1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

Merge develop into midi2

This commit is contained in:
reuk 2025-08-27 13:56:34 +01:00
commit 20bf58c847
No known key found for this signature in database
87 changed files with 2047 additions and 884 deletions

View file

@ -75,17 +75,17 @@ or Visual Studio project, then you could open the generated project in your IDE.
### Building for iOS
To build for iOS, you'll need CMake 3.14 or higher. Using the Xcode generator is highly recommended,
as other generators may not automatically find the correct SDK for the iPhone simulator, and may
fail to run certain parts of the build, such as compiling icons and processing the app's plist. By
default, CMake will build for the same system that originally configured the project, so to enable
cross-compilation for iOS, a few extra flags must be passed to the initial CMake invocation:
Using the Xcode generator is highly recommended, as other generators may not automatically find
the correct SDK for the iPhone simulator, and may fail to run certain parts of the build, such as
compiling icons and processing the app's plist. By default, CMake will build for the same system
that originally configured the project, so to enable cross-compilation for iOS, a few extra flags
must be passed to the initial CMake invocation:
cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3
cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0
Here we create a build tree in the directory named 'build-ios', using the Xcode generator. The
`-DCMAKE_SYSTEM_NAME=iOS` option tells CMake to enable cross-compiling for iOS. The
`-DCMAKE_OSX_DEPLOYMENT_TARGET=9.3` option sets the minimum deployment target (it applies to iOS
`-DCMAKE_OSX_DEPLOYMENT_TARGET=12.0` option sets the minimum deployment target (it applies to iOS
despite the 'OSX' in the variable name!).
Once the project has generated, we can open it as normal in Xcode (look for the project file in the
@ -102,7 +102,7 @@ require special code signing.
If we wanted to build for a real device, we would need to pass some extra signing details to the
initial CMake configuration command:
cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 \
cmake -Bbuild-ios -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_DEPLOYMENT_TARGET=12.0 \
-DCMAKE_XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY="iPhone Developer"
-DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=<10 character id>
@ -136,14 +136,14 @@ configuring the CMake project with `"-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64"`.
### Building with Clang on Windows
Clang-cl (Clang with MSVC-like command-line) should work by default. If you are generating a Visual
Clang-cl (Clang with MSVC-like command line) should work by default. If you are generating a Visual
Studio project, and have installed the LLVM package which is distributed with Visual Studio, then
you can configure a Clang-cl build by passing "-T ClangCL" on your configuration commandline.
you can configure a Clang-cl build by passing `-T ClangCL` on your configuration command line.
If you wish to use Clang with GNU-like command-line instead, you can pass
`-DCMAKE_CXX_COMPILER=clang++` and `-DCMAKE_C_COMPILER=clang` on your configuration commandline.
clang++ and clang must be on your `PATH` for this to work. Only more recent versions of CMake
support Clang's GNU-like command-line on Windows. Note that CMake doesn't seem to automatically
`-DCMAKE_CXX_COMPILER=clang++` and `-DCMAKE_C_COMPILER=clang` on your configuration command line.
`clang++` and `clang` must be on your `PATH` for this to work. Only more recent versions of CMake
support Clang's GNU-like command-line on Windows. Note that CMake doesn't seem to automatically
link a runtime library when building in this configuration, but this can be remedied by setting
the `MSVC_RUNTIME_LIBRARY` property. See the [official
documentation](https://cmake.org/cmake/help/v3.22/prop_tgt/MSVC_RUNTIME_LIBRARY.html) of this
@ -226,18 +226,18 @@ folders.
Only brings in targets for the built-in JUCE modules, and the `juce_add_module*` CMake functions.
This is meant for highly custom use-cases where the `juce_add_gui_app` and `juce_add_plugin`
functions are not required. Most importantly, the 'juceaide' helper tool is not built when this
functions are not required. Most importantly, the `juceaide` helper tool is not built when this
option is enabled, which may improve build times for established products that use other methods to
handle plugin bundle structures, icons, plists, and so on. If this option is enabled, then
`JUCE_ENABLE_MODULE_SOURCE_GROUPS` will have no effect.
#### `JUCE_WEBVIEW2_PACKAGE_LOCATION`
You can ask JUCE to link the WebView2 library statically to your target on Windows, by specifying
the `NEEDS_WEBVIEW2` option when creating your target. In this case JUCE will search for the
WebView2 package on your system. The default search location is
You can ask JUCE to link the WebView2 library statically to your target on Windows, by specifying
the `NEEDS_WEBVIEW2` option when creating your target. In this case JUCE will search for the
WebView2 package on your system. The default search location is
`%userprofile%\AppData\Local\PackageManagement\NuGet\Packages`. This location can be overriden by
specifying this option. The provided location should contain the `*Microsoft.Web.WebView2*`
specifying this option. The provided location should contain the `*Microsoft.Web.WebView2*`
directory.
### Functions
@ -274,82 +274,86 @@ attributes directly to these creation functions, rather than adding them later.
the target's plist.
`BUILD_VERSION`
- A version number string in the format "major.minor.bugfix". If not specified, this will match
- A version number string in the format `major.minor.bugfix`. If not specified, this will match
the `VERSION` of the target. On Apple platforms, this is the private version string used to
distinguish between App Store builds. This option corresponds to the `CFBundleVersion` field in
the target's plist.
`BUNDLE_ID`
- An identifier string in the form "com.yourcompany.productname" which should uniquely identify
- An identifier string in the form `com.yourcompany.productname` which should uniquely identify
this target. Mainly used for macOS builds. If not specified, a default will be generated using
the target's `COMPANY_NAME` and the name of the CMake target.
`MICROPHONE_PERMISSION_ENABLED`
- May be either TRUE or FALSE. Adds NSMicrophoneUsageDescription to an app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds `NSMicrophoneUsageDescription` to an app's Info.plist.
`MICROPHONE_PERMISSION_TEXT`
- The text your app will display when it requests microphone permissions.
`CAMERA_PERMISSION_ENABLED`
- May be either TRUE or FALSE. Adds NSCameraUsageDescription to an app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds `NSCameraUsageDescription` to an app's Info.plist.
`CAMERA_PERMISSION_TEXT`
- The text your app will display when it requests camera permissions.
`BLUETOOTH_PERMISSION_ENABLED`
- May be either TRUE or FALSE. Adds NSBluetoothAlwaysUsageDescription to an app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds `NSBluetoothAlwaysUsageDescription` to an app's Info.plist.
`BLUETOOTH_PERMISSION_TEXT`
- The text your app will display when it requests bluetooth permissions.
`LOCAL_NETWORK_PERMISSION_ENABLED`
- May be either TRUE or FALSE. Adds NSLocalNetworkUsageDescription to an app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds `NSLocalNetworkUsageDescription` to an app's Info.plist.
`LOCAL_NETWORK_PERMISSION_TEXT`
- The text your app will display when it requests local network access permissions.
`SEND_APPLE_EVENTS_PERMISSION_ENABLED`
- May be either TRUE or FALSE. Enable this to allow your app to send Apple events.
- May be either `TRUE` or `FALSE`. Enable this to allow your app to send Apple events.
`SEND_APPLE_EVENTS_PERMISSION_TEXT`
- The text your app will display when it requests permission to send Apple events.
`FILE_SHARING_ENABLED`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's Info.plist.
`DOCUMENT_BROWSER_ENABLED`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's Info.plist.
`STATUS_BAR_HIDDEN`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's Info.plist.
`REQUIRES_FULL_SCREEN`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist.
`REQUIRES_FULL_SCREEN`
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's Info.plist.
`BACKGROUND_AUDIO_ENABLED`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's Info.plist.
`BACKGROUND_BLE_ENABLED`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's Info.plist.
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's Info.plist.
`APP_GROUPS_ENABLED`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's entitlements.
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's entitlements.
`APP_GROUP_IDS`
- The app groups to which your iOS app belongs. These will be added to your app's entitlements.
`ICLOUD_PERMISSIONS_ENABLED`
- May be either TRUE or FALSE. Adds the appropriate entries to an iOS app's entitlements.
- May be either `TRUE` or `FALSE`. Adds the appropriate entries to an iOS app's entitlements.
`IPHONE_SCREEN_ORIENTATIONS`
- May be one or more of `UIInterfaceOrientationUnknown`, `UIInterfaceOrientationPortrait`,
`UIInterfaceOrientationPortraitUpsideDown`, `UIInterfaceOrientationLandscapeLeft`, or
`UIInterfaceOrientationLandscapeRight`. Adds appropriate entries to an iOS app's plist.
Defaults to `UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight`
`IPAD_SCREEN_ORIENTATIONS`
- May be one or more of `UIInterfaceOrientationUnknown`, `UIInterfaceOrientationPortrait`,
`UIInterfaceOrientationPortraitUpsideDown`, `UIInterfaceOrientationLandscapeLeft`, or
`UIInterfaceOrientationLandscapeRight`. Adds appropriate entries to an iOS app's plist.
Defaults to `UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight`
`LAUNCH_STORYBOARD_FILE`
- A custom launch storyboard file to use on iOS. If not supplied, a default storyboard will be
@ -358,14 +362,14 @@ attributes directly to these creation functions, rather than adding them later.
`CUSTOM_XCASSETS_FOLDER`
- A path to an xcassets directory, containing icons and/or launch images for this target. If this
is specified, the ICON_BIG and ICON_SMALL arguments will not have an effect on iOS. LaunchImages
have been deprecated from iOS 13 onward, but if your xcassets folder contains a LaunchImage and
a custom storyboard hasn't been specified, then it will be used.
is specified, the `ICON_BIG` and `ICON_SMALL` arguments will not have an effect on iOS.
LaunchImages have been deprecated from iOS 13 onward, but if your xcassets folder contains a
LaunchImage and a custom storyboard hasn't been specified, then it will be used.
`TARGETED_DEVICE_FAMILY`
- Specifies the device families on which the product must be capable of running. Allowed values
are "1", "2", and "1,2"; these correspond to "iPhone/iPod touch", "iPad", and "iPhone/iPod and
iPad" respectively. This will default to "1,2", meaning that the target will target iPhone,
are `1`, `2`, and `1,2`; these correspond to "iPhone/iPod touch", "iPad", and "iPhone/iPod and
iPad" respectively. This will default to `1,2`, meaning that the target will target iPhone,
iPod, and iPad.
`ICON_BIG`, `ICON_SMALL`
@ -440,13 +444,16 @@ attributes directly to these creation functions, rather than adding them later.
new target.
`PUSH_NOTIFICATIONS_ENABLED`
- Sets app entitlements to allow push notifications. False by default.
- Sets app entitlements to allow push notifications. May be either `TRUE`
or `FALSE`. Defaults to `FALSE`.
`NETWORK_MULTICAST_ENABLED`
- Sets app entitlements to allow IP multicast or broadcast on macOS/iOS. False by default.
- Sets app entitlements to allow IP multicast or broadcast on macOS/iOS. May be either `TRUE`
or `FALSE`. Defaults to `FALSE`.
`HARDENED_RUNTIME_ENABLED`
- Enables macOS' hardened runtime for this target. Required for notarisation. False by default.
- Enables macOS' hardened runtime for this target. Required for notarisation. May be either
`TRUE` or `FALSE`. Defaults to `FALSE`.
`HARDENED_RUNTIME_OPTIONS`
- A set of space-separated entitlement keys that will be added to this target's entitlements
@ -454,11 +461,12 @@ attributes directly to these creation functions, rather than adding them later.
`com.apple.security.*` where `*` is a specific entitlement.
`APP_SANDBOX_ENABLED`
- Enables macOS' app sandbox for this target. False by default.
- Enables macOS' app sandbox for this target. May be either `TRUE` or `FALSE`. Defaults to `FALSE`.
`APP_SANDBOX_INHERIT`
- Allows child processes to inherit the static entitlements of their parent process. If this
is set to `TRUE`, no other app sandbox entitlements will be set on this target.
is set to `TRUE`, no other app sandbox entitlements will be set on this target. Defaults to
`FALSE`.
`APP_SANDBOX_OPTIONS`
- A set of space-separated entitlement keys that will be added to this target's entitlements
@ -482,8 +490,8 @@ attributes directly to these creation functions, rather than adding them later.
accessing read/write absolute paths if `APP_SANDBOX_ENABLED` is `TRUE`.
`APP_SANDBOX_EXCEPTION_IOKIT`
- A set of space-separated strings specifying IOUserClient subclasses to open or to set properties
on. These will be added to this target's entitlements plist if `APP_SANDBOX_ENABLED` is `TRUE`.
- A set of space-separated strings specifying IOUserClient subclasses to open or to set properties
on. These will be added to this target's entitlements plist if `APP_SANDBOX_ENABLED` is `TRUE`.
For more information see Apple's IOKit User Client Class Temporary Exception documentation.
`PLIST_TO_MERGE`
@ -491,8 +499,8 @@ attributes directly to these creation functions, rather than adding them later.
`FORMATS`
- For plugin targets, specifies the plugin targets to build. Should be provided as a
space-separated list. Valid values are `Standalone Unity VST3 AU AUv3 AAX VST`. `AU` and `AUv3`
plugins will only be enabled when building on macOS. It is an error to pass `AAX` or `VST`
space-separated list. Valid values are `Standalone Unity VST3 AU AUv3 AAX VST LV2`. `AU` and
`AUv3` plugins will only be enabled when building on macOS. It is an error to pass `AAX` or `VST`
without first calling `juce_set_aax_sdk_path` or `juce_set_vst2_sdk_path` respectively.
`PLUGIN_NAME`
@ -504,71 +512,80 @@ attributes directly to these creation functions, rather than adding them later.
`PLUGIN_MANUFACTURER_CODE`
- A four-character unique ID for your company. For AU compatibility, this must contain at least
one upper-case letter. GarageBand 10.3 requires the first letter to be upper-case, and the
remaining letters to be lower-case.
remaining letters to be lower-case. Defaults to `Manu`.
`PLUGIN_CODE`
- A four-character unique ID for your plugin. For AU compatibility, this must contain exactly one
upper-case letter. GarageBand 10.3 requires the first letter to be upper-case, and the remaining
letters to be lower-case.
letters to be lower-case. Defaults to a random code that changes each time the build is
configured.
`DESCRIPTION`
- A short description of your plugin.
`IS_SYNTH`
- Whether the plugin is a synth. Will be used to set sensible plugin category values if they
are not provided explicitly.
are not provided explicitly. May be either `TRUE` or `FALSE`. Defaults to `FALSE`.
`NEEDS_MIDI_INPUT`
- Whether the plugin should provide a midi input.
- Whether the plugin should provide a midi input. May be either `TRUE` or `FALSE`. Defaults to
`FALSE`.
`NEEDS_MIDI_OUTPUT`
- Whether the plugin should provide a midi output.
- Whether the plugin should provide a midi output. May be either `TRUE` or `FALSE`. Defaults to
`FALSE`.
`IS_MIDI_EFFECT`
- Whether the plugin is a MIDI effect (some hosts provide a special channel-strip location for
MIDI effect plugins).
MIDI effect plugins). May be either `TRUE` or `FALSE`. Defaults to `FALSE`.
`EDITOR_WANTS_KEYBOARD_FOCUS`
- Whether the plugin requires keyboard focus, or should defer all keyboard handling to the host.
May be either `TRUE` or `FALSE`. Defaults to `FALSE`.
`DISABLE_AAX_BYPASS`
- Whether the AAX bypass function should be disabled.
- Whether the AAX bypass function should be disabled. May be either `TRUE` or `FALSE`. Defaults to
`FALSE`.
`DISABLE_AAX_MULTI_MONO`
- Whether the AAX multi mono bus layout should be disabled.
- Whether the AAX multi mono bus layout should be disabled. May be either `TRUE` or `FALSE`.
Defaults to `FALSE`.
`AAX_IDENTIFIER`
- The bundle ID for the AAX plugin target. Matches the `BUNDLE_ID` by default.
- The bundle ID for the AAX plugin target. Defaults to the `BUNDLE_ID`.
`LV2URI`
- This is a string that acts as a unique identifier for an LV2 plugin. If you make any incompatible
- This is a string that acts as a unique identifier for an LV2 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.
By default, the value of this property will be generated based on the COMPANY_WEBSITE and
PLUGIN_NAME. However, in some circumstances, such as the following, you'll need to override the
By default, the value of this property will be generated based on the `COMPANY_WEBSITE` and
`PLUGIN_NAME`. However, in some circumstances, such as the following, you'll need to override the
default:
- The plugin name contains characters such as spaces that are invalid in a URI; or
- The COMPANY_WEBSITE omits the leading scheme identifier (http://); or
- There's no website associated with the plugin, so you want to use a 'urn:' identifier instead.
- The `COMPANY_WEBSITE` omits the leading scheme identifier (`http://`); or
- There's no website associated with the plugin, so you want to use a `urn:` identifier instead.
`VST_NUM_MIDI_INS`
- For VST2 and VST3 plugins that accept midi, this allows you to configure the number of inputs.
Defaults to `16`.
`VST_NUM_MIDI_OUTS`
- For VST2 and VST3 plugins that produce midi, this allows you to configure the number of outputs.
Defaults to `16`.
`VST2_CATEGORY`
- Should be one of: `kPlugCategUnknown`, `kPlugCategEffect`, `kPlugCategSynth`,
`kPlugCategAnalysis`, `kPlugCategMastering`, `kPlugCategSpacializer`, `kPlugCategRoomFx`,
`kPlugSurroundFx`, `kPlugCategRestoration`, `kPlugCategOfflineProcess`, `kPlugCategShell`,
`kPlugCategGenerator`.
`kPlugCategGenerator`. Defaults to `kPlugCategSynth` if `IS_SYNTH` is `TRUE`. Otherwise defaults
to `kPlugCategEffect`.
`VST3_CATEGORIES`
- Should be one or more, separated by spaces, of the following: `Fx`, `Instrument`, `Analyzer`,
`Delay`, `Distortion`, `Drum`, `Dynamics`, `EQ`, `External`, `Filter`, `Generator`, `Mastering`,
`Modulation`, `Mono`, `Network`, `NoOfflineProcess`, `OnlyOfflineProcess`, `OnlyRT`,
`Pitch Shift`, `Restoration`, `Reverb`, `Sampler`, `Spatial`, `Stereo`, `Surround`, `Synth`,
`Tools`, `Up-Downmix`
`Tools`, `Up-Downmix`. Defaults to `Synth` if `IS_SYNTH` is `TRUE`. Otherwise defaults to `Fx`.
`AU_MAIN_TYPE`
- Should be one of: `kAudioUnitType_Effect`, `kAudioUnitType_FormatConverter`,
@ -579,42 +596,45 @@ attributes directly to these creation functions, rather than adding them later.
`AU_EXPORT_PREFIX`
- A prefix for the names of entry-point functions that your component exposes. Typically this
will be a version of your plugin's name that can be used as part of a C++ token. Defaults
to your plugin's name with the suffix 'AU'.
to your plugin's name with the suffix `AU`.
`AU_SANDBOX_SAFE`
- May be either TRUE or FALSE. Adds the appropriate entries to an AU plugin's Info.plist.
- Adds the appropriate entries to an AU plugin's Info.plist. May be either `TRUE` or `FALSE`.
Defaults to `FALSE`.
`SUPPRESS_AU_PLIST_RESOURCE_USAGE`
- May be either TRUE or FALSE. Defaults to FALSE. Set this to TRUE to disable the `resourceUsage`
key in the target's plist. This is useful for AU plugins that must access resources which cannot
be declared in the resourceUsage block, such as UNIX domain sockets. In particular,
PACE-protected AU plugins may require this option to be enabled in order for the plugin to load
in GarageBand.
- May be either `TRUE` or `FALSE`. Defaults to `FALSE`. Set this to `TRUE` to disable the
`resourceUsage` key in the target's plist. This is useful for AU plugins that must access
resources which cannot be declared in the resourceUsage block, such as UNIX domain sockets. In
particular, PACE-protected AU plugins may require this option to be enabled in order for the
plugin to load in GarageBand.
`AAX_CATEGORY`
- Should be one or more of: `None`, `EQ`, `Dynamics`, `PitchShift`, `Reverb`, `Delay`, `Modulation`,
`Harmonic`, `NoiseReduction`, `Dither`, `SoundField`, `HWGenerators`, `SWGenerators`,
`WrappedPlugin`, `Effect`, and `MIDIEffect`. You may also add the prefix `AAX_ePlugInCategory_`.
Defaults to `MIDIEffect` when `IS_MIDI_EFFECT` is `TRUE`, `SWGenerators` when `IS_SYNTH` is
`TRUE`, otherwise `None`.
`PLUGINHOST_AU`
- May be either TRUE or FALSE (defaults to FALSE). If TRUE, will add the preprocessor definition
`JUCE_PLUGINHOST_AU=1` to the new target, and will link the macOS frameworks necessary for
hosting plugins. Using this parameter should be preferred over using
- May be either `TRUE` or `FALSE`. Defaults to `FALSE`. If `TRUE`, will add the preprocessor
definition `JUCE_PLUGINHOST_AU=1` to the new target, and will link the macOS frameworks necessary
for hosting plugins. Using this parameter should be preferred over using
`target_compile_definitions` to manually set the `JUCE_PLUGINHOST_AU` preprocessor definition.
`USE_LEGACY_COMPATIBILITY_PLUGIN_CODE`
- May be either TRUE or FALSE (defaults to FALSE). If TRUE, will override the value of the
preprocessor definition "JucePlugin_ManufacturerCode" with the hex equivalent of "proj". This
option exists to maintain compatibility with a previous, buggy version of JUCE's CMake support
which mishandled the manufacturer code property. Most projects should leave this option set to
its default value.
- May be either `TRUE` or `FALSE`. Defaults to `FALSE`. If `TRUE`, the preprocessor definition
`JucePlugin_ManufacturerCode` will be set to the hex equivalent of `proj`. This option exists to
maintain compatibility with a previous, buggy version of JUCE's CMake support which mishandled the
manufacturer code property. Most projects should leave this option set to its default value.
`COPY_PLUGIN_AFTER_BUILD`
- Whether or not to install the plugin to the current system after building. False by default.
If you want all of the plugins in a subdirectory to be installed automatically after building,
you can set the property `JUCE_COPY_PLUGIN_AFTER_BUILD` on the directory before adding the
plugins, rather than setting this argument on each individual target. Note that on Windows,
the default install locations may not be writable by normal user accounts.
- Whether or not to install the plugin to the current system after building. May be either
`TRUE` or `FALSE`. Defaults to `FALSE`. If you want all of the plugins in a subdirectory to be
installed automatically after building, you can set the property `JUCE_COPY_PLUGIN_AFTER_BUILD`
on the directory before adding the plugins, rather than setting this argument on each individual
target. Note that on Windows, the default install locations may not be writable by normal user
accounts.
`VST_COPY_DIR`
- The location to which VST2 (legacy) plugins will be copied after building if
@ -650,8 +670,8 @@ attributes directly to these creation functions, rather than adding them later.
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
- 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.
@ -674,22 +694,22 @@ attributes directly to these creation functions, rather than adding them later.
- 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`
`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`
`kARAPlaybackTransformationContentBasedFadeAtHead`.
`VST3_AUTO_MANIFEST`
- May be either TRUE or FALSE (defaults to TRUE). When TRUE, a POST_BUILD step will be added to the
VST3 target which will generate a moduleinfo.json file into the Resources subdirectory of the
plugin bundle. This is normally desirable, but does require that the plugin can be successfully
loaded immediately after building the VST3 target. If the plugin needs further processing before
it can be loaded (e.g. custom signing), then set this option to FALSE to disable the automatic
manifest generation. To generate the manifest at a later point in the build, use the
- May be either `TRUE` or `FALSE`. Defaults to `TRUE`. When `TRUE`, a `POST_BUILD` step will be
added to the VST3 target which will generate a `moduleinfo.json` file into the Resources
subdirectory of the plugin bundle. This is normally desirable, but does require that the plugin
can be successfully loaded immediately after building the VST3 target. If the plugin needs further
processing before it can be loaded (e.g. custom signing), then set this option to FALSE to disable
the automatic manifest generation. To generate the manifest at a later point in the build, use the
`juce_enable_vst3_manifest_step` function. It is strongly recommended to generate a manifest for
your plugin, as this allows compatible hosts to scan the plugin much more quickly, leading to
an improved experience for users.
@ -761,10 +781,10 @@ target!).
You may call this function to manually enable VST3 manifest generation on a plugin. The argument to
this function should be a target previously created with `juce_add_plugin`.
VST3_AUTO_MANIFEST TRUE will cause the VST3 manifest to be generated immediately after building.
`VST3_AUTO_MANIFEST TRUE` will cause the VST3 manifest to be generated immediately after building.
This is not always appropriate, if extra build steps (such as signing or modifying the plugin
bundle) must be executed before the plugin can be loaded. In such cases, you should set
VST3_AUTO_MANIFEST FALSE, use `add_custom_command(TARGET POST_BUILD)` to add your own post-build
`VST3_AUTO_MANIFEST FALSE`, use `add_custom_command(TARGET POST_BUILD)` to add your own post-build
steps, and then finally call `juce_enable_vst3_manifest_step`.
#### `juce_set_<kind>_sdk_path`
@ -831,7 +851,7 @@ CMake-supplied defaults.
juce_link_with_embedded_linux_subprocess(<target>)
This function links the provided target with an interface library that generates a barebones
This function links the provided target with an interface library that generates a barebones
standalone executable file and embeds it as a binary resource. This binary resource is only used
by the `juce_gui_extra` module and only when its `JUCE_WEB_BROWSER` capability is enabled. This
executable will then be deployed into a temporary file only when the code is running in a

View file

@ -34,9 +34,9 @@ include_directories( AFTER
enable_language(ASM)
if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG")
add_definitions([[-DJUCE_PROJUCER_VERSION=0x80008]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1]] [[-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.8]] [[-DJUCE_APP_VERSION_HEX=0x80008]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
add_definitions([[-DJUCE_PROJUCER_VERSION=0x80008]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1]] [[-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.8]] [[-DJUCE_APP_VERSION_HEX=0x80008]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
add_definitions([[-DJUCE_PROJUCER_VERSION=0x80008]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1]] [[-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.8]] [[-DJUCE_APP_VERSION_HEX=0x80008]] [[-DNDEBUG=1]])
add_definitions([[-DJUCE_PROJUCER_VERSION=0x80008]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1]] [[-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=8.0.8]] [[-DJUCE_APP_VERSION_HEX=0x80008]] [[-DNDEBUG=1]])
else()
message( FATAL_ERROR "No matching build-configuration found." )
endif()
@ -805,6 +805,7 @@ add_library( ${BINARY_NAME}
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -833,7 +834,9 @@ add_library( ${BINARY_NAME}
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@ -3489,6 +3492,7 @@ set_source_files_properties(
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -3517,7 +3521,9 @@ set_source_files_properties(
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"

View file

@ -39,7 +39,7 @@ ifeq ($(CONFIG),Debug)
TARGET_ARCH :=
endif
JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80008" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1" "-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.8" "-DJUCE_APP_VERSION_HEX=0x80008" $(shell $(PKG_CONFIG) --cflags $(shell ($(PKG_CONFIG) --exists webkit2gtk-4.1 && echo webkit2gtk-4.1) || echo webkit2gtk-4.0) alsa freetype2 fontconfig gl libcurl 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 := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80008" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1" "-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.8" "-DJUCE_APP_VERSION_HEX=0x80008" $(shell $(PKG_CONFIG) --cflags $(shell ($(PKG_CONFIG) --exists webkit2gtk-4.1 && echo webkit2gtk-4.1) || echo webkit2gtk-4.0) alsa freetype2 fontconfig gl libcurl 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
@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release)
TARGET_ARCH :=
endif
JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80008" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1" "-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.8" "-DJUCE_APP_VERSION_HEX=0x80008" $(shell $(PKG_CONFIG) --cflags $(shell ($(PKG_CONFIG) --exists webkit2gtk-4.1 && echo webkit2gtk-4.1) || echo webkit2gtk-4.0) alsa freetype2 fontconfig gl libcurl 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 := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80008" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1" "-DJUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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" "-DJUCE_PUSH_NOTIFICATIONS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.8" "-DJUCE_APP_VERSION_HEX=0x80008" $(shell $(PKG_CONFIG) --cflags $(shell ($(PKG_CONFIG) --exists webkit2gtk-4.1 && echo webkit2gtk-4.1) || echo webkit2gtk-4.0) alsa freetype2 fontconfig gl libcurl 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

View file

@ -29,6 +29,7 @@
4FBBB55F4E347757F74F1F41 /* MainComponent.cpp */ = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; };
527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; };
55F120E70543228568573D4A /* include_juce_animation.cpp */ = {isa = PBXBuildFile; fileRef = CB4C64BACC1CA4AAD6D69565; };
5C1957CE874953FB83DCDACB /* AudioUnit.framework */ = {isa = PBXBuildFile; fileRef = 4A8625BBDD6C3BA8052CCA53; };
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; };
@ -97,6 +98,7 @@
483C3A8B4FB98B54BB42CB50 /* include_juce_graphics_Harfbuzz.cpp */ /* include_juce_graphics_Harfbuzz.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_graphics_Harfbuzz.cpp; path = ../../JuceLibraryCode/include_juce_graphics_Harfbuzz.cpp; sourceTree = SOURCE_ROOT; };
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; };
4A8625BBDD6C3BA8052CCA53 /* AudioUnit.framework */ /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = System/Library/Frameworks/AudioUnit.framework; sourceTree = SDKROOT; };
4DF215D350FFE5E119CBA7E5 /* include_juce_box2d.cpp */ /* include_juce_box2d.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_box2d.cpp; path = ../../JuceLibraryCode/include_juce_box2d.cpp; sourceTree = SOURCE_ROOT; };
4E9AD0EAF3CA57B548622D9A /* JuceHeader.h */ /* JuceHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = JuceHeader.h; path = ../../JuceLibraryCode/JuceHeader.h; sourceTree = SOURCE_ROOT; };
4EC2782DE1779A130835B64D /* Info-App.plist */ /* Info-App.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-App.plist"; path = "Info-App.plist"; sourceTree = SOURCE_ROOT; };
@ -165,6 +167,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
5C1957CE874953FB83DCDACB,
48CF0B02E1D06E5DA51E6270,
163B0CF2DD0990A63DF1D5A6,
7B4163348896EB1B86B15160,
@ -192,6 +195,7 @@
4452EAA652B65A9AE648288C /* Frameworks */ = {
isa = PBXGroup;
children = (
4A8625BBDD6C3BA8052CCA53,
A04E4408525F24F7DCBA000E,
470C3E4553B513FFEF752779,
DC192EFA899E6CBE6B5CD394,
@ -577,6 +581,7 @@
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_USE_MP3AUDIOFORMAT=1",
"JUCE_PLUGINHOST_VST3=1",
"JUCE_PLUGINHOST_AU=1",
"JUCE_PLUGINHOST_LV2=1",
"JUCE_ALLOW_STATIC_NULL_VARIABLES=0",
"JUCE_STRICT_REFCOUNTEDPOINTER=1",
@ -671,6 +676,7 @@
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_USE_MP3AUDIOFORMAT=1",
"JUCE_PLUGINHOST_VST3=1",
"JUCE_PLUGINHOST_AU=1",
"JUCE_PLUGINHOST_LV2=1",
"JUCE_ALLOW_STATIC_NULL_VARIABLES=0",
"JUCE_STRICT_REFCOUNTEDPOINTER=1",

View file

@ -68,7 +68,7 @@
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
@ -83,7 +83,7 @@
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>
@ -112,7 +112,7 @@
<Optimization>Full</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
@ -127,7 +127,7 @@
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>
@ -1020,6 +1020,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1056,6 +1059,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1723,6 +1723,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1759,6 +1762,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -68,7 +68,7 @@
<Optimization>Disabled</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
@ -83,7 +83,7 @@
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>
@ -112,7 +112,7 @@
<Optimization>Full</Optimization>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<RuntimeTypeInfo>true</RuntimeTypeInfo>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
@ -127,7 +127,7 @@
</ClCompile>
<ResourceCompile>
<AdditionalIncludeDirectories>..\..\..\..\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)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_PROJUCER_VERSION=0x80008;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_animation=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_javascript=1;JUCE_MODULE_AVAILABLE_juce_midi_ci=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_AU=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;JUCE_PUSH_NOTIFICATIONS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=8.0.8;JUCE_APP_VERSION_HEX=0x80008;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)</PreprocessorDefinitions>
</ResourceCompile>
<Link>
<OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>
@ -1020,6 +1020,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1056,6 +1059,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1723,6 +1723,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1759,6 +1762,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>inter-app-audio</key>
<true/>
<key>com.apple.developer.icloud-container-identifiers</key>
<array>
<string>iCloud.$(CFBundleIdentifier)</string>

View file

@ -410,7 +410,7 @@
enabled = 0;
};
com.apple.InterAppAudio = {
enabled = 0;
enabled = 1;
};
com.apple.Push = {
enabled = 0;
@ -588,6 +588,7 @@
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_USE_MP3AUDIOFORMAT=1",
"JUCE_PLUGINHOST_VST3=1",
"JUCE_PLUGINHOST_AU=1",
"JUCE_PLUGINHOST_LV2=1",
"JUCE_ALLOW_STATIC_NULL_VARIABLES=0",
"JUCE_STRICT_REFCOUNTEDPOINTER=1",
@ -682,6 +683,7 @@
"JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
"JUCE_USE_MP3AUDIOFORMAT=1",
"JUCE_PLUGINHOST_VST3=1",
"JUCE_PLUGINHOST_AU=1",
"JUCE_PLUGINHOST_LV2=1",
"JUCE_ALLOW_STATIC_NULL_VARIABLES=0",
"JUCE_STRICT_REFCOUNTEDPOINTER=1",

View file

@ -17,6 +17,13 @@
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict/>
</dict>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>

View file

@ -54,6 +54,7 @@ target_compile_definitions(DemoRunner PRIVATE
JUCE_ALLOW_STATIC_NULL_VARIABLES=0
JUCE_CONTENT_SHARING=1
JUCE_DEMO_RUNNER=1
JUCE_PLUGINHOST_AU=1
JUCE_PLUGINHOST_LV2=1
JUCE_PLUGINHOST_VST3=1
JUCE_PUSH_NOTIFICATIONS=1

View file

@ -257,7 +257,8 @@
<MODULE id="juce_video" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
</MODULES>
<JUCEOPTIONS JUCE_USE_CAMERA="1" JUCE_USE_MP3AUDIOFORMAT="1" JUCE_ALLOW_STATIC_NULL_VARIABLES="0"
JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_PLUGINHOST_LV2="1" JUCE_PLUGINHOST_VST3="1"/>
JUCE_STRICT_REFCOUNTEDPOINTER="1" JUCE_PLUGINHOST_LV2="1" JUCE_PLUGINHOST_VST3="1"
JUCE_PLUGINHOST_AU="1"/>
<LIVE_SETTINGS>
<OSX/>
</LIVE_SETTINGS>

View file

@ -760,6 +760,7 @@ add_library( ${BINARY_NAME}
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -788,7 +789,9 @@ add_library( ${BINARY_NAME}
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@ -3058,6 +3061,7 @@ set_source_files_properties(
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -3086,7 +3090,9 @@ set_source_files_properties(
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"

View file

@ -978,6 +978,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1014,6 +1017,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1504,6 +1504,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1540,6 +1543,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -9,6 +9,13 @@
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict/>
</dict>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>

View file

@ -793,6 +793,7 @@ add_library( ${BINARY_NAME}
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -821,7 +822,9 @@ add_library( ${BINARY_NAME}
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@ -3244,6 +3247,7 @@ set_source_files_properties(
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -3272,7 +3276,9 @@ set_source_files_properties(
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"

View file

@ -986,6 +986,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1022,6 +1025,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1579,6 +1579,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1615,6 +1618,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -986,6 +986,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1022,6 +1025,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1579,6 +1579,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1615,6 +1618,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -11,6 +11,13 @@
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict/>
</dict>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>

View file

@ -1044,7 +1044,9 @@ endfunction()
# ==================================================================================================
function(_juce_add_vst3_manifest_helper_target shared_code_target)
if(TARGET juce_vst3_helper
set(vst3_helper_target ${shared_code_target}_vst3_helper)
if(TARGET ${vst3_helper_target}
OR (CMAKE_SYSTEM_NAME STREQUAL "iOS")
OR (CMAKE_SYSTEM_NAME STREQUAL "Android")
OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD"))
@ -1062,7 +1064,6 @@ function(_juce_add_vst3_manifest_helper_target shared_code_target)
set(source "${module_path}/juce_audio_plugin_client/VST3/juce_VST3ManifestHelper.${extension}")
set(vst3_helper_target ${shared_code_target}_vst3_helper)
add_executable(${vst3_helper_target} "${source}")
add_executable(juce::${vst3_helper_target} ALIAS ${vst3_helper_target})

View file

@ -165,6 +165,15 @@ namespace juce::build_tools
if (shouldAddStoryboardToProject)
addPlistDictionaryKey (*dict, "UILaunchStoryboardName", storyboardName);
XmlElement sceneManifestKey ("key");
sceneManifestKey.addTextElement ("UIApplicationSceneManifest");
dict->addChildElement (new XmlElement (sceneManifestKey));
auto* sceneManifestDict = dict->createNewChildElement ("dict");
addPlistDictionaryKey (*sceneManifestDict, "UIApplicationSupportsMultipleScenes", false);
addKeyIfNotFound (*sceneManifestDict, "UISceneConfigurations");
sceneManifestDict->createNewChildElement ("dict");
}
else
{

View file

@ -764,6 +764,7 @@ add_library( ${BINARY_NAME}
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -792,7 +793,9 @@ add_library( ${BINARY_NAME}
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"
@ -3142,6 +3145,7 @@ set_source_files_properties(
"../../../../../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_AudioUnitPluginFormat_test.cpp"
"../../../../../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"
@ -3170,7 +3174,9 @@ set_source_files_properties(
"../../../../../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.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorListener.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.cpp"
"../../../../../modules/juce_audio_processors/processors/juce_AudioProcessorParameterGroup.h"

View file

@ -978,6 +978,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1014,6 +1017,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1534,6 +1534,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1570,6 +1573,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -9,6 +9,13 @@
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict/>
</dict>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIdentifier</key>

View file

@ -77,6 +77,8 @@ public:
MSVCScriptBuilder& deleteFile (const StringOrBuilder& path)
{
jassert (path.value.isQuotedString());
script << "del /s /q " << path.value;
script << newLine;
return *this;
@ -84,6 +86,8 @@ public:
MSVCScriptBuilder& mkdir (const StringOrBuilder& path)
{
jassert (path.value.isQuotedString());
script << "mkdir " << path.value;
script << newLine;
return *this;
@ -175,7 +179,8 @@ public:
MSVCScriptBuilder& append (const StringOrBuilder& string)
{
script << string.value << newLine;
if (string.isNotEmpty())
script << string.value << newLine;
return *this;
}
@ -803,7 +808,8 @@ public:
std::pair { Ids::vstBinaryLocation, &t.vstBinaryLocation },
std::pair { Ids::vst3BinaryLocation, &t.vst3BinaryLocation },
std::pair { Ids::aaxBinaryLocation, &t.aaxBinaryLocation },
std::pair { Ids::lv2BinaryLocation, &t.lv2BinaryLocation }
std::pair { Ids::lv2BinaryLocation, &t.lv2BinaryLocation },
std::pair { Ids::unityPluginBinaryLocation, &t.unityPluginBinaryLocation }
};
const auto iter = std::find_if (properties.begin(),
@ -1745,6 +1751,17 @@ public:
return aaxSdk.getChildFile ("Utilities").getChildFile ("PlugIn.ico");
}
static bool shouldPerformCopyStepForPlugin (Target::Type pluginType,
const MSVCBuildConfiguration& config,
Architecture arch)
{
if (! config.isPluginBinaryCopyStepEnabled())
return false;
const auto binaryLocationId = getPluginTypeInfo (pluginType).second;
return binaryLocationId.isValid() && config.getBinaryPath (binaryLocationId, arch).isNotEmpty();
}
String getExtraPostBuildSteps (const MSVCBuildConfiguration& config, Architecture arch) const
{
using Builder = MSVCScriptBuilder;
@ -1764,7 +1781,7 @@ public:
+ " "
+ (directory + "\\" + segments[0] + "\\").quoted();
return config.isPluginBinaryCopyStepEnabled() ? copyStep : "";
return shouldPerformCopyStepForPlugin (type, config, arch) ? copyStep : "";
};
if (type == AAXPlugIn)
@ -1800,7 +1817,7 @@ public:
auto pkgScript = String ("copy /Y ") + scriptPath.toWindowsStyle().quoted() + " \"$(OutDir)\"";
if (config.isPluginBinaryCopyStepEnabled())
if (shouldPerformCopyStepForPlugin (type, config, arch))
{
auto copyLocation = config.getBinaryPath (Ids::unityPluginBinaryLocation, arch);
@ -1835,7 +1852,9 @@ public:
+ ".lv2\"\r\n";
builder.runAndCheck (writer,
config.isPluginBinaryCopyStepEnabled() ? copyStep : Builder{}.info ("Sucessfully generated LV2 manifest").build(),
shouldPerformCopyStepForPlugin (type, config, arch)
? copyStep
: Builder{}.info ("Successfully generated LV2 manifest").build(),
Builder{}.error ("Failed to generate LV2 manifest.")
.exit (-1));
@ -1945,7 +1964,7 @@ public:
.build();
}
if (type == VSTPlugIn && config.isPluginBinaryCopyStepEnabled())
if (type == VSTPlugIn && shouldPerformCopyStepForPlugin (type, config, arch))
{
const String copyCommand = "copy /Y \"$(OutDir)$(TargetFileName)\" \""
+ config.getBinaryPath (Ids::vstBinaryLocation, arch)
@ -1960,6 +1979,114 @@ public:
return {};
}
static std::pair<String, Identifier> getPluginTypeInfo (Target::Type targetType)
{
if (targetType == AAXPlugIn) return { "AAX", Ids::aaxBinaryLocation };
if (targetType == VSTPlugIn) return { "VST (Legacy)", Ids::vstBinaryLocation };
if (targetType == VST3PlugIn) return { "VST3", Ids::vst3BinaryLocation };
if (targetType == UnityPlugIn) return { "Unity", Ids::unityPluginBinaryLocation };
if (targetType == LV2PlugIn) return { "LV2", Ids::lv2BinaryLocation };
return {};
}
static String generatePluginCopyStepPathValidatorScript (Target::Type targetType,
const MSVCBuildConfiguration& config,
Architecture arch)
{
MSVCScriptBuilder builder;
if (config.isPluginBinaryCopyStepEnabled())
{
const auto [projectTypeString, binaryLocationId] = getPluginTypeInfo (targetType);
if (projectTypeString.isNotEmpty())
{
const auto binaryPath = config.getBinaryPath (binaryLocationId, arch);
if (binaryPath.isEmpty())
{
String warningMessage =
"Plugin Configuration Warning: Plugin copy step is enabled but no target "
"path is specified in the Projucer.";
warningMessage << " This can be configured via the \""
<< getArchitectureValueString (arch) << " "
<< projectTypeString << " "
<< "Binary Location\" option in the relevant Exporter configuration panel.";
builder.warning (warningMessage.quoted());
}
else
{
constexpr auto errorMessage =
"Plugin Copy Step Failure: Either the install path does not exist or you "
"do not have permission to write to the target directory. Ensure you "
"have the necessary permissions to write to the directory, or choose "
"a different install location (e.g., a folder in your user directory).";
MemoryOutputStream script;
const auto validProjectName = build_tools::makeValidIdentifier (config.project.getProjectNameString(),
false,
true,
false,
false);
const auto validPluginName = build_tools::makeValidIdentifier (projectTypeString,
false,
true,
false,
false);
script << "set TOUCH_NAME=\".touch_\""
<< validProjectName << "_"
<< validPluginName << "_"
<< "\"%RANDOM%\"" << newLine;
String tempPath = binaryPath;
tempPath << "\\%TOUCH_NAME%";
script << "(" << newLine;
script << "echo \".\" > " << tempPath.quoted() << newLine;
script << ") > nul 2>&1" << newLine;
builder.append (script.toString());
builder.ifelse ("exist " + tempPath.quoted(),
MSVCScriptBuilder{}.deleteFile (tempPath.quoted()),
MSVCScriptBuilder{}.error (String { errorMessage }.quoted())
.exit (1));
}
}
}
return builder.build();
}
static String generateToolchainValidatorScript (Architecture arch)
{
MSVCScriptBuilder builder;
if (arch == Architecture::win64)
{
const auto x86ToolchainErrorMessage =
"echo : Warning: Toolchain configuration issue!"
" You are using a 32-bit toolchain to compile a 64-bit target on a 64-bit system."
" This may cause problems with the build system."
" To resolve this, use the x64 version of MSBuild. You can invoke it directly at:"
" \"<VisualStudioPathHere>/MSBuild/Current/Bin/amd64/MSBuild.exe\""
" Or, use the \"x64 Native Tools Command Prompt\" script.";
builder.ifAllConditionsTrue (
{
"\"$(PROCESSOR_ARCHITECTURE)\" == " + getVisualStudioArchitectureId (Architecture::win32).quoted(),
// This only exists if the process is x86 but the host is x64.
"defined PROCESSOR_ARCHITEW6432"
}, MSVCScriptBuilder{}.append (x86ToolchainErrorMessage));
}
return builder.build();
}
String getExtraPreBuildSteps (const MSVCBuildConfiguration& config, Architecture arch) const
{
const auto createBundleStructure = [&] (const StringArray& segments)
@ -1981,24 +2108,8 @@ public:
MSVCScriptBuilder builder;
if (arch == Architecture::win64)
{
const auto x86ToolchainErrorMessage =
"echo : Warning: Toolchain configuration issue!"
" You are using a 32-bit toolchain to compile a 64-bit target on a 64-bit system."
" This may cause problems with the build system."
" To resolve this, use the x64 version of MSBuild. You can invoke it directly at:"
" \"<VisualStudioPathHere>/MSBuild/Current/Bin/amd64/MSBuild.exe\""
" Or, use the \"x64 Native Tools Command Prompt\" script.";
builder.ifAllConditionsTrue (
{
"\"$(PROCESSOR_ARCHITECTURE)\" == " + getVisualStudioArchitectureId (Architecture::win32).quoted(),
// This only exists if the process is x86 but the host is x64.
"defined PROCESSOR_ARCHITEW6432"
}, MSVCScriptBuilder{}.append (x86ToolchainErrorMessage));
}
builder.append (generatePluginCopyStepPathValidatorScript (type, config, arch));
builder.append (generateToolchainValidatorScript (arch));
if (type == LV2PlugIn)
{
@ -2032,8 +2143,14 @@ public:
return builder.build();
}
if (type == UnityPlugIn)
return builder.build();
if (type == AAXPlugIn)
return createBundleStructure (getAaxBundleStructure (config, arch));
return builder.build() + "\r\n" + createBundleStructure (getAaxBundleStructure (config, arch));
if (type == VSTPlugIn)
return builder.build();
if (type == VST3PlugIn)
return builder.build() + "\r\n" + createBundleStructure (getVst3BundleStructure (config, arch));

View file

@ -994,6 +994,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1030,6 +1033,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1627,6 +1627,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1663,6 +1666,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -994,6 +994,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1030,6 +1033,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1627,6 +1627,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1663,6 +1666,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -37,6 +37,7 @@ juce_generate_juce_header(UnitTestRunner)
target_sources(UnitTestRunner PRIVATE Source/Main.cpp)
target_compile_definitions(UnitTestRunner PRIVATE
JUCE_PLUGINHOST_AU=1
JUCE_PLUGINHOST_LV2=1
JUCE_PLUGINHOST_VST3=1
JUCE_UNIT_TESTS=1

View file

@ -977,6 +977,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_ARAHosting.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
@ -1013,6 +1016,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<ExcludedFromBuild>true</ExcludedFromBuild>
</ClCompile>

View file

@ -1531,6 +1531,9 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat.mm">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_AudioUnitPluginFormat_test.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\format_types\juce_LADSPAPluginFormat.cpp">
<Filter>JUCE Modules\juce_audio_processors\format_types</Filter>
</ClCompile>
@ -1567,6 +1570,12 @@
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorGraph.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorListener.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameter.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>
<ClCompile Include="..\..\..\..\modules\juce_audio_processors\processors\juce_AudioProcessorParameterGroup.cpp">
<Filter>JUCE Modules\juce_audio_processors\processors</Filter>
</ClCompile>

View file

@ -2414,9 +2414,6 @@ namespace AAXClasses
aaxInputFormat = aaxOutputFormat;
#endif
if (processor.isMidiEffect())
aaxInputFormat = aaxOutputFormat = AAX_eStemFormat_Mono;
check (desc.AddAudioIn (JUCEAlgorithmIDs::inputChannels));
check (desc.AddAudioOut (JUCEAlgorithmIDs::outputChannels));
@ -2586,10 +2583,16 @@ namespace AAXClasses
// MIDI effect plug-ins do not support any audio channels
jassert (numInputBuses == 0 && numOutputBuses == 0);
if (auto* desc = descriptor.NewComponentDescriptor())
for (const auto format : aaxFormats)
{
createDescriptor (*desc, plugin->getBusesLayout(), *plugin, pluginIds, numMeters);
check (descriptor.AddComponent (desc));
const auto channelSet = channelSetFromStemFormat (format, false);
const AudioProcessor::BusesLayout layout { { channelSet }, { channelSet } };
if (auto* desc = descriptor.NewComponentDescriptor())
{
createDescriptor (*desc, layout, *plugin, pluginIds, numMeters);
check (descriptor.AddComponent (desc));
}
}
}
else

View file

@ -172,7 +172,12 @@ public:
channelInfo.add (info);
}
#else
channelInfo = AudioUnitHelpers::getAUChannelInfo (*juceFilter);
auto channelInfoSet = AudioUnitHelpers::getAUChannelInfo (*juceFilter);
channelInfo.resize ((int) channelInfoSet.size());
std::transform (channelInfoSet.begin(),
channelInfoSet.end(),
channelInfo.begin(),
[] (auto x) { return x.makeChannelInfo(); });
#endif
AddPropertyListener (kAudioUnitProperty_ContextName, auPropertyListenerDispatcher, this);

View file

@ -194,7 +194,13 @@ public:
channelInfos.add (channelInfo);
}
#else
Array<AUChannelInfo> channelInfos = AudioUnitHelpers::getAUChannelInfo (processor);
auto channelInfoSet = AudioUnitHelpers::getAUChannelInfo (processor);
Array<AUChannelInfo> channelInfos;
channelInfos.resize ((int) channelInfoSet.size());
std::transform (channelInfoSet.begin(),
channelInfoSet.end(),
channelInfos.begin(),
[] (auto x) { return x.makeChannelInfo(); });
#endif
processor.setPlayHead (this);

View file

@ -32,6 +32,8 @@
==============================================================================
*/
#pragma once
/** @cond */
// This macro can be set if you need to override this internal name for some reason..
#ifndef JUCE_STATE_DICTIONARY_KEY
@ -357,7 +359,40 @@ struct AudioUnitHelpers
return false;
}
static Array<AUChannelInfo> getAUChannelInfo (const AudioProcessor& processor)
struct Channels
{
SInt16 ins, outs;
std::pair<SInt16, SInt16> makePair() const noexcept { return std::make_pair (ins, outs); }
AUChannelInfo makeChannelInfo() const noexcept { return { ins, outs }; }
bool operator< (const Channels& other) const noexcept { return makePair() < other.makePair(); }
bool operator== (const Channels& other) const noexcept { return makePair() == other.makePair(); }
// The 'standard' layout with the most channels defined is AudioChannelSet::create9point1point6().
// This value should be updated if larger standard channel layouts are added in the future.
static constexpr auto maxNumChanToCheckFor = 16;
};
/* Removes non-wildcard layouts that are already included by other wildcard layouts.
*/
static void removeNonWildcardLayouts (std::set<Channels>& layouts)
{
for (auto it = layouts.begin(); it != layouts.end();)
{
if ((it->ins != -1 && layouts.find ({ -1, it->outs }) != layouts.end())
|| (it->outs != -1 && layouts.find ({ it->ins, -1 }) != layouts.end()))
{
it = layouts.erase (it);
}
else
{
++it;
}
}
}
static std::set<Channels> getAUChannelInfo (const AudioProcessor& processor)
{
#ifdef JucePlugin_AUMainType
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wfour-char-constants")
@ -366,140 +401,130 @@ struct AudioUnitHelpers
// A MIDI effect requires an output bus in order to determine the sample rate.
// No audio will be written to the output bus, so it can have any number of channels.
// No input bus is required.
return { AUChannelInfo { 0, -1 } };
return { Channels { 0, -1 } };
}
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
#endif
Array<AUChannelInfo> channelInfo;
const auto defaultInputs = processor.getChannelCountOfBus (true, 0);
const auto defaultOutputs = processor.getChannelCountOfBus (false, 0);
const auto hasMainInputBus = (AudioUnitHelpers::getBusCountForWrapper (processor, true) > 0);
const auto hasMainOutputBus = (AudioUnitHelpers::getBusCountForWrapper (processor, false) > 0);
auto hasMainInputBus = (AudioUnitHelpers::getBusCountForWrapper (processor, true) > 0);
auto hasMainOutputBus = (AudioUnitHelpers::getBusCountForWrapper (processor, false) > 0);
auto layout = processor.getBusesLayout();
// The 'standard' layout with the most channels defined is AudioChannelSet::create9point1point6().
// This value should be updated if larger standard channel layouts are added in the future.
constexpr auto maxNumChanToCheckFor = 16;
auto defaultInputs = processor.getChannelCountOfBus (true, 0);
auto defaultOutputs = processor.getChannelCountOfBus (false, 0);
struct Channels
{
SInt16 ins, outs;
std::pair<SInt16, SInt16> makePair() const noexcept { return std::make_pair (ins, outs); }
bool operator< (const Channels& other) const noexcept { return makePair() < other.makePair(); }
bool operator== (const Channels& other) const noexcept { return makePair() == other.makePair(); }
};
SortedSet<Channels> supportedChannels;
std::set<Channels> supportedChannels;
// add the current configuration
if (defaultInputs != 0 || defaultOutputs != 0)
supportedChannels.add ({ static_cast<SInt16> (defaultInputs),
static_cast<SInt16> (defaultOutputs) });
supportedChannels.insert ({ static_cast<SInt16> (defaultInputs),
static_cast<SInt16> (defaultOutputs) });
for (auto inChanNum = hasMainInputBus ? 1 : 0; inChanNum <= (hasMainInputBus ? maxNumChanToCheckFor : 0); ++inChanNum)
static const auto layoutsToTry = std::invoke ([&]
{
auto inLayout = layout;
std::vector<AudioChannelSet> sets;
if (auto* inBus = processor.getBus (true, 0))
if (! isNumberOfChannelsSupported (inBus, inChanNum, inLayout))
continue;
for (auto outChanNum = hasMainOutputBus ? 1 : 0; outChanNum <= (hasMainOutputBus ? maxNumChanToCheckFor : 0); ++outChanNum)
for (auto i = 1; i <= Channels::maxNumChanToCheckFor; ++i)
{
auto outLayout = inLayout;
const auto setsWithSizeI = AudioChannelSet::channelSetsWithNumberOfChannels (i);
std::copy (setsWithSizeI.begin(), setsWithSizeI.end(), std::back_inserter (sets));
}
if (auto* outBus = processor.getBus (false, 0))
if (! isNumberOfChannelsSupported (outBus, outChanNum, outLayout))
continue;
return sets;
});
supportedChannels.add ({ static_cast<SInt16> (hasMainInputBus ? outLayout.getMainInputChannels() : 0),
static_cast<SInt16> (hasMainOutputBus ? outLayout.getMainOutputChannels() : 0) });
std::vector<char> inputHasOutputRestrictions (layoutsToTry.size()), outputHasInputRestrictions (layoutsToTry.size());
for (const auto [inputIndex, inputLayout] : enumerate (layoutsToTry))
{
for (const auto [outputIndex, outputLayout] : enumerate (layoutsToTry))
{
auto copy = processor.getBusesLayout();
if (! copy.inputBuses.isEmpty())
copy.inputBuses.getReference (0) = inputLayout;
if (! copy.outputBuses.isEmpty())
copy.outputBuses.getReference (0) = outputLayout;
if (processor.checkBusesLayoutSupported (copy))
{
supportedChannels.insert ({ (SInt16) inputLayout.size(), (SInt16) outputLayout.size() });
}
else
{
inputHasOutputRestrictions[(size_t) inputIndex] = true;
outputHasInputRestrictions[(size_t) outputIndex] = true;
}
}
}
auto hasInOutMismatch = false;
static constexpr auto identity = [] (auto x) { return x; };
const auto noRestrictions = std::none_of (inputHasOutputRestrictions.begin(), inputHasOutputRestrictions.end(), identity)
&& std::none_of (outputHasInputRestrictions.begin(), outputHasInputRestrictions.end(), identity);
for (const auto& supported : supportedChannels)
if (noRestrictions)
{
if (supported.ins != supported.outs)
if (hasMainInputBus)
{
hasInOutMismatch = true;
break;
if (hasMainOutputBus)
return { Channels { -1, -2 } };
return { Channels { -1, 0 } };
}
return { Channels { 0, -1 } };
}
auto hasUnsupportedInput = ! hasMainInputBus, hasUnsupportedOutput = ! hasMainOutputBus;
for (auto inChanNum = hasMainInputBus ? 1 : 0; inChanNum <= (hasMainInputBus ? maxNumChanToCheckFor : 0); ++inChanNum)
const auto allMatchedLayoutsExclusivelySupported = std::invoke ([&]
{
Channels channelConfiguration { static_cast<SInt16> (inChanNum),
static_cast<SInt16> (hasInOutMismatch ? defaultOutputs : inChanNum) };
for (SInt16 i = 1; i <= Channels::maxNumChanToCheckFor; ++i)
if (supportedChannels.find ({ i, i }) == supportedChannels.end())
return false;
if (! supportedChannels.contains (channelConfiguration))
return std::all_of (supportedChannels.begin(), supportedChannels.end(), [] (auto x) { return x.ins == x.outs; });
});
if (allMatchedLayoutsExclusivelySupported)
return { Channels { -1, -1 } };
std::set<Channels> filteredChannels;
for (auto& c : supportedChannels)
{
const auto findDistance = [&] (auto channelCount)
{
hasUnsupportedInput = true;
break;
}
}
return std::distance (layoutsToTry.begin(),
std::lower_bound (layoutsToTry.begin(),
layoutsToTry.end(),
channelCount,
[] (auto a, auto b) { return a.size() < b; }));
};
for (auto outChanNum = hasMainOutputBus ? 1 : 0; outChanNum <= (hasMainOutputBus ? maxNumChanToCheckFor : 0); ++outChanNum)
{
Channels channelConfiguration { static_cast<SInt16> (hasInOutMismatch ? defaultInputs : outChanNum),
static_cast<SInt16> (outChanNum) };
if (! supportedChannels.contains (channelConfiguration))
const auto findChannelCount = [&] (auto& restrictions,
auto thisChannelCount,
auto otherChannelCount,
auto hasMainBus)
{
hasUnsupportedOutput = true;
break;
}
const auto lower = findDistance (otherChannelCount);
const auto upper = findDistance (otherChannelCount + 1);
const auto wildcard = std::all_of (restrictions.begin() + lower,
restrictions.begin() + upper,
identity)
? thisChannelCount
: (SInt16) -1;
return hasMainBus ? wildcard : (SInt16) 0;
};
const auto ins = findChannelCount (outputHasInputRestrictions, c.ins, c.outs, hasMainInputBus);
const auto outs = findChannelCount (inputHasOutputRestrictions, c.outs, c.ins, hasMainOutputBus);
const Channels layout { ins, outs };
filteredChannels.insert (layout == Channels { -1, -1 } ? c : layout);
}
for (const auto& supported : supportedChannels)
{
AUChannelInfo info;
removeNonWildcardLayouts (filteredChannels);
// see here: https://developer.apple.com/library/mac/documentation/MusicAudio/Conceptual/AudioUnitProgrammingGuide/TheAudioUnit/TheAudioUnit.html
info.inChannels = static_cast<SInt16> (hasMainInputBus ? (hasUnsupportedInput ? supported.ins : (hasInOutMismatch && (! hasUnsupportedOutput) ? -2 : -1)) : 0);
info.outChannels = static_cast<SInt16> (hasMainOutputBus ? (hasUnsupportedOutput ? supported.outs : (hasInOutMismatch && (! hasUnsupportedInput) ? -2 : -1)) : 0);
if (info.inChannels == -2 && info.outChannels == -2)
info.inChannels = -1;
int j;
for (j = 0; j < channelInfo.size(); ++j)
if (info.inChannels == channelInfo.getReference (j).inChannels
&& info.outChannels == channelInfo.getReference (j).outChannels)
break;
if (j >= channelInfo.size())
channelInfo.add (info);
}
return channelInfo;
}
static bool isNumberOfChannelsSupported (const AudioProcessor::Bus* b, int numChannels, AudioProcessor::BusesLayout& inOutCurrentLayout)
{
auto potentialSets = AudioChannelSet::channelSetsWithNumberOfChannels (static_cast<int> (numChannels));
for (auto set : potentialSets)
{
auto copy = inOutCurrentLayout;
if (b->isLayoutSupported (set, &copy))
{
inOutCurrentLayout = copy;
return true;
}
}
return false;
return filteredChannels;
}
//==============================================================================

View file

@ -1417,11 +1417,22 @@ public:
for (const auto metadata : midiMessages)
{
if (metadata.numBytes <= 3)
{
const auto getByteOrZero = [&metadata] (int index)
{
return index < metadata.numBytes ? metadata.data[index] : (uint8) 0;
};
MusicDeviceMIDIEvent (audioUnit,
metadata.data[0], metadata.data[1], metadata.data[2],
getByteOrZero (0),
getByteOrZero (1),
getByteOrZero (2),
(UInt32) metadata.samplePosition);
}
else
{
MusicDeviceSysEx (audioUnit, metadata.data, (UInt32) metadata.numBytes);
}
}
midiMessages.clear();

View file

@ -0,0 +1,308 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
#include "juce_AU_Shared.h"
namespace juce
{
class AudioUnitPluginFormatTests final : public UnitTest
{
public:
AudioUnitPluginFormatTests()
: UnitTest ("AU Hosting", UnitTestCategories::audioProcessors)
{
}
void runTest() override
{
beginTest ("Permissive audio processor produces layout [-1, -2]");
{
struct ProcA : public MockAudioProcessor
{
ProcA()
: MockAudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo())
.withOutput ("Output", AudioChannelSet::stereo())) {}
bool isBusesLayoutSupported (const BusesLayout&) const override
{
return true;
}
};
ProcA processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { -1, -2 } });
}
beginTest ("Audio processor with matched I/O produces layout [-1, -1]");
{
struct ProcB : public MockAudioProcessor
{
ProcB()
: MockAudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo())
.withOutput ("Output", AudioChannelSet::stereo())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
return l.getMainInputChannelSet() == l.getMainOutputChannelSet();
}
};
ProcB processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { -1, -1 } });
}
beginTest ("Audio processor that supports any input with a two-channel output produces layout [-1, 2]");
{
struct ProcC : public MockAudioProcessor
{
ProcC()
: MockAudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::stereo())
.withOutput ("Output", AudioChannelSet::stereo())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
return l.getMainOutputChannelSet() == AudioChannelSet::stereo();
}
};
ProcC processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { -1, 2 } });
}
beginTest ("Audio processor that supports any output with a 6-channel input produces layout [6, -1]");
{
struct ProcD : public MockAudioProcessor
{
ProcD()
: MockAudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::create5point1())
.withOutput ("Output", AudioChannelSet::create5point1())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
return l.getMainInputChannelSet() == AudioChannelSet::create5point1();
}
};
ProcD processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { 6, -1 } });
}
beginTest ("Audio processor that supports both above layouts produces [-1, 2] and [6, -1]");
{
struct ProcE : public MockAudioProcessor
{
ProcE()
: MockAudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::create5point1())
.withOutput ("Output", AudioChannelSet::stereo())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
return l.getMainOutputChannelSet() == AudioChannelSet::stereo()
|| l.getMainInputChannelSet() == AudioChannelSet::create5point1();
}
};
ProcE processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { -1, 2 },
AudioUnitHelpers::Channels { 6, -1 } });
}
beginTest ("Audio processor that supports only stereo and 5.1 produces [2, 2], [6, 6], [2, 6], and [6, 2]");
{
struct ProcF : public MockAudioProcessor
{
ProcF()
: MockAudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::create5point1())
.withOutput ("Output", AudioChannelSet::stereo())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
const std::array supported { AudioChannelSet::stereo(), AudioChannelSet::create5point1() };
return std::find (supported.begin(), supported.end(), l.getMainInputChannelSet()) != supported.end()
&& std::find (supported.begin(), supported.end(), l.getMainOutputChannelSet()) != supported.end();
}
};
ProcF processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { 2, 2 },
AudioUnitHelpers::Channels { 2, 6 },
AudioUnitHelpers::Channels { 6, 2 },
AudioUnitHelpers::Channels { 6, 6 } });
}
beginTest ("Complex layout is supported");
{
struct ProcG : public MockAudioProcessor
{
ProcG()
: MockAudioProcessor (BusesProperties().withInput ("Input", AudioChannelSet::create9point1point6())
.withOutput ("Output", AudioChannelSet::create9point1point6())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
using ACS = juce::AudioChannelSet;
const auto input = l.getMainInputChannelSet();
const auto output = l.getMainOutputChannelSet();
if (output == ACS::mono())
return input == ACS::mono();
if (output == ACS::stereo())
return input == ACS::mono() || input == ACS::stereo();
if (output == ACS::create9point1point6())
{
return input == ACS::mono()
|| input == ACS::stereo()
|| input == ACS::createLCR()
|| input == ACS::quadraphonic()
|| input == ACS::create5point0()
|| input == ACS::create5point1()
|| input == ACS::create7point0()
|| input == ACS::create7point1()
|| input == ACS::create7point0point2()
|| input == ACS::create5point1point4()
|| input == ACS::create7point0point4()
|| input == ACS::create7point1point4()
|| input == ACS::create7point0point6()
|| input == ACS::create7point1point6()
|| input == ACS::create9point0point6()
|| input == ACS::create9point1point6();
}
return false;
}
};
ProcG processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { 1, 1 },
AudioUnitHelpers::Channels { 1, 2 },
AudioUnitHelpers::Channels { 2, 2 },
AudioUnitHelpers::Channels { 1, 16 },
AudioUnitHelpers::Channels { 2, 16 },
AudioUnitHelpers::Channels { 3, 16 },
AudioUnitHelpers::Channels { 4, 16 },
AudioUnitHelpers::Channels { 5, 16 },
AudioUnitHelpers::Channels { 6, 16 },
AudioUnitHelpers::Channels { 7, 16 },
AudioUnitHelpers::Channels { 8, 16 },
AudioUnitHelpers::Channels { 9, 16 },
AudioUnitHelpers::Channels { 10, 16 },
AudioUnitHelpers::Channels { 11, 16 },
AudioUnitHelpers::Channels { 12, 16 },
AudioUnitHelpers::Channels { 13, 16 },
AudioUnitHelpers::Channels { 14, 16 },
AudioUnitHelpers::Channels { 15, 16 },
AudioUnitHelpers::Channels { 16, 16 } });
}
beginTest ("Audio processor that supports only stereo out reports [0, 2]");
{
struct ProcH : public MockAudioProcessor
{
ProcH()
: MockAudioProcessor (BusesProperties().withOutput ("Output", AudioChannelSet::stereo())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
return l.inputBuses.isEmpty() && l.getMainOutputChannelSet() == AudioChannelSet::stereo();
}
};
ProcH processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { 0, 2 } });
}
beginTest ("Audio processor that supports any out but no in reports [0, -1]");
{
struct ProcI : public MockAudioProcessor
{
ProcI()
: MockAudioProcessor (BusesProperties().withOutput ("Output", AudioChannelSet::stereo())) {}
bool isBusesLayoutSupported (const BusesLayout& l) const override
{
return l.inputBuses.isEmpty();
}
};
ProcI processor;
const auto layouts = AudioUnitHelpers::getAUChannelInfo (processor);
expect (layouts == std::set { AudioUnitHelpers::Channels { 0, -1 } });
}
}
private:
struct MockAudioProcessor : public AudioProcessor
{
using AudioProcessor::AudioProcessor;
const String getName() const override { return "Basic Processor"; }
double getTailLengthSeconds() const override { return {}; }
bool acceptsMidi() const override { return {}; }
bool producesMidi() const override { return {}; }
AudioProcessorEditor* createEditor() override { return {}; }
bool hasEditor() const override { return {}; }
int getNumPrograms() override { return 1; }
int getCurrentProgram() override { return {}; }
void setCurrentProgram (int) override {}
const String getProgramName (int) override { return {}; }
void changeProgramName (int, const String&) override {}
void getStateInformation (MemoryBlock&) override {}
void setStateInformation (const void*, int) override {}
void prepareToPlay (double, int) override {}
void releaseResources() override {}
bool supportsDoublePrecisionProcessing() const override { return {}; }
bool isMidiEffect() const override { return {}; }
void reset() override {}
void setNonRealtime (bool) noexcept override {}
void processBlock (AudioBuffer<float>&, MidiBuffer&) override {}
using AudioProcessor::processBlock;
};
};
static AudioUnitPluginFormatTests auPluginFormatTests;
} // namespace juce

View file

@ -40,29 +40,31 @@ JUCE_BEGIN_IGNORE_DEPRECATION_WARNINGS
class LegacyAudioParameter final : public HostedAudioProcessorParameter
{
public:
LegacyAudioParameter (AudioProcessor& audioProcessorToUse, int audioParameterIndex)
LegacyAudioParameter (AudioProcessorParameter::Listener& listener,
AudioProcessor& audioProcessorToUse,
int audioParameterIndex)
: processor (&audioProcessorToUse)
{
processor = &audioProcessorToUse;
parameterIndex = audioParameterIndex;
jassert (parameterIndex < processor->getNumParameters());
setOwner (&listener);
setParameterIndex (audioParameterIndex);
jassert (getParameterIndex() < processor->getNumParameters());
}
//==============================================================================
float getValue() const override { return processor->getParameter (parameterIndex); }
void setValue (float newValue) override { processor->setParameter (parameterIndex, newValue); }
float getDefaultValue() const override { return processor->getParameterDefaultValue (parameterIndex); }
String getName (int maxLen) const override { return processor->getParameterName (parameterIndex, maxLen); }
String getLabel() const override { return processor->getParameterLabel (parameterIndex); }
int getNumSteps() const override { return processor->getParameterNumSteps (parameterIndex); }
bool isDiscrete() const override { return processor->isParameterDiscrete (parameterIndex); }
float getValue() const override { return processor->getParameter (getParameterIndex()); }
void setValue (float newValue) override { processor->setParameter (getParameterIndex(), newValue); }
float getDefaultValue() const override { return processor->getParameterDefaultValue (getParameterIndex()); }
String getName (int maxLen) const override { return processor->getParameterName (getParameterIndex(), maxLen); }
String getLabel() const override { return processor->getParameterLabel (getParameterIndex()); }
int getNumSteps() const override { return processor->getParameterNumSteps (getParameterIndex()); }
bool isDiscrete() const override { return processor->isParameterDiscrete (getParameterIndex()); }
bool isBoolean() const override { return false; }
bool isOrientationInverted() const override { return processor->isParameterOrientationInverted (parameterIndex); }
bool isAutomatable() const override { return processor->isParameterAutomatable (parameterIndex); }
bool isMetaParameter() const override { return processor->isMetaParameter (parameterIndex); }
Category getCategory() const override { return processor->getParameterCategory (parameterIndex); }
String getCurrentValueAsText() const override { return processor->getParameterText (parameterIndex); }
String getParameterID() const override { return processor->getParameterID (parameterIndex); }
bool isOrientationInverted() const override { return processor->isParameterOrientationInverted (getParameterIndex()); }
bool isAutomatable() const override { return processor->isParameterAutomatable (getParameterIndex()); }
bool isMetaParameter() const override { return processor->isMetaParameter (getParameterIndex()); }
Category getCategory() const override { return processor->getParameterCategory (getParameterIndex()); }
String getCurrentValueAsText() const override { return processor->getParameterText (getParameterIndex()); }
String getParameterID() const override { return processor->getParameterID (getParameterIndex()); }
//==============================================================================
float getValueForText (const String&) const override
@ -85,22 +87,18 @@ public:
return (dynamic_cast<LegacyAudioParameter*> (param) != nullptr);
}
static int getParamIndex (AudioProcessor& processor, AudioProcessorParameter* param) noexcept
static int getParamIndex (AudioProcessor& proc, AudioProcessorParameter* param) noexcept
{
if (auto* legacy = dynamic_cast<LegacyAudioParameter*> (param))
{
return legacy->parameterIndex;
}
else
{
auto n = processor.getNumParameters();
jassert (n == processor.getParameters().size());
return legacy->getParameterIndex();
for (int i = 0; i < n; ++i)
{
if (processor.getParameters()[i] == param)
return i;
}
auto n = proc.getNumParameters();
jassert (n == proc.getParameters().size());
for (int i = 0; i < n; ++i)
{
if (proc.getParameters()[i] == param)
return i;
}
return -1;
@ -109,7 +107,7 @@ public:
static String getParamID (const AudioProcessorParameter* param, bool forceLegacyParamIDs) noexcept
{
if (auto* legacy = dynamic_cast<const LegacyAudioParameter*> (param))
return forceLegacyParamIDs ? String (legacy->parameterIndex) : legacy->getParameterID();
return forceLegacyParamIDs ? String (legacy->getParameterIndex()) : legacy->getParameterID();
if (auto* paramWithID = dynamic_cast<const HostedAudioProcessorParameter*> (param))
{
@ -122,6 +120,9 @@ public:
return {};
}
private:
AudioProcessor* processor = nullptr;
};
//==============================================================================
@ -139,6 +140,7 @@ public:
{
clear();
forwarder = AudioProcessor::ParameterChangeForwarder { &audioProcessor };
legacyParamIDs = forceLegacyParamIDs;
auto numParameters = audioProcessor.getNumParameters();
@ -151,7 +153,7 @@ public:
if (usingManagedParameters)
return audioProcessor.getParameters()[i];
auto newParam = std::make_unique<LegacyAudioParameter> (audioProcessor, i);
auto newParam = std::make_unique<LegacyAudioParameter> (forwarder, audioProcessor, i);
auto* result = newParam.get();
ownedGroup.addChild (std::move (newParam));
@ -167,6 +169,7 @@ public:
void clear()
{
forwarder = AudioProcessor::ParameterChangeForwarder { nullptr };
ownedGroup = AudioProcessorParameterGroup();
params.clear();
}
@ -215,6 +218,7 @@ private:
const AudioProcessorParameterGroup* processorGroup = nullptr;
AudioProcessorParameterGroup ownedGroup;
Array<AudioProcessorParameter*> params;
AudioProcessor::ParameterChangeForwarder forwarder { nullptr };
bool legacyParamIDs = false, usingManagedParameters = false;
};

View file

@ -246,7 +246,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
//==============================================================================
#if JucePlugin_Enable_ARA
#if JucePlugin_Enable_ARA || JUCE_PLUGINHOST_ARA
JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wpragma-pack")
#include <ARA_API/ARAVST3.h>
JUCE_END_IGNORE_WARNINGS_GCC_LIKE
@ -255,10 +255,12 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE
#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 // JucePlugin_Enable_ARA
#if ! JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY
DEF_CLASS_IID (ARA::IPlugInEntryPoint)
DEF_CLASS_IID (ARA::IPlugInEntryPoint2)
DEF_CLASS_IID (ARA::IMainFactory)
#endif
#endif // JucePlugin_Enable_ARA || JUCE_PLUGINHOST_ARA
//==============================================================================
#if JUCE_WINDOWS

View file

@ -184,7 +184,9 @@ private:
#include "format/juce_AudioPluginFormat.cpp"
#include "format/juce_AudioPluginFormatManager.cpp"
#include "format_types/juce_LegacyAudioParameter.cpp"
#include "processors/juce_AudioProcessorParameter.cpp"
#include "processors/juce_AudioProcessor.cpp"
#include "processors/juce_AudioProcessorListener.cpp"
#include "processors/juce_AudioPluginInstance.cpp"
#include "processors/juce_AudioProcessorEditor.cpp"
#include "processors/juce_AudioProcessorGraph.cpp"
@ -221,6 +223,10 @@ private:
#include "format_types/juce_VST3PluginFormat_test.cpp"
#endif
#if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS)
#include "format_types/juce_AudioUnitPluginFormat_test.cpp"
#endif
#if JUCE_PLUGINHOST_LV2 && (! (JUCE_ANDROID || JUCE_IOS))
#include "format_types/juce_LV2PluginFormat_test.cpp"
#endif

View file

@ -521,8 +521,8 @@ void AudioProcessor::addParameter (AudioProcessorParameter* param)
jassert (param != nullptr);
parameterTree.addChild (std::unique_ptr<AudioProcessorParameter> (param));
param->processor = this;
param->parameterIndex = flatParameterList.size();
param->setOwner (&parameterListener);
param->setParameterIndex (flatParameterList.size());
flatParameterList.add (param);
validateParameter (param);
@ -539,8 +539,8 @@ void AudioProcessor::addParameterGroup (std::unique_ptr<AudioProcessorParameterG
for (int i = oldSize; i < flatParameterList.size(); ++i)
{
auto p = flatParameterList.getUnchecked (i);
p->processor = this;
p->parameterIndex = i;
p->setOwner (&parameterListener);
p->setParameterIndex (i);
validateParameter (p);
}
@ -566,8 +566,8 @@ void AudioProcessor::setParameterTree (AudioProcessorParameterGroup&& newTree)
for (int i = 0; i < flatParameterList.size(); ++i)
{
auto p = flatParameterList.getUnchecked (i);
p->processor = this;
p->parameterIndex = i;
p->setOwner (&parameterListener);
p->setParameterIndex (i);
validateParameter (p);
}
@ -577,7 +577,7 @@ void AudioProcessor::refreshParameterList() {}
int AudioProcessor::getDefaultNumParameterSteps() noexcept
{
return 0x7fffffff;
return AudioProcessorParameter::getDefaultNumParameterSteps();
}
void AudioProcessor::suspendProcessing (const bool shouldBeSuspended)
@ -1278,97 +1278,6 @@ VST3ClientExtensions* AudioProcessor::getVST3ClientExtensions()
//==============================================================================
JUCE_BEGIN_IGNORE_DEPRECATION_WARNINGS
void AudioProcessor::setParameterNotifyingHost (int parameterIndex, float newValue)
{
if (auto* param = getParameters()[parameterIndex])
{
param->setValueNotifyingHost (newValue);
}
else if (isPositiveAndBelow (parameterIndex, getNumParameters()))
{
setParameter (parameterIndex, newValue);
sendParamChangeMessageToListeners (parameterIndex, newValue);
}
}
void AudioProcessor::sendParamChangeMessageToListeners (int parameterIndex, float newValue)
{
if (auto* param = getParameters()[parameterIndex])
{
param->sendValueChangedMessageToListeners (newValue);
}
else
{
if (isPositiveAndBelow (parameterIndex, getNumParameters()))
{
for (int i = listeners.size(); --i >= 0;)
if (auto* l = getListenerLocked (i))
l->audioProcessorParameterChanged (this, parameterIndex, newValue);
}
else
{
jassertfalse; // called with an out-of-range parameter index!
}
}
}
void AudioProcessor::beginParameterChangeGesture (int parameterIndex)
{
if (auto* param = getParameters()[parameterIndex])
{
param->beginChangeGesture();
}
else
{
if (isPositiveAndBelow (parameterIndex, getNumParameters()))
{
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This means you've called beginParameterChangeGesture twice in succession without a matching
// call to endParameterChangeGesture. That might be fine in most hosts, but better to avoid doing it.
jassert (! changingParams[parameterIndex]);
changingParams.setBit (parameterIndex);
#endif
for (int i = listeners.size(); --i >= 0;)
if (auto* l = getListenerLocked (i))
l->audioProcessorParameterChangeGestureBegin (this, parameterIndex);
}
else
{
jassertfalse; // called with an out-of-range parameter index!
}
}
}
void AudioProcessor::endParameterChangeGesture (int parameterIndex)
{
if (auto* param = getParameters()[parameterIndex])
{
param->endChangeGesture();
}
else
{
if (isPositiveAndBelow (parameterIndex, getNumParameters()))
{
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This means you've called endParameterChangeGesture without having previously called
// beginParameterChangeGesture. That might be fine in most hosts, but better to keep the
// calls matched correctly.
jassert (changingParams[parameterIndex]);
changingParams.clearBit (parameterIndex);
#endif
for (int i = listeners.size(); --i >= 0;)
if (auto* l = getListenerLocked (i))
l->audioProcessorParameterChangeGestureEnd (this, parameterIndex);
}
else
{
jassertfalse; // called with an out-of-range parameter index!
}
}
}
String AudioProcessor::getParameterName (int index, int maximumStringLength)
{
if (auto* p = getParameters()[index])
@ -1449,7 +1358,7 @@ int AudioProcessor::getParameterNumSteps (int index)
if (auto* p = getParameters()[index])
return p->getNumSteps();
return AudioProcessor::getDefaultNumParameterSteps();
return getDefaultNumParameterSteps();
}
bool AudioProcessor::isParameterDiscrete (int index) const
@ -1514,145 +1423,31 @@ AudioProcessorParameter* AudioProcessor::getParamChecked (int index) const
bool AudioProcessor::canAddBus ([[maybe_unused]] bool isInput) const { return false; }
bool AudioProcessor::canRemoveBus ([[maybe_unused]] bool isInput) const { return false; }
//==============================================================================
void AudioProcessor::ParameterChangeForwarder::parameterValueChanged (int index, float value)
{
if (owner == nullptr)
return;
for (int i = owner->listeners.size(); --i >= 0;)
if (auto* l = owner->listeners[i])
l->audioProcessorParameterChanged (owner, index, value);
}
void AudioProcessor::ParameterChangeForwarder::parameterGestureChanged (int index, bool begin)
{
if (owner == nullptr)
return;
const auto callback = begin
? &AudioProcessorListener::audioProcessorParameterChangeGestureBegin
: &AudioProcessorListener::audioProcessorParameterChangeGestureEnd;
for (int i = owner->listeners.size(); --i >= 0;)
if (auto* l = owner->listeners[i])
(l->*callback) (owner, index);
}
JUCE_END_IGNORE_DEPRECATION_WARNINGS
//==============================================================================
void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {}
void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {}
//==============================================================================
AudioProcessorParameter::~AudioProcessorParameter()
{
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This will fail if you've called beginChangeGesture() without having made
// a corresponding call to endChangeGesture...
jassert (! isPerformingGesture);
#endif
}
void AudioProcessorParameter::setValueNotifyingHost (float newValue)
{
setValue (newValue);
sendValueChangedMessageToListeners (newValue);
}
void AudioProcessorParameter::beginChangeGesture()
{
// This method can't be used until the parameter has been attached to a processor!
jassert (processor != nullptr && parameterIndex >= 0);
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This means you've called beginChangeGesture twice in succession without
// a matching call to endChangeGesture. That might be fine in most hosts,
// but it would be better to avoid doing it.
jassert (! isPerformingGesture);
isPerformingGesture = true;
#endif
ScopedLock lock (listenerLock);
for (int i = listeners.size(); --i >= 0;)
if (auto* l = listeners[i])
l->parameterGestureChanged (getParameterIndex(), true);
if (processor != nullptr && parameterIndex >= 0)
{
// audioProcessorParameterChangeGestureBegin callbacks will shortly be deprecated and
// this code will be removed.
for (int i = processor->listeners.size(); --i >= 0;)
if (auto* l = processor->listeners[i])
l->audioProcessorParameterChangeGestureBegin (processor, getParameterIndex());
}
}
void AudioProcessorParameter::endChangeGesture()
{
// This method can't be used until the parameter has been attached to a processor!
jassert (processor != nullptr && parameterIndex >= 0);
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This means you've called endChangeGesture without having previously
// called beginChangeGesture. That might be fine in most hosts, but it
// would be better to keep the calls matched correctly.
jassert (isPerformingGesture);
isPerformingGesture = false;
#endif
ScopedLock lock (listenerLock);
for (int i = listeners.size(); --i >= 0;)
if (auto* l = listeners[i])
l->parameterGestureChanged (getParameterIndex(), false);
if (processor != nullptr && parameterIndex >= 0)
{
// audioProcessorParameterChangeGestureEnd callbacks will shortly be deprecated and
// this code will be removed.
for (int i = processor->listeners.size(); --i >= 0;)
if (auto* l = processor->listeners[i])
l->audioProcessorParameterChangeGestureEnd (processor, getParameterIndex());
}
}
void AudioProcessorParameter::sendValueChangedMessageToListeners (float newValue)
{
ScopedLock lock (listenerLock);
for (int i = listeners.size(); --i >= 0;)
if (auto* l = listeners [i])
l->parameterValueChanged (getParameterIndex(), newValue);
if (processor != nullptr && parameterIndex >= 0)
{
// audioProcessorParameterChanged callbacks will shortly be deprecated and
// this code will be removed.
for (int i = processor->listeners.size(); --i >= 0;)
if (auto* l = processor->listeners[i])
l->audioProcessorParameterChanged (processor, getParameterIndex(), newValue);
}
}
bool AudioProcessorParameter::isOrientationInverted() const { return false; }
bool AudioProcessorParameter::isAutomatable() const { return true; }
bool AudioProcessorParameter::isMetaParameter() const { return false; }
AudioProcessorParameter::Category AudioProcessorParameter::getCategory() const { return genericParameter; }
int AudioProcessorParameter::getNumSteps() const { return AudioProcessor::getDefaultNumParameterSteps(); }
bool AudioProcessorParameter::isDiscrete() const { return false; }
bool AudioProcessorParameter::isBoolean() const { return false; }
String AudioProcessorParameter::getText (float value, int /*maximumStringLength*/) const
{
return String (value, 2);
}
String AudioProcessorParameter::getCurrentValueAsText() const
{
return getText (getValue(), 1024);
}
StringArray AudioProcessorParameter::getAllValueStrings() const
{
if (isDiscrete() && valueStrings.isEmpty())
{
auto maxIndex = getNumSteps() - 1;
for (int i = 0; i < getNumSteps(); ++i)
valueStrings.add (getText ((float) i / (float) maxIndex, 1024));
}
return valueStrings;
}
void AudioProcessorParameter::addListener (AudioProcessorParameter::Listener* newListener)
{
const ScopedLock sl (listenerLock);
listeners.addIfNotAlreadyThere (newListener);
}
void AudioProcessorParameter::removeListener (AudioProcessorParameter::Listener* listenerToRemove)
{
const ScopedLock sl (listenerLock);
listeners.removeFirstMatchingValue (listenerToRemove);
}
} // namespace juce

View file

@ -1483,9 +1483,6 @@ protected:
/** @internal */
std::atomic<AudioPlayHead*> playHead { nullptr };
/** @internal */
void sendParamChangeMessageToListeners (int parameterIndex, float newValue);
public:
/** @cond */
// These methods are all deprecated in favour of using AudioProcessorParameter
@ -1506,9 +1503,6 @@ public:
[[deprecated]] virtual bool isParameterAutomatable (int parameterIndex) const;
[[deprecated]] virtual bool isMetaParameter (int parameterIndex) const;
[[deprecated]] virtual AudioProcessorParameter::Category getParameterCategory (int parameterIndex) const;
[[deprecated]] void beginParameterChangeGesture (int parameterIndex);
[[deprecated]] void endParameterChangeGesture (int parameterIndex);
[[deprecated]] void setParameterNotifyingHost (int parameterIndex, float newValue);
// These functions are deprecated: your audio processor can inform the host
// on its bus and channel layouts and names using the AudioChannelSet and various bus classes.
@ -1522,6 +1516,31 @@ public:
[[deprecated]] virtual bool isOutputChannelStereoPair (int index) const;
/** @endcond */
/** @internal
Used to convert new-style per-parameter callbacks into old-style processor-change
callbacks.
This type will be removed in the future!
*/
class ParameterChangeForwarder : public AudioProcessorParameter::Listener
{
public:
explicit ParameterChangeForwarder (AudioProcessor* o) : owner (o) {}
ParameterChangeForwarder (const ParameterChangeForwarder& other) : owner (other.owner) {}
ParameterChangeForwarder& operator= (const ParameterChangeForwarder& other)
{
owner = other.owner;
return *this;
}
void parameterValueChanged (int, float) override;
void parameterGestureChanged (int, bool) override;
private:
AudioProcessor* owner = nullptr;
};
private:
//==============================================================================
struct InOutChannelPair
@ -1594,6 +1613,8 @@ private:
AudioProcessorParameterGroup parameterTree;
Array<AudioProcessorParameter*> flatParameterList;
ParameterChangeForwarder parameterListener { this };
AudioProcessorParameter* getParamChecked (int) const;
#if JUCE_DEBUG
@ -1621,7 +1642,6 @@ private:
template <typename floatType>
void processBypassed (AudioBuffer<floatType>&, MidiBuffer&);
friend class AudioProcessorParameter;
friend class LADSPAPluginInstance;
[[deprecated ("This method is no longer used - you can delete it from your AudioProcessor classes.")]]

View file

@ -36,6 +36,7 @@ namespace juce
{
class AudioProcessorEditorListener;
class AudioProcessor;
//==============================================================================
/**

View file

@ -0,0 +1,41 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
namespace juce
{
void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {}
void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {}
} // namespace juce

View file

@ -0,0 +1,171 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
namespace juce
{
AudioProcessorParameter::~AudioProcessorParameter()
{
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This will fail if you've called beginChangeGesture() without having made
// a corresponding call to endChangeGesture...
jassert (! isPerformingGesture);
#endif
}
void AudioProcessorParameter::setParameterIndex (int index) noexcept
{
jassert (parameterIndex < 0 && 0 <= index);
parameterIndex = index;
}
void AudioProcessorParameter::setOwner (Listener* listenerIn) noexcept
{
jassert (finalListener == nullptr);
finalListener = listenerIn;
}
void AudioProcessorParameter::setValueNotifyingHost (float newValue)
{
setValue (newValue);
sendValueChangedMessageToListeners (newValue);
}
void AudioProcessorParameter::beginChangeGesture()
{
// This method can't be used until the parameter has been attached to a processor!
jassert (parameterIndex >= 0);
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This means you've called beginChangeGesture twice in succession without
// a matching call to endChangeGesture. That might be fine in most hosts,
// but it would be better to avoid doing it.
jassert (! isPerformingGesture);
isPerformingGesture = true;
#endif
ScopedLock lock (listenerLock);
for (int i = listeners.size(); --i >= 0;)
if (auto* l = listeners[i])
l->parameterGestureChanged (getParameterIndex(), true);
if (finalListener != nullptr)
finalListener->parameterGestureChanged (getParameterIndex(), true);
}
void AudioProcessorParameter::endChangeGesture()
{
// This method can't be used until the parameter has been attached to a processor!
jassert (parameterIndex >= 0);
#if JUCE_DEBUG && ! JUCE_DISABLE_AUDIOPROCESSOR_BEGIN_END_GESTURE_CHECKING
// This means you've called endChangeGesture without having previously
// called beginChangeGesture. That might be fine in most hosts, but it
// would be better to keep the calls matched correctly.
jassert (isPerformingGesture);
isPerformingGesture = false;
#endif
ScopedLock lock (listenerLock);
for (int i = listeners.size(); --i >= 0;)
if (auto* l = listeners[i])
l->parameterGestureChanged (getParameterIndex(), false);
if (finalListener != nullptr)
finalListener->parameterGestureChanged (getParameterIndex(), false);
}
void AudioProcessorParameter::sendValueChangedMessageToListeners (float newValue)
{
ScopedLock lock (listenerLock);
for (int i = listeners.size(); --i >= 0;)
if (auto* l = listeners [i])
l->parameterValueChanged (getParameterIndex(), newValue);
if (finalListener != nullptr)
finalListener->parameterValueChanged (getParameterIndex(), newValue);
}
bool AudioProcessorParameter::isOrientationInverted() const { return false; }
bool AudioProcessorParameter::isAutomatable() const { return true; }
bool AudioProcessorParameter::isMetaParameter() const { return false; }
AudioProcessorParameter::Category AudioProcessorParameter::getCategory() const { return genericParameter; }
int AudioProcessorParameter::getNumSteps() const { return getDefaultNumParameterSteps(); }
bool AudioProcessorParameter::isDiscrete() const { return false; }
bool AudioProcessorParameter::isBoolean() const { return false; }
String AudioProcessorParameter::getText (float value, int /*maximumStringLength*/) const
{
return String (value, 2);
}
String AudioProcessorParameter::getCurrentValueAsText() const
{
return getText (getValue(), 1024);
}
StringArray AudioProcessorParameter::getAllValueStrings() const
{
if (isDiscrete() && valueStrings.isEmpty())
{
auto maxIndex = getNumSteps() - 1;
for (int i = 0; i < getNumSteps(); ++i)
valueStrings.add (getText ((float) i / (float) maxIndex, 1024));
}
return valueStrings;
}
void AudioProcessorParameter::addListener (AudioProcessorParameter::Listener* newListener)
{
const ScopedLock sl (listenerLock);
listeners.addIfNotAlreadyThere (newListener);
}
void AudioProcessorParameter::removeListener (AudioProcessorParameter::Listener* listenerToRemove)
{
const ScopedLock sl (listenerLock);
listeners.removeFirstMatchingValue (listenerToRemove);
}
int AudioProcessorParameter::getDefaultNumParameterSteps() noexcept
{
return 0x7fffffff;
}
} // namespace juce

View file

@ -35,8 +35,6 @@
namespace juce
{
class AudioProcessor;
//==============================================================================
/** An abstract base class for parameter objects that can be added to an
AudioProcessor.
@ -173,7 +171,7 @@ public:
/** Returns the number of steps that this parameter's range should be quantised into.
If you want a continuous range of values, don't override this method, and allow
the default implementation to return AudioProcessor::getDefaultNumParameterSteps().
the default implementation to return getDefaultNumParameterSteps().
If your parameter is boolean, then you may want to make this return 2.
@ -262,6 +260,12 @@ public:
/** Returns the index of this parameter in its parent processor's parameter list. */
int getParameterIndex() const noexcept { return parameterIndex; }
/** @internal
This should only be called by the owner of the parameter after it has been added to
a processor. Do not call this function; changing the parameter index *will* break things!
*/
void setParameterIndex (int) noexcept;
//==============================================================================
/** Returns the current value of the parameter as a String.
@ -332,6 +336,12 @@ public:
virtual void parameterGestureChanged (int parameterIndex, bool gestureIsStarting) = 0;
};
/** @internal
This should only be called by the owner of the parameter after it has been added to
a processor. Do not call this function; changing the owner *will* break things!
*/
void setOwner (Listener* listener) noexcept;
/** Registers a listener to receive events when the parameter's state changes.
If the listener is already registered, this will not register it again.
@ -349,15 +359,22 @@ public:
/** @internal */
void sendValueChangedMessageToListeners (float newValue);
/** Returns the default number of steps for a parameter.
NOTE! This method is deprecated! It's recommended that you use
AudioProcessorParameter::getNumSteps() instead.
@see getParameterNumSteps
*/
static int getDefaultNumParameterSteps() noexcept;
private:
//==============================================================================
friend class AudioProcessor;
friend class LegacyAudioParameter;
AudioProcessor* processor = nullptr;
int parameterIndex = -1;
int version = 0;
CriticalSection listenerLock;
Array<Listener*> listeners;
Listener* finalListener = nullptr;
mutable StringArray valueStrings;
#if JUCE_DEBUG

View file

@ -42,7 +42,7 @@ int RangedAudioParameter::getNumSteps() const
if (range.interval > 0)
return (static_cast<int> ((range.end - range.start) / range.interval) + 1);
return AudioProcessor::getDefaultNumParameterSteps();
return getDefaultNumParameterSteps();
}
float RangedAudioParameter::convertTo0to1 (float v) const noexcept

View file

@ -0,0 +1,63 @@
/*
==============================================================================
This file is part of the JUCE framework.
Copyright (c) Raw Material Software Limited
JUCE is an open source framework subject to commercial or open source
licensing.
By downloading, installing, or using the JUCE framework, or combining the
JUCE framework with any other source code, object code, content or any other
copyrightable work, you agree to the terms of the JUCE End User Licence
Agreement, and all incorporated terms including the JUCE Privacy Policy and
the JUCE Website Terms of Service, as applicable, which will bind you. If you
do not agree to the terms of these agreements, we will not license the JUCE
framework to you, and you must discontinue the installation or download
process and cease use of the JUCE framework.
JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
JUCE Privacy Policy: https://juce.com/juce-privacy-policy
JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
Or:
You may also use this code under the terms of the AGPLv3:
https://www.gnu.org/licenses/agpl-3.0.en.html
THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
==============================================================================
*/
package com.rmsl.juce;
import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
public class JuceActivityCallbacksBase implements Application.ActivityLifecycleCallbacks
{
@Override
public void onActivityCreated (Activity activity, Bundle savedInstanceState) {}
@Override
public void onActivityStarted (Activity activity) {}
@Override
public void onActivityResumed (Activity activity) {}
@Override
public void onActivityPaused (Activity activity) {}
@Override
public void onActivityStopped (Activity activity) {}
@Override
public void onActivitySaveInstanceState (Activity activity, Bundle outState) {}
@Override
public void onActivityDestroyed (Activity activity) {}
}

View file

@ -38,35 +38,35 @@ import java.lang.reflect.*;
public class JuceInvocationHandler implements InvocationHandler
{
public JuceInvocationHandler (long nativeContextRef)
{
nativeContext = nativeContextRef;
}
public JuceInvocationHandler (long nativeContextRef)
{
nativeContext = nativeContextRef;
}
public void clear()
{
nativeContext = 0;
}
public void clear()
{
nativeContext = 0;
}
@Override
public void finalize()
{
if (nativeContext != 0)
dispatchFinalize (nativeContext);
}
@Override
public void finalize()
{
if (nativeContext != 0)
dispatchFinalize (nativeContext);
}
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable
{
if (nativeContext != 0)
return dispatchInvoke (nativeContext, proxy, method, args);
@Override
public Object invoke (Object proxy, Method method, Object[] args) throws Throwable
{
if (nativeContext != 0)
return dispatchInvoke (nativeContext, proxy, method, args);
return null;
}
return null;
}
//==============================================================================
private long nativeContext = 0;
//==============================================================================
private long nativeContext = 0;
private native void dispatchFinalize (long nativeContextRef);
private native Object dispatchInvoke (long nativeContextRef, Object proxy, Method method, Object[] args);
private native void dispatchFinalize (long nativeContextRef);
private native Object dispatchInvoke (long nativeContextRef, Object proxy, Method method, Object[] args);
}

View file

@ -36,29 +36,142 @@ namespace juce
{
//==============================================================================
static const uint8 invocationHandleByteCode[] =
{31,139,8,8,215,115,161,94,0,3,105,110,118,111,99,97,116,105,111,110,72,97,110,100,108,101,66,121,116,101,67,111,100,101,46,
100,101,120,0,109,148,65,107,19,65,20,199,223,236,78,146,90,211,116,77,141,214,88,33,151,130,7,117,91,172,80,73,17,161,32,53,93,
17,108,233,65,5,217,38,155,102,219,237,110,220,108,99,172,8,173,40,42,244,36,245,226,65,232,165,138,7,15,226,65,193,147,120,244,
166,130,95,192,155,23,189,21,68,252,207,206,180,137,218,133,223,204,155,247,222,206,123,111,119,230,85,156,86,247,208,201,
83,84,121,127,155,63,122,245,209,24,205,141,63,156,124,186,176,229,110,12,151,158,157,126,219,76,39,136,234,68,212,154,25,201,
146,122,38,56,81,158,164,126,15,248,10,160,162,95,128,129,99,24,82,152,71,152,92,123,24,86,116,162,53,204,203,26,209,29,112,
15,108,128,231,224,37,248,2,126,128,4,252,6,192,56,184,6,102,65,21,220,2,171,224,1,120,2,94,128,215,224,29,248,0,62,129,111,224,
59,248,169,203,184,72,157,146,36,115,233,82,185,118,131,189,160,7,232,138,171,154,204,95,200,53,77,218,83,170,214,180,146,
35,77,238,153,139,107,212,99,27,35,141,122,213,218,80,181,239,83,250,108,60,51,234,139,247,213,148,191,68,188,61,13,149,208,142,
97,24,228,180,99,63,194,69,206,122,44,111,233,50,223,186,33,52,7,32,93,30,2,35,68,25,229,1,95,46,235,140,173,5,97,17,107,153,
97,154,203,245,212,89,216,17,103,24,33,71,81,141,88,215,135,52,226,44,131,90,121,252,141,250,184,172,109,170,222,233,219,67,83,
33,234,191,158,186,155,122,156,218,108,38,69,212,52,106,204,210,209,223,180,243,48,53,139,60,214,88,251,219,203,178,116,236,
223,165,190,117,50,254,15,42,243,49,215,119,163,51,196,74,148,47,45,149,157,243,126,51,40,219,145,27,248,19,182,95,241,156,240,
196,188,221,180,41,97,149,44,203,34,110,137,113,208,42,7,139,102,184,216,240,204,121,188,98,238,250,94,145,242,86,197,246,154,
238,130,105,251,126,16,197,54,115,186,22,6,55,26,69,202,90,98,91,211,179,253,57,243,226,236,188,83,142,138,148,235,208,197,126,
246,172,231,20,17,173,173,14,157,170,7,95,115,215,104,255,187,93,112,162,90,80,41,18,155,33,109,166,68,125,87,118,137,202,237,
112,174,65,137,178,231,216,33,25,21,183,81,183,163,114,237,156,235,219,158,187,236,80,102,91,35,66,46,56,212,85,221,182,36,93,
169,73,46,198,81,168,199,71,66,77,103,60,240,35,167,21,145,241,215,242,146,83,165,68,61,12,90,55,137,71,53,23,1,155,182,183,
132,237,216,193,84,70,203,23,181,185,210,113,156,146,84,102,146,246,99,188,127,153,14,235,253,185,94,72,155,164,105,236,208,0,
235,231,196,116,113,134,87,87,248,186,174,225,246,50,1,123,163,235,236,179,206,216,138,248,207,198,63,103,65,204,219,61,66,235,
232,19,122,71,175,224,29,253,34,65,237,158,145,164,118,223,208,13,41,199,231,170,32,223,89,23,62,5,169,23,247,135,25,82,31,223,
169,130,140,43,250,140,174,252,197,61,226,133,246,253,34,37,15,170,196,133,44,122,218,31,165,24,139,249,12,5,0,0,0,0};
constexpr uint8 invocationHandleByteCode[]
{
0x1f, 0x8b, 0x08, 0x08, 0xa2, 0x70, 0x87, 0x68, 0x00, 0x03, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x6d, 0x94,
0xbd, 0x6f, 0xd3, 0x40, 0x14, 0xc0, 0xdf, 0x9d, 0x9d, 0xa4, 0x94, 0x12,
0xd2, 0x0f, 0x10, 0x2a, 0x1d, 0x2a, 0x0b, 0x18, 0x50, 0xd2, 0x38, 0x25,
0x90, 0xa4, 0x29, 0x15, 0x12, 0x88, 0x8f, 0xca, 0x80, 0x44, 0xab, 0x0e,
0x05, 0x24, 0x2e, 0xf6, 0x85, 0xb8, 0x75, 0xec, 0x28, 0x4e, 0x43, 0xf8,
0xaa, 0x0a, 0x42, 0x65, 0xab, 0x58, 0x3a, 0x30, 0x20, 0x18, 0x58, 0x91,
0x18, 0xf8, 0x03, 0x90, 0x58, 0x40, 0x0c, 0xc0, 0xc6, 0x00, 0x13, 0x6c,
0x74, 0x64, 0x64, 0xe0, 0x9d, 0xef, 0x4a, 0x22, 0x51, 0x4b, 0xbf, 0xbb,
0xe7, 0xf7, 0xde, 0xbd, 0xf7, 0xee, 0xec, 0x7b, 0x0e, 0xef, 0xf4, 0x9b,
0xc7, 0x0a, 0xf0, 0xf0, 0xfb, 0xa7, 0x8d, 0xb7, 0x9b, 0xe6, 0x6b, 0x72,
0xee, 0xe9, 0x97, 0xe1, 0x1f, 0xfe, 0xe6, 0xc7, 0x5f, 0x3f, 0x7f, 0x7f,
0x7b, 0xf1, 0x31, 0x98, 0x8f, 0x01, 0x34, 0x00, 0xa0, 0xb3, 0x90, 0x1f,
0x02, 0xf5, 0x3c, 0xd1, 0x01, 0xf6, 0x83, 0xd4, 0xef, 0x42, 0xde, 0x23,
0xa8, 0x82, 0x2d, 0x84, 0x20, 0x63, 0x38, 0x24, 0x70, 0x3e, 0x44, 0xe4,
0xfb, 0x35, 0x1c, 0xbe, 0x6a, 0x00, 0xf7, 0x70, 0xbe, 0x42, 0x01, 0x16,
0x91, 0xeb, 0xc8, 0x6d, 0x64, 0x0d, 0x59, 0x47, 0x5e, 0x21, 0x1f, 0x90,
0xef, 0xc8, 0x6f, 0xe4, 0x20, 0xfa, 0x17, 0x90, 0x29, 0x64, 0x06, 0x99,
0x43, 0x16, 0x11, 0x4f, 0xc4, 0x41, 0xd6, 0x91, 0x0d, 0xe4, 0x19, 0xf2,
0x52, 0x93, 0x79, 0xb0, 0x54, 0x88, 0x83, 0xcc, 0xdd, 0xa7, 0x6a, 0xeb,
0x47, 0x76, 0x23, 0x7b, 0x10, 0x4d, 0x91, 0xa7, 0xb2, 0x5e, 0x21, 0x9f,
0xa2, 0xd2, 0x9e, 0x50, 0x7b, 0x1b, 0x50, 0xb2, 0x45, 0x65, 0xcc, 0xe1,
0x68, 0x4f, 0x5a, 0x64, 0x23, 0x40, 0x21, 0xa9, 0xde, 0xf7, 0xaa, 0xbd,
0xa6, 0x94, 0x7e, 0x30, 0x9a, 0x09, 0x0c, 0x45, 0x71, 0xa9, 0xf2, 0x97,
0x88, 0xd5, 0x69, 0x54, 0x09, 0x6d, 0x07, 0x13, 0x5f, 0xd2, 0x65, 0xae,
0x7e, 0xac, 0x42, 0xd4, 0x3b, 0x42, 0x65, 0x9e, 0x39, 0x86, 0xe7, 0x8a,
0xce, 0x39, 0x20, 0x5a, 0x11, 0xab, 0x4a, 0xdc, 0x48, 0x84, 0x89, 0x47,
0x89, 0xcd, 0x76, 0x5c, 0x44, 0x18, 0x48, 0x0c, 0x26, 0x86, 0x10, 0x11,
0x4f, 0x93, 0xe7, 0x4c, 0xe5, 0x7e, 0x1b, 0x29, 0x31, 0x2e, 0xa2, 0x2a,
0xa9, 0x2c, 0x00, 0x06, 0x95, 0xe7, 0x21, 0xbe, 0xd3, 0xe2, 0x38, 0x44,
0x75, 0xc7, 0xd4, 0x4e, 0x8e, 0x50, 0xb9, 0xcf, 0xb9, 0x53, 0x68, 0x47,
0x39, 0x47, 0x81, 0x16, 0x69, 0x0c, 0x1a, 0x26, 0x05, 0x9d, 0x24, 0xe1,
0xa4, 0x70, 0x4a, 0xbe, 0x83, 0xa3, 0x04, 0x92, 0xd3, 0x60, 0x42, 0x1a,
0x4e, 0x40, 0xf2, 0x71, 0xf7, 0x8c, 0x65, 0xf9, 0x1a, 0xe6, 0xee, 0x53,
0x67, 0x1a, 0x8f, 0xce, 0x5b, 0x66, 0x8e, 0x4f, 0xbb, 0xbe, 0xdb, 0x9a,
0x01, 0x32, 0x0b, 0xa3, 0xb3, 0x2b, 0x36, 0xbf, 0xe0, 0xb7, 0x03, 0x9b,
0xb5, 0xdc, 0xc0, 0x3f, 0xcf, 0x7c, 0xc7, 0xe3, 0xcd, 0x89, 0x25, 0xd6,
0x66, 0x10, 0xb3, 0x66, 0x2d, 0xcb, 0x02, 0xdd, 0x12, 0xe3, 0x61, 0xcb,
0x0e, 0xea, 0xd9, 0x66, 0x3d, 0xf4, 0xb2, 0x4b, 0xb8, 0x24, 0xbb, 0xe3,
0xba, 0x32, 0x8c, 0x5a, 0x0e, 0xf3, 0xda, 0xee, 0x72, 0x96, 0xf9, 0x7e,
0xd0, 0x8a, 0x6c, 0xd9, 0xf9, 0x5a, 0x33, 0xb8, 0x15, 0x96, 0x61, 0xc8,
0x12, 0x61, 0xb3, 0x1e, 0xf3, 0x6f, 0x66, 0x2f, 0x57, 0x96, 0xb8, 0xdd,
0x2a, 0xc3, 0xbe, 0x1e, 0x5d, 0xe4, 0xc7, 0x2a, 0x1e, 0x2f, 0x63, 0xb6,
0xae, 0xba, 0xc9, 0xab, 0x1e, 0xfa, 0x66, 0x77, 0xcc, 0xf6, 0xbf, 0xdb,
0x45, 0xde, 0xaa, 0x05, 0x4e, 0x19, 0xc8, 0x02, 0xd0, 0x85, 0x59, 0x18,
0xbe, 0xba, 0x43, 0xd6, 0x98, 0xed, 0x71, 0xd6, 0x84, 0x94, 0xe3, 0x86,
0x0d, 0xd6, 0xb2, 0x6b, 0x67, 0x5d, 0x9f, 0x79, 0xee, 0x1d, 0x0e, 0xc9,
0x6d, 0x8d, 0x48, 0xb6, 0xcc, 0xa1, 0xaf, 0xba, 0x6d, 0x89, 0xbb, 0x52,
0xb3, 0xc7, 0xc7, 0x12, 0xda, 0xfc, 0x74, 0xe0, 0xb7, 0x78, 0xa7, 0x05,
0xb1, 0x36, 0xf3, 0x56, 0x38, 0x3c, 0x27, 0xab, 0xab, 0x67, 0x8a, 0x77,
0x8d, 0x0a, 0xb3, 0x97, 0xb9, 0xef, 0x18, 0x53, 0x86, 0xc3, 0x3b, 0x46,
0xda, 0xc0, 0x33, 0x6b, 0xb8, 0x5e, 0x54, 0x74, 0xa6, 0x1e, 0x38, 0x1c,
0x0d, 0x4d, 0x8e, 0xb9, 0x43, 0x8e, 0xc6, 0x1a, 0x0b, 0x33, 0x76, 0x8d,
0xdb, 0xcb, 0xe1, 0x4a, 0x3d, 0x34, 0xa6, 0xaa, 0xcc, 0x0b, 0x79, 0xda,
0xa8, 0xbb, 0x7e, 0x86, 0x35, 0x5c, 0x63, 0x6a, 0x32, 0x9f, 0x36, 0xc2,
0x1a, 0xcb, 0xe4, 0x70, 0x11, 0x2b, 0x30, 0x27, 0x57, 0x64, 0x05, 0x33,
0x7f, 0xc2, 0xac, 0x14, 0x4a, 0x25, 0xc7, 0xcc, 0x17, 0x27, 0x79, 0xbe,
0x54, 0xb0, 0x73, 0x66, 0x89, 0x15, 0x8e, 0x57, 0xaa, 0x85, 0x6a, 0x29,
0xe7, 0x88, 0xa8, 0x6d, 0xde, 0x0c, 0x31, 0x1d, 0x2e, 0x2a, 0x4e, 0xe4,
0xcc, 0x89, 0x52, 0xc6, 0xe1, 0x6d, 0xe3, 0x3e, 0x50, 0x4a, 0x46, 0xc6,
0xc8, 0x01, 0x1d, 0x7f, 0x5c, 0xf1, 0xf3, 0x3f, 0x58, 0xd3, 0xdf, 0x68,
0xf4, 0x21, 0x05, 0x22, 0x20, 0x9f, 0x35, 0x8d, 0x6c, 0x69, 0x84, 0xfc,
0x51, 0x77, 0xea, 0xac, 0x0e, 0xff, 0x1e, 0xa2, 0x66, 0xf1, 0x5f, 0x35,
0x74, 0x79, 0x9f, 0x7a, 0xf5, 0x04, 0xba, 0xbd, 0x86, 0xf6, 0xf4, 0x1b,
0xad, 0xa7, 0xe7, 0xe8, 0x3d, 0x7d, 0x27, 0x06, 0xdd, 0xde, 0x13, 0x87,
0x6e, 0xff, 0x21, 0xe3, 0xd2, 0x4f, 0xf4, 0x20, 0x4d, 0xc9, 0xe2, 0xde,
0x91, 0x94, 0x94, 0xa3, 0xfb, 0x39, 0x2e, 0x73, 0x89, 0x1e, 0xa5, 0x8f,
0xf7, 0xd4, 0xaa, 0x64, 0x71, 0x6f, 0xb5, 0x94, 0x94, 0x45, 0xad, 0x71,
0xa5, 0x17, 0x77, 0x1a, 0x94, 0x5e, 0xf4, 0xc6, 0xbf, 0x68, 0xe3, 0xb4,
0x6f, 0x54, 0x05, 0x00, 0x00
};
constexpr uint8 activityCallbacksByteCode[]
{
0x1f, 0x8b, 0x08, 0x08, 0x70, 0x70, 0x87, 0x68, 0x00, 0x03, 0x63, 0x6c,
0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x9d, 0x94,
0x41, 0x68, 0x13, 0x41, 0x14, 0x86, 0xdf, 0x6c, 0xd2, 0x56, 0x6b, 0xac,
0xb1, 0x15, 0x0f, 0x2a, 0x52, 0x96, 0x5e, 0x02, 0x49, 0x36, 0xa9, 0xd1,
0x4d, 0x9a, 0xa2, 0x58, 0x73, 0x51, 0x16, 0x2a, 0x16, 0x72, 0x2a, 0xc8,
0x64, 0x77, 0x62, 0x36, 0xdd, 0xec, 0x2e, 0x3b, 0x9b, 0xd0, 0x22, 0x96,
0x56, 0x3c, 0xa8, 0x07, 0x0f, 0x0a, 0x9e, 0x04, 0xa1, 0x17, 0xaf, 0x1e,
0xbd, 0x0a, 0x1e, 0x3d, 0x88, 0x20, 0x88, 0x78, 0xf0, 0x24, 0x08, 0x7a,
0x91, 0x82, 0x37, 0xf1, 0xcd, 0xee, 0x6c, 0x92, 0x1e, 0xbc, 0x74, 0xc2,
0x97, 0x99, 0xf9, 0xe7, 0xbd, 0x37, 0x6f, 0x96, 0x99, 0x67, 0xb1, 0xcd,
0xe9, 0xd2, 0x05, 0x1d, 0xde, 0x7f, 0xf9, 0xf4, 0x68, 0xf6, 0xf1, 0xce,
0xf4, 0x46, 0xb7, 0xff, 0x67, 0xef, 0xf6, 0xae, 0xf1, 0xf6, 0xc9, 0xb3,
0xc6, 0xf3, 0xd5, 0xdc, 0xde, 0xb7, 0x34, 0x80, 0x0f, 0x00, 0x9b, 0xcd,
0xca, 0x2c, 0xc8, 0x66, 0xa0, 0x26, 0x26, 0x42, 0x9f, 0x44, 0xde, 0x20,
0x29, 0xe4, 0x03, 0x8c, 0xda, 0x51, 0x64, 0x1f, 0x21, 0xc8, 0x32, 0xfe,
0x3d, 0x40, 0x83, 0x75, 0xec, 0xcf, 0x29, 0x00, 0x0b, 0x48, 0x03, 0x59,
0x47, 0x9e, 0x22, 0xaf, 0x90, 0x8f, 0xc8, 0x77, 0xe4, 0x07, 0xf2, 0x0b,
0xf9, 0x8d, 0x4c, 0xa0, 0xcf, 0x19, 0x24, 0x8f, 0x5c, 0x11, 0xfe, 0x88,
0x87, 0xdc, 0x47, 0x14, 0xb9, 0x27, 0xa6, 0x02, 0x13, 0x32, 0x8f, 0x29,
0xc9, 0x84, 0xcc, 0xe1, 0x88, 0x1c, 0x67, 0x94, 0x38, 0x1f, 0x31, 0x3e,
0xa5, 0xc4, 0x7e, 0x10, 0xf9, 0x2b, 0x30, 0x1d, 0xf5, 0x04, 0x8e, 0xc9,
0x3e, 0x23, 0xfb, 0xe3, 0x72, 0x7d, 0x46, 0xce, 0x4f, 0xc8, 0x3e, 0x2b,
0xf7, 0x04, 0xb9, 0x3f, 0x91, 0xf3, 0xb4, 0x12, 0x8f, 0x45, 0x5b, 0x90,
0x06, 0x24, 0xfa, 0x01, 0xfc, 0x25, 0xb1, 0x8d, 0x9f, 0x15, 0x19, 0xcd,
0xa0, 0x5f, 0x92, 0x41, 0xec, 0x23, 0xf6, 0x50, 0xa2, 0x13, 0x1d, 0x4e,
0x3b, 0x7c, 0xbc, 0x5c, 0xa4, 0x93, 0x31, 0x00, 0x40, 0x5a, 0x29, 0x30,
0xb9, 0x6c, 0xbb, 0x76, 0x78, 0x19, 0xce, 0xdf, 0xe8, 0x9b, 0xec, 0xaa,
0x19, 0xda, 0x03, 0x3b, 0xdc, 0xba, 0x46, 0x1d, 0xa7, 0x45, 0xcd, 0x0d,
0xbe, 0x42, 0x39, 0x2b, 0x76, 0xe9, 0x80, 0xc2, 0x69, 0x83, 0xba, 0x56,
0xe0, 0xd9, 0x96, 0x46, 0x7d, 0x5f, 0x4b, 0x0c, 0xeb, 0x50, 0x39, 0xa8,
0xfb, 0xbe, 0x63, 0x9b, 0x34, 0xb4, 0x3d, 0x77, 0x21, 0xb1, 0x31, 0xec,
0x36, 0x33, 0xb7, 0x4c, 0x87, 0x0d, 0xa3, 0xd6, 0x61, 0x6e, 0xe8, 0xe5,
0x71, 0x6d, 0xa5, 0xef, 0x5a, 0x0e, 0xab, 0x43, 0xce, 0x30, 0xbd, 0x9e,
0x16, 0xf4, 0xb8, 0xa3, 0x75, 0x31, 0x19, 0xed, 0xbf, 0x19, 0xd5, 0x61,
0xd6, 0x10, 0x49, 0x69, 0x0e, 0x75, 0xef, 0x68, 0xab, 0xad, 0x2e, 0x33,
0xc3, 0x3a, 0x90, 0x26, 0x28, 0x4d, 0x03, 0x52, 0x4d, 0xc3, 0x80, 0x93,
0x9e, 0x3b, 0xf4, 0x0c, 0x18, 0x0d, 0x99, 0x05, 0x73, 0x23, 0xa9, 0xc1,
0x78, 0x18, 0x78, 0x5b, 0x28, 0x66, 0x47, 0xe2, 0x4d, 0xda, 0xe7, 0xa8,
0x8c, 0x79, 0xde, 0x62, 0xbc, 0xdf, 0x43, 0xe9, 0xec, 0x48, 0x5a, 0xa3,
0x03, 0x76, 0xdd, 0xe5, 0x21, 0x75, 0x4d, 0xb6, 0x16, 0x62, 0xdc, 0x71,
0x7b, 0x14, 0x82, 0xf0, 0x60, 0x88, 0xb5, 0xd0, 0xf3, 0x7d, 0x94, 0x5e,
0x92, 0xed, 0xed, 0x46, 0xf5, 0xae, 0x2a, 0x8e, 0xc0, 0x5c, 0x4b, 0x5d,
0x52, 0x2d, 0xb6, 0xa9, 0xe6, 0x55, 0x3c, 0xb0, 0x6f, 0x3b, 0xd1, 0xf7,
0x2a, 0xf4, 0x3c, 0x8b, 0xe1, 0x42, 0xc0, 0x1c, 0x86, 0x67, 0xc4, 0xc5,
0x0e, 0xe5, 0x05, 0xb3, 0xc3, 0xf0, 0xd0, 0xfd, 0x1e, 0x57, 0x97, 0xda,
0xd4, 0xe1, 0x2c, 0xaf, 0xf6, 0x6c, 0xb7, 0x40, 0x7d, 0x5b, 0x5d, 0x5a,
0xac, 0xe4, 0x55, 0xde, 0xa1, 0x85, 0x32, 0x3a, 0x51, 0x9d, 0x5a, 0xe5,
0x2a, 0xd5, 0x4b, 0x95, 0x4b, 0xa5, 0x96, 0x5e, 0xab, 0x59, 0xa5, 0x4a,
0x75, 0x91, 0x55, 0x6a, 0xba, 0x59, 0x2e, 0xd5, 0xa8, 0x7e, 0xb1, 0xd5,
0xd6, 0xdb, 0xb5, 0xb2, 0x25, 0xa2, 0x0e, 0x58, 0xc0, 0x71, 0x3b, 0x74,
0xaa, 0x16, 0xcb, 0xa5, 0x62, 0xad, 0x60, 0xb1, 0x81, 0x7a, 0x4f, 0xdc,
0x8c, 0x29, 0xd8, 0xdd, 0x49, 0x7f, 0x55, 0x08, 0xd9, 0x47, 0x1e, 0xa6,
0x08, 0x79, 0x81, 0xbc, 0x46, 0xde, 0x21, 0x9f, 0x91, 0x9f, 0x78, 0x05,
0x33, 0x63, 0x77, 0x2b, 0xe9, 0x93, 0x3a, 0x21, 0xee, 0xd4, 0x78, 0xad,
0x48, 0xea, 0x85, 0x78, 0x93, 0x49, 0xad, 0x98, 0x84, 0x51, 0xbd, 0x20,
0xf3, 0xf1, 0xfb, 0x15, 0x35, 0x23, 0x35, 0x0f, 0xc3, 0x77, 0x44, 0xb2,
0xf2, 0xdd, 0x63, 0x40, 0x65, 0x3e, 0x8e, 0x2f, 0x6a, 0x0a, 0x48, 0x9b,
0xe8, 0xed, 0x65, 0xe3, 0xb1, 0xa8, 0x53, 0xff, 0x00, 0xdd, 0xea, 0xf5,
0x4e, 0xe0, 0x04, 0x00, 0x00
};
//==============================================================================
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
@ -96,6 +209,12 @@ static const uint8 invocationHandleByteCode[] =
DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidInMemoryDexClassLoader, "dalvik/system/InMemoryDexClassLoader", 26)
#undef JNI_CLASS_MEMBERS
#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \
METHOD (constructor, "<init>", "()V")
DECLARE_JNI_CLASS_WITH_BYTECODE (JuceActivityCallbacksBase, "com/rmsl/juce/JuceActivityCallbacksBase", 24, activityCallbacksByteCode)
#undef JNI_CLASS_MEMBERS
//==============================================================================
struct SystemJavaClassComparator
{
@ -428,7 +547,29 @@ void juce_dispatchDelete (JNIEnv*, jobject /*object*/, jlong host)
}
//==============================================================================
jobject ActivityLifecycleCallbacks::invoke (jobject proxy, jobject method, jobjectArray args)
ActivityLifecycleCallbackForwarder::ActivityLifecycleCallbackForwarder (GlobalRef ctx, ActivityLifecycleCallbacks* cb)
: appContext (ctx),
myself (std::invoke ([&]
{
const LocalRef<jobject> subclass { getEnv()->NewObject (JuceActivityCallbacksBase,
JuceActivityCallbacksBase.constructor) };
return CreateJavaInterface (this,
{ "android/app/Application$ActivityLifecycleCallbacks" },
subclass);
})),
callbacks (cb)
{
if (appContext != nullptr && myself != nullptr)
getEnv()->CallVoidMethod (appContext, AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
}
ActivityLifecycleCallbackForwarder::~ActivityLifecycleCallbackForwarder()
{
if (appContext != nullptr && myself != nullptr)
getEnv()->CallVoidMethod (appContext, AndroidApplication.unregisterActivityLifecycleCallbacks, myself.get());
}
jobject ActivityLifecycleCallbackForwarder::invoke (jobject proxy, jobject method, jobjectArray args)
{
auto* env = getEnv();
@ -474,7 +615,7 @@ jobject ActivityLifecycleCallbacks::invoke (jobject proxy, jobject method, jobje
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);
(iter->second) (*callbacks, activity, bundle);
return nullptr;
}

View file

@ -1033,9 +1033,11 @@ LocalRef<jobject> CreateJavaInterface (AndroidInterfaceImplementer* implementer,
const String& interfaceName);
//==============================================================================
class ActivityLifecycleCallbacks : public AndroidInterfaceImplementer
class ActivityLifecycleCallbacks
{
public:
virtual ~ActivityLifecycleCallbacks() = default;
virtual void onActivityPreCreated (jobject /*activity*/, jobject /*bundle*/) {}
virtual void onActivityPreDestroyed (jobject /*activity*/) {}
virtual void onActivityPrePaused (jobject /*activity*/) {}
@ -1061,15 +1063,27 @@ public:
virtual void onActivityPostStopped (jobject /*activity*/) {}
virtual void onActivityConfigurationChanged (jobject /*activity*/) {}
};
class ActivityLifecycleCallbackForwarder : private AndroidInterfaceImplementer
{
public:
ActivityLifecycleCallbackForwarder (GlobalRef appContext, ActivityLifecycleCallbacks* callbacks);
~ActivityLifecycleCallbackForwarder() override;
private:
jobject invoke (jobject, jobject, jobjectArray) override;
GlobalRef appContext;
GlobalRef myself;
ActivityLifecycleCallbacks* callbacks = nullptr;
};
//==============================================================================
struct SurfaceHolderCallback : AndroidInterfaceImplementer
struct SurfaceHolderCallback : public AndroidInterfaceImplementer
{
virtual ~SurfaceHolderCallback() override = default;
~SurfaceHolderCallback() override = default;
virtual void surfaceChanged (LocalRef<jobject> holder, int format, int width, int height) = 0;
virtual void surfaceCreated (LocalRef<jobject> holder) = 0;

View file

@ -161,33 +161,9 @@ class JuceActivityWatcher final : public ActivityLifecycleCallbacks
public:
JuceActivityWatcher()
{
auto appContext = getAppContext();
if (appContext != nullptr)
{
auto* env = getEnv();
myself = GlobalRef (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks"));
env->CallVoidMethod (appContext.get(), AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
}
checkActivityIsMain (androidApkContext);
}
~JuceActivityWatcher() override
{
auto appContext = getAppContext();
if (appContext != nullptr && myself != nullptr)
{
auto* env = getEnv();
env->CallVoidMethod (appContext.get(), AndroidApplication.unregisterActivityLifecycleCallbacks, myself.get());
clear();
myself.clear();
}
}
void onActivityStarted (jobject activity) override
{
auto* env = getEnv();
@ -314,9 +290,9 @@ private:
return mainActivityClassPath;
}
GlobalRef myself;
CriticalSection currentActivityLock;
WeakGlobalRef currentActivity, mainActivity;
ActivityLifecycleCallbackForwarder forwarder { GlobalRef { getAppContext() }, this };
};
//==============================================================================

View file

@ -85,14 +85,14 @@ namespace juce
#define JUCE_BREAK_IN_DEBUGGER { __debugbreak(); }
#elif JUCE_INTEL && (JUCE_GCC || JUCE_CLANG || JUCE_MAC)
#if JUCE_NO_INLINE_ASM
#define JUCE_BREAK_IN_DEBUGGER { }
#define JUCE_BREAK_IN_DEBUGGER { }
#else
#define JUCE_BREAK_IN_DEBUGGER { asm ("int $3"); }
#define JUCE_BREAK_IN_DEBUGGER { asm ("int $3"); }
#endif
#elif JUCE_ARM && JUCE_MAC
#define JUCE_BREAK_IN_DEBUGGER { __builtin_debugtrap(); }
#elif JUCE_ANDROID
#define JUCE_BREAK_IN_DEBUGGER { __builtin_trap(); }
#elif JUCE_ARM && JUCE_CLANG
#define JUCE_BREAK_IN_DEBUGGER { __builtin_debugtrap(); }
#else
#define JUCE_BREAK_IN_DEBUGGER { __asm int 3 }
#endif

View file

@ -2878,6 +2878,20 @@ public:
expectEquals (String::toDecimalStringWithSignificantFigures (2.8647, 6), String ("2.86470"));
expectEquals (String::toDecimalStringWithSignificantFigures (-0.0000000000019, 1), String ("-0.000000000002"));
// Powers of 10
expectEquals (String::toDecimalStringWithSignificantFigures ( 0.001, 7), String ( "0.001000000"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 0.01, 7), String ( "0.01000000"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 0.1, 7), String ( "0.1000000"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 1, 7), String ( "1.000000"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 10, 7), String ( "10.00000"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 100, 7), String ( "100.0000"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 1000, 7), String ( "1000.000"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 10000, 7), String ( "10000.00"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 100000, 7), String ( "100000.0"));
expectEquals (String::toDecimalStringWithSignificantFigures ( 1000000, 7), String ( "1000000"));
expectEquals (String::toDecimalStringWithSignificantFigures (10000000, 7), String ("10000000"));
}
beginTest ("Float trimming");

View file

@ -1159,11 +1159,10 @@ public:
return "0";
}
auto numDigitsBeforePoint = (int) std::ceil (std::log10 (number < 0 ? -number : number));
auto shift = numberOfSignificantFigures - numDigitsBeforePoint;
auto factor = std::pow (10.0, shift);
auto rounded = std::round (number * factor) / factor;
const auto numDigitsBeforePoint = (int) std::floor (std::log10 (std::abs (number)) + DecimalType (1));
const auto shift = numberOfSignificantFigures - numDigitsBeforePoint;
const auto factor = std::pow (10.0, shift);
const auto rounded = std::round (number * factor) / factor;
std::stringstream ss;
ss << std::fixed << std::setprecision (std::max (shift, 0)) << rounded;

View file

@ -92,10 +92,18 @@
#endif
#endif
#if JUCE_64BIT && JUCE_WINDOWS
#include <arm64_neon.h>
#else
#include <arm_neon.h>
#if JUCE_USE_SIMD
#if JUCE_WINDOWS
#if JUCE_64BIT
#if ! JUCE_CLANG
#include <arm64_neon.h>
#endif
#else
#include <arm_neon.h>
#endif
#else
#include <arm_neon.h>
#endif
#endif
#else

View file

@ -182,29 +182,6 @@ public:
explicit JuceAppLifecycle (CreateApp initSymbolAddr)
: createApplicationSymbol (initSymbolAddr)
{
auto appContext = getAppContext();
if (appContext != nullptr)
{
auto* env = getEnv();
myself = GlobalRef (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks"));
env->CallVoidMethod (appContext.get(), AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
}
}
~JuceAppLifecycle() override
{
auto appContext = getAppContext();
if (appContext != nullptr && myself != nullptr)
{
auto* env = getEnv();
clear();
env->CallVoidMethod (appContext.get(), AndroidApplication.unregisterActivityLifecycleCallbacks, myself.get());
myself.clear();
}
}
void onActivityCreated (jobject, jobject) override
@ -291,6 +268,7 @@ private:
GlobalRef myself;
CreateApp createApplicationSymbol{};
bool hasBeenInitialised = false;
ActivityLifecycleCallbackForwarder forwarder { GlobalRef { getAppContext() }, this };
};
//==============================================================================

View file

@ -283,39 +283,72 @@ void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& te
createLayoutWithBalancedLineLengths (text, maxWidth, 1.0e7f);
}
void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth, float maxHeight)
void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text,
float maxWidth,
float maxHeight)
{
auto minimumWidth = maxWidth / 2.0f;
auto bestWidth = maxWidth;
float bestLineProportion = 0.0f;
auto bestScore = std::numeric_limits<float>::max();
auto widthProbeText = text;
if (widthProbeText.getWordWrap() == AttributedString::byChar)
widthProbeText.setWordWrap (AttributedString::byWord);
std::optional<float> advanceWidth;
while (maxWidth > minimumWidth)
{
createLayout (text, maxWidth, maxHeight);
createLayout (widthProbeText, maxWidth, maxHeight);
if (getNumLines() < 2)
const auto numLines = getNumLines();
if (numLines < 2)
return;
auto line1 = lines.getUnchecked (lines.size() - 1)->getLineBoundsX().getLength();
auto line2 = lines.getUnchecked (lines.size() - 2)->getLineBoundsX().getLength();
auto shortest = jmin (line1, line2);
auto longest = jmax (line1, line2);
auto prop = shortest > 0 ? longest / shortest : 1.0f;
std::vector<float> lineLengths;
lineLengths.reserve ((size_t) numLines);
std::transform (lines.begin(),
lines.end(),
std::back_inserter (lineLengths),
[] (const auto& line) { return line->getLineBoundsX().getLength(); });
if (prop > 0.9f && prop < 1.1f)
return;
const auto longestLineLength = *std::max_element (lineLengths.begin(), lineLengths.end());
if (prop > bestLineProportion)
auto accumulateScore = [longestLineLength] (auto scoreSum, auto lineLength)
{
bestLineProportion = prop;
const auto unusedSpace = 1.0f - (lineLength / longestLineLength);
return scoreSum + (unusedSpace * unusedSpace);
};
const auto score = std::accumulate (lineLengths.begin(),
lineLengths.end(),
0.0f, accumulateScore) / (float) numLines;
if (score < bestScore)
{
bestScore = score;
bestWidth = maxWidth;
if (score < 0.4f)
break;
}
maxWidth -= 10.0f;
if (! advanceWidth.has_value())
{
advanceWidth = std::numeric_limits<float>::max();
for (const auto& line : lines)
for (const auto& run : line->runs)
for (const auto& glyph : run->glyphs)
advanceWidth = jmin (*advanceWidth, glyph.width);
}
maxWidth -= *advanceWidth;
}
if (! approximatelyEqual (bestWidth, maxWidth))
createLayout (text, bestWidth, maxHeight);
createLayout (text, bestWidth, maxHeight);
}
//==============================================================================
@ -421,6 +454,9 @@ void TextLayout::createStandardLayout (const AttributedString& text)
if (text.getWordWrap() != AttributedString::none)
shapedTextOptions = shapedTextOptions.withWordWrapWidth (width);
if (text.getWordWrap() == AttributedString::WordWrap::byChar)
shapedTextOptions = shapedTextOptions.withAllowBreakingInsideWord (true);
ShapedText st { text.getText(), shapedTextOptions };
std::optional<int64> lastLineNumber;

View file

@ -55,6 +55,7 @@ namespace jpeglibNamespace
"-Wregister",
"-Wredundant-decls")
#define DONT_USE_EXTERN_C
#include "jpglib/jaricom.c"
#include "jpglib/jcapimin.c"
#include "jpglib/jcapistd.c"

View file

@ -449,8 +449,7 @@ public:
{
noTransforms = 0,
applyWorldTransform = 1,
applyInverseWorldTransform = 2,
applyFillTypeTransform = 4,
applyFillTypeTransform = 2,
applyWorldAndFillTypeTransforms = applyFillTypeTransform | applyWorldTransform
};
@ -462,38 +461,30 @@ public:
if (! fillType.isGradient() && ! fillType.isTiledImage())
return currentBrush;
Point<float> translation{};
AffineTransform transform{};
if ((flags & BrushTransformFlags::applyWorldTransform) != 0)
transform = currentTransform.getTransform();
if ((flags & BrushTransformFlags::applyFillTypeTransform) != 0)
transform = fillType.transform.followedBy (transform);
if (fillType.isGradient())
{
if ((flags & BrushTransformFlags::applyWorldTransform) != 0)
{
if (currentTransform.isOnlyTranslated)
translation = currentTransform.offset.toFloat();
else
transform = currentTransform.getTransform();
}
auto p1 = fillType.gradient->point1;
auto p2 = fillType.gradient->point2;
if ((flags & BrushTransformFlags::applyFillTypeTransform) != 0)
if (transform.isOnlyTranslation())
{
if (fillType.transform.isOnlyTranslation())
translation += Point (fillType.transform.getTranslationX(), fillType.transform.getTranslationY());
else
transform = transform.followedBy (fillType.transform);
Point<float> translation { transform.getTranslationX(), transform.getTranslationY() };
p1 += translation;
p2 += translation;
}
if ((flags & BrushTransformFlags::applyInverseWorldTransform) != 0)
else
{
if (currentTransform.isOnlyTranslated)
translation -= currentTransform.offset.toFloat();
else
transform = transform.followedBy (currentTransform.getTransform().inverted());
currentBrush->SetTransform (D2DUtilities::transformToMatrix (transform));
}
const auto p1 = fillType.gradient->point1 + translation;
const auto p2 = fillType.gradient->point2 + translation;
if (fillType.gradient->isRadial)
{
const auto radius = p2.getDistanceFrom (p1);
@ -507,19 +498,11 @@ public:
linearGradient->SetEndPoint ({ p2.x, p2.y });
}
}
else if (fillType.isTiledImage())
else
{
if ((flags & BrushTransformFlags::applyWorldTransform) != 0)
transform = currentTransform.getTransform();
if ((flags & BrushTransformFlags::applyFillTypeTransform) != 0)
transform = transform.followedBy (fillType.transform);
if ((flags & BrushTransformFlags::applyInverseWorldTransform) != 0)
transform = transform.followedBy (currentTransform.getTransform().inverted());
currentBrush->SetTransform (D2DUtilities::transformToMatrix (transform));
}
currentBrush->SetTransform (D2DUtilities::transformToMatrix (transform));
currentBrush->SetOpacity (fillType.getOpacity());
return currentBrush;

View file

@ -924,7 +924,7 @@ void Direct2DGraphicsContext::drawImage (const Image& imageIn, const AffineTrans
continue;
const auto src = intersection - pageBounds.getPosition().toFloat();
const auto dst = getRect (intersection - pagesAndArea.area.getPosition().toFloat()).toNearestInt().toFloat();
const auto dst = getRect (intersection - pagesAndArea.area.getPosition().toFloat());
const auto [srcConverted, dstConverted] = std::tuple (D2DUtilities::toRECT_F (src),
D2DUtilities::toRECT_F (dst));
@ -945,12 +945,19 @@ void Direct2DGraphicsContext::drawImage (const Image& imageIn, const AffineTrans
}
else
{
const auto lastMode = deviceContext->GetAntialiasMode();
if (pagesAndArea.pages.size() > 1)
deviceContext->SetAntialiasMode (D2D1_ANTIALIAS_MODE_ALIASED);
deviceContext->DrawBitmap (page.bitmap,
dstConverted,
currentState->fillType.getOpacity(),
currentState->interpolationMode,
srcConverted,
{});
deviceContext->SetAntialiasMode (lastMode);
}
}
};
@ -1327,39 +1334,183 @@ public:
g.drawImageTransformed (imageToDraw, transform);
}
compareImages (targetNative, targetSoftware);
auto pixelsToIgnore = createEdgeMask (imageToDraw.getWidth(),
imageToDraw.getHeight(),
targetNative.getWidth(),
targetNative.getHeight(),
transform);
compareImages (targetNative, targetSoftware, 16, pixelsToIgnore);
}
}
}
beginTest ("Check that there is no seam between D2D image tiles");
{
const auto width = 229;
const auto height = 80 * width;
Image filmStripSoftware { Image::RGB, width, height, true, SoftwareImageType{} };
{
Graphics g { filmStripSoftware };
g.setGradientFill ({ Colours::red, 0, 0, Colours::cyan, (float) filmStripSoftware.getWidth(), 0, false });
g.fillAll();
}
const auto filmStrip = NativeImageType{}.convert (filmStripSoftware);
Image targetNative { Image::RGB, targetDim, targetDim, true, NativeImageType{} };
Image targetSoftware { Image::RGB, targetDim, targetDim, true, SoftwareImageType{} };
const auto transform = AffineTransform::scale (1.1f);
for (auto* target : { &targetNative, &targetSoftware })
{
Graphics g { *target };
g.setColour (Colours::orange);
g.fillAll();
g.addTransform (transform);
g.drawImage (filmStrip, 0, 0, width, width, 0, (16384 / width) * width, width, width);
}
auto pixelsToIgnore = createEdgeMask (width,
width,
targetNative.getWidth(),
targetNative.getHeight(),
transform);
compareImages (targetNative, targetSoftware, 1, pixelsToIgnore);
}
beginTest ("Gradient fill transform should compose with world transform correctly");
{
testGradientFillTransform (1.0f);
testGradientFillTransform (1.5f);
}
}
void compareImages (const Image& a, const Image& b)
static Image createEdgeMask (int sourceWidth,
int sourceHeight,
int maskWidth,
int maskHeight,
const AffineTransform& transform)
{
Image mask { Image::SingleChannel, maskWidth, maskHeight, true, SoftwareImageType{} };
Graphics g { mask };
g.addTransform (transform);
g.setColour (Colours::white);
g.drawRect (Rectangle<int> { 0, 0, sourceWidth + 1, sourceHeight + 1 }.toFloat(), 2.0f);
return mask;
}
void compareImages (const Image& a, const Image& b, int stride, const Image& ignoreMask)
{
expect (a.getBounds() == b.getBounds());
const Image::BitmapData bitmapA { a, Image::BitmapData::readOnly };
const Image::BitmapData bitmapB { b, Image::BitmapData::readOnly };
int64_t maxAbsError{};
int64_t accumulatedError{};
int64_t numSamples{};
for (auto y = 0; y < a.getHeight(); y += 16)
for (auto y = 0; y < a.getHeight(); y += stride)
{
for (auto x = 0; x < a.getWidth(); x += 16)
for (auto x = 0; x < a.getWidth(); x += stride)
{
if (ignoreMask.getPixelAt (x, y) != Colour{})
continue;
const auto expected = bitmapA.getPixelColour (x, y);
const auto actual = bitmapB.getPixelColour (x, y);
for (auto& fn : { &Colour::getRed, &Colour::getGreen, &Colour::getBlue, &Colour::getAlpha })
{
accumulatedError += ((int64_t) (actual.*fn)() - (int64_t) (expected.*fn)());
const auto signedError = ((int64_t) (actual.*fn)() - (int64_t) (expected.*fn)());
const auto absError = std::abs (signedError);
maxAbsError = std::max (maxAbsError, absError);
accumulatedError += absError;
++numSamples;
}
}
}
const auto averageError = (double) accumulatedError / (double) numSamples;
expect (std::abs (averageError) < 1.0);
expect (std::abs (averageError) < 1.0 && maxAbsError < 10);
}
void testGradientFillTransform (float scale)
{
constexpr int size = 500;
constexpr int circleSize = 100;
constexpr int brushTranslation = 20;
Image image { Image::RGB,
roundToInt (size * scale),
roundToInt (size * scale),
true };
{
for (int i = 0; i < size / circleSize; ++i)
{
Graphics g { image };
g.addTransform (AffineTransform::scale (scale));
g.addTransform (AffineTransform::translation ((float) i * circleSize, (float) i * circleSize));
const auto fillCol1 { Colours::red };
const auto fillCol2 { Colours::green };
const auto centreLoc = circleSize / 2.0f;
FillType innerGlowGrad = ColourGradient { fillCol1,
{ centreLoc, centreLoc },
fillCol2,
{ centreLoc, 0.0f },
true };
innerGlowGrad.gradient->addColour (0.19, fillCol1);
innerGlowGrad.transform = AffineTransform::scale (1.1f, 0.9f, centreLoc, centreLoc)
.followedBy (AffineTransform::translation (brushTranslation,
brushTranslation));
g.setFillType (innerGlowGrad);
g.fillEllipse (0, 0, (float) circleSize, (float) circleSize);
}
}
for (int i = 0; i < size / circleSize; ++i)
{
const auto getScaled = [scale] (Point<int> p)
{
return p.toFloat().transformedBy (AffineTransform::scale (scale)).roundToInt();
};
const auto approximatelyEqual = [] (const Colour& a, const Colour& b)
{
return std::abs (a.getRed() - b.getRed()) < 2
&& std::abs (a.getGreen() - b.getGreen()) < 2
&& std::abs (a.getBlue() - b.getBlue()) < 2
&& std::abs (a.getAlpha() - b.getAlpha()) < 2;
};
const Point<int> centre { circleSize / 2, circleSize / 2 };
const Point<int> brushOffset { brushTranslation, brushTranslation };
const auto redPosition = getScaled (centre + brushOffset);
expect (image.getPixelAt (redPosition.getX(), redPosition.getY()) == Colours::red);
const auto mostlyRedPosition = getScaled (centre);
expect (approximatelyEqual (image.getPixelAt (mostlyRedPosition.getX(), mostlyRedPosition.getY()),
Colour { 138, 59, 0 }));
const auto greenPosition = getScaled (centre.withY (2));
expect (image.getPixelAt (greenPosition.getX(), greenPosition.getY()) == Colours::green);
const auto blackPosition = getScaled ({ circleSize - 2, 2 });
expect (image.getPixelAt (blackPosition.getX(), blackPosition.getY()) == Colours::black);
}
}
};

View file

@ -2420,9 +2420,9 @@ public:
SoftwareRendererSavedState (const SoftwareRendererSavedState& other) = default;
SoftwareRendererSavedState* beginTransparencyLayer (float opacity)
std::unique_ptr<SoftwareRendererSavedState> beginTransparencyLayer (float opacity)
{
auto* s = new SoftwareRendererSavedState (*this);
auto s = std::make_unique<SoftwareRendererSavedState> (*this);
if (clip != nullptr)
{
@ -2565,12 +2565,12 @@ public:
void beginTransparencyLayer (float opacity)
{
save();
currentState.reset (currentState->beginTransparencyLayer (opacity));
currentState = currentState->beginTransparencyLayer (opacity);
}
void endTransparencyLayer()
{
std::unique_ptr<StateObjectType> finishedTransparencyLayer (currentState.release());
auto finishedTransparencyLayer = std::move (currentState);
restore();
currentState->endTransparencyLayer (*finishedTransparencyLayer);
}
@ -2680,7 +2680,7 @@ protected:
if (auto fill = colourLayer->colour)
stack->setFillType (*fill);
stack->fillEdgeTable (colourLayer->clip, drawPosition.x, (int) drawPosition.y);
stack->fillEdgeTable (colourLayer->clip, drawPosition.x, roundToInt (drawPosition.y));
}
else if (auto* imageLayer = std::get_if<ImageLayer> (&layer.layer))
{

View file

@ -59,6 +59,7 @@ struct LookAndFeelHelpers
const int maxToolTipWidth = 400;
AttributedString s;
s.setWordWrap (AttributedString::WordWrap::byChar);
s.setJustification (Justification::centred);
s.append (text, FontOptions (tooltipFontSize, Font::bold).withMetricsKind (metrics), colour);

View file

@ -72,6 +72,8 @@ void FileListComponent::scrollToTop()
void FileListComponent::setSelectedFile (const File& f)
{
lastDirectory = directoryContentsList.getDirectory();
if (! directoryContentsList.isStillLoading())
{
for (int i = directoryContentsList.getNumFiles(); --i >= 0;)

View file

@ -46,6 +46,8 @@ int ModifierKeys::getNumMouseButtonsDown() const noexcept
if (isLeftButtonDown()) ++num;
if (isRightButtonDown()) ++num;
if (isMiddleButtonDown()) ++num;
if (isBackButtonDown()) ++num;
if (isForwardButtonDown()) ++num;
return num;
}

View file

@ -98,6 +98,10 @@ public:
inline bool isMiddleButtonDown() const noexcept { return testFlags (middleButtonModifier); }
inline bool isBackButtonDown() const noexcept { return testFlags (backButtonModifier); }
inline bool isForwardButtonDown() const noexcept { return testFlags (forwardButtonModifier); }
/** Tests for any of the mouse-button flags. */
inline bool isAnyMouseButtonDown() const noexcept { return testFlags (allMouseButtonModifiers); }
@ -144,6 +148,12 @@ public:
/** Middle mouse button flag. */
middleButtonModifier = 64,
/* Back mouse button flag. Otherwise known as button 4. */
backButtonModifier = 128,
/* Forward mouse button flag. Otherwise known as button 5. */
forwardButtonModifier = 256,
#if JUCE_MAC || JUCE_IOS
/** Command key flag - on windows this is the same as the CTRL key flag. */
commandModifier = 8,
@ -164,7 +174,11 @@ public:
allKeyboardModifiers = shiftModifier | ctrlModifier | altModifier | commandModifier,
/** Represents a combination of all the mouse buttons at once. */
allMouseButtonModifiers = leftButtonModifier | rightButtonModifier | middleButtonModifier,
allMouseButtonModifiers = leftButtonModifier
| rightButtonModifier
| middleButtonModifier
| backButtonModifier
| forwardButtonModifier,
/** Represents a combination of all the alt, ctrl and command key modifiers. */
ctrlAltCommandModifiers = ctrlModifier | altModifier | commandModifier

View file

@ -250,7 +250,7 @@ private:
}
private:
static AccessibilityActions getAccessibilityActions (ItemAccessibilityHandler& handler,
static AccessibilityActions getAccessibilityActions (ItemAccessibilityHandler&,
ItemComponent& item)
{
auto onFocus = [&item]
@ -260,16 +260,7 @@ private:
item.parentWindow.setCurrentlyHighlightedChild (&item);
};
auto onToggle = [&handler, &item, onFocus]
{
if (handler.getCurrentState().isSelected())
item.parentWindow.setCurrentlyHighlightedChild (nullptr);
else
onFocus();
};
auto actions = AccessibilityActions().addAction (AccessibilityActionType::focus, std::move (onFocus))
.addAction (AccessibilityActionType::toggle, std::move (onToggle));
auto actions = AccessibilityActions().addAction (AccessibilityActionType::focus, std::move (onFocus));
if (canBeTriggered (item.item))
{

View file

@ -1445,9 +1445,16 @@ public:
static int getModifierForButtonNumber (const NSInteger num)
{
return num == 0 ? ModifierKeys::leftButtonModifier
: (num == 1 ? ModifierKeys::rightButtonModifier
: (num == 2 ? ModifierKeys::middleButtonModifier : 0));
switch (num)
{
case 0: return ModifierKeys::leftButtonModifier;
case 1: return ModifierKeys::rightButtonModifier;
case 2: return ModifierKeys::middleButtonModifier;
case 3: return ModifierKeys::backButtonModifier;
case 4: return ModifierKeys::forwardButtonModifier;
}
return 0;
}
static unsigned int getNSWindowStyleMask (const int flags) noexcept

View file

@ -44,6 +44,15 @@ std::unique_ptr<ScopedMessageBoxInterface> ScopedMessageBoxInterface::create (co
void runAsync (std::function<void (int)> recipient) override
{
auto* peerToUse = std::invoke ([&]() -> UIViewComponentPeer*
{
if (auto* comp = options.getAssociatedComponent())
if (auto* peer = comp->getPeer())
return static_cast<UIViewComponentPeer*> (peer);
return iOSGlobals::currentlyFocusedPeer;
});
if (peerToUse == nullptr)
{
// Since iOS8, alert windows need to be associated with a window, so you need to
@ -109,15 +118,6 @@ std::unique_ptr<ScopedMessageBoxInterface> ScopedMessageBoxInterface::create (co
private:
const MessageBoxOptions options;
UIViewComponentPeer* peerToUse = std::invoke ([&]() -> UIViewComponentPeer*
{
if (auto* comp = options.getAssociatedComponent())
if (auto* peer = comp->getPeer())
return static_cast<UIViewComponentPeer*> (peer);
return iOSGlobals::currentlyFocusedPeer;
});
NSUniquePtr<UIAlertController> alert;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MessageBox)
};

View file

@ -1308,7 +1308,8 @@ static constexpr int translateAndroidKeyboardFlags (int javaFlags) noexcept
}
//==============================================================================
class AndroidComponentPeer final : public ComponentPeer
class AndroidComponentPeer final : public ComponentPeer,
private ActivityLifecycleCallbacks
{
public:
AndroidComponentPeer (Component& comp, int windowStyleFlags, void* nativeViewHandle)
@ -2092,28 +2093,20 @@ public:
}
//==============================================================================
static Point<float> lastMousePos;
static int64 touchesDown;
inline static Point<float> lastMousePos{};
inline static int64 touchesDown = 0;
//==============================================================================
struct StartupActivityCallbackListener final : public ActivityLifecycleCallbacks
{
void onActivityStarted (jobject /*activity*/) override
{
auto* env = getEnv();
LocalRef<jobject> appContext (getAppContext());
forceDisplayUpdate();
if (appContext.get() != nullptr)
{
env->CallVoidMethod (appContext.get(),
AndroidApplication.unregisterActivityLifecycleCallbacks,
activityCallbackListener.get());
clear();
activityCallbackListener.clear();
forceDisplayUpdate();
}
AndroidComponentPeer::startupActivityCallbackListener.reset();
}
ActivityLifecycleCallbackForwarder forwarder { GlobalRef { getAppContext() }, this };
};
class MainActivityWindowLayoutListener : public AndroidInterfaceImplementer
@ -2532,8 +2525,8 @@ private:
//==============================================================================
friend class Displays;
static AndroidComponentPeer* frontWindow;
static GlobalRef activityCallbackListener;
inline static AndroidComponentPeer* frontWindow = nullptr;
inline static std::optional<StartupActivityCallbackListener> startupActivityCallbackListener;
static constexpr jint GRAVITY_LEFT = 0x3, GRAVITY_TOP = 0x30;
static constexpr jint TYPE_APPLICATION = 0x2;
@ -2553,11 +2546,6 @@ private:
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidComponentPeer)
};
Point<float> AndroidComponentPeer::lastMousePos;
int64 AndroidComponentPeer::touchesDown = 0;
AndroidComponentPeer* AndroidComponentPeer::frontWindow = nullptr;
GlobalRef AndroidComponentPeer::activityCallbackListener;
//==============================================================================
ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindow)
{
@ -2570,37 +2558,10 @@ bool Desktop::canUseSemiTransparentWindows() noexcept
return true;
}
class Desktop::NativeDarkModeChangeDetectorImpl : public ActivityLifecycleCallbacks
class Desktop::NativeDarkModeChangeDetectorImpl : private ActivityLifecycleCallbacks
{
public:
NativeDarkModeChangeDetectorImpl()
{
LocalRef<jobject> appContext (getAppContext());
if (appContext != nullptr)
{
auto* env = getEnv();
myself = GlobalRef (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks"));
env->CallVoidMethod (appContext.get(), AndroidApplication.registerActivityLifecycleCallbacks, myself.get());
}
}
~NativeDarkModeChangeDetectorImpl() override
{
LocalRef<jobject> appContext (getAppContext());
if (appContext != nullptr && myself != nullptr)
{
auto* env = getEnv();
env->CallVoidMethod (appContext.get(),
AndroidApplication.unregisterActivityLifecycleCallbacks,
myself.get());
clear();
myself.clear();
}
}
NativeDarkModeChangeDetectorImpl() = default;
bool isDarkModeEnabled() const noexcept { return darkModeEnabled; }
@ -2633,8 +2594,8 @@ private:
UI_MODE_NIGHT_UNDEFINED = 0x00000000,
UI_MODE_NIGHT_YES = 0x00000020;
GlobalRef myself;
bool darkModeEnabled = getDarkModeSetting();
ActivityLifecycleCallbackForwarder forwarder { GlobalRef { getAppContext() }, this };
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeDarkModeChangeDetectorImpl)
@ -2979,20 +2940,9 @@ void Displays::findDisplays (float masterScale)
}
}
}
else if (AndroidComponentPeer::activityCallbackListener == nullptr)
else if (! AndroidComponentPeer::startupActivityCallbackListener.has_value())
{
LocalRef<jobject> appContext (getAppContext());
if (appContext.get() != nullptr)
{
AndroidComponentPeer::activityCallbackListener = GlobalRef (CreateJavaInterface (
new AndroidComponentPeer::StartupActivityCallbackListener,
"android/app/Application$ActivityLifecycleCallbacks"));
env->CallVoidMethod (appContext,
AndroidApplication.registerActivityLifecycleCallbacks,
AndroidComponentPeer::activityCallbackListener.get());
}
AndroidComponentPeer::startupActivityCallbackListener.emplace();
}
displays.add (d);

View file

@ -1973,6 +1973,8 @@ public:
if (wParam & MK_LBUTTON) mouseMods |= ModifierKeys::leftButtonModifier;
if (wParam & MK_RBUTTON) mouseMods |= ModifierKeys::rightButtonModifier;
if (wParam & MK_MBUTTON) mouseMods |= ModifierKeys::middleButtonModifier;
if (wParam & MK_XBUTTON1) mouseMods |= ModifierKeys::backButtonModifier;
if (wParam & MK_XBUTTON2) mouseMods |= ModifierKeys::forwardButtonModifier;
ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutMouseButtons().withFlags (mouseMods);
updateKeyModifiers();
@ -4056,12 +4058,14 @@ private:
case WM_LBUTTONDOWN:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_XBUTTONDOWN:
doMouseDown (lParam, wParam);
return 0;
case WM_LBUTTONUP:
case WM_MBUTTONUP:
case WM_RBUTTONUP:
case WM_XBUTTONUP:
doMouseUp (getPointFromLocalLParam (lParam), wParam);
return 0;

View file

@ -411,7 +411,9 @@ namespace Keys
MiddleButton = 2,
RightButton = 3,
WheelUp = 4,
WheelDown = 5
WheelDown = 5,
BackButton = 6,
ForwardButton = 7
};
static int AltMask = 0;
@ -2518,6 +2520,7 @@ ModifierKeys XWindowSystem::getNativeRealtimeModifiers() const
XWindowSystemUtilities::ScopedXLock xLock;
// xQueryPointer doesn't emit masks for back/forward buttons.
if (X11Symbols::getInstance()->xQueryPointer (display,
X11Symbols::getInstance()->xRootWindow (display,
X11Symbols::getInstance()->xDefaultScreen (display)),
@ -3077,26 +3080,24 @@ void XWindowSystem::setWindowType (::Window windowH, int styleFlags) const
void XWindowSystem::initialisePointerMap()
{
auto numButtons = X11Symbols::getInstance()->xGetPointerMapping (display, nullptr, 0);
pointerMap[2] = pointerMap[3] = pointerMap[4] = Keys::NoButton;
const auto numButtons = X11Symbols::getInstance()->xGetPointerMapping (display, nullptr, 0);
std::fill_n (pointerMap, std::size (pointerMap), Keys::NoButton);
if (numButtons == 2)
{
pointerMap[0] = Keys::LeftButton;
pointerMap[1] = Keys::RightButton;
}
else if (numButtons >= 3)
{
pointerMap[0] = Keys::LeftButton;
pointerMap[1] = Keys::MiddleButton;
pointerMap[2] = Keys::RightButton;
constexpr unsigned char twoButtons[] { Keys::LeftButton, Keys::RightButton };
constexpr unsigned char moreButtons[] { Keys::LeftButton,
Keys::MiddleButton,
Keys::RightButton,
Keys::WheelUp,
Keys::WheelDown,
Keys::NoButton,
Keys::NoButton,
Keys::BackButton,
Keys::ForwardButton };
static_assert (std::size (moreButtons) >= std::size (decltype (pointerMap){}));
if (numButtons >= 5)
{
pointerMap[3] = Keys::WheelUp;
pointerMap[4] = Keys::WheelDown;
}
}
auto* sourceArray = numButtons == 2 ? twoButtons : moreButtons;
const auto numToCopy = jmin (numButtons, (int) std::size (pointerMap));
std::copy (sourceArray, sourceArray + numToCopy, pointerMap);
}
void XWindowSystem::deleteIconPixmaps (::Window windowH) const
@ -3620,6 +3621,9 @@ void XWindowSystem::handleButtonPressEvent (LinuxComponentPeer* peer, const XBut
case Keys::LeftButton: handleButtonPressEvent (peer, buttonPressEvent, ModifierKeys::leftButtonModifier); break;
case Keys::RightButton: handleButtonPressEvent (peer, buttonPressEvent, ModifierKeys::rightButtonModifier); break;
case Keys::MiddleButton: handleButtonPressEvent (peer, buttonPressEvent, ModifierKeys::middleButtonModifier); break;
case Keys::BackButton: handleButtonPressEvent (peer, buttonPressEvent, ModifierKeys::backButtonModifier); break;
case Keys::ForwardButton: handleButtonPressEvent (peer, buttonPressEvent, ModifierKeys::forwardButtonModifier); break;
default: break;
}
}
@ -3638,9 +3642,12 @@ void XWindowSystem::handleButtonReleaseEvent (LinuxComponentPeer* peer, const XB
{
switch (pointerMap[mapIndex])
{
case Keys::LeftButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::leftButtonModifier); break;
case Keys::RightButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::rightButtonModifier); break;
case Keys::MiddleButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::middleButtonModifier); break;
case Keys::LeftButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::leftButtonModifier); break;
case Keys::RightButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::rightButtonModifier); break;
case Keys::MiddleButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::middleButtonModifier); break;
case Keys::BackButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::backButtonModifier); break;
case Keys::ForwardButton: ModifierKeys::currentModifiers = ModifierKeys::getCurrentModifiers().withoutFlags (ModifierKeys::forwardButtonModifier); break;
default: break;
}
}

View file

@ -352,7 +352,7 @@ private:
#endif
int shmCompletionEvent = 0;
int pointerMap[5] = {};
unsigned char pointerMap[9]{};
String localClipboardContent;
Point<int> parentScreenPosition;

View file

@ -523,6 +523,9 @@ static void comboBoxPopupMenuFinishedCallback (int result, ComboBox* combo)
if (result != 0)
combo->setSelectedId (result);
if (auto* handler = combo->getAccessibilityHandler())
handler->grabFocus();
}
}

View file

@ -356,7 +356,7 @@ public:
These constants can be used either via the Component::setColour(), or LookAndFeel::setColour()
methods.
To change the colours of the menu that pops up, you can set the colour IDs in PopupMenu::ColourIDs.
To change the colours of the menu that pops up, you can set the colour IDs in PopupMenu::ColourIds.
@see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour
*/

View file

@ -80,9 +80,9 @@ VBlankAttachment::~VBlankAttachment()
cleanup();
}
void VBlankAttachment::onVBlank (double timestampMs)
void VBlankAttachment::onVBlank (double timestampSec)
{
NullCheckedInvocation::invoke (callback, timestampMs);
NullCheckedInvocation::invoke (callback, timestampSec);
}
void VBlankAttachment::componentParentHierarchyChanged (Component&)

View file

@ -80,7 +80,7 @@ public:
private:
//==============================================================================
void onVBlank (double timestampMs) override;
void onVBlank (double timestampSec) override;
//==============================================================================
void componentParentHierarchyChanged (Component&) override;

View file

@ -288,15 +288,76 @@ public:
private:
//==============================================================================
class ComponentIsShowingListener : private ComponentMovementWatcher
{
public:
ComponentIsShowingListener (Component& componentIn, std::function<void()> callbackIn)
: ComponentMovementWatcher (&componentIn),
callback (std::move (callbackIn))
{}
private:
void componentMovedOrResized (bool, bool) override {}
void componentPeerChanged() override {}
void componentVisibilityChanged() override { NullCheckedInvocation::invoke (callback); }
using ComponentMovementWatcher::componentMovedOrResized;
using ComponentMovementWatcher::componentVisibilityChanged;
std::function<void()> callback;
};
class WindowMapper
{
public:
WindowMapper (Pimpl& pimplIn, Window& windowIn)
: pimpl (pimplIn),
window (windowIn)
{}
void update()
{
if (window == 0)
return;
const auto shouldBeMapped = pimpl.getXEmbedMappedFlag()
&& pimpl.owner.isShowing()
&& pimpl.lastPeer != nullptr;
if (std::exchange (mapped, shouldBeMapped) != shouldBeMapped)
{
if (shouldBeMapped)
X11Symbols::getInstance()->xMapWindow (pimpl.getDisplay(), window);
else
X11Symbols::getInstance()->xUnmapWindow (pimpl.getDisplay(), window);
}
}
void unmap()
{
if (window == 0)
return;
X11Symbols::getInstance()->xUnmapWindow (pimpl.getDisplay(), window);
mapped = false;
}
private:
Pimpl& pimpl;
Window& window;
bool mapped = false;
};
XEmbedComponent& owner;
ComponentIsShowingListener isShowingListener { owner, [this] { updateMapping(); } };
Window client = 0, host = 0;
WindowMapper clientMapper { *this, client }, hostMapper { *this, host };
Atom infoAtom, messageTypeAtom;
bool clientInitiated;
bool wantsFocus = false;
bool allowResize = false;
bool supportsXembed = false;
bool hasBeenMapped = false;
int xembedVersion = maxXEmbedVersionToSupport;
ComponentPeer* lastPeer = nullptr;
@ -369,11 +430,8 @@ private:
int defaultScreen = X11Symbols::getInstance()->xDefaultScreen (dpy);
Window root = X11Symbols::getInstance()->xRootWindow (dpy, defaultScreen);
if (hasBeenMapped)
{
X11Symbols::getInstance()->xUnmapWindow (dpy, client);
hasBeenMapped = false;
}
hostMapper.unmap();
clientMapper.unmap();
X11Symbols::getInstance()->xReparentWindow (dpy, client, root, 0, 0);
client = 0;
@ -384,20 +442,8 @@ private:
void updateMapping()
{
if (client != 0)
{
const bool shouldBeMapped = getXEmbedMappedFlag();
if (shouldBeMapped != hasBeenMapped)
{
hasBeenMapped = shouldBeMapped;
if (shouldBeMapped)
X11Symbols::getInstance()->xMapWindow (getDisplay(), client);
else
X11Symbols::getInstance()->xUnmapWindow (getDisplay(), client);
}
}
hostMapper.update();
clientMapper.update();
}
Window getParentX11Window()
@ -496,7 +542,7 @@ private:
Rectangle<int> newBounds = getX11BoundsFromJuce();
if (newPeer == nullptr)
X11Symbols::getInstance()->xUnmapWindow (dpy, host);
hostMapper.unmap();
Window newParent = (newPeer != nullptr ? getParentX11Window() : rootWindow);
X11Symbols::getInstance()->xReparentWindow (dpy, host, newParent, newBounds.getX(), newBounds.getY());
@ -512,7 +558,7 @@ private:
}
componentMovedOrResized (owner, true, true);
X11Symbols::getInstance()->xMapWindow (dpy, host);
updateMapping();
broughtToFront();
}

View file

@ -1797,9 +1797,9 @@ struct SavedState final : public RenderingHelpers::SavedStateBase<SavedState>
previousTarget (createCopyIfNotNull (other.previousTarget.get()))
{}
SavedState* beginTransparencyLayer (float opacity)
std::unique_ptr<SavedState> beginTransparencyLayer (float opacity)
{
auto* s = new SavedState (*this);
auto s = std::make_unique<SavedState> (*this);
if (clip != nullptr)
{
@ -1834,6 +1834,8 @@ struct SavedState final : public RenderingHelpers::SavedStateBase<SavedState>
clip->renderImageUntransformed (*this, finishedLayerState.transparencyLayer,
(int) (finishedLayerState.transparencyLayerAlpha * 255.0f),
clipBounds.getX(), clipBounds.getY(), false);
state->activeTextures.bindTexture (0);
}
}

View file

@ -490,8 +490,7 @@ private:
};
//==============================================================================
struct CameraDevice::Pimpl
: private ActivityLifecycleCallbacks
struct CameraDevice::Pimpl : private ActivityLifecycleCallbacks
{
using InternalOpenCameraResultCallback = std::function<void (const String& /*cameraId*/, const String& /*error*/)>;
@ -504,7 +503,6 @@ struct CameraDevice::Pimpl
maxWidth (maxWidthToUse),
maxHeight (maxHeightToUse),
cameraId (cameraIdToUse),
activityLifeListener (CreateJavaInterface (this, "android/app/Application$ActivityLifecycleCallbacks")),
cameraManager (initialiseCameraManager()),
cameraCharacteristics (initialiseCameraCharacteristics (cameraManager, cameraId)),
streamConfigurationMap (cameraCharacteristics),
@ -516,10 +514,7 @@ struct CameraDevice::Pimpl
~Pimpl() override
{
auto* env = getEnv();
env->CallVoidMethod (getAppContext().get(), AndroidApplication.unregisterActivityLifecycleCallbacks, activityLifeListener.get());
activityLifeListener.clear();
callbackForwarder.reset();
}
JUCE_DECLARE_WEAK_REFERENCEABLE (Pimpl)
@ -551,7 +546,7 @@ struct CameraDevice::Pimpl
{
if (granted)
{
getEnv()->CallVoidMethod (getAppContext().get(), AndroidApplication.registerActivityLifecycleCallbacks, activityLifeListener.get());
callbackForwarder.emplace (GlobalRef { getAppContext() }, static_cast<ActivityLifecycleCallbacks*> (this));
scopedCameraDevice.reset (new ScopedCameraDevice (*this, cameraId, cameraManager, handler, getAutoFocusModeToUse()));
}
else
@ -2809,7 +2804,7 @@ private:
String cameraId;
InternalOpenCameraResultCallback cameraOpenCallback;
GlobalRef activityLifeListener;
std::optional<ActivityLifecycleCallbackForwarder> callbackForwarder;
GlobalRef cameraManager;
GlobalRef cameraCharacteristics;

View file

@ -344,8 +344,9 @@ private:
};
//==============================================================================
struct VideoComponent::Pimpl
: public AndroidViewComponent, private ActivityLifecycleCallbacks, private SurfaceHolderCallback
struct VideoComponent::Pimpl : public AndroidViewComponent,
private ActivityLifecycleCallbacks,
private SurfaceHolderCallback
{
Pimpl (VideoComponent& ownerToUse, bool)
: owner (ownerToUse),
@ -360,14 +361,6 @@ struct VideoComponent::Pimpl
LocalRef<jobject> appContext (getAppContext());
if (appContext != nullptr)
{
ActivityLifecycleCallbacks* callbacks = dynamic_cast<ActivityLifecycleCallbacks*> (this);
activityLifeListener = GlobalRef (CreateJavaInterface (callbacks, "android/app/Application$ActivityLifecycleCallbacks"));
env->CallVoidMethod (appContext.get(), AndroidApplication.registerActivityLifecycleCallbacks, activityLifeListener.get());
}
{
LocalRef<jobject> surfaceView (env->NewObject (AndroidSurfaceView, AndroidSurfaceView.constructor, getAppContext().get()));
LocalRef<jobject> holder (env->CallObjectMethod (surfaceView.get(), AndroidSurfaceView.getHolder));
@ -397,13 +390,6 @@ struct VideoComponent::Pimpl
surfaceHolderCallback.clear();
}
}
if (activityLifeListener != nullptr)
{
env->CallVoidMethod (getAppContext().get(), AndroidApplication.unregisterActivityLifecycleCallbacks, activityLifeListener.get());
ActivityLifecycleCallbacks::clear();
activityLifeListener.clear();
}
}
void loadAsync (const URL& url, std::function<void (const URL&, Result)> callback)
@ -1696,7 +1682,7 @@ private:
VideoComponent& owner;
MediaSession mediaSession;
GlobalRef activityLifeListener;
ActivityLifecycleCallbackForwarder forwarder { GlobalRef { getAppContext() }, this };
#if JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME
SystemVolumeListener systemVolumeListener;
#endif