1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-28 02:30:05 +00:00

Merge branch 'juce-framework:master' into master

This commit is contained in:
Lukas Klingebiel 2024-12-04 20:42:53 +01:00 committed by GitHub
commit fc0c2382c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3070 changed files with 520511 additions and 163491 deletions

23
.clang-tidy Normal file
View file

@ -0,0 +1,23 @@
Checks: >
-clang-analyzer-cplusplus.NewDeleteLeaks,
-clang-analyzer-optin.performance.Padding,
-clang-analyzer-security.FloatLoopCounter,
-clang-analyzer-security.insecureAPI.strcpy,
modernize-concat-nested-namespaces,
WarningsAsErrors: '*'
# No negative lookahead available here, which makes things difficult.
#
# We want checks to run on JUCE files included from the JUCE modules. We can
# restrict these to files named `juce_.*`.
#
# We also want checks to run on any files inlcuded from the examples or extras
# directories. However, some include paths generated by the Android Studio build
# system look like:
#
# ~/JUCE/examples/DemoRunner/Builds/Android/app/../../../../../modules/juce_box2d/box2d/Collision/b2CollideEdge.cpp
#
# Since we can only opt-in to paths, we restrict the maximum depth of the path
# past examples/extras.
HeaderFilterRegex: '(.*\/modules\/juce_.*juce_[^\/]*$)|(\/(examples|extras)(\/[^\/]*){1,7}$)'

View file

@ -48,10 +48,11 @@ body:
multiple: true
options:
- x86_64
- ARM
- Other
- 64-bit
- 32-bit
- Arm64/aarch64
- Arm64EC (Windows)
- x86 (Windows, Android)
- 32 bit Arm (Linux, Android)
- Unsupported
validations:
required: true
- type: textarea

2
.gitignore vendored
View file

@ -65,3 +65,5 @@ extras/Projucer/JUCECompileEngine.dylib
/build
CMakeUserPresets.json
.editorconfig

View file

@ -1,4 +1,9 @@
include:
- project: 'juce-repos/JUCE-utils'
file: '/CI/gitlab-ci.yml'
variables:
REF: &REF master
include:
- project: juce-repos/JUCE-utils
file: /CI/gitlab-ci.yml
ref: *REF
inputs:
ref: *REF

File diff suppressed because it is too large Load diff

View file

@ -1,16 +1,132 @@
== Major JUCE features and updates ==
# Major JUCE features and updates
This file just lists the more notable headline features. For more detailed info
about changes and bugfixes please see the git log and BREAKING-CHANGES.txt.
This file lists the more notable headline features. For more detailed info
about changes and bugfixes please see the git log and BREAKING_CHANGES.md.
## Version 8.0.4
- Simplified singleton creation
- Fixed some Javascript and C++ interoperability issues
- Added exact passthrough of MIDI CC timestamps
- Switched to obtaining MIDI plug-in properties at runtime
- Improved Windows Arm CMake support
- Improved ShapedText
- Fixed some issues with Windows DLL builds
- Add system-provided timestamps to VBlankAttachment and animations
- Fixed some iOS deprecation warnings
- Updated embedded CHOC version
- Updated embedded Oboe version
- Moved the JavaScript implementation into a separate module
## Version 8.0.3
- Updated the AAX SDK to 2.8.0
- Fixed multiple Direct2D drawing issues
- Fixed buffer size and sample rate selection on iOS 18
## Version 8.0.2
- Fixed some issues handling large images in Direct2D
- Enabled rounded window corners in Windows 11
- Fixed some compiler warnings in Xcode 16
- Improved macOS and Android GU rendering performance
- Added support for C++20 and C++23
- Fixed a Windows mouse response issue
- Updated the VST3 SDK to 3.7.12
## Version 8.0.1
- Fixed some issues with text layout
- Removed source code for unsupported platforms
- Fixed some Direct2D issues
- Update the embedded version of harfbuzz
- Added more surround formats
## Version 8.0.0
- Added a new Direct2D renderer
- Added support for WebView based UIs
- Added consistent unicode support across platforms
- Added a new animation module
- Bundled the AAX SDK
## Version 7.0.12
- Fixed an issue with timers in Pro Tools
- Fixed an issue with Projucer Xcode code signing
## Version 7.0.11
- Fixed an issue with paths containing a tilde in Xcode
- Multiple fixes for plug-in deployment and code signing in Xcode
- Fixed an issue painting an empty RectangleList
- Improved the performance of TreeView rendering
## Version 7.0.10
- Fixed multiple issues selecting devices in AudioDeviceSelector
- Updated the bundled Oboe version
- Fixed multiple issues with Timer
- Updated the bundled version of FLAC
- Added configuration options for sockets
- Added new JSON::Formatter
- Added support for Xcode 15.1
- Update OpenGL compatibility headers
- Added ChildProcessManager
- Fixed multiple MIDI-CI issues
## Version 7.0.9
- Added MIDI-CI support
- Added enumerate utility function
- Fixed a macOS/iOS CMake signing issue
## Version 7.0.8
- Added macOS/iOS AudioWorkgroup support
- Added Xcode 15, macOS Sonoma and LLVM 17 compatibility
- Added serialisation tools
- Fixed some VST3 manifest generation issues
- Fixed a MessageManager locking bug
- Fixed GCC 7 VST3 support
- Fixed some SVG scaling issues
## Version 7.0.7
- Fixed some macOS 14.0 deprecations
- Fixed some issues with VST3 manifest generation
- Fixed a Metal layer rendering issue
- Fixed an issue setting realtime thread priorities
- Fixed a crash in VirtualDesktopWatcher
- Fixed an AUv3 bundling problem
## Version 7.0.6
- Added support for VST3 bundles and moduleinfo.json
- Improved message box dismissal
- Improved WebView support
- Updated to the latest VST3 and AAX SDKs
- Fixed some Metal layer rendering issues
- Improved ambisonic support
- Improved machine ID support
- Improved the HighResolutionTimer implementation
## Version 7.0.5
- Fixed Windows 7 compatibility
- Fixed dark mode notifications on macOS
- Improved the performance of AudioProcessorGraph
## Version 7.0.4
Version 7.0.4
- Improved Metal device handling
- Adopted more C++17 features
- Improved input handling on macOS and iOS
- Fixed a GUI display issue on Linux
- Fixed some compiler warnings
Version 7.0.3
## Version 7.0.3
- Added a unique machine ID
- Added new threading classes
- Improved the performance of multiple OpenGL contexts
@ -19,18 +135,21 @@ Version 7.0.3
- Fixed Studio One drawing performance
- Updated the FLAC library
Version 7.0.2
## Version 7.0.2
- Fixed accessibility table navigation
- Fixed Android file access on older APIs
- Improved Linux VST3 threading
- Improved ARA integration
Version 7.0.1
## Version 7.0.1
- Fixed some Xcode and MSVC compiler warnings
- Improved VST3 bus configuration and channel handling
- Fixed some Metal layer rendering bugs
Version 7.0.0
## Version 7.0.0
- Added Audio Random Access (ARA) SDK support
- Added support for authoring and hosting LV2 plug-ins
- Added a default renderer for macOS and iOS
@ -40,14 +159,16 @@ Version 7.0.0
- Revamped AudioPlayHead functionality
- Improved accessibility support
Version 6.1.6
## Version 6.1.6
- Improved the handling of AU multichannel layouts
- Added JUCE_NODISCARD to builder-patten functions
- Added recursion options to DirectoryIterator
- Unified the loading of OpenGL 3.2 core profiles
- Improved macOS full-screen behaviour with non-native titlebars
Version 6.1.5
## Version 6.1.5
- Improved the accessibility framework
- Added handling of non-Latin virtual key codes on macOS
- Improved X11 compatibility
@ -56,12 +177,14 @@ Version 6.1.5
- Improved MinGW-w64 compatibility
- Added an MPEKeyboardComponent class
Version 6.1.4
## Version 6.1.4
- Restored Projucer project saving behavior
- Fixed a CGImage memory access violation on Monterey
- Improved macOS thread priority management
Version 6.1.3
## Version 6.1.3
- Added support for Visual Studio 2022 to the Projucer
- Added support for creating OpenGL 3.2 contexts on Windows
- Added support for plugin hosts to easily retrieve stable parameter IDs
@ -72,12 +195,14 @@ Version 6.1.3
- Improved macOS 12 compatibility, including OpenGL and FileChooser fixes
- Improved accessibility support
Version 6.1.2
## Version 6.1.2
- Fixed an OpenGL display refresh rate issue on macOS
- Improved the scaling behaviour of hosted VST3 plug-ins
- Improved accessibility support
Version 6.1.1
## Version 6.1.1
- Fixed a CMake installation issue
- Improved parameter value loading after plug-in restarts
- Fixed some problems with multi-line text layouts
@ -85,7 +210,8 @@ Version 6.1.1
- Fixed an issue setting OpenGL repaint events
- Improved accessibility support
Version 6.1.0
## Version 6.1.0
- Added accessibility support
- Enabled use of VST3 plug-in extensions
- Improved OpenGL function loading
@ -102,7 +228,8 @@ Version 6.1.0
- Improved modal dismissing
- Improved assertion handling on macOS ARM
Version 6.0.8
## Version 6.0.8
- Fixed a macOS graphics invalidation region issue
- Improved the handling of modal dialog dismissal
- Fixed audio glitching in CoreAudio before microphone permission is granted
@ -116,11 +243,13 @@ Version 6.0.8
- Fixed some DSP convolution issues
- Added host detection on macOS ARM
Version 6.0.7
## Version 6.0.7
- Fixed a macOS drawing issue
- Updated the DemoRunner bundle ID
Version 6.0.6
## Version 6.0.6
- Moved to the new CoreMIDI API on supported platforms
- Added support for the "New Build System" in Xcode
- Made the audio format readers more robust
@ -128,7 +257,8 @@ Version 6.0.6
- Fixed a VST3 program parameter issue
- Updated to Oboe 1.5 on Android
Version 6.0.5
## Version 6.0.5
- Added more support for styling PopupMenus
- Fixed some race conditions in the IPC and name named pipe classes
- Implemented multiple FileChooser improvements
@ -136,16 +266,19 @@ Version 6.0.5
- Prevented CoreAudio glitches before accepting audio access permissions
- Made reading MIDI and audio files more robust
Version 6.0.4
## Version 6.0.4
- Improved the Projucer update mechanism
- Fixed an AUv3 parameter normalisation issue
- Fixed WASAPI exclusive mode sample rate selection bug
- Fixed a Linux build issue when omitting ALSA
Version 6.0.3
## Version 6.0.3
- Fixed version numbers in project files
Version 6.0.2
## Version 6.0.2
- Added support for macOS 11 and arm64
- Added Windows IAudioClient3 support for low latency audio drivers
- Added Windows and macOS precompiled header support in the Projucer
@ -155,7 +288,8 @@ Version 6.0.2
- Improved resave diffs in Projucer project files
- Fixed some Linux JACK issues
Version 6.0.1
## Version 6.0.1
- Fixed a bug in the Projucer GUI editor causing existing code to be overwritten
- Updated Android Oboe to 1.4.2
- Bumped default Android Studio gradle and plugin versions to the latest
@ -169,7 +303,8 @@ Version 6.0.1
- Fixed Projucer CLion exporter generated CMakeLists.txt
- Fixed drag and drop for non-DPI aware plug-ins on Windows
Version 6.0.0
## Version 6.0.0
- Added support for building JUCE projects with CMake
- Revamped the DSP module
- Added VST3 support on Linux
@ -195,7 +330,8 @@ Version 6.0.0
- Windows and Linux hiDPI scaling improvements
- Various bug-fixes, improvements and documentation updates
Version 5.4.7
## Version 5.4.7
- Fixed a macOS focus bug causing Components to not receive mouse events
- Fixed a potential NullPointerException in the Android IAP code
- Fixed an entitlements file generation bug in the Projucer
@ -203,7 +339,8 @@ Version 5.4.7
- Fixed some build errors and warnings when using Clang on Windows
- Changed the default architecture specified in Linux Makefiles generated by the Projucer
Version 5.4.6
## Version 5.4.6
- Fixed compatibility with macOS versions below 10.11
- Multiple thread safety improvements
- Added dynamic parameter and parameter group names
@ -212,7 +349,8 @@ Version 5.4.6
- Replaced WaitableEvent internals with std::condition_variable
- Fixed some macOS text alignment issues
Version 5.4.5
## Version 5.4.5
- Improved message queue performance on Linux
- Added missing lifecycle callbacks on Android Q
- Refactored the AudioBlock class
@ -224,7 +362,8 @@ Version 5.4.5
- Replaced select() calls with poll()
- Various bug-fixes, improvements and documentation updates
Version 5.4.4
## Version 5.4.4
- Improvements to floating point number printing
- Faster plug-in parameter indexing
- Added support for persisting attachements to MIDI devices
@ -234,7 +373,8 @@ Version 5.4.4
- Added support for Visual Studio 2019
- Removed support for Visual Studio 2013
Version 5.4.3
## Version 5.4.3
- Added a Visual Studio 2019 exporter to the Projucer
- Added options to configure macOS Hardened Runtime in the Projucer
- Fixed a potential memory corruption when drawing on macOS/iOS
@ -242,7 +382,8 @@ Version 5.4.3
- Multiple DSP module enhancements
- Various bug-fixes, improvements and documentation updates
Version 5.4.2
## Version 5.4.2
- Restructured the low-level Android native code
- Added an ADSR envelope class
- AudioProcessorValueTreeState performance improvements
@ -250,7 +391,8 @@ Version 5.4.2
- Improved VST3 hosting
- Windows hiDPI scaling enhancements
Version 5.4.1
## Version 5.4.1
- Fixed a VST2 compilation error in VS2013
- Fixed some live-build compilation errors in the Projucer
- Fixed a bug in the Oversampling class
@ -258,7 +400,8 @@ Version 5.4.1
- Fixed some bugs in the Unity plug-in wrapper
- Fixed some VS2015 compiler errors
Version 5.4.0
## Version 5.4.0
- macOS Mojave and iOS 12 support
- Windows hiDPI support
- Unity native plug-in support
@ -270,7 +413,8 @@ Version 5.4.0
- Support for Android Studio 3.2
- Various bug-fixes, improvements and documentation updates
Version 5.3.2
## Version 5.3.2
- Removed the OSX 10.5 and 10.6 deployment target options from the Projucer and enabled more C++11 features across all platforms
- Replaced all usage of ScopedPointer with std::unique_ptr
- Added camera support for iOS and Android
@ -285,7 +429,8 @@ Version 5.3.2
- Fixed a bug causing an unintentional menu item highlight disco party when using a popup menu in a plug-in's UI
- Marked as deprecated: String::empty, var::null, File::nonexistent, ValueTree::invalid and other problematic statically-initialised null values
Version 5.3.1
## Version 5.3.1
- Add Android and iOS support to AudioPluginHost
- Added support for Bela in the form of an AudioIODeviceType
- Add bypass support to both hosting and plug-in client code
@ -304,7 +449,8 @@ Version 5.3.1
- Added a command-line option to use LF as linefeeds rather than CRLF in the Projucer cleanup tools
- Multiple documentation updates
Version 5.3.0
## Version 5.3.0
- Added support for Android OBOE (developer preview)
- Updated JUCE's MPE classes to comply with the new MMA-adopted specification
- Multiple documentation updates
@ -317,7 +463,8 @@ Version 5.3.0
- Added thread safe methods for getting and setting the AudioProcessorValueTreeState state
- Added customisable MacOS icons
Version 5.2.1
## Version 5.2.1
- Added native content sharing support for iOS and Android
- Added iOS and Android native file chooser support
- Implemented WebBrowserComponent on Android
@ -343,7 +490,8 @@ Version 5.2.1
- Multiple Projucer UI and UX improvements
- Various documentation tweaks and fixes
Version 5.2.0
## Version 5.2.0
- Added a CMake exporter to the Projucer
- JUCE analytics module
- Added support for push notifications on iOS and Android
@ -362,7 +510,8 @@ Version 5.2.0
- Improved the performance of 3D rendering when multiple OpenGL contexts are used at the same time
- Tweaked the rate at which EdgeTable grows its internal storage, to improve performance rendering large and complex paths
Version 5.1.2
## Version 5.1.2
- Fixed multiple plugin-resizing bugs
- Added support for AUv3 MIDI and screen size negotiation
- Added support for Xcode 9 and iOS 11
@ -376,7 +525,8 @@ Version 5.1.2
- Plug-in parameters can be explicitly marked as continuous or discrete
- Multiple documentation updates
Version 5.1.1
## Version 5.1.1
- Fixed Windows live build engine on Visual Studio 2017
- Fixed a compiler error in juce_MathFunctions.h in Visual Studio 2013
- Fixed a potential crash when using the ProcessorDuplicator
@ -390,7 +540,8 @@ Version 5.1.1
- Fixed an issue where a JUCE VST2 would not correctly report that it supports resizing of its plugin editor
- Various documentation tweaks and fixes
Version 5.1.0
## Version 5.1.0
- Release of the JUCE DSP module
- Multichannel audio readers and writers
- Plugin editor Hi-DPI scaling support
@ -402,7 +553,8 @@ Version 5.1.0
- Various documentation fixes
- Various minor improvements and bug fixes
Version 5.0.2
## Version 5.0.2
- Improved project save speed in the Projucer
- Added option to save individual exporters in the Projucer
- Added the ability to create custom colour schemes for the Projucers code editor
@ -425,7 +577,8 @@ Version 5.0.2
- Various documentation fixes
- Various minor improvements and bug fixes
Version 5.0.1
## Version 5.0.1
- Fixed Windows live build engine on Visual Studio 2017
- Fixed memory-leak in Projucer live build engine
- Fixed an issue where you could not paste your redeem serial number with Cmd+V on macOS
@ -433,7 +586,8 @@ Version 5.0.1
- Minor Projucer UI improvements
- Various minor improvements and bug fixes
Version 5.0.0
## Version 5.0.0
- New licensing model
- Projucer UI/UX overhaul
- New look and feel (version 4)
@ -452,7 +606,8 @@ Version 5.0.0
- Various minor improvements and bug fixes
- Various documentation improvements
Version 4.3.1
## Version 4.3.1
- Added support for iOS download tasks
- Added support for AAX plug-in meters
- Added support for dynamically disabling/enabling sidechains in ProTools
@ -467,7 +622,8 @@ Version 4.3.1
- Various minor improvements and bug fixes
- Various documentation improvements
Version 4.3.0
## Version 4.3.0
- Added API and examples for ROLI Blocks
- Multiple Projucer live-build UI and diagnostics improvements
- JUCE now supports hosting multi-bus plug-ins
@ -480,7 +636,8 @@ Version 4.3.0
- Various minor improvements and bug fixes
- Various documentation improvements
Version 4.2.4
## Version 4.2.4
- Pre-release of live build engine on Windows
- Added FlexBox layout engine
- Removed dependency on external Steinberg SDK when building and/or hosting VST2 plug-ins
@ -504,18 +661,21 @@ Version 4.2.4
- Various minor improvements and bug fixes
- Various documentation improvements
Version 4.2.3
## Version 4.2.3
- Various VST3 improvements: resizing VST3 windows, plug-in compatibility issues
- Use NSURLSession on newer OS X versions
- Add compatibility for VST 3 SDK update 3.6.6
- Miscellaneous fixes and improvements
Version 4.2.1
## Version 4.2.1
- New class CachedValue, for providing easy and efficient access to ValueTree properties
- Reduced audio plug-in binary sizes on OS X and added symbol-stripping option
- Miscellaneous fixes and improvements
Version 4.2
## Version 4.2
- Added support for AudioUnit v3 on OS X and iOS
- Simplified the JUCE module format. Removed the json module definition files, and made
it easier to manually add modules to projects. The format is fully described in the
@ -528,21 +688,25 @@ Version 4.2
open-source project. This will allow everyone to compile the Projucer's IDE themselves, and
having just one app instead of two will make things a lot less confusing!
Version 4.1
## Version 4.1
- Added multi-bus support for audio plug-in clients
- Added support for MIDI effect plug-ins (AU and AAX).
- Added new example: Network Graphics Demo
Version 4.0.3
## Version 4.0.3
- Added MPE (Multidimensional Polyphonic Expression) classes
- Added full support for generating and parsing Midi RPN/NRPN messages
- Made the LinearSmoothedValue class public
- Miscellaneous fixes and minor improvements
Version 4.0.2
## Version 4.0.2
- Miscellaneous fixes and house-keeping
Version 4.0.1
## Version 4.0.1
- Initial release of the Projucer!
- Full OSC support!
- Android Studio exporting from the Introjucer
@ -556,12 +720,14 @@ Version 4.0.1
- Many updates to Introjucer
- Many new tutorials and examples
Version 3.3.0
## Version 3.3.0
- New functions for Base64 conversion
- New command-line options in the introjucer for trimming whitespace and
replacing tabs in source files
Version 3.2.0
## Version 3.2.0
- Major OpenGL performance/stability improvements
- Performance improvements to FloatVectorOperations math functions
- New FloatVectorOperations: abs, min, max, addWithMultiply, clip

View file

@ -1,170 +1,194 @@
# ==============================================================================
#
# This file is part of the JUCE library.
# Copyright (c) 2022 - Raw Material Software Limited
#
# JUCE is an open source library subject to commercial or open-source
# licensing.
#
# By using JUCE, you agree to the terms of both the JUCE 7 End-User License
# Agreement and JUCE Privacy Policy.
#
# End User License Agreement: www.juce.com/juce-7-licence
# Privacy Policy: www.juce.com/juce-privacy-policy
#
# Or: You may also use this code under the terms of the GPL v3 (see
# www.gnu.org/licenses).
#
# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
# DISCLAIMED.
#
# ==============================================================================
cmake_minimum_required(VERSION 3.15)
project(JUCE VERSION 7.0.4 LANGUAGES C CXX)
include(CMakeDependentOption)
set_property(GLOBAL PROPERTY USE_FOLDERS YES)
set(JUCE_MODULES_DIR "${JUCE_SOURCE_DIR}/modules" CACHE INTERNAL
"The path to JUCE modules")
# This option will disable most of the JUCE helper functions and tools. This option exists to
# facilitate existing CMake builds which handle things like bundle creation, icons, plists, and
# binary data independently of JUCE. This option is not recommended - use at your own risk!
option(JUCE_MODULES_ONLY "Only configure the JUCE modules" OFF)
include(extras/Build/CMake/JUCEModuleSupport.cmake)
# This option controls whether dummy targets are added to the build, where these targets contain all
# of the source files for each JUCE module. If you're planning to use an IDE and want to be able to
# browse all of JUCE's source files, this may be useful. However, it will increase the size of
# generated IDE projects and might slow down configuration a bit. If you enable this, you should
# probably also add `set_property(GLOBAL PROPERTY USE_FOLDERS YES)` to your top level CMakeLists,
# otherwise the module sources will be added directly to the top level of the project, instead of in
# a nice 'Modules' subfolder.
cmake_dependent_option(JUCE_ENABLE_MODULE_SOURCE_GROUPS
"Show all module sources in IDE projects" OFF
"NOT JUCE_MODULES_ONLY" OFF)
add_subdirectory(modules)
if(JUCE_MODULES_ONLY)
return()
endif()
include(extras/Build/CMake/JUCEUtils.cmake)
set_directory_properties(PROPERTIES
JUCE_COMPANY_NAME "JUCE"
JUCE_COMPANY_WEBSITE "https://juce.com"
JUCE_COMPANY_EMAIL "info@juce.com"
JUCE_COMPANY_COPYRIGHT "Copyright (c) 2020 - Raw Material Software Limited")
option(JUCE_COPY_PLUGIN_AFTER_BUILD
"Whether or not plugins should be installed to the system after building" OFF)
set_property(GLOBAL PROPERTY JUCE_COPY_PLUGIN_AFTER_BUILD ${JUCE_COPY_PLUGIN_AFTER_BUILD})
set(CMAKE_CXX_EXTENSIONS FALSE)
juce_disable_default_flags()
add_subdirectory(extras/Build)
# If you want to build the JUCE examples with VST2/AAX/ARA support, you'll need to make the
# VST2/AAX/ARA headers visible to the juce_audio_processors module. You can either set the paths on
# the command line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE
# examples, or you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after
# importing JUCE.
if(JUCE_GLOBAL_AAX_SDK_PATH)
juce_set_aax_sdk_path("${JUCE_GLOBAL_AAX_SDK_PATH}")
endif()
if(JUCE_GLOBAL_VST2_SDK_PATH)
juce_set_vst2_sdk_path("${JUCE_GLOBAL_VST2_SDK_PATH}")
endif()
# The ARA_SDK path should point to the "Umbrella installer" ARA_SDK directory.
# The directory can be obtained by recursively cloning https://github.com/Celemony/ARA_SDK and
# checking out the tag releases/2.1.0.
if(JUCE_GLOBAL_ARA_SDK_PATH)
juce_set_ara_sdk_path("${JUCE_GLOBAL_ARA_SDK_PATH}")
endif()
# We don't build anything other than the juceaide by default, because we want to keep configuration
# speedy and the number of targets low. If you want to add targets for the extra projects and
# example PIPs (there's a lot of them!), specify -DJUCE_BUILD_EXAMPLES=ON and/or
# -DJUCE_BUILD_EXTRAS=ON when initially generating your build tree.
option(JUCE_BUILD_EXTRAS "Add build targets for the Projucer and other tools" OFF)
if(JUCE_BUILD_EXTRAS)
add_subdirectory(extras)
endif()
option(JUCE_BUILD_EXAMPLES "Add build targets for the DemoRunner and PIPs" OFF)
if(JUCE_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
# ==================================================================================================
# Install configuration
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
VERSION ${JUCE_VERSION}
COMPATIBILITY ExactVersion
${extra_version_arg})
set(JUCE_INSTALL_DESTINATION "lib/cmake/JUCE-${JUCE_VERSION}" CACHE STRING
"The location, relative to the install prefix, where the JUCE config file will be installed")
set(JUCE_MODULE_PATH "include/JUCE-${JUCE_VERSION}/modules")
set(UTILS_INSTALL_DIR "${JUCE_INSTALL_DESTINATION}")
set(JUCEAIDE_PATH "${JUCE_TOOL_INSTALL_DIR}/${JUCE_JUCEAIDE_NAME}")
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
"${JUCE_BINARY_DIR}/JUCEConfig.cmake"
PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH
INSTALL_DESTINATION "${JUCE_INSTALL_DESTINATION}")
set(JUCE_MODULE_PATH "${JUCE_MODULES_DIR}")
set(UTILS_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extras/Build/CMake")
get_target_property(JUCEAIDE_PATH juceaide IMPORTED_LOCATION)
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
"${JUCE_BINARY_DIR}/JUCEExportConfig.cmake"
PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH
INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
"${JUCE_BINARY_DIR}/JUCEConfig.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEModuleSupport.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JuceLV2Defines.h.in"
"${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard"
"${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessorWithARA.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib"
"${JUCE_CMAKE_UTILS_DIR}/UnityPluginGUIScript.cs.in"
"${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake"
"${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake"
"${JUCE_CMAKE_UTILS_DIR}/juce_runtime_arch_detection.cpp"
DESTINATION "${JUCE_INSTALL_DESTINATION}")
if("${CMAKE_SOURCE_DIR}" STREQUAL "${JUCE_SOURCE_DIR}")
_juce_add_lv2_manifest_helper_target()
install(TARGETS juce_lv2_helper EXPORT LV2_HELPER DESTINATION "bin/JUCE-${JUCE_VERSION}")
install(EXPORT LV2_HELPER NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}")
endif()
# ==============================================================================
#
# 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.
#
# ==============================================================================
cmake_minimum_required(VERSION 3.22)
project(JUCE VERSION 8.0.4 LANGUAGES C CXX)
include(CMakeDependentOption)
set_property(GLOBAL PROPERTY USE_FOLDERS YES)
set(JUCE_MODULES_DIR "${JUCE_SOURCE_DIR}/modules" CACHE INTERNAL
"The path to JUCE modules")
# This option will disable most of the JUCE helper functions and tools. This option exists to
# facilitate existing CMake builds which handle things like bundle creation, icons, plists, and
# binary data independently of JUCE. This option is not recommended - use at your own risk!
option(JUCE_MODULES_ONLY "Only configure the JUCE modules" OFF)
include(extras/Build/CMake/JUCEModuleSupport.cmake)
# This option controls whether dummy targets are added to the build, where these targets contain all
# of the source files for each JUCE module. If you're planning to use an IDE and want to be able to
# browse all of JUCE's source files, this may be useful. However, it will increase the size of
# generated IDE projects and might slow down configuration a bit. If you enable this, you should
# probably also add `set_property(GLOBAL PROPERTY USE_FOLDERS YES)` to your top level CMakeLists,
# otherwise the module sources will be added directly to the top level of the project, instead of in
# a nice 'Modules' subfolder.
cmake_dependent_option(JUCE_ENABLE_MODULE_SOURCE_GROUPS
"Show all module sources in IDE projects" OFF
"NOT JUCE_MODULES_ONLY" OFF)
add_subdirectory(modules)
if(JUCE_MODULES_ONLY)
return()
endif()
include(extras/Build/CMake/JUCEUtils.cmake)
set_directory_properties(PROPERTIES
JUCE_COMPANY_NAME "JUCE"
JUCE_COMPANY_WEBSITE "https://juce.com"
JUCE_COMPANY_EMAIL "info@juce.com"
JUCE_COMPANY_COPYRIGHT "Copyright (c) - Raw Material Software Limited")
option(JUCE_COPY_PLUGIN_AFTER_BUILD
"Whether or not plugins should be installed to the system after building" OFF)
set_property(GLOBAL PROPERTY JUCE_COPY_PLUGIN_AFTER_BUILD ${JUCE_COPY_PLUGIN_AFTER_BUILD})
set(CMAKE_CXX_EXTENSIONS FALSE)
juce_disable_default_flags()
add_subdirectory(extras/Build)
# If you want to build the JUCE examples with VST2/AAX/ARA support, you'll need to make the
# VST2/AAX/ARA headers visible to the juce_audio_processors module. You can either set the paths on
# the command line, (e.g. -DJUCE_GLOBAL_AAX_SDK_PATH=/path/to/sdk) if you're just building the JUCE
# examples, or you can call the `juce_set_*_sdk_path` functions in your own CMakeLists after
# importing JUCE.
if(JUCE_GLOBAL_AAX_SDK_PATH)
juce_set_aax_sdk_path("${JUCE_GLOBAL_AAX_SDK_PATH}")
endif()
if(JUCE_GLOBAL_VST2_SDK_PATH)
juce_set_vst2_sdk_path("${JUCE_GLOBAL_VST2_SDK_PATH}")
endif()
# The ARA_SDK path should point to the "Umbrella installer" ARA_SDK directory.
# The directory can be obtained by recursively cloning https://github.com/Celemony/ARA_SDK and
# checking out the tag releases/2.1.0.
if(JUCE_GLOBAL_ARA_SDK_PATH)
juce_set_ara_sdk_path("${JUCE_GLOBAL_ARA_SDK_PATH}")
endif()
# We don't build anything other than the juceaide by default, because we want to keep configuration
# speedy and the number of targets low. If you want to add targets for the extra projects and
# example PIPs (there's a lot of them!), specify -DJUCE_BUILD_EXAMPLES=ON and/or
# -DJUCE_BUILD_EXTRAS=ON when initially generating your build tree.
option(JUCE_BUILD_EXTRAS "Add build targets for the Projucer and other tools" OFF)
if(JUCE_BUILD_EXTRAS)
add_subdirectory(extras)
endif()
option(JUCE_BUILD_EXAMPLES "Add build targets for the DemoRunner and PIPs" OFF)
if(JUCE_BUILD_EXAMPLES)
add_subdirectory(examples)
endif()
string(CONCAT webview2_option_message "Location that overrides the default directory where our "
"FindWebView2 script is looking for the "
"*Microsoft.Web.WebView2* directory")
option(JUCE_WEBVIEW2_PACKAGE_LOCATION ${webview2_option_message} "")
# ==================================================================================================
# Install configuration
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
VERSION ${JUCE_VERSION}
COMPATIBILITY ExactVersion)
set(JUCE_INSTALL_DESTINATION "lib/cmake/JUCE-${JUCE_VERSION}" CACHE STRING
"The location, relative to the install prefix, where the JUCE config file will be installed")
set(JUCE_MODULE_PATH "include/JUCE-${JUCE_VERSION}/modules")
set(UTILS_INSTALL_DIR "${JUCE_INSTALL_DESTINATION}")
set(JUCEAIDE_PATH "${JUCE_TOOL_INSTALL_DIR}/${JUCE_JUCEAIDE_NAME}")
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
"${JUCE_BINARY_DIR}/JUCEConfig.cmake"
PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH
INSTALL_DESTINATION "${JUCE_INSTALL_DESTINATION}")
set(JUCE_MODULE_PATH "${JUCE_MODULES_DIR}")
set(UTILS_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extras/Build/CMake")
get_target_property(JUCEAIDE_PATH juceaide IMPORTED_LOCATION)
configure_package_config_file("${JUCE_CMAKE_UTILS_DIR}/JUCEConfig.cmake.in"
"${JUCE_BINARY_DIR}/JUCEExportConfig.cmake"
PATH_VARS UTILS_INSTALL_DIR JUCEAIDE_PATH JUCE_MODULE_PATH
INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
INSTALL_DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
install(FILES "${JUCE_BINARY_DIR}/JUCEConfigVersion.cmake"
"${JUCE_BINARY_DIR}/JUCEConfig.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCECheckAtomic.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEHelperTargets.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEModuleSupport.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JUCEUtils.cmake"
"${JUCE_CMAKE_UTILS_DIR}/JuceLV2Defines.h.in"
"${JUCE_CMAKE_UTILS_DIR}/LaunchScreen.storyboard"
"${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessor.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/PIPAudioProcessorWithARA.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/PIPComponent.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/PIPConsole.cpp.in"
"${JUCE_CMAKE_UTILS_DIR}/RecentFilesMenuTemplate.nib"
"${JUCE_CMAKE_UTILS_DIR}/UnityPluginGUIScript.cs.in"
"${JUCE_CMAKE_UTILS_DIR}/checkBundleSigning.cmake"
"${JUCE_CMAKE_UTILS_DIR}/copyDir.cmake"
"${JUCE_CMAKE_UTILS_DIR}/juce_runtime_arch_detection.cpp"
"${JUCE_CMAKE_UTILS_DIR}/juce_LinuxSubprocessHelper.cpp"
DESTINATION "${JUCE_INSTALL_DESTINATION}")
if(("${CMAKE_SOURCE_DIR}" STREQUAL "${JUCE_SOURCE_DIR}") AND (NOT JUCE_BUILD_HELPER_TOOLS))
_juce_add_lv2_manifest_helper_target()
if(TARGET juce_lv2_helper)
install(TARGETS juce_lv2_helper EXPORT LV2_HELPER DESTINATION "bin/JUCE-${JUCE_VERSION}")
install(EXPORT LV2_HELPER NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}")
endif()
_juce_add_vst3_manifest_helper_target()
if(TARGET juce_vst3_helper)
install(TARGETS juce_vst3_helper EXPORT VST3_HELPER DESTINATION "bin/JUCE-${JUCE_VERSION}")
install(EXPORT VST3_HELPER NAMESPACE juce:: DESTINATION "${JUCE_INSTALL_DESTINATION}")
endif()
endif()

132
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,132 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[info@juce.com](mailto:info@juce.com).
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View file

@ -1,37 +1,66 @@
# The JUCE Library
# The JUCE Framework
**BY DOWNLOADING, INSTALLING OR USING ANY PART OF THE JUCE LIBRARY, YOU AGREE
TO THE [JUCE 7 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-7-licence)
AND THE [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy), WHICH
ARE BINDING AGREEMENTS BETWEEN YOU AND RAW MATERIAL SOFTWARE LIMITED. IF YOU DO
NOT AGREE TO THE TERMS, DO NOT USE THE JUCE LIBRARY.**
The JUCE Framework is an open source framework licensed under a combination of
open source and commercial licences.
JUCE has tier-leveled license terms, with different terms for each available
license: JUCE Personal (for developers or startup businesses with revenue under
the 50K USD Revenue Limit; free), JUCE Indie (for small businesses with under
500K USD Revenue Limit; $40/month), JUCE Pro (no Revenue Limit; $130/month),
and JUCE Educational (no Revenue Limit; free for bona fide educational
institutions). All licenses allow you to commercially release applications as
long as you do not exceed the Revenue Limit and pay the applicable Fees. Once
your business hits the Revenue Limit for your JUCE license tier, to continue
distributing your Applications you will either have to upgrade your JUCE
license, or instead release your Applications under the
[GNU General Public License v.3](https://www.gnu.org/licenses/gpl-3.0.en.html),
which means, amongst other things, that you must make the source code of your
Applications available.
The JUCE Framework modules are dual-licensed under the
[AGPLv3](https://www.gnu.org/licenses/agpl-3.0.en.html) and the commercial [JUCE
licence](https://juce.com/legal/juce-8-licence/).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF MERCHANTABILITY AND FITNESS FOR A
PARTICULAR PURPOSE, ARE DISCLAIMED.
## The JUCE Licence
The juce_audio_basics, juce_audio_devices, juce_core and juce_events modules
are permissively licensed under the terms of the [ISC
license](http://www.isc.org/downloads/software-support-policy/isc-license).
If you are not licensing the JUCE Framework modules under the
[AGPLv3](https://www.gnu.org/licenses/agpl-3.0.en.html) then 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 the [JUCE 8 End User Licence
Agreement](https://juce.com/legal/juce-8-licence/), and all incorporated terms
including the [JUCE Privacy Policy](https://juce.com/legal/juce-privacy-policy/)
and the [JUCE Website Terms of
Service](https://juce.com/legal/juce-website-terms-of-service/), as applicable,
which will bind you. If you do not agree to the terms of this Agreement, 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.
For more information, visit the website:
[www.juce.com](https://www.juce.com)
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.
FULL JUCE TERMS:
- [JUCE 7 END-USER LICENSE AGREEMENT](https://www.juce.com/juce-7-licence)
- [JUCE PRIVACY POLICY](https://www.juce.com/juce-privacy-policy)
For more information, visit the [JUCE website](https://juce.com).
Full licence terms:
- [JUCE 8 End User Licence Agreement](https://juce.com/legal/juce-8-licence/)
- [JUCE Privacy Policy](https://juce.com/legal/juce-privacy-policy/)
- [JUCE Website Terms of Service](https://juce.com/legal/juce-website-terms-of-service/)
## The JUCE Framework Dependencies
The JUCE modules contain the following dependencies:
- [AudioUnitSDK](modules/juce_audio_plugin_client/AU/AudioUnitSDK/) ([Apache 2.0](modules/juce_audio_plugin_client/AU/AudioUnitSDK/LICENSE.txt))
- [Oboe](modules/juce_audio_devices/native/oboe/) ([Apache 2.0](modules/juce_audio_devices/native/oboe/LICENSE))
- [FLAC](modules/juce_audio_formats/codecs/flac/) ([BSD](modules/juce_audio_formats/codecs/flac/Flac%20Licence.txt))
- [GLEW](modules/juce_opengl/opengl/juce_gl.h) ([BSD](modules/juce_opengl/opengl/juce_gl.h)), including [Mesa](modules/juce_opengl/opengl/juce_gl.h) ([MIT](modules/juce_opengl/opengl/juce_gl.h)) and [Khronos](modules/juce_opengl/opengl/juce_gl.h) ([MIT](modules/juce_opengl/opengl/juce_gl.h))
- [Ogg Vorbis](modules/juce_audio_formats/codecs/oggvorbis/) ([BSD](modules/juce_audio_formats/codecs/oggvorbis/Ogg%20Vorbis%20Licence.txt))
- [jpeglib](modules/juce_graphics/image_formats/jpglib/) ([Independent JPEG Group License](modules/juce_graphics/image_formats/jpglib/README))
- [CHOC](modules/juce_core/javascript/choc/) ([ISC](modules/juce_core/javascript/choc/LICENSE.md)), including [QuickJS](modules/juce_core/javascript/choc/javascript/choc_javascript_QuickJS.h) ([MIT](modules/juce_core/javascript/choc/javascript/choc_javascript_QuickJS.h))
- [LV2](modules/juce_audio_processors/format_types/LV2_SDK/) ([ISC](modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING))
- [pslextensions](modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h) ([Public domain](modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h))
- [AAX](modules/juce_audio_plugin_client/AAX/SDK/) ([Proprietary Avid AAX License/GPLv3](modules/juce_audio_plugin_client/AAX/SDK/LICENSE.txt))
- [VST3](modules/juce_audio_processors/format_types/VST3_SDK/) ([Proprietary Steinberg VST3 License/GPLv3](modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt))
- [Box2D](modules/juce_box2d/box2d/) ([zlib](modules/juce_box2d/box2d/Box2D.h))
- [pnglib](modules/juce_graphics/image_formats/pnglib/) ([zlib](modules/juce_graphics/image_formats/pnglib/LICENSE))
- [zlib](modules/juce_core/zip/zlib/) ([zlib](modules/juce_core/zip/zlib/README))
- [HarfBuzz](modules/juce_graphics/fonts/harfbuzz/) ([Old MIT](modules/juce_graphics/fonts/harfbuzz/COPYING))
- [SheenBidi](modules/juce_graphics/unicode/sheenbidi/) ([Apache](modules/juce_graphics/unicode/sheenbidi/LICENSE))
The JUCE examples are licensed under the terms of the
[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/).
Dependencies in the examples:
- [reaper-sdk](examples/Plugins/extern/) ([zlib](examples/Plugins/extern/LICENSE.md))
Dependencies in the bundled applications:
- [Projucer icons](extras/Projucer/Source/Utility/UI/jucer_Icons.cpp) ([MIT](extras/Projucer/Source/Utility/UI/jucer_Icons.cpp))
Dependencies in the build system:
- [Android Gradle](examples/DemoRunner/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt) ([Apache 2.0](examples/DemoRunner/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt))

124
README.md
View file

@ -1,33 +1,38 @@
![alt text](https://assets.juce.com/juce/JUCE_banner_github.png "JUCE")
JUCE is an open-source cross-platform C++ application framework for creating high quality
desktop and mobile applications, including VST, VST3, AU, AUv3, AAX and LV2 audio plug-ins
and plug-in hosts. JUCE can be easily integrated with existing projects via CMake, or can
be used as a project generation tool via the [Projucer](https://juce.com/discover/projucer),
which supports exporting projects for Xcode (macOS and iOS), Visual Studio, Android Studio,
Code::Blocks and Linux Makefiles as well as containing a source code editor.
JUCE is an open-source cross-platform C++ application framework for creating
desktop and mobile applications, including VST, VST3, AU, AUv3, AAX and LV2
audio plug-ins and plug-in hosts. JUCE can be easily integrated with existing
projects via CMake, or can be used as a project generation tool via the
[Projucer](#the-projucer), which supports exporting projects for Xcode (macOS
and iOS), Visual Studio, Android Studio, and Linux Makefiles as well as
containing a source code editor.
## Getting Started
The JUCE repository contains a [master](https://github.com/juce-framework/JUCE/tree/master)
and [develop](https://github.com/juce-framework/JUCE/tree/develop) branch. The develop branch
contains the latest bugfixes and features and is periodically merged into the master
branch in stable [tagged releases](https://github.com/juce-framework/JUCE/releases)
(the latest release containing pre-built binaries can be also downloaded from the
[JUCE website](https://juce.com/get-juce)).
The JUCE repository contains a
[master](https://github.com/juce-framework/JUCE/tree/master) and
[develop](https://github.com/juce-framework/JUCE/tree/develop) branch. The
develop branch contains the latest bug fixes and features and is periodically
merged into the master branch in stable [tagged
releases](https://github.com/juce-framework/JUCE/releases) (the latest release
containing pre-built binaries can be also downloaded from the [JUCE
website](https://juce.com/get-juce)).
JUCE projects can be managed with either the Projucer (JUCE's own project-configuration
tool) or with CMake.
JUCE projects can be managed with either the Projucer (JUCE's own
project-configuration tool) or with CMake.
### The Projucer
The repository doesn't contain a pre-built Projucer so you will need to build it
for your platform - Xcode, Visual Studio and Linux Makefile projects are located in
[extras/Projucer/Builds](/extras/Projucer/Builds)
(the minimum system requirements are listed in the __System Requirements__ section below).
The Projucer can then be used to create new JUCE projects, view tutorials and run examples.
It is also possible to include the JUCE modules source code in an existing project directly,
or build them into a static or dynamic library which can be linked into a project.
for your platform - Xcode, Visual Studio and Linux Makefile projects are located
in [extras/Projucer/Builds](/extras/Projucer/Builds) (the minimum system
requirements are listed in the [minimum system
requirements](#minimum-system-requirements) section below). The Projucer can
then be used to create new JUCE projects, view tutorials and run examples. It is
also possible to include the JUCE modules source code in an existing project
directly, or build them into a static or dynamic library which can be linked
into a project.
For further help getting started, please refer to the JUCE
[documentation](https://juce.com/learn/documentation) and
@ -35,7 +40,7 @@ For further help getting started, please refer to the JUCE
### CMake
Version 3.15 or higher is required. To use CMake, you will need to install it,
Version 3.22 or higher is required. To use CMake, you will need to install it,
either from your system package manager or from the [official download
page](https://cmake.org/download/). For comprehensive documentation on JUCE's
CMake API, see the [JUCE CMake documentation](/docs/CMake%20API.md). For
@ -56,19 +61,20 @@ of the target you wish to build.
#### Building JUCE Projects
- __macOS/iOS__: Xcode 10.1 (macOS 10.13.6)
- __Windows__: Windows 8.1 and Visual Studio 2017
- __C++ Standard__: 17
- __macOS/iOS__: Xcode 12.4 (Intel macOS 10.15.4, Apple Silicon macOS 11.0)
- __Windows__: Visual Studio 2019 (Windows 10)
- __Linux__: g++ 7.0 or Clang 6.0 (for a full list of dependencies, see
[here](/docs/Linux%20Dependencies.md)).
- __Android__: Android Studio on Windows, macOS or Linux
- __Android__: Android Studio (NDK 26) on Windows, macOS or Linux
#### Deployment Targets
- __macOS__: macOS 10.9
- __Windows__: Windows Vista
- __Linux__: Mainstream Linux distributions
- __iOS__: iOS 9.0
- __Android__: Jelly Bean (API 16)
- __macOS__: macOS 10.11 (x86_64, Arm64)
- __Windows__: Windows 10 (x86_64, x86, Arm64, Arm64EC)
- __Linux__: Mainstream Linux distributions (x86_64, Arm64/aarch64, (32 bit Arm systems like armv7 should work but are not regularly tested))
- __iOS__: iOS 12 (Arm64, Arm64e, x86_64 (Simulator))
- __Android__: Android 5 - Lollipop (API Level 21) (arm64-v8a, armeabi-v7a, x86_64, x86)
## Contributing
@ -76,43 +82,37 @@ Please see our [contribution guidelines](.github/contributing.md).
## Licensing
The core JUCE modules (juce_audio_basics, juce_audio_devices, juce_core and juce_events)
are permissively licensed under the terms of the
[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/).
Other modules are covered by a
[GPL](https://www.gnu.org/licenses/gpl-3.0.en.html)/Commercial license.
See [LICENSE.md](LICENSE.md) for licensing and dependency information.
There are multiple commercial licensing tiers for JUCE, with different terms for each:
- JUCE Personal (developers or startup businesses with revenue under 50K USD) - free
- JUCE Indie (small businesses with revenue under 500K USD) - $40/month or $800 perpetual
- JUCE Pro (no revenue limit) - $130/month or $2600 perpetual
- JUCE Educational (no revenue limit) - free for bona fide educational institutes
## AAX Plug-Ins
For full terms see [LICENSE.md](LICENSE.md).
AAX plug-ins need to be digitally signed using PACE Anti-Piracy's signing tools
before they will run in commercially available versions of Pro Tools. These
tools are provided free of charge by Avid. Before obtaining the signing tools,
you will need to use a special build of Pro Tools, called Pro Tools Developer,
to test your unsigned plug-ins. The steps to obtain Pro Tools Developer are:
The JUCE framework contains the following dependencies:
- [Oboe](modules/juce_audio_devices/native/oboe/) ([Apache 2.0](modules/juce_audio_devices/native/oboe/LICENSE))
- [FLAC](modules/juce_audio_formats/codecs/flac/) ([BSD](modules/juce_audio_formats/codecs/flac/Flac%20Licence.txt))
- [Ogg Vorbis](modules/juce_audio_formats/codecs/oggvorbis/) ([BSD](modules/juce_audio_formats/codecs/oggvorbis/Ogg%20Vorbis%20Licence.txt))
- [AudioUnitSDK](modules/juce_audio_plugin_client/AU/AudioUnitSDK/) ([Apache 2.0](modules/juce_audio_plugin_client/AU/AudioUnitSDK/LICENSE.txt))
- [AUResources.r](modules/juce_audio_plugin_client/AUResources.r) ([Apple](modules/juce_audio_plugin_client/AUResources.r))
- [LV2](modules/juce_audio_processors/format_types/LV2_SDK/) ([ISC](modules/juce_audio_processors/format_types/LV2_SDK/lv2/COPYING))
- [pslextensions](modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h) ([Public domain](modules/juce_audio_processors/format_types/pslextensions/ipslcontextinfo.h))
- [VST3](modules/juce_audio_processors/format_types/VST3_SDK/) ([Proprietary Steinberg VST3/GPLv3](modules/juce_audio_processors/format_types/VST3_SDK/LICENSE.txt))
- [zlib](modules/juce_core/zip/zlib/) ([zlib](modules/juce_core/zip/zlib/README))
- [Box2D](modules/juce_box2d/box2d/) ([zlib](modules/juce_box2d/box2d/Box2D.h))
- [jpeglib](modules/juce_graphics/image_formats/jpglib/) ([Independent JPEG Group License](modules/juce_graphics/image_formats/jpglib/README))
- [pnglib](modules/juce_graphics/image_formats/pnglib/) ([zlib](modules/juce_graphics/image_formats/pnglib/LICENSE))
- [GLEW](modules/juce_opengl/opengl/juce_gl.h) ([BSD](modules/juce_opengl/opengl/juce_gl.h)), including [Mesa](modules/juce_opengl/opengl/juce_gl.h) ([MIT](modules/juce_opengl/opengl/juce_gl.h)) and [Khronos](modules/juce_opengl/opengl/juce_gl.h) ([MIT](modules/juce_opengl/opengl/juce_gl.h))
1. Sign up as an AAX Developer [here](https://developer.avid.com/aax/).
2. Request a Pro Tools Developer Bundle activation code by sending an email to
[devauth@avid.com](mailto:devauth@avid.com).
3. Download the latest Pro Tools Developer build from your Avid Developer
account.
The JUCE examples are licensed under the terms of the
[ISC license](http://www.isc.org/downloads/software-support-policy/isc-license/).
When your plug-ins have been tested and debugged in Pro Tools Developer, and you
are ready to digitally sign them, please send an email to
[audiosdk@avid.com](mailto:audiosdk@avid.com) with the subject "PACE Eden
Signing Tools Request". You need to include an overview of each plug-in along
with a screen recording showing the plug-in running in Pro Tools Developer, with
audio if possible.
Dependencies in the examples:
- [reaper-sdk](examples/Plugins/extern/) ([zlib](examples/Plugins/extern/LICENSE.md))
Please also include the following information:
Dependencies in the bundled applications:
- [Projucer icons](extras/Projucer/Source/Utility/UI/jucer_Icons.cpp) ([MIT](extras/Projucer/Source/Utility/UI/jucer_Icons.cpp))
- Company name
- Admin full name
- Telephone number
Dependencies in the build system:
- [Android Gradle](examples/DemoRunner/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt) ([Apache 2.0](examples/DemoRunner/Builds/Android/gradle/wrapper/LICENSE-for-gradlewrapper.txt))
Once the request is submitted, PACE Anti-Piracy will contact you directly with
information about signing your plug-ins. When the plug-ins have been signed, you
are free to sell and distribute them. If you are interested in selling your
plug-ins on the Avid Marketplace, please send an email to
[audiosdk@avid.com](mailto:audiosdk@avid.com).

View file

@ -2,9 +2,8 @@
## System Requirements
- All project types require CMake 3.15 or higher.
- All project types require CMake 3.22 or higher.
- Android targets are not currently supported.
- WebView2 on Windows via JUCE_USE_WIN_WEBVIEW2 flag in juce_gui_extra is not currently supported.
Most system package managers have packages for CMake, but we recommend using the most recent release
from https://cmake.org/download. You should always use a CMake that's newer than your build
@ -144,11 +143,10 @@ you can configure a Clang-cl build by passing "-T ClangCL" on your configuration
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. CMake 3.12 is not supported, CMake 3.15 has
support, CMake 3.20 or higher is recommended. 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.15/prop_tgt/MSVC_RUNTIME_LIBRARY.html) of this
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
property for usage recommendations.
### A note about compile definitions
@ -169,10 +167,10 @@ appropriate:
target_compile_definitions(my_target PUBLIC NAME_OF_KEY=<value>)
The `JucePlugin_PreferredChannelConfig` preprocessor definition for plugins is difficult to specify
in a portable way due to its use of curly braces, which may be misinterpreted in Linux/Mac builds
using the Ninja/Makefile generators. It is recommended to avoid this option altogether, and to use
the newer buses API to specify the desired plugin inputs and outputs.
The `JucePlugin_PreferredChannelConfigurations` preprocessor definition for plugins is difficult to
specify in a portable way due to its use of curly braces, which may be misinterpreted in Linux/Mac
builds using the Ninja/Makefile generators. It is recommended to avoid this option altogether, and
to use the newer buses API to specify the desired plugin inputs and outputs.
## API Reference
@ -224,6 +222,24 @@ plugin folders may be protected, so the build may require elevated permissions i
installation to work correctly, or you may need to adjust the permissions of the destination
folders.
#### `JUCE_MODULES_ONLY`
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
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
`%userprofile%\AppData\Local\PackageManagement\NuGet\Packages`. This location can be overriden by
specifying this option. The provided location should contain the `*Microsoft.Web.WebView2*`
directory.
### Functions
#### `juce_add_<target>`
@ -266,7 +282,7 @@ attributes directly to these creation functions, rather than adding them later.
`BUNDLE_ID`
- 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 `PRODUCT_NAME`.
the target's `COMPANY_NAME` and the name of the CMake target.
`MICROPHONE_PERMISSION_ENABLED`
- May be either TRUE or FALSE. Adds the appropriate entries to an app's Info.plist.
@ -398,6 +414,11 @@ attributes directly to these creation functions, rather than adding them later.
are set on a JUCE target. By default, we don't link Webkit because you might not need it, but
if you get linker or include errors that reference Webkit, just set this argument to `TRUE`.
`NEEDS_WEBVIEW2`
- On Windows, JUCE may or may not need to link to WebView2 depending on the compile definitions that
are set on a JUCE target. By default, we don't link WebView2 because you might not need it, but
if you get linker or include errors that reference WebView2, just set this argument to `TRUE`.
`NEEDS_STORE_KIT`
- On macOS, JUCE may or may not need to link to StoreKit depending on the compile definitions that
are set on a JUCE target. By default, we don't link StoreKit because you might not need it, but
@ -445,6 +466,11 @@ attributes directly to these creation functions, rather than adding them later.
- A set of space-separated paths that will be added to this target's entitlements plist for
accessing read/write absolute paths if `APP_SANDBOX_ENABLED` is `TRUE`.
`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`.
For more information see Apple's IOKit User Client Class Temporary Exception documentation.
`PLIST_TO_MERGE`
- A string to insert into an app/plugin's Info.plist.
@ -499,6 +525,17 @@ attributes directly to these creation functions, rather than adding them later.
`AAX_IDENTIFIER`
- The bundle ID for the AAX plugin target. Matches the `BUNDLE_ID` by default.
`LV2URI`
- 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
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.
`VST_NUM_MIDI_INS`
- For VST2 and VST3 plugins that accept midi, this allows you to configure the number of inputs.
@ -507,7 +544,7 @@ attributes directly to these creation functions, rather than adding them later.
`VST2_CATEGORY`
- Should be one of: `kPlugCategUnknown`, `kPlugCategEffect`, `kPlugCategSynth`,
`kPlugCategAnalysis`, `kPlugCategMatering`, `kPlugCategSpacializer`, `kPlugCategRoomFx`,
`kPlugCategAnalysis`, `kPlugCategMastering`, `kPlugCategSpacializer`, `kPlugCategRoomFx`,
`kPlugSurroundFx`, `kPlugCategRestoration`, `kPlugCategOfflineProcess`, `kPlugCategShell`,
`kPlugCategGenerator`.
@ -540,13 +577,9 @@ attributes directly to these creation functions, rather than adding them later.
in GarageBand.
`AAX_CATEGORY`
- Should be one or more of: `AAX_ePlugInCategory_None`, `AAX_ePlugInCategory_EQ`,
`AAX_ePlugInCategory_Dynamics`, `AAX_ePlugInCategory_PitchShift`, `AAX_ePlugInCategory_Reverb`,
`AAX_ePlugInCategory_Delay`, `AAX_ePlugInCategory_Modulation`, `AAX_ePlugInCategory_Harmonic`,
`AAX_ePlugInCategory_NoiseReduction`, `AAX_ePlugInCategory_Dither`,
`AAX_ePlugInCategory_SoundField`, `AAX_ePlugInCategory_HWGenerators`,
`AAX_ePlugInCategory_SWGenerators`, `AAX_ePlugInCategory_WrappedPlugin`,
`AAX_EPlugInCategory_Effect`
- 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_`.
`PLUGINHOST_AU`
- May be either TRUE or FALSE (defaults to FALSE). If TRUE, will add the preprocessor definition
@ -635,6 +668,17 @@ attributes directly to these creation functions, rather than adding them later.
`kARAPlaybackTransformationContentBasedFadeAtTail`,
`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
`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.
#### `juce_add_binary_data`
juce_add_binary_data(<name>
@ -695,6 +739,19 @@ If your custom build steps need to use the location of the plugin artefact, you
by querying the property `JUCE_PLUGIN_ARTEFACT_FILE` on a plugin target (*not* the shared code
target!).
#### `juce_enable_vst3_manifest_step`
juce_enable_vst3_manifest_step(<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.
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
steps, and then finally call `juce_enable_vst3_manifest_step`.
#### `juce_set_<kind>_sdk_path`
juce_set_aax_sdk_path(<absolute path>)
@ -738,8 +795,8 @@ CMakeLists in the `modules` directory.
This function parses the PIP metadata block in the provided header, and adds appropriate build
targets for a console app, GUI app, or audio plugin. For audio plugin targets, it builds as many
plugin formats as possible. To build AAX or VST2 targets, call `juce_set_aax_sdk_path` and/or
`juce_set_vst2_sdk_path` *before* calling `juce_add_pip`.
plugin formats as possible. To build VST2 targets, call `juce_set_vst2_sdk_path` *before* calling
`juce_add_pip`.
This is mainly provided to build the built-in example projects in the JUCE repo, and for building
quick proof-of-concept demo apps with minimal set-up. For any use-case more complex than a
@ -755,6 +812,21 @@ This function sets the `CMAKE_<LANG>_FLAGS_<MODE>` to empty in the current direc
allowing alternative optimisation/debug flags to be supplied without conflicting with the
CMake-supplied defaults.
#### `juce_link_with_embedded_linux_subprocess`
juce_link_with_embedded_linux_subprocess(<target>)
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
non-standalone format, and will be used to host a WebKit view. This technique is used by audio
plugins on Linux.
This function is automatically called if necessary for all targets created by one of the JUCE target
creation functions i.e. `juce_add_gui_app`, `juce_add_console_app` and `juce_add_gui_app`. You don't
need to call this function manually in these cases.
### Targets
#### `juce::juce_recommended_warning_flags`

View file

@ -65,28 +65,28 @@ adding these files to their projects.
The names of these source files must begin with the name of the module, but they can have
a number or other suffix if there is more than one.
In order to specify that a source file should only be compiled on a specific platform,
then the filename can be suffixed with one of the following strings:
In order to specify that a source file should only be compiled for a specific platform,
then the filename can be suffixed with one of the following (case insensitive) strings:
_OSX
_Windows
_Linux
_Android
_iOS
_mac or _osx <- compiled for macOS and OSX platforms only
_windows <- compiled for Windows platforms only
_linux <- compiled for Linux and FreeBSD platforms only
_andoid <- compiled for Android platforms only
_ios <- compiled for iOS platforms only
e.g.
juce_mymodule/juce_mymodule_1.cpp <- compiled on all platforms
juce_mymodule/juce_mymodule_2.cpp <- compiled on all platforms
juce_mymodule/juce_mymodule_OSX.cpp <- compiled only on OSX
juce_mymodule/juce_mymodule_Windows.cpp <- compiled only on Windows
juce_mymodule/juce_mymodule_1.cpp <- compiled for all platforms
juce_mymodule/juce_mymodule_2.cpp <- compiled for all platforms
juce_mymodule/juce_mymodule_mac.cpp <- compiled for macOS and OSX platforms only
juce_mymodule/juce_mymodule_windows.cpp <- compiled for Windows platforms only
Often this isn't necessary, as in most cases you can easily add checks inside the files
to do different things depending on the platform, but this may be handy just to avoid
clutter in user projects where files aren't needed.
To simplify the use of obj-C++ there's also a special-case rule: If the folder contains
both a .mm and a .cpp file whose names are otherwise identical, then on OSX/iOS the .mm
both a .mm and a .cpp file whose names are otherwise identical, then on macOS/iOS the .mm
will be used and the cpp ignored. (And vice-versa for other platforms, of course).
@ -95,8 +95,7 @@ will be used and the cpp ignored. (And vice-versa for other platforms, of course
Precompiled libraries can be included in a module by placing them in a libs/ subdirectory.
The following directories are automatically added to the library search paths, and libraries
placed in these directories can be linked with projects via the OSXLibs, iOSLibs,
windowsLibs, linuxLibs and mingwLibs keywords in the module declaration (see the following
section).
windowsLibs, and linuxLibs keywords in the module declaration (see the following section).
- OS X
- libs/MacOSX - to support multiple architectures, you may place libraries built as universal
@ -115,9 +114,6 @@ section).
- libs/Linux/{arch}, where {arch} is the architecture you are targeting with the compiler. Some
common examples of {arch} are "x86_64", "i386" and "armv6".
- MinGW
- libs/MinGW/{arch}, where {arch} can take the same values as Linux.
- iOS
- libs/iOS - to support multiple architectures, you may place libraries built as universal
binaries at this location. For backwards compatibility, the Projucer will also include the
@ -206,10 +202,6 @@ Possible values:
- (Optional) A list (space or comma-separated) of static or dynamic libs that should be linked in a
linux build (these are passed to the linker via the -l flag)
- mingwLibs
- (Optional) A list (space or comma-separated) of static libs that should be linked in a
win32 mingw build (these are passed to the linker via the -l flag)
- OSXLibs
- (Optional) A list (space or comma-separated) of static or dynamic libs that should be linked in an
OS X build (these are passed to the linker via the -l flag)
@ -232,13 +224,12 @@ Here's an example block:
name: JUCE audio and MIDI I/O device classes
description: Classes to play and record from audio and MIDI I/O devices
website: http://www.juce.com/juce
license: GPL/Commercial
license: AGPLv3/Commercial
dependencies: juce_audio_basics, juce_audio_formats, juce_events
OSXFrameworks: CoreAudio CoreMIDI DiscRecording
iOSFrameworks: CoreAudio CoreMIDI AudioToolbox AVFoundation
linuxLibs: asound
mingwLibs: winmm
END_JUCE_MODULE_DECLARATION

View file

@ -32,7 +32,11 @@ or
- libcurl4-openssl-dev (unless `JUCE_USE_CURL=0`)
#### juce_graphics
- libfreetype6-dev (unless `JUCE_USE_FREETYPE=0`)
- libfontconfig1-dev (unless `JUCE_USE_FONTCONFIG=0`)
- libfreetype-dev (unless `JUCE_USE_FREETYPE=0`)
These packages are available on Ubuntu 22 and 24. If libfreetype-dev is not
available you could try installing the libfreetype6-dev package.
#### juce_gui_basics
- libx11-dev
@ -44,7 +48,14 @@ or
- libxrender-dev (unless `JUCE_USE_XRENDER=0`)
#### juce_gui_extra
- libwebkit2gtk-4.0-dev (unless `JUCE_WEB_BROWSER=0`)
- libwebkit2gtk-4.1-dev (unless `JUCE_WEB_BROWSER=0`)
On older systems, where 4.1 is not available, you can also use
- libwebkit2gtk-4.0-dev
Compiled JUCE applications will dynamically load whichever library version is
available during runtime.
#### juce_opengl
- libglu1-mesa-dev
@ -56,7 +67,7 @@ The full command is as follows:
sudo apt install libasound2-dev libjack-jackd2-dev \
ladspa-sdk \
libcurl4-openssl-dev \
libfreetype6-dev \
libx11-dev libxcomposite-dev libxcursor-dev libxcursor-dev libxext-dev libxinerama-dev libxrandr-dev libxrender-dev \
libwebkit2gtk-4.0-dev \
libfreetype-dev libfontconfig1-dev \
libx11-dev libxcomposite-dev libxcursor-dev libxext-dev libxinerama-dev libxrandr-dev libxrender-dev \
libwebkit2gtk-4.1-dev \
libglu1-mesa-dev mesa-common-dev

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,190 @@
/*
==============================================================================
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
#pragma once
class ADSRComponent final : public Component
{
public:
ADSRComponent()
: envelope { *this }
{
for (Slider* slider : { &adsrAttack, &adsrDecay, &adsrSustain, &adsrRelease })
{
if (slider == &adsrSustain)
{
slider->textFromValueFunction = [slider] (double value)
{
String text;
text << slider->getName();
const auto val = (int) jmap (value, 0.0, 1.0, 0.0, 100.0);
text << String::formatted (": %d%%", val);
return text;
};
}
else
{
slider->textFromValueFunction = [slider] (double value)
{
String text;
text << slider->getName();
text << ": " << ((value < 0.4f) ? String::formatted ("%dms", (int) std::round (value * 1000))
: String::formatted ("%0.2lf Sec", value));
return text;
};
slider->setSkewFactor (0.3);
}
slider->setRange (0, 1);
slider->setTextBoxStyle (Slider::TextBoxBelow, true, 300, 25);
slider->onValueChange = [this]
{
NullCheckedInvocation::invoke (onChange);
repaint();
};
addAndMakeVisible (slider);
}
adsrAttack.setName ("Attack");
adsrDecay.setName ("Decay");
adsrSustain.setName ("Sustain");
adsrRelease.setName ("Release");
adsrAttack.setValue (0.1, dontSendNotification);
adsrDecay.setValue (0.3, dontSendNotification);
adsrSustain.setValue (0.3, dontSendNotification);
adsrRelease.setValue (0.2, dontSendNotification);
addAndMakeVisible (envelope);
}
std::function<void()> onChange;
ADSR::Parameters getParameters() const
{
return
{
(float) adsrAttack.getValue(),
(float) adsrDecay.getValue(),
(float) adsrSustain.getValue(),
(float) adsrRelease.getValue(),
};
}
void resized() final
{
auto bounds = getLocalBounds();
const auto knobWidth = bounds.getWidth() / 4;
auto knobBounds = bounds.removeFromBottom (bounds.getHeight() / 2);
{
adsrAttack.setBounds (knobBounds.removeFromLeft (knobWidth));
adsrDecay.setBounds (knobBounds.removeFromLeft (knobWidth));
adsrSustain.setBounds (knobBounds.removeFromLeft (knobWidth));
adsrRelease.setBounds (knobBounds.removeFromLeft (knobWidth));
}
envelope.setBounds (bounds);
}
Slider adsrAttack { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
Slider adsrDecay { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
Slider adsrSustain { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
Slider adsrRelease { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
private:
class Envelope final : public Component
{
public:
Envelope (ADSRComponent& adsr) : parent { adsr } {}
void paint (Graphics& g) final
{
const auto env = parent.getParameters();
// sustain isn't a length but we use a fixed value here to give
// sustain some visual width in the envelope
constexpr auto sustainLength = 0.1;
const auto adsrLength = env.attack
+ env.decay
+ sustainLength
+ env.release;
auto bounds = getLocalBounds().toFloat();
const auto attackWidth = bounds.proportionOfWidth (env.attack / adsrLength);
const auto decayWidth = bounds.proportionOfWidth (env.decay / adsrLength);
const auto sustainWidth = bounds.proportionOfWidth (sustainLength / adsrLength);
const auto releaseWidth = bounds.proportionOfWidth (env.release / adsrLength);
const auto sustainHeight = bounds.proportionOfHeight (1 - env.sustain);
const auto attackBounds = bounds.removeFromLeft (attackWidth);
const auto decayBounds = bounds.removeFromLeft (decayWidth);
const auto sustainBounds = bounds.removeFromLeft (sustainWidth);
const auto releaseBounds = bounds.removeFromLeft (releaseWidth);
g.setColour (Colours::black.withAlpha (0.1f));
g.fillRect (bounds);
const auto alpha = 0.4f;
g.setColour (Colour (246, 98, 92).withAlpha (alpha));
g.fillRect (attackBounds);
g.setColour (Colour (242, 187, 60).withAlpha (alpha));
g.fillRect (decayBounds);
g.setColour (Colour (109, 234, 166).withAlpha (alpha));
g.fillRect (sustainBounds);
g.setColour (Colour (131, 61, 183).withAlpha (alpha));
g.fillRect (releaseBounds);
Path envelopePath;
envelopePath.startNewSubPath (attackBounds.getBottomLeft());
envelopePath.lineTo (decayBounds.getTopLeft());
envelopePath.lineTo (sustainBounds.getX(), sustainHeight);
envelopePath.lineTo (releaseBounds.getX(), sustainHeight);
envelopePath.lineTo (releaseBounds.getBottomRight());
const auto lineThickness = 4.0f;
g.setColour (Colours::white);
g.strokePath (envelopePath, PathStrokeType { lineThickness });
}
private:
ADSRComponent& parent;
};
Envelope envelope;
};

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -24,8 +28,8 @@
/* This component scrolls a continuous waveform showing the audio that's
coming into whatever audio inputs this object is connected to.
*/
class LiveScrollingAudioDisplay : public AudioVisualiserComponent,
public AudioIODeviceCallback
class LiveScrollingAudioDisplay final : public AudioVisualiserComponent,
public AudioIODeviceCallback
{
public:
LiveScrollingAudioDisplay() : AudioVisualiserComponent (1)

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -38,7 +42,7 @@ struct DSPDemoParameterBase : public ChangeBroadcaster
};
//==============================================================================
struct SliderParameter : public DSPDemoParameterBase
struct SliderParameter final : public DSPDemoParameterBase
{
SliderParameter (Range<double> range, double skew, double initialValue,
const String& labelName, const String& suffix = {})
@ -66,7 +70,7 @@ private:
};
//==============================================================================
struct ChoiceParameter : public DSPDemoParameterBase
struct ChoiceParameter final : public DSPDemoParameterBase
{
ChoiceParameter (const StringArray& options, int initialId, const String& labelName)
: DSPDemoParameterBase (labelName)
@ -89,11 +93,11 @@ private:
};
//==============================================================================
class AudioThumbnailComponent : public Component,
public FileDragAndDropTarget,
public ChangeBroadcaster,
private ChangeListener,
private Timer
class AudioThumbnailComponent final : public Component,
public FileDragAndDropTarget,
public ChangeBroadcaster,
private ChangeListener,
private Timer
{
public:
AudioThumbnailComponent (AudioDeviceManager& adm, AudioFormatManager& afm)
@ -148,7 +152,7 @@ public:
{
transportSource = newSource;
struct ResetCallback : public CallbackMessage
struct ResetCallback final : public CallbackMessage
{
ResetCallback (AudioThumbnailComponent& o) : owner (o) {}
void messageCallback() override { owner.reset(); }
@ -217,7 +221,7 @@ private:
};
//==============================================================================
class DemoParametersComponent : public Component
class DemoParametersComponent final : public Component
{
public:
DemoParametersComponent (const std::vector<DSPDemoParameterBase*>& demoParams)
@ -270,9 +274,9 @@ private:
//==============================================================================
template <class DemoType>
struct DSPDemo : public AudioSource,
public ProcessorWrapper<DemoType>,
private ChangeListener
struct DSPDemo final : public AudioSource,
public ProcessorWrapper<DemoType>,
private ChangeListener
{
DSPDemo (AudioSource& input)
: inputSource (&input)
@ -327,10 +331,10 @@ struct DSPDemo : public AudioSource,
//==============================================================================
template <class DemoType>
class AudioFileReaderComponent : public Component,
private TimeSliceThread,
private Value::Listener,
private ChangeListener
class AudioFileReaderComponent final : public Component,
private TimeSliceThread,
private Value::Listener,
private ChangeListener
{
public:
//==============================================================================
@ -379,7 +383,7 @@ public:
r.removeFromTop (20);
if (parametersComponent.get() != nullptr)
if (parametersComponent != nullptr)
parametersComponent->setBounds (r.removeFromTop (parametersComponent->getHeightNeeded()).reduced (20, 0));
}
@ -412,6 +416,7 @@ public:
readerSource->setLooping (loopState.getValue());
init();
resized();
return true;
}
@ -442,7 +447,7 @@ public:
transportSource.reset (new AudioTransportSource());
transportSource->addChangeListener (this);
if (readerSource.get() != nullptr)
if (readerSource != nullptr)
{
if (auto* device = audioDeviceManager.getCurrentAudioDevice())
{
@ -461,12 +466,20 @@ public:
audioSourcePlayer.setSource (currentDemo.get());
initParameters();
auto& parameters = currentDemo->getParameters();
parametersComponent.reset();
if (! parameters.empty())
{
parametersComponent = std::make_unique<DemoParametersComponent> (parameters);
addAndMakeVisible (parametersComponent.get());
}
}
void play()
{
if (readerSource.get() == nullptr)
if (readerSource == nullptr)
return;
if (transportSource->getCurrentPosition() >= transportSource->getLengthInSeconds()
@ -479,32 +492,17 @@ public:
void setLooping (bool shouldLoop)
{
if (readerSource.get() != nullptr)
if (readerSource != nullptr)
readerSource->setLooping (shouldLoop);
}
AudioThumbnailComponent& getThumbnailComponent() { return header.thumbnailComp; }
void initParameters()
{
auto& parameters = currentDemo->getParameters();
parametersComponent.reset();
if (parameters.size() > 0)
{
parametersComponent.reset (new DemoParametersComponent (parameters));
addAndMakeVisible (parametersComponent.get());
}
resized();
}
private:
//==============================================================================
class AudioPlayerHeader : public Component,
private ChangeListener,
private Value::Listener
class AudioPlayerHeader final : public Component,
private ChangeListener,
private Value::Listener
{
public:
AudioPlayerHeader (AudioDeviceManager& adm,
@ -596,13 +594,17 @@ private:
const auto u = fc.getURLResult();
if (! audioFileReader.loadURL (u))
NativeMessageBox::showAsync (MessageBoxOptions()
.withIconType (MessageBoxIconType::WarningIcon)
.withTitle ("Error loading file")
.withMessage ("Unable to load audio file"),
nullptr);
{
auto options = MessageBoxOptions().withIconType (MessageBoxIconType::WarningIcon)
.withTitle ("Error loading file")
.withMessage ("Unable to load audio file")
.withButton ("OK");
messageBox = NativeMessageBox::showScopedAsync (options, nullptr);
}
else
{
thumbnailComp.setCurrentURL (u);
}
}
fileChooser = nullptr;
@ -629,12 +631,13 @@ private:
AudioFileReaderComponent& audioFileReader;
std::unique_ptr<FileChooser> fileChooser;
ScopedMessageBox messageBox;
};
//==============================================================================
void valueChanged (Value& v) override
{
if (readerSource.get() != nullptr)
if (readerSource != nullptr)
readerSource->setLooping (v.getValue());
}

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -82,11 +86,26 @@ inline File getExamplesDirectory() noexcept
#endif
}
inline std::unique_ptr<InputStream> createAssetInputStream (const char* resourcePath)
enum class AssertAssetExists
{
no,
yes
};
inline std::unique_ptr<InputStream> createAssetInputStream (const char* resourcePath,
[[maybe_unused]] AssertAssetExists assertExists = AssertAssetExists::yes)
{
#if JUCE_ANDROID
ZipFile apkZip (File::getSpecialLocation (File::invokedExecutableFile));
return std::unique_ptr<InputStream> (apkZip.createStreamForEntry (apkZip.getIndexOfFileName ("assets/" + String (resourcePath))));
const auto fileIndex = apkZip.getIndexOfFileName ("assets/" + String (resourcePath));
if (fileIndex == -1)
{
jassert (assertExists == AssertAssetExists::no);
return {};
}
return std::unique_ptr<InputStream> (apkZip.createStreamForEntry (fileIndex));
#else
#if JUCE_IOS
auto assetsDir = File::getSpecialLocation (File::currentExecutableFile)
@ -102,7 +121,12 @@ inline std::unique_ptr<InputStream> createAssetInputStream (const char* resource
#endif
auto resourceFile = assetsDir.getChildFile (resourcePath);
jassert (resourceFile.existsAsFile());
if (! resourceFile.existsAsFile())
{
jassert (assertExists == AssertAssetExists::no);
return {};
}
return resourceFile.createInputStream();
#endif
@ -218,11 +242,7 @@ inline Path getJUCELogoPath()
// 0.0 and 1.0 at a random speed
struct BouncingNumber
{
BouncingNumber()
: speed (0.0004 + 0.0007 * Random::getSystemRandom().nextDouble()),
phase (Random::getSystemRandom().nextDouble())
{
}
virtual ~BouncingNumber() = default;
float getValue() const
{
@ -231,10 +251,11 @@ struct BouncingNumber
}
protected:
double speed, phase;
double speed = 0.0004 + 0.0007 * Random::getSystemRandom().nextDouble(),
phase = Random::getSystemRandom().nextDouble();
};
struct SlowerBouncingNumber : public BouncingNumber
struct SlowerBouncingNumber final : public BouncingNumber
{
SlowerBouncingNumber()
{
@ -244,10 +265,8 @@ struct SlowerBouncingNumber : public BouncingNumber
inline std::unique_ptr<InputSource> makeInputSource (const URL& url)
{
#if JUCE_ANDROID
if (auto doc = AndroidDocument::fromDocument (url))
if (const auto doc = AndroidDocument::fromDocument (url))
return std::make_unique<AndroidDocumentInputSource> (doc);
#endif
#if ! JUCE_IOS
if (url.isLocalFile())
@ -257,4 +276,17 @@ inline std::unique_ptr<InputSource> makeInputSource (const URL& url)
return std::make_unique<URLInputSource> (url);
}
inline std::unique_ptr<OutputStream> makeOutputStream (const URL& url)
{
if (const auto doc = AndroidDocument::fromDocument (url))
return doc.createOutputStream();
#if ! JUCE_IOS
if (url.isLocalFile())
return url.getLocalFile().createOutputStream();
#endif
return url.createOutputStream();
}
#endif // PIP_DEMO_UTILITIES_INCLUDED

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/

View file

@ -33,6 +33,5 @@
"OSXFrameworks": "Cocoa IOKit",
"iOSFrameworks": "Foundation",
"LinuxLibs": "rt dl pthread",
"mingwLibs": "uuid wsock32 wininet version ole32 ws2_32 oleaut32 imm32 comdlg32 shlwapi rpcrt4 winmm"
"LinuxLibs": "rt dl pthread"
}

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>WebViewPluginDemo</title>
<style type="text/css">
body {
background-color: white;
}
</style>
</head>
<body>
<h1>WebViewPluginDemo</h1>
<p>
This document is a placeholder for the GUI component of the
WebViewPluginDemo.
</p>
<p>
To build the fully fledged user interface you need to install
<a href="https://nodejs.org">node.js</a>
</p>
<p>
Then navigate into the
<code>examples/Plugins/WebViewPluginDemoGUI</code> directory inside your JUCE
directory, and issue the following commands.
</p>
<pre>
npm install
npm run build
npm run zip
</pre
>
<p>
This will build the full GUI package and place it in the
<code>Assets</code> directory.
</p>
<p>After this, rebuild and restart this demo.</p>
</body>
</html>

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -50,7 +54,7 @@
//==============================================================================
class AudioAppDemo : public AudioAppComponent
class AudioAppDemo final : public AudioAppComponent
{
public:
//==============================================================================

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -52,8 +56,8 @@
#include "../Assets/AudioLiveScrollingDisplay.h"
//==============================================================================
class LatencyTester : public AudioIODeviceCallback,
private Timer
class LatencyTester final : public AudioIODeviceCallback,
private Timer
{
public:
LatencyTester (TextEditor& editorBox)
@ -304,7 +308,7 @@ private:
};
//==============================================================================
class AudioLatencyDemo : public Component
class AudioLatencyDemo final : public Component
{
public:
AudioLatencyDemo()

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -48,12 +52,12 @@
#include "../Assets/DemoUtilities.h"
class DemoThumbnailComp : public Component,
public ChangeListener,
public FileDragAndDropTarget,
public ChangeBroadcaster,
private ScrollBar::Listener,
private Timer
class DemoThumbnailComp final : public Component,
public ChangeListener,
public FileDragAndDropTarget,
public ChangeBroadcaster,
private ScrollBar::Listener,
private Timer
{
public:
DemoThumbnailComp (AudioFormatManager& formatManager,
@ -188,7 +192,7 @@ public:
if (canMoveTransport())
setRange ({ newStart, newStart + visibleRange.getLength() });
if (wheel.deltaY != 0.0f)
if (! approximatelyEqual (wheel.deltaY, 0.0f))
zoomSlider.setValue (zoomSlider.getValue() - wheel.deltaY);
repaint();
@ -251,19 +255,19 @@ private:
};
//==============================================================================
class AudioPlaybackDemo : public Component,
#if (JUCE_ANDROID || JUCE_IOS)
private Button::Listener,
#else
private FileBrowserListener,
#endif
private ChangeListener
class AudioPlaybackDemo final : public Component,
#if (JUCE_ANDROID || JUCE_IOS)
private Button::Listener,
#else
private FileBrowserListener,
#endif
private ChangeListener
{
public:
AudioPlaybackDemo()
{
addAndMakeVisible (zoomLabel);
zoomLabel.setFont (Font (15.00f, Font::plain));
zoomLabel.setFont (FontOptions (15.00f, Font::plain));
zoomLabel.setJustificationType (Justification::centredRight);
zoomLabel.setEditable (false, false, false);
zoomLabel.setColour (TextEditor::textColourId, Colours::black);
@ -285,7 +289,7 @@ public:
fileTreeComp.addListener (this);
addAndMakeVisible (explanation);
explanation.setFont (Font (14.00f, Font::plain));
explanation.setFont (FontOptions (14.00f, Font::plain));
explanation.setJustificationType (Justification::bottomRight);
explanation.setEditable (false, false, false);
explanation.setColour (TextEditor::textColourId, Colours::black);
@ -312,12 +316,7 @@ public:
thread.startThread (Thread::Priority::normal);
#ifndef JUCE_DEMO_RUNNER
RuntimePermissions::request (RuntimePermissions::recordAudio,
[this] (bool granted)
{
int numInputChannels = granted ? 2 : 0;
audioDeviceManager.initialise (numInputChannels, 2, nullptr, true, {}, nullptr);
});
audioDeviceManager.initialise (0, 2, nullptr, true, {}, nullptr);
#endif
audioDeviceManager.addAudioCallback (&audioSourcePlayer);
@ -415,9 +414,14 @@ private:
//==============================================================================
void showAudioResource (URL resource)
{
if (loadURLIntoTransport (resource))
currentAudioFile = std::move (resource);
if (! loadURLIntoTransport (resource))
{
// Failed to load the audio file!
jassertfalse;
return;
}
currentAudioFile = std::move (resource);
zoomSlider.setValue (0, dontSendNotification);
thumbnail->setURL (currentAudioFile);
}
@ -492,7 +496,7 @@ private:
if (FileChooser::isPlatformDialogAvailable())
{
fileChooser = std::make_unique<FileChooser> ("Select an audio file...", File(), "*.wav;*.mp3;*.aif");
fileChooser = std::make_unique<FileChooser> ("Select an audio file...", File(), "*.wav;*.flac;*.aif");
fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,
[this] (const FileChooser& fc) mutable

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -55,7 +59,7 @@
/** A simple class that acts as an AudioIODeviceCallback and writes the
incoming audio data to a WAV file.
*/
class AudioRecorder : public AudioIODeviceCallback
class AudioRecorder final : public AudioIODeviceCallback
{
public:
AudioRecorder (AudioThumbnail& thumbnailToUpdate)
@ -170,8 +174,8 @@ private:
};
//==============================================================================
class RecordingThumbnail : public Component,
private ChangeListener
class RecordingThumbnail final : public Component,
private ChangeListener
{
public:
RecordingThumbnail()
@ -230,7 +234,7 @@ private:
};
//==============================================================================
class AudioRecordingDemo : public Component
class AudioRecordingDemo final : public Component
{
public:
AudioRecordingDemo()
@ -239,7 +243,7 @@ public:
addAndMakeVisible (liveAudioScroller);
addAndMakeVisible (explanationLabel);
explanationLabel.setFont (Font (15.0f, Font::plain));
explanationLabel.setFont (FontOptions (15.0f, Font::plain));
explanationLabel.setJustificationType (Justification::topLeft);
explanationLabel.setEditable (false, false, false);
explanationLabel.setColour (TextEditor::textColourId, Colours::black);
@ -305,17 +309,14 @@ private:
LiveScrollingAudioDisplay liveAudioScroller;
RecordingThumbnail recordingThumbnail;
AudioRecorder recorder { recordingThumbnail.getAudioThumbnail() };
AudioRecorder recorder { recordingThumbnail.getAudioThumbnail() };
Label explanationLabel { {}, "This page demonstrates how to record a wave file from the live audio input..\n\n"
#if (JUCE_ANDROID || JUCE_IOS)
"After you are done with your recording you can share with other apps."
#else
"Pressing record will start recording a file in your \"Documents\" folder."
#endif
};
Label explanationLabel { {},
"This page demonstrates how to record a wave file from the live audio input.\n\n"
"After you are done with your recording you can choose where to save it." };
TextButton recordButton { "Record" };
File lastRecording;
FileChooser chooser { "Output file...", File::getCurrentWorkingDirectory().getChildFile ("recording.wav"), "*.wav" };
void startRecording()
{
@ -350,28 +351,18 @@ private:
{
recorder.stop();
#if JUCE_CONTENT_SHARING
SafePointer<AudioRecordingDemo> safeThis (this);
File fileToShare = lastRecording;
chooser.launchAsync ( FileBrowserComponent::saveMode
| FileBrowserComponent::canSelectFiles
| FileBrowserComponent::warnAboutOverwriting,
[this] (const FileChooser& c)
{
if (FileInputStream inputStream (lastRecording); inputStream.openedOk())
if (const auto outputStream = makeOutputStream (c.getURLResult()))
outputStream->writeFromInputStream (inputStream, -1);
ContentSharer::getInstance()->shareFiles (Array<URL> ({URL (fileToShare)}),
[safeThis, fileToShare] (bool success, const String& error)
{
if (fileToShare.existsAsFile())
fileToShare.deleteFile();
if (! success && error.isNotEmpty())
NativeMessageBox::showAsync (MessageBoxOptions()
.withIconType (MessageBoxIconType::WarningIcon)
.withTitle ("Sharing Error")
.withMessage (error),
nullptr);
});
#endif
lastRecording = File();
recordButton.setButtonText ("Record");
recordingThumbnail.setDisplayFullThumbnail (true);
recordButton.setButtonText ("Record");
recordingThumbnail.setDisplayFullThumbnail (true);
});
}
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioRecordingDemo)

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -51,8 +55,8 @@
#include "../Assets/DemoUtilities.h"
//==============================================================================
class AudioSettingsDemo : public Component,
public ChangeListener
class AudioSettingsDemo final : public Component,
public ChangeListener
{
public:
AudioSettingsDemo()

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -53,20 +57,16 @@
//==============================================================================
/** Our demo synth sound is just a basic sine wave.. */
struct SineWaveSound : public SynthesiserSound
struct SineWaveSound final : public SynthesiserSound
{
SineWaveSound() {}
bool appliesToNote (int /*midiNoteNumber*/) override { return true; }
bool appliesToChannel (int /*midiChannel*/) override { return true; }
};
//==============================================================================
/** Our demo synth voice just plays a sine wave.. */
struct SineWaveVoice : public SynthesiserVoice
struct SineWaveVoice final : public SynthesiserVoice
{
SineWaveVoice() {}
bool canPlaySound (SynthesiserSound* sound) override
{
return dynamic_cast<SineWaveSound*> (sound) != nullptr;
@ -92,8 +92,8 @@ struct SineWaveVoice : public SynthesiserVoice
// start a tail-off by setting this flag. The render callback will pick up on
// this and do a fade out, calling clearCurrentNote() when it's finished.
if (tailOff == 0.0) // we only need to begin a tail-off if it's not already doing so - the
tailOff = 1.0; // stopNote method could be called more than once.
if (approximatelyEqual (tailOff, 0.0)) // we only need to begin a tail-off if it's not already doing so - the
tailOff = 1.0; // stopNote method could be called more than once.
}
else
{
@ -108,7 +108,7 @@ struct SineWaveVoice : public SynthesiserVoice
void renderNextBlock (AudioBuffer<float>& outputBuffer, int startSample, int numSamples) override
{
if (angleDelta != 0.0)
if (! approximatelyEqual (angleDelta, 0.0))
{
if (tailOff > 0.0)
{
@ -157,7 +157,7 @@ private:
//==============================================================================
// This is an audio source that streams the output of our demo synth.
struct SynthAudioSource : public AudioSource
struct SynthAudioSource final : public AudioSource
{
SynthAudioSource (MidiKeyboardState& keyState) : keyboardState (keyState)
{
@ -242,7 +242,52 @@ struct SynthAudioSource : public AudioSource
};
//==============================================================================
class AudioSynthesiserDemo : public Component
class Callback final : public AudioIODeviceCallback
{
public:
Callback (AudioSourcePlayer& playerIn, LiveScrollingAudioDisplay& displayIn)
: player (playerIn), display (displayIn) {}
void audioDeviceIOCallbackWithContext (const float* const* inputChannelData,
int numInputChannels,
float* const* outputChannelData,
int numOutputChannels,
int numSamples,
const AudioIODeviceCallbackContext& context) override
{
player.audioDeviceIOCallbackWithContext (inputChannelData,
numInputChannels,
outputChannelData,
numOutputChannels,
numSamples,
context);
display.audioDeviceIOCallbackWithContext (outputChannelData,
numOutputChannels,
nullptr,
0,
numSamples,
context);
}
void audioDeviceAboutToStart (AudioIODevice* device) override
{
player.audioDeviceAboutToStart (device);
display.audioDeviceAboutToStart (device);
}
void audioDeviceStopped() override
{
player.audioDeviceStopped();
display.audioDeviceStopped();
}
private:
AudioSourcePlayer& player;
LiveScrollingAudioDisplay& display;
};
//==============================================================================
class AudioSynthesiserDemo final : public Component
{
public:
AudioSynthesiserDemo()
@ -259,19 +304,13 @@ public:
sampledButton.onClick = [this] { synthAudioSource.setUsingSampledSound(); };
addAndMakeVisible (liveAudioDisplayComp);
audioDeviceManager.addAudioCallback (&liveAudioDisplayComp);
audioSourcePlayer.setSource (&synthAudioSource);
#ifndef JUCE_DEMO_RUNNER
RuntimePermissions::request (RuntimePermissions::recordAudio,
[this] (bool granted)
{
int numInputChannels = granted ? 2 : 0;
audioDeviceManager.initialise (numInputChannels, 2, nullptr, true, {}, nullptr);
});
audioDeviceManager.initialise (0, 2, nullptr, true, {}, nullptr);
#endif
audioDeviceManager.addAudioCallback (&audioSourcePlayer);
audioDeviceManager.addAudioCallback (&callback);
audioDeviceManager.addMidiInputDeviceCallback ({}, &(synthAudioSource.midiCollector));
setOpaque (true);
@ -282,8 +321,7 @@ public:
{
audioSourcePlayer.setSource (nullptr);
audioDeviceManager.removeMidiInputDeviceCallback ({}, &(synthAudioSource.midiCollector));
audioDeviceManager.removeAudioCallback (&audioSourcePlayer);
audioDeviceManager.removeAudioCallback (&liveAudioDisplayComp);
audioDeviceManager.removeAudioCallback (&callback);
}
//==============================================================================
@ -318,5 +356,7 @@ private:
LiveScrollingAudioDisplay liveAudioDisplayComp;
Callback callback { audioSourcePlayer, liveAudioDisplayComp };
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSynthesiserDemo)
};

View file

@ -0,0 +1,663 @@
/*
==============================================================================
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
/*******************************************************************************
The block below describes the properties of this PIP. A PIP is a short snippet
of code that can be read by the Projucer and used to generate a JUCE project.
BEGIN_JUCE_PIP_METADATA
name: AudioWorkgroupDemo
version: 1.0.0
vendor: JUCE
website: http://juce.com
description: Simple audio workgroup demo application.
dependencies: juce_audio_basics, juce_audio_devices, juce_audio_formats,
juce_audio_processors, juce_audio_utils, juce_core,
juce_data_structures, juce_events, juce_graphics,
juce_gui_basics, juce_gui_extra
exporters: xcode_mac, xcode_iphone
moduleFlags: JUCE_STRICT_REFCOUNTEDPOINTER=1
type: Component
mainClass: AudioWorkgroupDemo
useLocalCopy: 1
END_JUCE_PIP_METADATA
*******************************************************************************/
#pragma once
#include "../Assets/DemoUtilities.h"
#include "../Assets/AudioLiveScrollingDisplay.h"
#include "../Assets/ADSRComponent.h"
constexpr auto NumWorkerThreads = 4;
//==============================================================================
class ThreadBarrier : public ReferenceCountedObject
{
public:
using Ptr = ReferenceCountedObjectPtr<ThreadBarrier>;
static Ptr make (int numThreadsToSynchronise)
{
return { new ThreadBarrier { numThreadsToSynchronise } };
}
void arriveAndWait()
{
std::unique_lock lk { mutex };
[[maybe_unused]] const auto c = ++blockCount;
// You've tried to synchronise too many threads!!
jassert (c <= threadCount);
if (blockCount == threadCount)
{
blockCount = 0;
cv.notify_all();
return;
}
cv.wait (lk, [this] { return blockCount == 0; });
}
private:
std::mutex mutex;
std::condition_variable cv;
int blockCount{};
const int threadCount{};
explicit ThreadBarrier (int numThreadsToSynchronise)
: threadCount (numThreadsToSynchronise) {}
JUCE_DECLARE_NON_COPYABLE (ThreadBarrier)
JUCE_DECLARE_NON_MOVEABLE (ThreadBarrier)
};
struct Voice
{
struct Oscillator
{
float getNextSample()
{
const auto s = (2.f * phase - 1.f);
phase += delta;
if (phase >= 1.f)
phase -= 1.f;
return s;
}
float delta = 0;
float phase = 0;
};
Voice (int numSamples, double newSampleRate)
: sampleRate (newSampleRate),
workBuffer (2, numSamples)
{
}
bool isActive() const { return adsr.isActive(); }
void startNote (int midiNoteNumber, float detuneAmount, ADSR::Parameters env)
{
constexpr float superSawDetuneValues[] = { -1.f, -0.8f, -0.6f, 0.f, 0.5f, 0.7f, 1.f };
const auto freq = 440.f * std::pow (2.f, ((float) midiNoteNumber - 69.f) / 12.f);
for (size_t i = 0; i < 7; i++)
{
auto& osc = oscillators[i];
const auto detune = superSawDetuneValues[i] * detuneAmount;
osc.delta = (freq + detune) / (float) sampleRate;
osc.phase = wobbleGenerator.nextFloat();
}
currentNote = midiNoteNumber;
adsr.setParameters (env);
adsr.setSampleRate (sampleRate);
adsr.noteOn();
}
void stopNote()
{
adsr.noteOff();
}
void run()
{
workBuffer.clear();
constexpr auto oscillatorCount = 7;
constexpr float superSawPanValues[] = { -1.f, -0.7f, -0.3f, 0.f, 0.3f, 0.7f, 1.f };
constexpr auto spread = 0.8f;
constexpr auto mix = 1 / 7.f;
auto* l = workBuffer.getWritePointer (0);
auto* r = workBuffer.getWritePointer (1);
for (int i = 0; i < workBuffer.getNumSamples(); i++)
{
const auto a = adsr.getNextSample();
float left = 0;
float right = 0;
for (size_t o = 0; o < oscillatorCount; o++)
{
auto& osc = oscillators[o];
const auto s = a * osc.getNextSample();
left += s * (1.f - (superSawPanValues[o] * spread));
right += s * (1.f + (superSawPanValues[o] * spread));
}
l[i] += left * mix;
r[i] += right * mix;
}
workBuffer.applyGain (0.25f);
}
const AudioSampleBuffer& getWorkBuffer() const { return workBuffer; }
ADSR adsr;
double sampleRate;
std::array<Oscillator, 7> oscillators;
int currentNote = 0;
Random wobbleGenerator;
private:
AudioSampleBuffer workBuffer;
JUCE_DECLARE_NON_COPYABLE (Voice)
JUCE_DECLARE_NON_MOVEABLE (Voice)
};
struct AudioWorkerThreadOptions
{
int numChannels;
int numSamples;
double sampleRate;
AudioWorkgroup workgroup;
ThreadBarrier::Ptr completionBarrier;
};
class AudioWorkerThread final : private Thread
{
public:
using Ptr = std::unique_ptr<AudioWorkerThread>;
using Options = AudioWorkerThreadOptions;
explicit AudioWorkerThread (const Options& workerOptions)
: Thread ("AudioWorkerThread"),
options (workerOptions)
{
jassert (options.completionBarrier != nullptr);
#if defined (JUCE_MAC)
jassert (options.workgroup);
#endif
startRealtimeThread (RealtimeOptions{}.withApproximateAudioProcessingTime (options.numSamples, options.sampleRate));
}
~AudioWorkerThread() override { stop(); }
using Thread::notify;
using Thread::signalThreadShouldExit;
using Thread::isThreadRunning;
int getJobCount() const { return lastJobCount; }
int queueAudioJobs (Span<Voice*> jobs)
{
size_t spanIndex = 0;
const auto write = jobQueueFifo.write ((int) jobs.size());
write.forEach ([&, jobs] (int dstIndex)
{
jobQueue[(size_t) dstIndex] = jobs[spanIndex++];
});
return write.blockSize1 + write.blockSize2;
}
private:
void stop()
{
signalThreadShouldExit();
stopThread (-1);
}
void run() override
{
WorkgroupToken token;
options.workgroup.join (token);
while (wait (-1) && ! threadShouldExit())
{
const auto numReady = jobQueueFifo.getNumReady();
lastJobCount = numReady;
if (numReady > 0)
{
jobQueueFifo.read (jobQueueFifo.getNumReady())
.forEach ([this] (int srcIndex)
{
jobQueue[(size_t) srcIndex]->run();
});
}
// Wait for all our threads to get to this point.
options.completionBarrier->arriveAndWait();
}
}
static constexpr auto numJobs = 128;
Options options;
std::array<Voice*, numJobs> jobQueue;
AbstractFifo jobQueueFifo { numJobs };
std::atomic<int> lastJobCount = 0;
private:
JUCE_DECLARE_NON_COPYABLE (AudioWorkerThread)
JUCE_DECLARE_NON_MOVEABLE (AudioWorkerThread)
};
template <typename ValueType, typename LockType>
struct SharedThreadValue
{
SharedThreadValue (LockType& lockRef, ValueType initialValue = {})
: lock (lockRef),
preSyncValue (initialValue),
postSyncValue (initialValue)
{
}
void set (const ValueType& newValue)
{
const typename LockType::ScopedLockType sl { lock };
preSyncValue = newValue;
}
ValueType get() const
{
{
const typename LockType::ScopedTryLockType sl { lock, true };
if (sl.isLocked())
postSyncValue = preSyncValue;
}
return postSyncValue;
}
private:
LockType& lock;
ValueType preSyncValue{};
mutable ValueType postSyncValue{};
JUCE_DECLARE_NON_COPYABLE (SharedThreadValue)
JUCE_DECLARE_NON_MOVEABLE (SharedThreadValue)
};
//==============================================================================
class SuperSynth
{
public:
SuperSynth() = default;
void setEnvelope (ADSR::Parameters params)
{
envelope.set (params);
}
void setThickness (float newThickness)
{
thickness.set (newThickness);
}
void prepareToPlay (int numSamples, double sampleRate)
{
activeVoices.reserve (128);
for (auto& voice : voices)
voice.reset (new Voice { numSamples, sampleRate });
}
void process (ThreadBarrier::Ptr barrier, Span<AudioWorkerThread*> workers,
AudioSampleBuffer& buffer, MidiBuffer& midiBuffer)
{
const auto blockThickness = thickness.get();
const auto blockEnvelope = envelope.get();
// We're not trying to be sample accurate.. handle the on/off events in a single block.
for (auto event : midiBuffer)
{
const auto message = event.getMessage();
if (message.isNoteOn())
{
for (auto& voice : voices)
{
if (! voice->isActive())
{
voice->startNote (message.getNoteNumber(), blockThickness, blockEnvelope);
break;
}
}
continue;
}
if (message.isNoteOff())
{
for (auto& voice : voices)
{
if (voice->currentNote == message.getNoteNumber())
voice->stopNote();
}
continue;
}
}
// Queue up all active voices
for (auto& voice : voices)
if (voice->isActive())
activeVoices.push_back (voice.get());
constexpr auto jobsPerThread = 1;
// Try and split the voices evenly just for demonstration purposes.
// You could also do some of the work on this thread instead of waiting.
for (int i = 0; i < (int) activeVoices.size();)
{
for (auto worker : workers)
{
if (i >= (int) activeVoices.size())
break;
const auto jobCount = jmin (jobsPerThread, (int) activeVoices.size() - i);
i += worker->queueAudioJobs ({ activeVoices.data() + i, (size_t) jobCount });
}
}
// kick off the work.
for (auto& worker : workers)
worker->notify();
// Wait for our jobs to complete.
barrier->arriveAndWait();
// mix the jobs into the main audio thread buffer.
for (auto* voice : activeVoices)
{
buffer.addFrom (0, 0, voice->getWorkBuffer(), 0, 0, buffer.getNumSamples());
buffer.addFrom (1, 0, voice->getWorkBuffer(), 1, 0, buffer.getNumSamples());
}
// Abuse std::vector not reallocating on clear.
activeVoices.clear();
}
private:
std::array<std::unique_ptr<Voice>, 128> voices;
std::vector<Voice*> activeVoices;
template <typename T>
using ThreadValue = SharedThreadValue<T, SpinLock>;
SpinLock paramLock;
ThreadValue<ADSR::Parameters> envelope { paramLock, { 0.f, 0.3f, 1.f, 0.3f } };
ThreadValue<float> thickness { paramLock, 1.f };
JUCE_DECLARE_NON_COPYABLE (SuperSynth)
JUCE_DECLARE_NON_MOVEABLE (SuperSynth)
};
//==============================================================================
class AudioWorkgroupDemo : public Component,
private Timer,
private AudioSource,
private MidiInputCallback
{
public:
AudioWorkgroupDemo()
{
addAndMakeVisible (keyboardComponent);
addAndMakeVisible (liveAudioDisplayComp);
addAndMakeVisible (envelopeComponent);
addAndMakeVisible (keyboardComponent);
addAndMakeVisible (thicknessSlider);
addAndMakeVisible (voiceCountLabel);
std::generate (threadLabels.begin(), threadLabels.end(), &std::make_unique<Label>);
for (auto& label : threadLabels)
{
addAndMakeVisible (*label);
label->setEditable (false);
}
thicknessSlider.textFromValueFunction = [] (double) { return "Phatness"; };
thicknessSlider.onValueChange = [this] { synthesizer.setThickness ((float) thicknessSlider.getValue()); };
thicknessSlider.setRange (0.5, 15, 0.1);
thicknessSlider.setValue (7, dontSendNotification);
thicknessSlider.setTextBoxIsEditable (false);
envelopeComponent.onChange = [this] { synthesizer.setEnvelope (envelopeComponent.getParameters()); };
voiceCountLabel.setEditable (false);
audioSourcePlayer.setSource (this);
#ifndef JUCE_DEMO_RUNNER
audioDeviceManager.initialise (0, 2, nullptr, true, {}, nullptr);
#endif
audioDeviceManager.addAudioCallback (&audioSourcePlayer);
audioDeviceManager.addMidiInputDeviceCallback ({}, this);
setOpaque (true);
setSize (640, 480);
startTimerHz (10);
}
~AudioWorkgroupDemo() override
{
audioSourcePlayer.setSource (nullptr);
audioDeviceManager.removeMidiInputDeviceCallback ({}, this);
audioDeviceManager.removeAudioCallback (&audioSourcePlayer);
}
//==============================================================================
void paint (Graphics& g) override
{
g.fillAll (getUIColourIfAvailable (LookAndFeel_V4::ColourScheme::UIColour::windowBackground));
}
void resized() override
{
auto bounds = getLocalBounds();
liveAudioDisplayComp.setBounds (bounds.removeFromTop (60));
keyboardComponent.setBounds (bounds.removeFromBottom (150));
envelopeComponent.setBounds (bounds.removeFromBottom (150));
thicknessSlider.setBounds (bounds.removeFromTop (30));
voiceCountLabel.setBounds (bounds.removeFromTop (30));
const auto maxLabelWidth = bounds.getWidth() / 4;
auto currentBounds = bounds.removeFromLeft (maxLabelWidth);
for (auto& l : threadLabels)
{
if (currentBounds.getHeight() < 30)
currentBounds = bounds.removeFromLeft (maxLabelWidth);
l->setBounds (currentBounds.removeFromTop (30));
}
}
void timerCallback() override
{
String text;
int totalVoices = 0;
{
const SpinLock::ScopedLockType sl { threadArrayUiLock };
for (size_t i = 0; i < NumWorkerThreads; i++)
{
const auto& thread = workerThreads[i];
auto& label = threadLabels[i];
if (thread != nullptr)
{
const auto count = thread->getJobCount();
text = "Thread ";
text << (int) i << ": " << count << " jobs";
label->setText (text, dontSendNotification);
totalVoices += count;
}
}
}
text = {};
text << "Voices: " << totalVoices << " (" << totalVoices * 7 << " oscs)";
voiceCountLabel.setText (text, dontSendNotification);
}
//==============================================================================
void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override
{
completionBarrier = ThreadBarrier::make ((int) NumWorkerThreads + 1);
const auto numChannels = 2;
const auto workerOptions = AudioWorkerThreadOptions
{
numChannels,
samplesPerBlockExpected,
sampleRate,
audioDeviceManager.getDeviceAudioWorkgroup(),
completionBarrier,
};
{
const SpinLock::ScopedLockType sl { threadArrayUiLock };
for (auto& worker : workerThreads)
worker.reset (new AudioWorkerThread { workerOptions });
}
synthesizer.prepareToPlay (samplesPerBlockExpected, sampleRate);
liveAudioDisplayComp.audioDeviceAboutToStart (audioDeviceManager.getCurrentAudioDevice());
waveformBuffer.setSize (1, samplesPerBlockExpected);
}
void releaseResources() override
{
{
const SpinLock::ScopedLockType sl { threadArrayUiLock };
for (auto& thread : workerThreads)
thread.reset();
}
liveAudioDisplayComp.audioDeviceStopped();
}
void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) override
{
midiBuffer.clear();
bufferToFill.clearActiveBufferRegion();
keyboardState.processNextMidiBuffer (midiBuffer, bufferToFill.startSample, bufferToFill.numSamples, true);
AudioWorkerThread* workers[NumWorkerThreads]{};
std::transform (workerThreads.begin(), workerThreads.end(), workers,
[] (auto& worker) { return worker.get(); });
synthesizer.process (completionBarrier, Span { workers }, *bufferToFill.buffer, midiBuffer);
// LiveAudioScrollingDisplay applies a 10x gain to the input signal, we need to reduce the gain on our signal.
waveformBuffer.copyFrom (0, 0,
bufferToFill.buffer->getReadPointer (0),
bufferToFill.numSamples,
1 / 10.f);
liveAudioDisplayComp.audioDeviceIOCallbackWithContext (waveformBuffer.getArrayOfReadPointers(), 1,
nullptr, 0, bufferToFill.numSamples, {});
}
void handleIncomingMidiMessage (MidiInput*, const MidiMessage& message) override
{
if (message.isNoteOn())
keyboardState.noteOn (message.getChannel(), message.getNoteNumber(), 1);
else if (message.isNoteOff())
keyboardState.noteOff (message.getChannel(), message.getNoteNumber(), 1);
}
private:
// if this PIP is running inside the demo runner, we'll use the shared device manager instead
#ifndef JUCE_DEMO_RUNNER
AudioDeviceManager audioDeviceManager;
#else
AudioDeviceManager& audioDeviceManager { getSharedAudioDeviceManager (0, 2) };
#endif
MidiBuffer midiBuffer;
MidiKeyboardState keyboardState;
AudioSourcePlayer audioSourcePlayer;
SuperSynth synthesizer;
AudioSampleBuffer waveformBuffer;
MidiKeyboardComponent keyboardComponent { keyboardState, MidiKeyboardComponent::horizontalKeyboard };
LiveScrollingAudioDisplay liveAudioDisplayComp;
ADSRComponent envelopeComponent;
Slider thicknessSlider { Slider::SliderStyle::LinearHorizontal, Slider::TextBoxLeft };
Label voiceCountLabel;
SpinLock threadArrayUiLock;
ThreadBarrier::Ptr completionBarrier;
std::array<std::unique_ptr<Label>, NumWorkerThreads> threadLabels;
std::array<AudioWorkerThread::Ptr, NumWorkerThreads> workerThreads;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioWorkgroupDemo)
};

View file

@ -1,24 +1,22 @@
# ==============================================================================
#
# This file is part of the JUCE library.
# Copyright (c) 2022 - Raw Material Software Limited
#
# JUCE is an open source library subject to commercial or open-source
# licensing.
#
# By using JUCE, you agree to the terms of both the JUCE 7 End-User License
# Agreement and JUCE Privacy Policy.
#
# End User License Agreement: www.juce.com/juce-7-licence
# Privacy Policy: www.juce.com/juce-privacy-policy
#
# Or: You may also use this code under the terms of the GPL v3 (see
# www.gnu.org/licenses).
#
# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
# DISCLAIMED.
#
# ==============================================================================
_juce_add_pips()
# ==============================================================================
#
# This file is part of the JUCE framework examples.
# Copyright (c) Raw Material Software Limited
#
# The code included in this file is provided under the terms of the ISC license
# http://www.isc.org/downloads/software-support-policy/isc-license. Permission
# to use, copy, modify, and/or distribute this software for any purpose with or
# without fee is hereby granted provided that the above copyright notice and
# this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# ==============================================================================
_juce_add_pips()

File diff suppressed because it is too large Load diff

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -95,7 +99,7 @@ private:
};
//==============================================================================
class MPESetupComponent : public Component
class MPESetupComponent final : public Component
{
public:
//==============================================================================
@ -279,13 +283,14 @@ private:
return legacyStartChannel.getText().getIntValue() <= legacyEndChannel.getText().getIntValue();
}
void handleInvalidLegacyModeParameters() const
void handleInvalidLegacyModeParameters()
{
AlertWindow::showMessageBoxAsync (MessageBoxIconType::WarningIcon,
"Invalid legacy mode channel layout",
"Cannot set legacy mode start/end channel:\n"
"The end channel must not be less than the start channel!",
"Got it");
auto options = MessageBoxOptions::makeOptionsOk (MessageBoxIconType::WarningIcon,
"Invalid legacy mode channel layout",
"Cannot set legacy mode start/end channel:\n"
"The end channel must not be less than the start channel!",
"Got it");
messageBox = AlertWindow::showScopedAsync (options, nullptr);
}
Range<int> getLegacyModeChannelRange() const
@ -338,6 +343,8 @@ private:
ComboBox numberOfVoices;
Label numberOfVoicesLabel { {}, "Number of synth voices"};
ScopedMessageBox messageBox;
static constexpr int defaultMemberChannels = 15,
defaultMasterPitchbendRange = 2,
defaultNotePitchbendRange = 48;
@ -346,8 +353,8 @@ private:
};
//==============================================================================
class ZoneLayoutComponent : public Component,
private MPEInstrument::Listener
class ZoneLayoutComponent final : public Component,
private MPEInstrument::Listener
{
public:
//==============================================================================
@ -463,7 +470,7 @@ private:
};
//==============================================================================
class MPEDemoSynthVoice : public MPESynthesiserVoice
class MPEDemoSynthVoice final : public MPESynthesiserVoice
{
public:
//==============================================================================
@ -496,8 +503,8 @@ public:
// start a tail-off by setting this flag. The render callback will pick up on
// this and do a fade out, calling clearCurrentNote() when it's finished.
if (tailOff == 0.0) // we only need to begin a tail-off if it's not already doing so - the
// stopNote method could be called more than once.
if (approximatelyEqual (tailOff, 0.0)) // we only need to begin a tail-off if it's not already doing so - the
// stopNote method could be called more than once.
tailOff = 1.0;
}
else
@ -527,7 +534,7 @@ public:
void setCurrentSampleRate (double newRate) override
{
if (currentSampleRate != newRate)
if (! approximatelyEqual (currentSampleRate, newRate))
{
noteStopped (false);
currentSampleRate = newRate;
@ -543,7 +550,7 @@ public:
int startSample,
int numSamples) override
{
if (phaseDelta != 0.0)
if (! approximatelyEqual (phaseDelta, 0.0))
{
if (tailOff > 0.0)
{
@ -619,10 +626,10 @@ private:
};
//==============================================================================
class MPEDemo : public Component,
private AudioIODeviceCallback,
private MidiInputCallback,
private MPEInstrument::Listener
class MPEDemo final : public Component,
private AudioIODeviceCallback,
private MidiInputCallback,
private MPEInstrument::Listener
{
public:
//==============================================================================

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -50,24 +54,32 @@
//==============================================================================
struct MidiDeviceListEntry : ReferenceCountedObject
struct MidiDeviceListEntry final : ReferenceCountedObject
{
MidiDeviceListEntry (MidiDeviceInfo info) : deviceInfo (info) {}
explicit MidiDeviceListEntry (MidiDeviceInfo info) : deviceInfo (info) {}
MidiDeviceInfo deviceInfo;
std::unique_ptr<MidiInput> inDevice;
std::unique_ptr<MidiOutput> outDevice;
using Ptr = ReferenceCountedObjectPtr<MidiDeviceListEntry>;
void stopAndReset()
{
if (inDevice != nullptr)
inDevice->stop();
inDevice .reset();
outDevice.reset();
}
};
//==============================================================================
class MidiDemo : public Component,
private Timer,
private MidiKeyboardState::Listener,
private MidiInputCallback,
private AsyncUpdater
class MidiDemo final : public Component,
private MidiKeyboardState::Listener,
private MidiInputCallback,
private AsyncUpdater
{
public:
//==============================================================================
@ -113,12 +125,11 @@ public:
setSize (732, 520);
startTimer (500);
updateDeviceLists();
}
~MidiDemo() override
{
stopTimer();
midiInputs .clear();
midiOutputs.clear();
keyboardState.removeListener (this);
@ -128,12 +139,6 @@ public:
}
//==============================================================================
void timerCallback() override
{
updateDeviceList (true);
updateDeviceList (false);
}
void handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override
{
MidiMessage m (MidiMessage::noteOn (midiChannel, midiNoteNumber, velocity));
@ -211,17 +216,8 @@ public:
void closeDevice (bool isInput, int index)
{
if (isInput)
{
jassert (midiInputs[index]->inDevice.get() != nullptr);
midiInputs[index]->inDevice->stop();
midiInputs[index]->inDevice.reset();
}
else
{
jassert (midiOutputs[index]->outDevice.get() != nullptr);
midiOutputs[index]->outDevice.reset();
}
auto& list = isInput ? midiInputs : midiOutputs;
list[index]->stopAndReset();
}
int getNumMidiInputs() const noexcept
@ -241,8 +237,8 @@ public:
private:
//==============================================================================
struct MidiDeviceListBox : private ListBoxModel,
public ListBox
struct MidiDeviceListBox final : private ListBoxModel,
public ListBox
{
MidiDeviceListBox (const String& name,
MidiDemo& contentComponent,
@ -319,7 +315,7 @@ private:
{
SparseSet<int> selectedRows;
for (auto i = 0; i < midiDevices.size(); ++i)
if (midiDevices[i]->inDevice.get() != nullptr || midiDevices[i]->outDevice.get() != nullptr)
if (midiDevices[i]->inDevice != nullptr || midiDevices[i]->outDevice != nullptr)
selectedRows.addRange (Range<int> (i, i + 1));
lastSelectedItems = selectedRows;
@ -364,7 +360,7 @@ private:
void sendToOutputs (const MidiMessage& msg)
{
for (auto midiOutput : midiOutputs)
if (midiOutput->outDevice.get() != nullptr)
if (midiOutput->outDevice != nullptr)
midiOutput->outDevice->sendMessageNow (msg);
}
@ -423,7 +419,6 @@ private:
if (hasDeviceListChanged (availableDevices, isInputDeviceList))
{
ReferenceCountedArray<MidiDeviceListEntry>& midiDevices
= isInputDeviceList ? midiInputs : midiOutputs;
@ -454,7 +449,7 @@ private:
//==============================================================================
void addLabelAndSetStyle (Label& label)
{
label.setFont (Font (15.00f, Font::plain));
label.setFont (FontOptions (15.00f, Font::plain));
label.setJustificationType (Justification::centredLeft);
label.setEditable (false, false, false);
label.setColour (TextEditor::textColourId, Colours::black);
@ -463,6 +458,12 @@ private:
addAndMakeVisible (label);
}
void updateDeviceLists()
{
for (const auto isInput : { true, false })
updateDeviceList (isInput);
}
//==============================================================================
Label midiInputLabel { "Midi Input Label", "MIDI Input:" };
Label midiOutputLabel { "Midi Output Label", "MIDI Output:" };
@ -473,12 +474,17 @@ private:
TextEditor midiMonitor { "MIDI Monitor" };
TextButton pairButton { "MIDI Bluetooth devices..." };
std::unique_ptr<MidiDeviceListBox> midiInputSelector, midiOutputSelector;
ReferenceCountedArray<MidiDeviceListEntry> midiInputs, midiOutputs;
std::unique_ptr<MidiDeviceListBox> midiInputSelector, midiOutputSelector;
CriticalSection midiMonitorLock;
Array<MidiMessage> incomingMessages;
MidiDeviceListConnection connection = MidiDeviceListConnection::make ([this]
{
updateDeviceLists();
});
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiDemo)
};

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -172,8 +176,8 @@ private:
This component represents a horizontal vibrating musical string of fixed height
and variable length. The string can be excited by calling stringPlucked().
*/
class StringComponent : public Component,
private Timer
class StringComponent final : public Component,
private Timer
{
public:
StringComponent (int lengthInPixels, Colour stringColour)
@ -249,7 +253,7 @@ private:
};
//==============================================================================
class PluckedStringsDemo : public AudioAppComponent
class PluckedStringsDemo final : public AudioAppComponent
{
public:
PluckedStringsDemo()

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -50,8 +54,8 @@
//==============================================================================
class SimpleFFTDemo : public AudioAppComponent,
private Timer
class SimpleFFTDemo final : public AudioAppComponent,
private Timer
{
public:
SimpleFFTDemo() :
@ -160,13 +164,15 @@ public:
// show up the detail clearly
auto maxLevel = FloatVectorOperations::findMinAndMax (fftData, fftSize / 2);
Image::BitmapData bitmap { spectrogramImage, rightHandEdge, 0, 1, imageHeight, Image::BitmapData::writeOnly };
for (auto y = 1; y < imageHeight; ++y)
{
auto skewedProportionY = 1.0f - std::exp (std::log ((float) y / (float) imageHeight) * 0.2f);
auto fftDataIndex = jlimit (0, fftSize / 2, (int) (skewedProportionY * (int) fftSize / 2));
auto level = jmap (fftData[fftDataIndex], 0.0f, jmax (maxLevel.getEnd(), 1e-5f), 0.0f, 1.0f);
spectrogramImage.setPixelAt (rightHandEdge, y, Colour::fromHSV (level, 1.0f, level, 1.0f));
bitmap.setPixelColour (0, y, Colour::fromHSV (level, 1.0f, level, 1.0f));
}
}

View file

@ -1,111 +1,111 @@
# Example Audio Plugin CMakeLists.txt
# To get started on a new plugin, copy this entire folder (containing this file and C++ sources) to
# a convenient location, and then start making modifications.
# The first line of any CMake project should be a call to `cmake_minimum_required`, which checks
# that the installed CMake will be able to understand the following CMakeLists, and ensures that
# CMake's behaviour is compatible with the named version. This is a standard CMake command, so more
# information can be found in the CMake docs.
cmake_minimum_required(VERSION 3.15)
# The top-level CMakeLists.txt file for a project must contain a literal, direct call to the
# `project()` command. `project()` sets up some helpful variables that describe source/binary
# directories, and the current project version. This is a standard CMake command.
project(AUDIO_PLUGIN_EXAMPLE VERSION 0.0.1)
# If you've installed JUCE somehow (via a package manager, or directly using the CMake install
# target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've
# included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to
# include that subdirectory as part of the build.
# find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system
# or
# add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE
# If you are building a VST2 or AAX plugin, CMake needs to be told where to find these SDKs on your
# system. This setup should be done before calling `juce_add_plugin`.
# juce_set_vst2_sdk_path(...)
# juce_set_aax_sdk_path(...)
# `juce_add_plugin` adds a static library target with the name passed as the first argument
# (AudioPluginExample here). This target is a normal CMake target, but has a lot of extra properties set
# up by default. As well as this shared code static library, this function adds targets for each of
# the formats specified by the FORMATS arguments. This function accepts many optional arguments.
# Check the readme at `docs/CMake API.md` in the JUCE repo for the full list.
juce_add_plugin(AudioPluginExample
# VERSION ... # Set this if the plugin version is different to the project version
# ICON_BIG ... # ICON_* arguments specify a path to an image file to use as an icon for the Standalone
# ICON_SMALL ...
# COMPANY_NAME ... # Specify the name of the plugin's author
# IS_SYNTH TRUE/FALSE # Is this a synth or an effect?
# NEEDS_MIDI_INPUT TRUE/FALSE # Does the plugin need midi input?
# NEEDS_MIDI_OUTPUT TRUE/FALSE # Does the plugin need midi output?
# IS_MIDI_EFFECT TRUE/FALSE # Is this plugin a MIDI effect?
# EDITOR_WANTS_KEYBOARD_FOCUS TRUE/FALSE # Does the editor need keyboard focus?
# COPY_PLUGIN_AFTER_BUILD TRUE/FALSE # Should the plugin be installed to a default location after building?
PLUGIN_MANUFACTURER_CODE Juce # A four-character manufacturer id with at least one upper-case character
PLUGIN_CODE Dem0 # A unique four-character plugin id with exactly one upper-case character
# GarageBand 10.3 requires the first letter to be upper-case, and the remaining letters to be lower-case
FORMATS AU VST3 Standalone # The formats to build. Other valid formats are: AAX Unity VST AU AUv3
PRODUCT_NAME "Audio Plugin Example") # The name of the final executable, which can differ from the target name
# `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated
# into your build tree. This should be included with `#include <JuceHeader.h>`. The include path for
# this header will be automatically added to the target. The main function of the JuceHeader is to
# include all your JUCE module headers; if you're happy to include module headers directly, you
# probably don't need to call this.
# juce_generate_juce_header(AudioPluginExample)
# `target_sources` adds source files to a target. We pass the target that needs the sources as the
# first argument, then a visibility parameter for the sources which should normally be PRIVATE.
# Finally, we supply a list of source files that will be built into the target. This is a standard
# CMake command.
target_sources(AudioPluginExample
PRIVATE
PluginEditor.cpp
PluginProcessor.cpp)
# `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer
# project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use
# of compile definitions to switch certain features on/off, so if there's a particular feature you
# need that's not on by default, check the module header for the correct flag to set here. These
# definitions will be visible both to your code, and also the JUCE module code, so for new
# definitions, pick unique names that are unlikely to collide! This is a standard CMake command.
target_compile_definitions(AudioPluginExample
PUBLIC
# JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them.
JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_plugin` call
JUCE_USE_CURL=0 # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_plugin` call
JUCE_VST3_CAN_REPLACE_VST2=0)
# If your target needs extra binary assets, you can add them here. The first argument is the name of
# a new static library target that will include all the binary resources. There is an optional
# `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally,
# the SOURCES argument should be followed by a list of source files that should be built into the
# static library. These source files can be of any kind (wav data, images, fonts, icons etc.).
# Conversion to binary-data will happen when your target is built.
# juce_add_binary_data(AudioPluginData SOURCES ...)
# `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here,
# we're linking our executable target to the `juce::juce_audio_utils` module. Inter-module
# dependencies are resolved automatically, so `juce_core`, `juce_events` and so on will also be
# linked automatically. If we'd generated a binary data target above, we would need to link to it
# here too. This is a standard CMake command.
target_link_libraries(AudioPluginExample
PRIVATE
# AudioPluginData # If we'd created a binary data target, we'd link to it here
juce::juce_audio_utils
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)
# Example Audio Plugin CMakeLists.txt
# To get started on a new plugin, copy this entire folder (containing this file and C++ sources) to
# a convenient location, and then start making modifications.
# The first line of any CMake project should be a call to `cmake_minimum_required`, which checks
# that the installed CMake will be able to understand the following CMakeLists, and ensures that
# CMake's behaviour is compatible with the named version. This is a standard CMake command, so more
# information can be found in the CMake docs.
cmake_minimum_required(VERSION 3.22)
# The top-level CMakeLists.txt file for a project must contain a literal, direct call to the
# `project()` command. `project()` sets up some helpful variables that describe source/binary
# directories, and the current project version. This is a standard CMake command.
project(AUDIO_PLUGIN_EXAMPLE VERSION 0.0.1)
# If you've installed JUCE somehow (via a package manager, or directly using the CMake install
# target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've
# included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to
# include that subdirectory as part of the build.
# find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system
# or
# add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE
# If you are building a VST2 or AAX plugin, CMake needs to be told where to find these SDKs on your
# system. This setup should be done before calling `juce_add_plugin`.
# juce_set_vst2_sdk_path(...)
# juce_set_aax_sdk_path(...)
# `juce_add_plugin` adds a static library target with the name passed as the first argument
# (AudioPluginExample here). This target is a normal CMake target, but has a lot of extra properties set
# up by default. As well as this shared code static library, this function adds targets for each of
# the formats specified by the FORMATS arguments. This function accepts many optional arguments.
# Check the readme at `docs/CMake API.md` in the JUCE repo for the full list.
juce_add_plugin(AudioPluginExample
# VERSION ... # Set this if the plugin version is different to the project version
# ICON_BIG ... # ICON_* arguments specify a path to an image file to use as an icon for the Standalone
# ICON_SMALL ...
# COMPANY_NAME ... # Specify the name of the plugin's author
# IS_SYNTH TRUE/FALSE # Is this a synth or an effect?
# NEEDS_MIDI_INPUT TRUE/FALSE # Does the plugin need midi input?
# NEEDS_MIDI_OUTPUT TRUE/FALSE # Does the plugin need midi output?
# IS_MIDI_EFFECT TRUE/FALSE # Is this plugin a MIDI effect?
# EDITOR_WANTS_KEYBOARD_FOCUS TRUE/FALSE # Does the editor need keyboard focus?
# COPY_PLUGIN_AFTER_BUILD TRUE/FALSE # Should the plugin be installed to a default location after building?
PLUGIN_MANUFACTURER_CODE Juce # A four-character manufacturer id with at least one upper-case character
PLUGIN_CODE Dem0 # A unique four-character plugin id with exactly one upper-case character
# GarageBand 10.3 requires the first letter to be upper-case, and the remaining letters to be lower-case
FORMATS AU VST3 Standalone # The formats to build. Other valid formats are: AAX Unity VST AU AUv3
PRODUCT_NAME "Audio Plugin Example") # The name of the final executable, which can differ from the target name
# `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated
# into your build tree. This should be included with `#include <JuceHeader.h>`. The include path for
# this header will be automatically added to the target. The main function of the JuceHeader is to
# include all your JUCE module headers; if you're happy to include module headers directly, you
# probably don't need to call this.
# juce_generate_juce_header(AudioPluginExample)
# `target_sources` adds source files to a target. We pass the target that needs the sources as the
# first argument, then a visibility parameter for the sources which should normally be PRIVATE.
# Finally, we supply a list of source files that will be built into the target. This is a standard
# CMake command.
target_sources(AudioPluginExample
PRIVATE
PluginEditor.cpp
PluginProcessor.cpp)
# `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer
# project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use
# of compile definitions to switch certain features on/off, so if there's a particular feature you
# need that's not on by default, check the module header for the correct flag to set here. These
# definitions will be visible both to your code, and also the JUCE module code, so for new
# definitions, pick unique names that are unlikely to collide! This is a standard CMake command.
target_compile_definitions(AudioPluginExample
PUBLIC
# JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them.
JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_plugin` call
JUCE_USE_CURL=0 # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_plugin` call
JUCE_VST3_CAN_REPLACE_VST2=0)
# If your target needs extra binary assets, you can add them here. The first argument is the name of
# a new static library target that will include all the binary resources. There is an optional
# `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally,
# the SOURCES argument should be followed by a list of source files that should be built into the
# static library. These source files can be of any kind (wav data, images, fonts, icons etc.).
# Conversion to binary-data will happen when your target is built.
# juce_add_binary_data(AudioPluginData SOURCES ...)
# `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here,
# we're linking our executable target to the `juce::juce_audio_utils` module. Inter-module
# dependencies are resolved automatically, so `juce_core`, `juce_events` and so on will also be
# linked automatically. If we'd generated a binary data target above, we would need to link to it
# here too. This is a standard CMake command.
target_link_libraries(AudioPluginExample
PRIVATE
# AudioPluginData # If we'd created a binary data target, we'd link to it here
juce::juce_audio_utils
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)

View file

@ -3,7 +3,7 @@
#include "PluginProcessor.h"
//==============================================================================
class AudioPluginAudioProcessorEditor : public juce::AudioProcessorEditor
class AudioPluginAudioProcessorEditor final : public juce::AudioProcessorEditor
{
public:
explicit AudioPluginAudioProcessorEditor (AudioPluginAudioProcessor&);

View file

@ -3,7 +3,7 @@
#include <juce_audio_processors/juce_audio_processors.h>
//==============================================================================
class AudioPluginAudioProcessor : public juce::AudioProcessor
class AudioPluginAudioProcessor final : public juce::AudioProcessor
{
public:
//==============================================================================

View file

@ -1,26 +1,24 @@
# ==============================================================================
#
# This file is part of the JUCE library.
# Copyright (c) 2022 - Raw Material Software Limited
#
# JUCE is an open source library subject to commercial or open-source
# licensing.
#
# By using JUCE, you agree to the terms of both the JUCE 7 End-User License
# Agreement and JUCE Privacy Policy.
#
# End User License Agreement: www.juce.com/juce-7-licence
# Privacy Policy: www.juce.com/juce-privacy-policy
#
# Or: You may also use this code under the terms of the GPL v3 (see
# www.gnu.org/licenses).
#
# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
# DISCLAIMED.
#
# ==============================================================================
add_subdirectory(AudioPlugin)
add_subdirectory(ConsoleApp)
add_subdirectory(GuiApp)
# ==============================================================================
#
# This file is part of the JUCE framework examples.
# Copyright (c) Raw Material Software Limited
#
# The code included in this file is provided under the terms of the ISC license
# http://www.isc.org/downloads/software-support-policy/isc-license. Permission
# to use, copy, modify, and/or distribute this software for any purpose with or
# without fee is hereby granted provided that the above copyright notice and
# this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# ==============================================================================
add_subdirectory(AudioPlugin)
add_subdirectory(ConsoleApp)
add_subdirectory(GuiApp)

View file

@ -1,88 +1,88 @@
# Example Console App CMakeLists.txt
# To get started on a new console app, copy this entire folder (containing this file and C++
# sources) to a convenient location, and then start making modifications. For other examples of
# CMakeLists for console apps, check `extras/BinaryBuilder` and `extras/UnitTestRunner` in the JUCE
# repo.
# The first line of any CMake project should be a call to `cmake_minimum_required`, which checks
# that the installed CMake will be able to understand the following CMakeLists, and ensures that
# CMake's behaviour is compatible with the named version. This is a standard CMake command, so more
# information can be found in the CMake docs.
cmake_minimum_required(VERSION 3.15)
# The top-level CMakeLists.txt file for a project must contain a literal, direct call to the
# `project()` command. `project()` sets up some helpful variables that describe source/binary
# directories, and the current project version. This is a standard CMake command.
project(CONSOLE_APP_EXAMPLE VERSION 0.0.1)
# If you've installed JUCE somehow (via a package manager, or directly using the CMake install
# target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've
# included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to
# include that subdirectory as part of the build.
# find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system
# or
# add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE
# `juce_add_console_app` adds an executable target with the name passed as the first argument
# (ConsoleAppExample here). This target is a normal CMake target, but has a lot of extra properties
# set up by default. This function accepts many optional arguments. Check the readme at
# `docs/CMake API.md` in the JUCE repo for the full list.
juce_add_console_app(ConsoleAppExample
PRODUCT_NAME "Console App Example") # The name of the final executable, which can differ from the target name
# `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated
# into the build tree. This header should be included with `#include <JuceHeader.h>`. The include
# path for this header will be automatically added to the target. The main function of the
# JuceHeader is to include all the JUCE module headers for a particular target; if you're happy to
# include module headers directly, you probably don't need to call this.
# juce_generate_juce_header(ConsoleAppExample)
# `target_sources` adds source files to a target. We pass the target that needs the sources as the
# first argument, then a visibility parameter for the sources which should normally be PRIVATE.
# Finally, we supply a list of source files that will be built into the target. This is a standard
# CMake command.
target_sources(ConsoleAppExample
PRIVATE
Main.cpp)
# `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer
# project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use
# of compile definitions to switch certain features on/off, so if there's a particular feature you
# need that's not on by default, check the module header for the correct flag to set here. These
# definitions will be visible both to your code, and also the JUCE module code, so for new
# definitions, pick unique names that are unlikely to collide! This is a standard CMake command.
target_compile_definitions(ConsoleAppExample
PRIVATE
# JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them.
JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_console_app` call
JUCE_USE_CURL=0) # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_console_app` call
# If the target needs extra binary assets, they can be added here. The first argument is the name of
# a new static library target that will include all the binary resources. There is an optional
# `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally,
# the SOURCES argument should be followed by a list of source files that should be built into the
# static library. These source files can be of any kind (wav data, images, fonts, icons etc.).
# Conversion to binary-data will happen when the target is built.
# juce_add_binary_data(ConsoleAppData SOURCES ...)
# `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here,
# we're linking our executable target to the `juce::juce_core` module. Inter-module dependencies are
# resolved automatically. If you'd generated a binary data target above, you would need to link to
# it here too. This is a standard CMake command.
target_link_libraries(ConsoleAppExample
PRIVATE
# ConsoleAppData # If you'd created a binary data target, you'd link to it here
juce::juce_core
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_warning_flags)
# Example Console App CMakeLists.txt
# To get started on a new console app, copy this entire folder (containing this file and C++
# sources) to a convenient location, and then start making modifications. For other examples of
# CMakeLists for console apps, check `extras/BinaryBuilder` and `extras/UnitTestRunner` in the JUCE
# repo.
# The first line of any CMake project should be a call to `cmake_minimum_required`, which checks
# that the installed CMake will be able to understand the following CMakeLists, and ensures that
# CMake's behaviour is compatible with the named version. This is a standard CMake command, so more
# information can be found in the CMake docs.
cmake_minimum_required(VERSION 3.22)
# The top-level CMakeLists.txt file for a project must contain a literal, direct call to the
# `project()` command. `project()` sets up some helpful variables that describe source/binary
# directories, and the current project version. This is a standard CMake command.
project(CONSOLE_APP_EXAMPLE VERSION 0.0.1)
# If you've installed JUCE somehow (via a package manager, or directly using the CMake install
# target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've
# included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to
# include that subdirectory as part of the build.
# find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system
# or
# add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE
# `juce_add_console_app` adds an executable target with the name passed as the first argument
# (ConsoleAppExample here). This target is a normal CMake target, but has a lot of extra properties
# set up by default. This function accepts many optional arguments. Check the readme at
# `docs/CMake API.md` in the JUCE repo for the full list.
juce_add_console_app(ConsoleAppExample
PRODUCT_NAME "Console App Example") # The name of the final executable, which can differ from the target name
# `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated
# into the build tree. This header should be included with `#include <JuceHeader.h>`. The include
# path for this header will be automatically added to the target. The main function of the
# JuceHeader is to include all the JUCE module headers for a particular target; if you're happy to
# include module headers directly, you probably don't need to call this.
# juce_generate_juce_header(ConsoleAppExample)
# `target_sources` adds source files to a target. We pass the target that needs the sources as the
# first argument, then a visibility parameter for the sources which should normally be PRIVATE.
# Finally, we supply a list of source files that will be built into the target. This is a standard
# CMake command.
target_sources(ConsoleAppExample
PRIVATE
Main.cpp)
# `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer
# project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use
# of compile definitions to switch certain features on/off, so if there's a particular feature you
# need that's not on by default, check the module header for the correct flag to set here. These
# definitions will be visible both to your code, and also the JUCE module code, so for new
# definitions, pick unique names that are unlikely to collide! This is a standard CMake command.
target_compile_definitions(ConsoleAppExample
PRIVATE
# JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them.
JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_console_app` call
JUCE_USE_CURL=0) # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_console_app` call
# If the target needs extra binary assets, they can be added here. The first argument is the name of
# a new static library target that will include all the binary resources. There is an optional
# `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally,
# the SOURCES argument should be followed by a list of source files that should be built into the
# static library. These source files can be of any kind (wav data, images, fonts, icons etc.).
# Conversion to binary-data will happen when the target is built.
# juce_add_binary_data(ConsoleAppData SOURCES ...)
# `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here,
# we're linking our executable target to the `juce::juce_core` module. Inter-module dependencies are
# resolved automatically. If you'd generated a binary data target above, you would need to link to
# it here too. This is a standard CMake command.
target_link_libraries(ConsoleAppExample
PRIVATE
# ConsoleAppData # If you'd created a binary data target, you'd link to it here
juce::juce_core
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_warning_flags)

View file

@ -1,102 +1,102 @@
# Example GUI App CMakeLists.txt
# To get started on a new GUI app, copy this entire folder (containing this file and C++ sources) to
# a convenient location, and then start making modifications. For other examples of CMakeLists for
# GUI apps, check `extras/Projucer` and `examples/DemoRunner` in the JUCE repo.
# The first line of any CMake project should be a call to `cmake_minimum_required`, which checks
# that the installed CMake will be able to understand the following CMakeLists, and ensures that
# CMake's behaviour is compatible with the named version. This is a standard CMake command, so more
# information can be found in the CMake docs.
cmake_minimum_required(VERSION 3.15)
# The top-level CMakeLists.txt file for a project must contain a literal, direct call to the
# `project()` command. `project()` sets up some helpful variables that describe source/binary
# directories, and the current project version. This is a standard CMake command.
project(GUI_APP_EXAMPLE VERSION 0.0.1)
# If you've installed JUCE somehow (via a package manager, or directly using the CMake install
# target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've
# included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to
# include that subdirectory as part of the build.
# find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system
# or
# add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE
# If your app depends the VST2 SDK, perhaps to host VST2 plugins, CMake needs to be told where
# to find the SDK on your system. This setup should be done before calling `juce_add_gui_app`.
# juce_set_vst2_sdk_path(...)
# `juce_add_gui_app` adds an executable target with the name passed as the first argument
# (GuiAppExample here). This target is a normal CMake target, but has a lot of extra properties set
# up by default. This function accepts many optional arguments. Check the readme at
# `docs/CMake API.md` in the JUCE repo for the full list.
juce_add_gui_app(GuiAppExample
# VERSION ... # Set this if the app version is different to the project version
# ICON_BIG ... # ICON_* arguments specify a path to an image file to use as an icon
# ICON_SMALL ...
# DOCUMENT_EXTENSIONS ... # Specify file extensions that should be associated with this app
# COMPANY_NAME ... # Specify the name of the app's author
PRODUCT_NAME "Gui App Example") # The name of the final executable, which can differ from the target name
# `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated
# into your build tree. This should be included with `#include <JuceHeader.h>`. The include path for
# this header will be automatically added to the target. The main function of the JuceHeader is to
# include all your JUCE module headers; if you're happy to include module headers directly, you
# probably don't need to call this.
# juce_generate_juce_header(GuiAppExample)
# `target_sources` adds source files to a target. We pass the target that needs the sources as the
# first argument, then a visibility parameter for the sources which should normally be PRIVATE.
# Finally, we supply a list of source files that will be built into the target. This is a standard
# CMake command.
target_sources(GuiAppExample
PRIVATE
Main.cpp
MainComponent.cpp)
# `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer
# project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use
# of compile definitions to switch certain features on/off, so if there's a particular feature you
# need that's not on by default, check the module header for the correct flag to set here. These
# definitions will be visible both to your code, and also the JUCE module code, so for new
# definitions, pick unique names that are unlikely to collide! This is a standard CMake command.
target_compile_definitions(GuiAppExample
PRIVATE
# JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them.
JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_gui_app` call
JUCE_USE_CURL=0 # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_gui_app` call
JUCE_APPLICATION_NAME_STRING="$<TARGET_PROPERTY:GuiAppExample,JUCE_PRODUCT_NAME>"
JUCE_APPLICATION_VERSION_STRING="$<TARGET_PROPERTY:GuiAppExample,JUCE_VERSION>")
# If your target needs extra binary assets, you can add them here. The first argument is the name of
# a new static library target that will include all the binary resources. There is an optional
# `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally,
# the SOURCES argument should be followed by a list of source files that should be built into the
# static library. These source files can be of any kind (wav data, images, fonts, icons etc.).
# Conversion to binary-data will happen when your target is built.
# juce_add_binary_data(GuiAppData SOURCES ...)
# `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here,
# we're linking our executable target to the `juce::juce_gui_extra` module. Inter-module
# dependencies are resolved automatically, so `juce_core`, `juce_events` and so on will also be
# linked automatically. If we'd generated a binary data target above, we would need to link to it
# here too. This is a standard CMake command.
target_link_libraries(GuiAppExample
PRIVATE
# GuiAppData # If we'd created a binary data target, we'd link to it here
juce::juce_gui_extra
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)
# Example GUI App CMakeLists.txt
# To get started on a new GUI app, copy this entire folder (containing this file and C++ sources) to
# a convenient location, and then start making modifications. For other examples of CMakeLists for
# GUI apps, check `extras/Projucer` and `examples/DemoRunner` in the JUCE repo.
# The first line of any CMake project should be a call to `cmake_minimum_required`, which checks
# that the installed CMake will be able to understand the following CMakeLists, and ensures that
# CMake's behaviour is compatible with the named version. This is a standard CMake command, so more
# information can be found in the CMake docs.
cmake_minimum_required(VERSION 3.22)
# The top-level CMakeLists.txt file for a project must contain a literal, direct call to the
# `project()` command. `project()` sets up some helpful variables that describe source/binary
# directories, and the current project version. This is a standard CMake command.
project(GUI_APP_EXAMPLE VERSION 0.0.1)
# If you've installed JUCE somehow (via a package manager, or directly using the CMake install
# target), you'll need to tell this project that it depends on the installed copy of JUCE. If you've
# included JUCE directly in your source tree (perhaps as a submodule), you'll need to tell CMake to
# include that subdirectory as part of the build.
# find_package(JUCE CONFIG REQUIRED) # If you've installed JUCE to your system
# or
# add_subdirectory(JUCE) # If you've put JUCE in a subdirectory called JUCE
# If your app depends the VST2 SDK, perhaps to host VST2 plugins, CMake needs to be told where
# to find the SDK on your system. This setup should be done before calling `juce_add_gui_app`.
# juce_set_vst2_sdk_path(...)
# `juce_add_gui_app` adds an executable target with the name passed as the first argument
# (GuiAppExample here). This target is a normal CMake target, but has a lot of extra properties set
# up by default. This function accepts many optional arguments. Check the readme at
# `docs/CMake API.md` in the JUCE repo for the full list.
juce_add_gui_app(GuiAppExample
# VERSION ... # Set this if the app version is different to the project version
# ICON_BIG ... # ICON_* arguments specify a path to an image file to use as an icon
# ICON_SMALL ...
# DOCUMENT_EXTENSIONS ... # Specify file extensions that should be associated with this app
# COMPANY_NAME ... # Specify the name of the app's author
PRODUCT_NAME "Gui App Example") # The name of the final executable, which can differ from the target name
# `juce_generate_juce_header` will create a JuceHeader.h for a given target, which will be generated
# into your build tree. This should be included with `#include <JuceHeader.h>`. The include path for
# this header will be automatically added to the target. The main function of the JuceHeader is to
# include all your JUCE module headers; if you're happy to include module headers directly, you
# probably don't need to call this.
# juce_generate_juce_header(GuiAppExample)
# `target_sources` adds source files to a target. We pass the target that needs the sources as the
# first argument, then a visibility parameter for the sources which should normally be PRIVATE.
# Finally, we supply a list of source files that will be built into the target. This is a standard
# CMake command.
target_sources(GuiAppExample
PRIVATE
Main.cpp
MainComponent.cpp)
# `target_compile_definitions` adds some preprocessor definitions to our target. In a Projucer
# project, these might be passed in the 'Preprocessor Definitions' field. JUCE modules also make use
# of compile definitions to switch certain features on/off, so if there's a particular feature you
# need that's not on by default, check the module header for the correct flag to set here. These
# definitions will be visible both to your code, and also the JUCE module code, so for new
# definitions, pick unique names that are unlikely to collide! This is a standard CMake command.
target_compile_definitions(GuiAppExample
PRIVATE
# JUCE_WEB_BROWSER and JUCE_USE_CURL would be on by default, but you might not need them.
JUCE_WEB_BROWSER=0 # If you remove this, add `NEEDS_WEB_BROWSER TRUE` to the `juce_add_gui_app` call
JUCE_USE_CURL=0 # If you remove this, add `NEEDS_CURL TRUE` to the `juce_add_gui_app` call
JUCE_APPLICATION_NAME_STRING="$<TARGET_PROPERTY:GuiAppExample,JUCE_PRODUCT_NAME>"
JUCE_APPLICATION_VERSION_STRING="$<TARGET_PROPERTY:GuiAppExample,JUCE_VERSION>")
# If your target needs extra binary assets, you can add them here. The first argument is the name of
# a new static library target that will include all the binary resources. There is an optional
# `NAMESPACE` argument that can specify the namespace of the generated binary data class. Finally,
# the SOURCES argument should be followed by a list of source files that should be built into the
# static library. These source files can be of any kind (wav data, images, fonts, icons etc.).
# Conversion to binary-data will happen when your target is built.
# juce_add_binary_data(GuiAppData SOURCES ...)
# `target_link_libraries` links libraries and JUCE modules to other libraries or executables. Here,
# we're linking our executable target to the `juce::juce_gui_extra` module. Inter-module
# dependencies are resolved automatically, so `juce_core`, `juce_events` and so on will also be
# linked automatically. If we'd generated a binary data target above, we would need to link to it
# here too. This is a standard CMake command.
target_link_libraries(GuiAppExample
PRIVATE
# GuiAppData # If we'd created a binary data target, we'd link to it here
juce::juce_gui_extra
PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)

View file

@ -1,7 +1,7 @@
#include "MainComponent.h"
//==============================================================================
class GuiAppApplication : public juce::JUCEApplication
class GuiAppApplication final : public juce::JUCEApplication
{
public:
//==============================================================================
@ -51,7 +51,7 @@ public:
This class implements the desktop window that contains an instance of
our MainComponent class.
*/
class MainWindow : public juce::DocumentWindow
class MainWindow final : public juce::DocumentWindow
{
public:
explicit MainWindow (juce::String name)

View file

@ -12,7 +12,7 @@ void MainComponent::paint (juce::Graphics& g)
// (Our component is opaque, so we must completely fill the background with a solid colour)
g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId));
g.setFont (juce::Font (16.0f));
g.setFont (juce::FontOptions (16.0f));
g.setColour (juce::Colours::white);
g.drawText ("Hello World!", getLocalBounds(), juce::Justification::centred, true);
}

View file

@ -11,7 +11,7 @@
This component lives inside our window, and this is where you should put all
your controls and content.
*/
class MainComponent : public juce::Component
class MainComponent final : public juce::Component
{
public:
//==============================================================================

View file

@ -1,69 +1,83 @@
# ==============================================================================
#
# This file is part of the JUCE library.
# Copyright (c) 2022 - Raw Material Software Limited
#
# JUCE is an open source library subject to commercial or open-source
# licensing.
#
# By using JUCE, you agree to the terms of both the JUCE 7 End-User License
# Agreement and JUCE Privacy Policy.
#
# End User License Agreement: www.juce.com/juce-7-licence
# Privacy Policy: www.juce.com/juce-privacy-policy
#
# Or: You may also use this code under the terms of the GPL v3 (see
# www.gnu.org/licenses).
#
# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
# DISCLAIMED.
#
# ==============================================================================
set(CMAKE_FOLDER examples)
add_subdirectory(CMake)
add_subdirectory(DemoRunner)
function(_juce_add_pips)
file(GLOB headers
CONFIGURE_DEPENDS LIST_DIRECTORIES false
"${CMAKE_CURRENT_SOURCE_DIR}/*.h")
if((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD"))
list(REMOVE_ITEM headers
"${CMAKE_CURRENT_SOURCE_DIR}/CameraDemo.h"
"${CMAKE_CURRENT_SOURCE_DIR}/PushNotificationsDemo.h"
"${CMAKE_CURRENT_SOURCE_DIR}/VideoDemo.h")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
list(REMOVE_ITEM headers
"${CMAKE_CURRENT_SOURCE_DIR}/PushNotificationsDemo.h")
endif()
if(NOT (TARGET juce_ara_sdk
AND (CMAKE_SYSTEM_NAME STREQUAL "Windows"
OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"
OR CMAKE_SYSTEM_NAME STREQUAL "Linux")))
list(REMOVE_ITEM headers
"${CMAKE_CURRENT_SOURCE_DIR}/ARAPluginDemo.h")
endif()
if(NOT TARGET juce_vst2_sdk)
list(REMOVE_ITEM headers "${CMAKE_CURRENT_SOURCE_DIR}/ReaperEmbeddedViewPluginDemo.h")
endif()
foreach(header IN ITEMS ${headers})
juce_add_pip(${header} added_target)
target_link_libraries(${added_target} PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)
endforeach()
endfunction()
add_subdirectory(Audio)
add_subdirectory(DSP)
add_subdirectory(GUI)
add_subdirectory(Plugins)
add_subdirectory(Utilities)
# ==============================================================================
#
# This file is part of the JUCE framework examples.
# Copyright (c) Raw Material Software Limited
#
# The code included in this file is provided under the terms of the ISC license
# http://www.isc.org/downloads/software-support-policy/isc-license. Permission
# to use, copy, modify, and/or distribute this software for any purpose with or
# without fee is hereby granted provided that the above copyright notice and
# this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# ==============================================================================
set(CMAKE_FOLDER examples)
add_subdirectory(CMake)
add_subdirectory(DemoRunner)
function(_juce_add_pips)
file(GLOB headers
CONFIGURE_DEPENDS LIST_DIRECTORIES false
"${CMAKE_CURRENT_SOURCE_DIR}/*.h")
if((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD"))
list(REMOVE_ITEM headers
"${CMAKE_CURRENT_SOURCE_DIR}/CameraDemo.h"
"${CMAKE_CURRENT_SOURCE_DIR}/PushNotificationsDemo.h"
"${CMAKE_CURRENT_SOURCE_DIR}/VideoDemo.h")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
list(REMOVE_ITEM headers
"${CMAKE_CURRENT_SOURCE_DIR}/PushNotificationsDemo.h")
endif()
if(NOT (TARGET juce_ara_sdk
AND (CMAKE_SYSTEM_NAME STREQUAL "Windows"
OR CMAKE_SYSTEM_NAME STREQUAL "Darwin"
OR CMAKE_SYSTEM_NAME STREQUAL "Linux")))
list(REMOVE_ITEM headers
"${CMAKE_CURRENT_SOURCE_DIR}/ARAPluginDemo.h")
endif()
if(NOT TARGET juce_vst2_sdk)
list(REMOVE_ITEM headers "${CMAKE_CURRENT_SOURCE_DIR}/ReaperEmbeddedViewPluginDemo.h")
endif()
if((CMAKE_SYSTEM_NAME STREQUAL "Windows")
AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/WebViewPluginDemo.h")
if(NOT ("${JUCE_CMAKE_UTILS_DIR}" IN_LIST CMAKE_MODULE_PATH))
list(APPEND CMAKE_MODULE_PATH "${JUCE_CMAKE_UTILS_DIR}")
endif()
find_package(WebView2)
if(NOT WebView2_FOUND)
list(REMOVE_ITEM headers "${CMAKE_CURRENT_SOURCE_DIR}/WebViewPluginDemo.h")
message(WARNING "The WebViewPluginDemo was not enabled because the WebView2 package wasn't found.")
endif()
endif()
foreach(header IN ITEMS ${headers})
juce_add_pip(${header} added_target)
target_link_libraries(${added_target} PUBLIC
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)
endforeach()
endfunction()
add_subdirectory(Audio)
add_subdirectory(DSP)
add_subdirectory(GUI)
add_subdirectory(Plugins)
add_subdirectory(Utilities)

View file

@ -1,24 +1,22 @@
# ==============================================================================
#
# This file is part of the JUCE library.
# Copyright (c) 2022 - Raw Material Software Limited
#
# JUCE is an open source library subject to commercial or open-source
# licensing.
#
# By using JUCE, you agree to the terms of both the JUCE 7 End-User License
# Agreement and JUCE Privacy Policy.
#
# End User License Agreement: www.juce.com/juce-7-licence
# Privacy Policy: www.juce.com/juce-privacy-policy
#
# Or: You may also use this code under the terms of the GPL v3 (see
# www.gnu.org/licenses).
#
# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
# DISCLAIMED.
#
# ==============================================================================
_juce_add_pips()
# ==============================================================================
#
# This file is part of the JUCE framework examples.
# Copyright (c) Raw Material Software Limited
#
# The code included in this file is provided under the terms of the ISC license
# http://www.isc.org/downloads/software-support-policy/isc-license. Permission
# to use, copy, modify, and/or distribute this software for any purpose with or
# without fee is hereby granted provided that the above copyright notice and
# this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# ==============================================================================
_juce_add_pips()

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -186,7 +190,7 @@ struct ConvolutionDemoDSP
std::vector<DSPDemoParameterBase*> parameters { &cabinetParam };
};
struct ConvolutionDemo : public Component
struct ConvolutionDemo final : public Component
{
ConvolutionDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -77,7 +81,7 @@ struct FIRFilterDemoDSP
void updateParameters()
{
if (sampleRate != 0.0)
if (! approximatelyEqual (sampleRate, 0.0))
{
auto cutoff = static_cast<float> (cutoffParam.getCurrentValue());
auto windowingMethod = static_cast<WindowingFunction<float>::WindowingMethod> (typeParam.getCurrentSelectedID() - 1);
@ -98,7 +102,7 @@ struct FIRFilterDemoDSP
std::vector<DSPDemoParameterBase*> parameters { &cutoffParam, &typeParam };
};
struct FIRFilterDemo : public Component
struct FIRFilterDemo final : public Component
{
FIRFilterDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -83,7 +87,7 @@ struct GainDemoDSP
std::vector<DSPDemoParameterBase*> parameters { &gainParam };
};
struct GainDemo : public Component
struct GainDemo final : public Component
{
GainDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -76,7 +80,7 @@ struct IIRFilterDemoDSP
void updateParameters()
{
if (sampleRate != 0.0)
if (! approximatelyEqual (sampleRate, 0.0))
{
auto cutoff = static_cast<float> (cutoffParam.getCurrentValue());
auto qVal = static_cast<float> (qParam.getCurrentValue());
@ -96,13 +100,13 @@ struct IIRFilterDemoDSP
ChoiceParameter typeParam { { "Low-pass", "High-pass", "Band-pass" }, 1, "Type" };
SliderParameter cutoffParam { { 20.0, 20000.0 }, 0.5, 440.0f, "Cutoff", "Hz" };
SliderParameter qParam { { 0.3, 20.0 }, 0.5, 1.0 / std::sqrt(2.0), "Q" };
SliderParameter qParam { { 0.3, 20.0 }, 0.5, 1.0 / std::sqrt (2.0), "Q" };
std::vector<DSPDemoParameterBase*> parameters { &typeParam, &cutoffParam, &qParam };
double sampleRate = 0.0;
};
struct IIRFilterDemo : public Component
struct IIRFilterDemo final : public Component
{
IIRFilterDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -134,7 +138,7 @@ struct OscillatorDemoDSP
std::vector<DSPDemoParameterBase*> parameters { &typeParam, &accuracy, &freqParam, &gainParam, &mixParam };
};
struct OscillatorDemo : public Component
struct OscillatorDemo final : public Component
{
OscillatorDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -90,7 +94,7 @@ struct OverdriveDemoDSP
void updateParameters()
{
if (sampleRate != 0.0)
if (! approximatelyEqual (sampleRate, 0.0))
{
overdrive.get<0>().setGainDecibels (static_cast<float> (inGainParam.getCurrentValue()));
overdrive.get<4>().setGainDecibels (static_cast<float> (outGainParam.getCurrentValue()));
@ -113,7 +117,7 @@ struct OverdriveDemoDSP
double sampleRate = 0.0;
};
struct OverdriveDemo : public Component
struct OverdriveDemo final : public Component
{
OverdriveDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -124,7 +128,7 @@ struct SIMDRegisterDemoDSP
void updateParameters()
{
if (sampleRate != 0.0)
if (! approximatelyEqual (sampleRate, 0.0))
{
auto cutoff = static_cast<float> (cutoffParam.getCurrentValue());
auto qVal = static_cast<float> (qParam.getCurrentValue());
@ -156,7 +160,7 @@ struct SIMDRegisterDemoDSP
double sampleRate = 0.0;
};
struct SIMDRegisterDemo : public Component
struct SIMDRegisterDemo final : public Component
{
SIMDRegisterDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -74,7 +78,7 @@ struct StateVariableFilterDemoDSP
void updateParameters()
{
if (sampleRate != 0.0)
if (! approximatelyEqual (sampleRate, 0.0))
{
filter.setCutoffFrequency (static_cast<float> (cutoffParam.getCurrentValue()));
filter.setResonance (static_cast<float> (qParam.getCurrentValue()));
@ -100,7 +104,7 @@ struct StateVariableFilterDemoDSP
double sampleRate = 0.0;
};
struct StateVariableFilterDemo : public Component
struct StateVariableFilterDemo final : public Component
{
StateVariableFilterDemo()
{

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -82,7 +86,7 @@ struct WaveShaperTanhDemoDSP
std::vector<DSPDemoParameterBase*> parameters { &accuracy }; // no params for this demo
};
struct WaveShaperTanhDemo : public Component
struct WaveShaperTanhDemo final : public Component
{
WaveShaperTanhDemo()
{

File diff suppressed because it is too large Load diff

View file

@ -1,11 +1,15 @@
apply plugin: 'com.android.application'
def ndkVersionString = "26.2.11394342"
android {
compileSdkVersion 33
compileSdk 34
ndkVersion ndkVersionString
namespace "com.rmsl.jucedemorunner"
externalNativeBuild {
cmake {
path "CMakeLists.txt"
version "3.22.1"
}
}
signingConfigs {
@ -21,10 +25,10 @@ android {
defaultConfig {
applicationId "com.rmsl.jucedemorunner"
minSdkVersion 23
targetSdkVersion 33
targetSdkVersion 34
externalNativeBuild {
cmake {
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_CXX_STANDARD=17", "-DCMAKE_CXX_EXTENSIONS=OFF"
arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DANDROID_WEAK_API_DEFS=ON", "-DCMAKE_CXX_STANDARD=17", "-DCMAKE_CXX_EXTENSIONS=OFF"
}
}
}

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="7.0.4">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="8.0.4">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
android:xlargeScreens="true"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
@ -8,19 +8,20 @@
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-feature android:glEsVersion="0x00030000" android:required="true"/>
<application android:label="@string/app_name" android:name="com.rmsl.juce.JuceApp" android:icon="@drawable/icon" android:hardwareAccelerated="false">
<receiver android:name="com.rmsl.juce.Receiver" android:exported="false"/>
<activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation"
android:screenOrientation="unspecified" android:launchMode="singleTask" android:hardwareAccelerated="true"
android:exported="true">

View file

@ -0,0 +1,190 @@
/*
==============================================================================
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
#pragma once
class ADSRComponent final : public Component
{
public:
ADSRComponent()
: envelope { *this }
{
for (Slider* slider : { &adsrAttack, &adsrDecay, &adsrSustain, &adsrRelease })
{
if (slider == &adsrSustain)
{
slider->textFromValueFunction = [slider] (double value)
{
String text;
text << slider->getName();
const auto val = (int) jmap (value, 0.0, 1.0, 0.0, 100.0);
text << String::formatted (": %d%%", val);
return text;
};
}
else
{
slider->textFromValueFunction = [slider] (double value)
{
String text;
text << slider->getName();
text << ": " << ((value < 0.4f) ? String::formatted ("%dms", (int) std::round (value * 1000))
: String::formatted ("%0.2lf Sec", value));
return text;
};
slider->setSkewFactor (0.3);
}
slider->setRange (0, 1);
slider->setTextBoxStyle (Slider::TextBoxBelow, true, 300, 25);
slider->onValueChange = [this]
{
NullCheckedInvocation::invoke (onChange);
repaint();
};
addAndMakeVisible (slider);
}
adsrAttack.setName ("Attack");
adsrDecay.setName ("Decay");
adsrSustain.setName ("Sustain");
adsrRelease.setName ("Release");
adsrAttack.setValue (0.1, dontSendNotification);
adsrDecay.setValue (0.3, dontSendNotification);
adsrSustain.setValue (0.3, dontSendNotification);
adsrRelease.setValue (0.2, dontSendNotification);
addAndMakeVisible (envelope);
}
std::function<void()> onChange;
ADSR::Parameters getParameters() const
{
return
{
(float) adsrAttack.getValue(),
(float) adsrDecay.getValue(),
(float) adsrSustain.getValue(),
(float) adsrRelease.getValue(),
};
}
void resized() final
{
auto bounds = getLocalBounds();
const auto knobWidth = bounds.getWidth() / 4;
auto knobBounds = bounds.removeFromBottom (bounds.getHeight() / 2);
{
adsrAttack.setBounds (knobBounds.removeFromLeft (knobWidth));
adsrDecay.setBounds (knobBounds.removeFromLeft (knobWidth));
adsrSustain.setBounds (knobBounds.removeFromLeft (knobWidth));
adsrRelease.setBounds (knobBounds.removeFromLeft (knobWidth));
}
envelope.setBounds (bounds);
}
Slider adsrAttack { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
Slider adsrDecay { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
Slider adsrSustain { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
Slider adsrRelease { Slider::RotaryVerticalDrag, Slider::TextBoxBelow };
private:
class Envelope final : public Component
{
public:
Envelope (ADSRComponent& adsr) : parent { adsr } {}
void paint (Graphics& g) final
{
const auto env = parent.getParameters();
// sustain isn't a length but we use a fixed value here to give
// sustain some visual width in the envelope
constexpr auto sustainLength = 0.1;
const auto adsrLength = env.attack
+ env.decay
+ sustainLength
+ env.release;
auto bounds = getLocalBounds().toFloat();
const auto attackWidth = bounds.proportionOfWidth (env.attack / adsrLength);
const auto decayWidth = bounds.proportionOfWidth (env.decay / adsrLength);
const auto sustainWidth = bounds.proportionOfWidth (sustainLength / adsrLength);
const auto releaseWidth = bounds.proportionOfWidth (env.release / adsrLength);
const auto sustainHeight = bounds.proportionOfHeight (1 - env.sustain);
const auto attackBounds = bounds.removeFromLeft (attackWidth);
const auto decayBounds = bounds.removeFromLeft (decayWidth);
const auto sustainBounds = bounds.removeFromLeft (sustainWidth);
const auto releaseBounds = bounds.removeFromLeft (releaseWidth);
g.setColour (Colours::black.withAlpha (0.1f));
g.fillRect (bounds);
const auto alpha = 0.4f;
g.setColour (Colour (246, 98, 92).withAlpha (alpha));
g.fillRect (attackBounds);
g.setColour (Colour (242, 187, 60).withAlpha (alpha));
g.fillRect (decayBounds);
g.setColour (Colour (109, 234, 166).withAlpha (alpha));
g.fillRect (sustainBounds);
g.setColour (Colour (131, 61, 183).withAlpha (alpha));
g.fillRect (releaseBounds);
Path envelopePath;
envelopePath.startNewSubPath (attackBounds.getBottomLeft());
envelopePath.lineTo (decayBounds.getTopLeft());
envelopePath.lineTo (sustainBounds.getX(), sustainHeight);
envelopePath.lineTo (releaseBounds.getX(), sustainHeight);
envelopePath.lineTo (releaseBounds.getBottomRight());
const auto lineThickness = 4.0f;
g.setColour (Colours::white);
g.strokePath (envelopePath, PathStrokeType { lineThickness });
}
private:
ADSRComponent& parent;
};
Envelope envelope;
};

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -24,8 +28,8 @@
/* This component scrolls a continuous waveform showing the audio that's
coming into whatever audio inputs this object is connected to.
*/
class LiveScrollingAudioDisplay : public AudioVisualiserComponent,
public AudioIODeviceCallback
class LiveScrollingAudioDisplay final : public AudioVisualiserComponent,
public AudioIODeviceCallback
{
public:
LiveScrollingAudioDisplay() : AudioVisualiserComponent (1)

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -38,7 +42,7 @@ struct DSPDemoParameterBase : public ChangeBroadcaster
};
//==============================================================================
struct SliderParameter : public DSPDemoParameterBase
struct SliderParameter final : public DSPDemoParameterBase
{
SliderParameter (Range<double> range, double skew, double initialValue,
const String& labelName, const String& suffix = {})
@ -66,7 +70,7 @@ private:
};
//==============================================================================
struct ChoiceParameter : public DSPDemoParameterBase
struct ChoiceParameter final : public DSPDemoParameterBase
{
ChoiceParameter (const StringArray& options, int initialId, const String& labelName)
: DSPDemoParameterBase (labelName)
@ -89,11 +93,11 @@ private:
};
//==============================================================================
class AudioThumbnailComponent : public Component,
public FileDragAndDropTarget,
public ChangeBroadcaster,
private ChangeListener,
private Timer
class AudioThumbnailComponent final : public Component,
public FileDragAndDropTarget,
public ChangeBroadcaster,
private ChangeListener,
private Timer
{
public:
AudioThumbnailComponent (AudioDeviceManager& adm, AudioFormatManager& afm)
@ -148,7 +152,7 @@ public:
{
transportSource = newSource;
struct ResetCallback : public CallbackMessage
struct ResetCallback final : public CallbackMessage
{
ResetCallback (AudioThumbnailComponent& o) : owner (o) {}
void messageCallback() override { owner.reset(); }
@ -217,7 +221,7 @@ private:
};
//==============================================================================
class DemoParametersComponent : public Component
class DemoParametersComponent final : public Component
{
public:
DemoParametersComponent (const std::vector<DSPDemoParameterBase*>& demoParams)
@ -270,9 +274,9 @@ private:
//==============================================================================
template <class DemoType>
struct DSPDemo : public AudioSource,
public ProcessorWrapper<DemoType>,
private ChangeListener
struct DSPDemo final : public AudioSource,
public ProcessorWrapper<DemoType>,
private ChangeListener
{
DSPDemo (AudioSource& input)
: inputSource (&input)
@ -327,10 +331,10 @@ struct DSPDemo : public AudioSource,
//==============================================================================
template <class DemoType>
class AudioFileReaderComponent : public Component,
private TimeSliceThread,
private Value::Listener,
private ChangeListener
class AudioFileReaderComponent final : public Component,
private TimeSliceThread,
private Value::Listener,
private ChangeListener
{
public:
//==============================================================================
@ -379,7 +383,7 @@ public:
r.removeFromTop (20);
if (parametersComponent.get() != nullptr)
if (parametersComponent != nullptr)
parametersComponent->setBounds (r.removeFromTop (parametersComponent->getHeightNeeded()).reduced (20, 0));
}
@ -412,6 +416,7 @@ public:
readerSource->setLooping (loopState.getValue());
init();
resized();
return true;
}
@ -442,7 +447,7 @@ public:
transportSource.reset (new AudioTransportSource());
transportSource->addChangeListener (this);
if (readerSource.get() != nullptr)
if (readerSource != nullptr)
{
if (auto* device = audioDeviceManager.getCurrentAudioDevice())
{
@ -461,12 +466,20 @@ public:
audioSourcePlayer.setSource (currentDemo.get());
initParameters();
auto& parameters = currentDemo->getParameters();
parametersComponent.reset();
if (! parameters.empty())
{
parametersComponent = std::make_unique<DemoParametersComponent> (parameters);
addAndMakeVisible (parametersComponent.get());
}
}
void play()
{
if (readerSource.get() == nullptr)
if (readerSource == nullptr)
return;
if (transportSource->getCurrentPosition() >= transportSource->getLengthInSeconds()
@ -479,32 +492,17 @@ public:
void setLooping (bool shouldLoop)
{
if (readerSource.get() != nullptr)
if (readerSource != nullptr)
readerSource->setLooping (shouldLoop);
}
AudioThumbnailComponent& getThumbnailComponent() { return header.thumbnailComp; }
void initParameters()
{
auto& parameters = currentDemo->getParameters();
parametersComponent.reset();
if (parameters.size() > 0)
{
parametersComponent.reset (new DemoParametersComponent (parameters));
addAndMakeVisible (parametersComponent.get());
}
resized();
}
private:
//==============================================================================
class AudioPlayerHeader : public Component,
private ChangeListener,
private Value::Listener
class AudioPlayerHeader final : public Component,
private ChangeListener,
private Value::Listener
{
public:
AudioPlayerHeader (AudioDeviceManager& adm,
@ -596,13 +594,17 @@ private:
const auto u = fc.getURLResult();
if (! audioFileReader.loadURL (u))
NativeMessageBox::showAsync (MessageBoxOptions()
.withIconType (MessageBoxIconType::WarningIcon)
.withTitle ("Error loading file")
.withMessage ("Unable to load audio file"),
nullptr);
{
auto options = MessageBoxOptions().withIconType (MessageBoxIconType::WarningIcon)
.withTitle ("Error loading file")
.withMessage ("Unable to load audio file")
.withButton ("OK");
messageBox = NativeMessageBox::showScopedAsync (options, nullptr);
}
else
{
thumbnailComp.setCurrentURL (u);
}
}
fileChooser = nullptr;
@ -629,12 +631,13 @@ private:
AudioFileReaderComponent& audioFileReader;
std::unique_ptr<FileChooser> fileChooser;
ScopedMessageBox messageBox;
};
//==============================================================================
void valueChanged (Value& v) override
{
if (readerSource.get() != nullptr)
if (readerSource != nullptr)
readerSource->setLooping (v.getValue());
}

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -82,11 +86,26 @@ inline File getExamplesDirectory() noexcept
#endif
}
inline std::unique_ptr<InputStream> createAssetInputStream (const char* resourcePath)
enum class AssertAssetExists
{
no,
yes
};
inline std::unique_ptr<InputStream> createAssetInputStream (const char* resourcePath,
[[maybe_unused]] AssertAssetExists assertExists = AssertAssetExists::yes)
{
#if JUCE_ANDROID
ZipFile apkZip (File::getSpecialLocation (File::invokedExecutableFile));
return std::unique_ptr<InputStream> (apkZip.createStreamForEntry (apkZip.getIndexOfFileName ("assets/" + String (resourcePath))));
const auto fileIndex = apkZip.getIndexOfFileName ("assets/" + String (resourcePath));
if (fileIndex == -1)
{
jassert (assertExists == AssertAssetExists::no);
return {};
}
return std::unique_ptr<InputStream> (apkZip.createStreamForEntry (fileIndex));
#else
#if JUCE_IOS
auto assetsDir = File::getSpecialLocation (File::currentExecutableFile)
@ -102,7 +121,12 @@ inline std::unique_ptr<InputStream> createAssetInputStream (const char* resource
#endif
auto resourceFile = assetsDir.getChildFile (resourcePath);
jassert (resourceFile.existsAsFile());
if (! resourceFile.existsAsFile())
{
jassert (assertExists == AssertAssetExists::no);
return {};
}
return resourceFile.createInputStream();
#endif
@ -218,11 +242,7 @@ inline Path getJUCELogoPath()
// 0.0 and 1.0 at a random speed
struct BouncingNumber
{
BouncingNumber()
: speed (0.0004 + 0.0007 * Random::getSystemRandom().nextDouble()),
phase (Random::getSystemRandom().nextDouble())
{
}
virtual ~BouncingNumber() = default;
float getValue() const
{
@ -231,10 +251,11 @@ struct BouncingNumber
}
protected:
double speed, phase;
double speed = 0.0004 + 0.0007 * Random::getSystemRandom().nextDouble(),
phase = Random::getSystemRandom().nextDouble();
};
struct SlowerBouncingNumber : public BouncingNumber
struct SlowerBouncingNumber final : public BouncingNumber
{
SlowerBouncingNumber()
{
@ -244,10 +265,8 @@ struct SlowerBouncingNumber : public BouncingNumber
inline std::unique_ptr<InputSource> makeInputSource (const URL& url)
{
#if JUCE_ANDROID
if (auto doc = AndroidDocument::fromDocument (url))
if (const auto doc = AndroidDocument::fromDocument (url))
return std::make_unique<AndroidDocumentInputSource> (doc);
#endif
#if ! JUCE_IOS
if (url.isLocalFile())
@ -257,4 +276,17 @@ inline std::unique_ptr<InputSource> makeInputSource (const URL& url)
return std::make_unique<URLInputSource> (url);
}
inline std::unique_ptr<OutputStream> makeOutputStream (const URL& url)
{
if (const auto doc = AndroidDocument::fromDocument (url))
return doc.createOutputStream();
#if ! JUCE_IOS
if (url.isLocalFile())
return url.getLocalFile().createOutputStream();
#endif
return url.createOutputStream();
}
#endif // PIP_DEMO_UTILITIES_INCLUDED

View file

@ -1,18 +1,22 @@
/*
==============================================================================
This file is part of the JUCE examples.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
To use, copy, modify, and/or distribute this software for any purpose with or
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES,
WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR
PURPOSE, ARE DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/

View file

@ -33,6 +33,5 @@
"OSXFrameworks": "Cocoa IOKit",
"iOSFrameworks": "Foundation",
"LinuxLibs": "rt dl pthread",
"mingwLibs": "uuid wsock32 wininet version ole32 ws2_32 oleaut32 imm32 comdlg32 shlwapi rpcrt4 winmm"
"LinuxLibs": "rt dl pthread"
}

View file

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>WebViewPluginDemo</title>
<style type="text/css">
body {
background-color: white;
}
</style>
</head>
<body>
<h1>WebViewPluginDemo</h1>
<p>
This document is a placeholder for the GUI component of the
WebViewPluginDemo.
</p>
<p>
To build the fully fledged user interface you need to install
<a href="https://nodejs.org">node.js</a>
</p>
<p>
Then navigate into the
<code>examples/Plugins/WebViewPluginDemoGUI</code> directory inside your JUCE
directory, and issue the following commands.
</p>
<pre>
npm install
npm run build
npm run zip
</pre
>
<p>
This will build the full GUI package and place it in the
<code>Assets</code> directory.
</p>
<p>After this, rebuild and restart this demo.</p>
</body>
</html>

View file

@ -4,7 +4,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.3.0'
classpath 'com.android.tools.build:gradle:8.4.1'
}
}

View file

@ -0,0 +1 @@
android.useAndroidX=true

View file

@ -1 +1 @@
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-all.zip

View file

@ -39,15 +39,15 @@ ifeq ($(CONFIG),Debug)
TARGET_ARCH :=
endif
JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.4" "-DJUCE_APP_VERSION_HEX=0x70004" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80004" "-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_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.4" "-DJUCE_APP_VERSION_HEX=0x80004" $(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
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -g -ggdb -O0 $(CFLAGS)
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++17 $(CXXFLAGS)
JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS)
JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 fontconfig gl libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS)
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OBJDIR)
endif
ifeq ($(CONFIG),Release)
@ -60,15 +60,15 @@ ifeq ($(CONFIG),Release)
TARGET_ARCH :=
endif
JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.4" "-DJUCE_APP_VERSION_HEX=0x70004" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_PROJUCER_VERSION=0x80004" "-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_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=8.0.4" "-DJUCE_APP_VERSION_HEX=0x80004" $(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
JUCE_CFLAGS += $(JUCE_CPPFLAGS) $(TARGET_ARCH) -O3 $(CFLAGS)
JUCE_CXXFLAGS += $(JUCE_CFLAGS) -std=c++17 $(CXXFLAGS)
JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 libcurl) -fvisibility=hidden -lrt -ldl -lpthread -lGL $(LDFLAGS)
JUCE_LDFLAGS += $(TARGET_ARCH) -L$(JUCE_BINDIR) -L$(JUCE_LIBDIR) $(shell $(PKG_CONFIG) --libs alsa freetype2 fontconfig gl libcurl) -fvisibility=hidden -lrt -ldl -lpthread $(LDFLAGS)
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(TARGET) $(JUCE_OBJDIR)
CLEANCMD = rm -rf $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(JUCE_OBJDIR)
endif
OBJECTS_APP := \
@ -79,6 +79,7 @@ OBJECTS_APP := \
$(JUCE_OBJDIR)/MainComponent_a54318d2.o \
$(JUCE_OBJDIR)/Main_90ebc5c2.o \
$(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o \
$(JUCE_OBJDIR)/include_juce_animation_c2224b92.o \
$(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o \
$(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o \
$(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o \
@ -88,13 +89,17 @@ OBJECTS_APP := \
$(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o \
$(JUCE_OBJDIR)/include_juce_box2d_b0305d8b.o \
$(JUCE_OBJDIR)/include_juce_core_f26d17db.o \
$(JUCE_OBJDIR)/include_juce_core_CompilationTime_9257742c.o \
$(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o \
$(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o \
$(JUCE_OBJDIR)/include_juce_dsp_aeb2060f.o \
$(JUCE_OBJDIR)/include_juce_events_fd7d695.o \
$(JUCE_OBJDIR)/include_juce_graphics_f817e147.o \
$(JUCE_OBJDIR)/include_juce_graphics_Harfbuzz_60c52ba2.o \
$(JUCE_OBJDIR)/include_juce_graphics_Sheenbidi_c310974d.o \
$(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o \
$(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o \
$(JUCE_OBJDIR)/include_juce_javascript_84e88969.o \
$(JUCE_OBJDIR)/include_juce_opengl_a8a032b.o \
$(JUCE_OBJDIR)/include_juce_osc_f3df604d.o \
$(JUCE_OBJDIR)/include_juce_product_unlocking_8278fcdc.o \
@ -104,156 +109,191 @@ OBJECTS_APP := \
all : $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)
$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(RESOURCES)
$(JUCE_OUTDIR)/$(JUCE_TARGET_APP) : $(OBJECTS_APP) $(JUCE_OBJDIR)/execinfo.cmd $(RESOURCES)
@command -v $(PKG_CONFIG) >/dev/null 2>&1 || { echo >&2 "pkg-config not installed. Please, install it."; exit 1; }
@$(PKG_CONFIG) --print-errors alsa freetype2 libcurl
@$(PKG_CONFIG) --print-errors alsa freetype2 fontconfig gl libcurl
@echo Linking "DemoRunner - App"
-$(V_AT)mkdir -p $(JUCE_BINDIR)
-$(V_AT)mkdir -p $(JUCE_LIBDIR)
-$(V_AT)mkdir -p $(JUCE_OUTDIR)
$(V_AT)$(CXX) -o $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(OBJECTS_APP) $(JUCE_LDFLAGS) $(JUCE_LDFLAGS_APP) $(RESOURCES) $(TARGET_ARCH)
$(V_AT)$(CXX) -o $(JUCE_OUTDIR)/$(JUCE_TARGET_APP) $(OBJECTS_APP) $(JUCE_LDFLAGS) $(shell cat $(JUCE_OBJDIR)/execinfo.cmd) $(JUCE_LDFLAGS_APP) $(RESOURCES) $(TARGET_ARCH)
$(JUCE_OBJDIR)/DemoPIPs1_5b52b434.o: ../../Source/Demos/DemoPIPs1.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling DemoPIPs1.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/DemoPIPs2_5b60cbb5.o: ../../Source/Demos/DemoPIPs2.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling DemoPIPs2.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/JUCEDemos_5a07ba05.o: ../../Source/Demos/JUCEDemos.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling JUCEDemos.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/DemoContentComponent_c5bb9cc3.o: ../../Source/UI/DemoContentComponent.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling DemoContentComponent.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/MainComponent_a54318d2.o: ../../Source/UI/MainComponent.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling MainComponent.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/Main_90ebc5c2.o: ../../Source/Main.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling Main.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_analytics_f8e9fa94.o: ../../JuceLibraryCode/include_juce_analytics.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_analytics.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_animation_c2224b92.o: ../../JuceLibraryCode/include_juce_animation.cpp
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_animation.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_basics_8a4e984a.o: ../../JuceLibraryCode/include_juce_audio_basics.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_basics.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_devices_63111d02.o: ../../JuceLibraryCode/include_juce_audio_devices.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_devices.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_formats_15f82001.o: ../../JuceLibraryCode/include_juce_audio_formats.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_formats.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_processors_10c03666.o: ../../JuceLibraryCode/include_juce_audio_processors.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_processors.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_processors_ara_2a4c6ef7.o: ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_processors_ara.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_processors_lv2_libs_12bdca08.o: ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_processors_lv2_libs.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_audio_utils_9f9fb2d6.o: ../../JuceLibraryCode/include_juce_audio_utils.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_audio_utils.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_box2d_b0305d8b.o: ../../JuceLibraryCode/include_juce_box2d.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_box2d.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_core_f26d17db.o: ../../JuceLibraryCode/include_juce_core.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_core.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_core_CompilationTime_9257742c.o: ../../JuceLibraryCode/include_juce_core_CompilationTime.cpp
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_core_CompilationTime.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_cryptography_8cb807a8.o: ../../JuceLibraryCode/include_juce_cryptography.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_cryptography.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_data_structures_7471b1e3.o: ../../JuceLibraryCode/include_juce_data_structures.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_data_structures.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_dsp_aeb2060f.o: ../../JuceLibraryCode/include_juce_dsp.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_dsp.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_events_fd7d695.o: ../../JuceLibraryCode/include_juce_events.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_events.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_graphics_f817e147.o: ../../JuceLibraryCode/include_juce_graphics.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_graphics.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_graphics_Harfbuzz_60c52ba2.o: ../../JuceLibraryCode/include_juce_graphics_Harfbuzz.cpp
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_graphics_Harfbuzz.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_graphics_Sheenbidi_c310974d.o: ../../JuceLibraryCode/include_juce_graphics_Sheenbidi.c
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_graphics_Sheenbidi.c"
$(V_AT)$(CC) $(JUCE_CFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_gui_basics_e3f79785.o: ../../JuceLibraryCode/include_juce_gui_basics.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_gui_basics.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_gui_extra_6dee1c1a.o: ../../JuceLibraryCode/include_juce_gui_extra.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_gui_extra.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_javascript_84e88969.o: ../../JuceLibraryCode/include_juce_javascript.cpp
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_javascript.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_opengl_a8a032b.o: ../../JuceLibraryCode/include_juce_opengl.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_opengl.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_osc_f3df604d.o: ../../JuceLibraryCode/include_juce_osc.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_osc.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_product_unlocking_8278fcdc.o: ../../JuceLibraryCode/include_juce_product_unlocking.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_product_unlocking.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/include_juce_video_be78589.o: ../../JuceLibraryCode/include_juce_video.cpp
-$(V_AT)mkdir -p $(JUCE_OBJDIR)
-$(V_AT)mkdir -p $(@D)
@echo "Compiling include_juce_video.cpp"
$(V_AT)$(CXX) $(JUCE_CXXFLAGS) $(JUCE_CPPFLAGS_APP) $(JUCE_CFLAGS_APP) -o "$@" -c "$<"
$(JUCE_OBJDIR)/execinfo.cmd:
-$(V_AT)mkdir -p $(@D)
-@if [ -z "$(V_AT)" ]; then echo "Checking if we need to link libexecinfo"; fi
$(V_AT)printf "int main() { return 0; }" | $(CXX) -x c++ -o $(@D)/execinfo.x -lexecinfo - >/dev/null 2>&1 && printf -- "-lexecinfo" > "$@" || touch "$@"
$(JUCE_OBJDIR)/cxxfs.cmd:
-$(V_AT)mkdir -p $(@D)
-@if [ -z "$(V_AT)" ]; then echo "Checking if we need to link stdc++fs"; fi
$(V_AT)printf "int main() { return 0; }" | $(CXX) -x c++ -o $(@D)/cxxfs.x -lstdc++fs - >/dev/null 2>&1 && printf -- "-lstdc++fs" > "$@" || touch "$@"
clean:
@echo Cleaning DemoRunner
$(V_AT)$(CLEANCMD)
strip:
@echo Stripping DemoRunner
-$(V_AT)$(STRIP) --strip-unneeded $(JUCE_OUTDIR)/$(TARGET)
-$(V_AT)$(STRIP) --strip-unneeded $(JUCE_OUTDIR)/$(JUCE_TARGET_APP)
-include $(OBJECTS_APP:%.o=%.d)

View file

@ -9,9 +9,13 @@
/* Begin PBXBuildFile section */
0140787C0118A95E37DE90B4 /* include_juce_video.mm */ = {isa = PBXBuildFile; fileRef = 9144821E003E15E4042B57DB; };
028383D0577D0236899D8CA5 /* OpenGL.framework */ = {isa = PBXBuildFile; fileRef = 40BD06D4AB0D2C73E936A2F1; };
05E2CC77AE99E8A2E3A18777 /* Security.framework */ = {isa = PBXBuildFile; fileRef = 87D5F938A115568F9CF3BE5A; };
10D769051F1431A67AD2CB40 /* MetalKit.framework */ = {isa = PBXBuildFile; fileRef = 2992DB69DCFB7DADDE907385; settings = { ATTRIBUTES = (Weak, ); }; };
11D7AB57EC28DB48A066F7AD /* include_juce_graphics_Harfbuzz.cpp */ = {isa = PBXBuildFile; fileRef = 483C3A8B4FB98B54BB42CB50; };
1351A13E78F38741C6075600 /* CoreAudio.framework */ = {isa = PBXBuildFile; fileRef = 4F0A137A4115946A346180E6; };
163B0CF2DD0990A63DF1D5A6 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 470C3E4553B513FFEF752779; };
1BA301E39E29966719B710A1 /* GUI */ = {isa = PBXBuildFile; fileRef = 9EBAEBBD9093CB005D1692F2; };
1BA36E8CA4B9E8D3F3B57D24 /* include_juce_graphics_Sheenbidi.c */ = {isa = PBXBuildFile; fileRef = CCC8AEBCE55002F970222BAD; };
1DBDFEDE359CFC84F8E3DE4C /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = FCD0D758C5767944BEC29730; };
26652AB1BB77C8A39434775F /* include_juce_audio_formats.mm */ = {isa = PBXBuildFile; fileRef = E061A1C75FA5722167FC4997; };
2707968B431D83AC7E28E49B /* include_juce_audio_processors.mm */ = {isa = PBXBuildFile; fileRef = E67AB94002886AF67437D6AE; };
@ -23,6 +27,7 @@
48CF0B02E1D06E5DA51E6270 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; };
4FBBB55F4E347757F74F1F41 /* MainComponent.cpp */ = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; };
527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; };
55F120E70543228568573D4A /* include_juce_animation.cpp */ = {isa = PBXBuildFile; fileRef = CB4C64BACC1CA4AAD6D69565; };
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; };
@ -39,6 +44,7 @@
89AD16514B1F4133FFEA1DF9 /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = 96D99A08027CA35D6A4E5CFD; };
8C0AEA08A71075A6C765AEC9 /* AVKit.framework */ = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; };
91CD2BCE4CA07E18229EB436 /* RecentFilesMenuTemplate.nib */ = {isa = PBXBuildFile; fileRef = 9672FCE6167ADB567A9EB2F8; };
98D376BD41E5359370AD42D9 /* include_juce_core_CompilationTime.cpp */ = {isa = PBXBuildFile; fileRef = 640B7C54D35F5DF408327886; };
9BEA1428416CE06BF72FBAB8 /* DiscRecording.framework */ = {isa = PBXBuildFile; fileRef = 3DC90DA86565B0356B6E5E0B; };
9EACEA6BE8D0ACC72C12C080 /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 03A63C3CA6F24977F19C316D; };
9F15FD7A7CE83CFD98F07D59 /* Cocoa.framework */ = {isa = PBXBuildFile; fileRef = 02A2ED58B066B4D119F67913; };
@ -46,6 +52,7 @@
B1981F62F6A91FD2F579A198 /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = 23CD1A3F9067C3A0ECE7BB67; };
B38728296BB32B7994CE28DF /* JUCEDemos.cpp */ = {isa = PBXBuildFile; fileRef = 934ACDCB3FD9D223A3481D8F; };
BC6036F22423CA0AFF0385A7 /* include_juce_opengl.mm */ = {isa = PBXBuildFile; fileRef = 94B6C88FE30861A47CD28709; };
BE3AD5595805C8B8845146EF /* include_juce_javascript.cpp */ = {isa = PBXBuildFile; fileRef = 4306E55904378CE5A6EB48B3; };
C2BB2B6DA237FE0CB64C7EDA /* include_juce_analytics.cpp */ = {isa = PBXBuildFile; fileRef = 5965349393850F41DF76F350; };
CDABEA6258EC70C65C9ACCFE /* include_juce_graphics.mm */ = {isa = PBXBuildFile; fileRef = 3E4ED41C374261CFFD309743; };
CDEB6BA5341494AF51D07C72 /* include_juce_product_unlocking.mm */ = {isa = PBXBuildFile; fileRef = 0AB68DBAB6B7DAEDDDD5B683; };
@ -54,6 +61,7 @@
E2F44A968EC2598DAE33A997 /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = A1D6D36B96B6B37C31F32829; };
E33E8FE2E7F8EC8EB4279F1B /* Utilities */ = {isa = PBXBuildFile; fileRef = 7B3243C92248D379A0489AA4; };
E6F58FC3ACAE774DB4D06420 /* DemoPIPs1.cpp */ = {isa = PBXBuildFile; fileRef = 3AB62BFF806112585B54DDA3; };
EFD00925ED57B2C5EB5412FC /* Metal.framework */ = {isa = PBXBuildFile; fileRef = 3644EF58D9EB1AB436A04E77; settings = { ATTRIBUTES = (Weak, ); }; };
F28112945CEBEA4CE8975833 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 03B0F9318FD583525AB195A9; };
F619F3887CEC064441BB6EE6 /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 260481E972425474BB8155B0; };
FF87532E62753EDFA3D29CAD /* include_juce_cryptography.mm */ = {isa = PBXBuildFile; fileRef = 6C5E26B4D28F8450435B8AE1; };
@ -74,14 +82,18 @@
23CD1A3F9067C3A0ECE7BB67 /* QuartzCore.framework */ /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
25E5ED33876A2C752378C859 /* MainComponent.cpp */ /* MainComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/UI/MainComponent.cpp; sourceTree = SOURCE_ROOT; };
260481E972425474BB8155B0 /* Main.cpp */ /* Main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = SOURCE_ROOT; };
2992DB69DCFB7DADDE907385 /* MetalKit.framework */ /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
346450C70C964FD9640B6086 /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; };
3644EF58D9EB1AB436A04E77 /* Metal.framework */ /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
3AB62BFF806112585B54DDA3 /* DemoPIPs1.cpp */ /* DemoPIPs1.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs1.cpp; path = ../../Source/Demos/DemoPIPs1.cpp; sourceTree = SOURCE_ROOT; };
3B99CF94C44E2EE04635A439 /* AVKit.framework */ /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
3BC9753E0CD75A36DC742EE0 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; };
3DC90DA86565B0356B6E5E0B /* DiscRecording.framework */ /* DiscRecording.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = DiscRecording.framework; path = System/Library/Frameworks/DiscRecording.framework; sourceTree = SDKROOT; };
3E4ED41C374261CFFD309743 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; };
40BD06D4AB0D2C73E936A2F1 /* OpenGL.framework */ /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
4306E55904378CE5A6EB48B3 /* include_juce_javascript.cpp */ /* include_juce_javascript.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_javascript.cpp; path = ../../JuceLibraryCode/include_juce_javascript.cpp; sourceTree = SOURCE_ROOT; };
470C3E4553B513FFEF752779 /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
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; };
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; };
@ -95,6 +107,7 @@
5CD17151385A69F1E07FE85B /* DSP */ /* DSP */ = {isa = PBXFileReference; lastKnownFileType = folder; name = DSP; path = ../../../DSP; sourceTree = "<group>"; };
60F2869DC345EAF2314D6C09 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; };
61AE09C749B007B70A265D9B /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
640B7C54D35F5DF408327886 /* include_juce_core_CompilationTime.cpp */ /* include_juce_core_CompilationTime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_core_CompilationTime.cpp; path = ../../JuceLibraryCode/include_juce_core_CompilationTime.cpp; sourceTree = SOURCE_ROOT; };
651ECE3C7BA845DDCFEE48F3 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; };
6847A9B2C5E3C2ED56D8D4E7 /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; };
685A261BE78585293F3EAD36 /* Assets */ /* Assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Assets; path = ../../../Assets; sourceTree = "<group>"; };
@ -104,6 +117,8 @@
71A91516AFD980FEE694C0E1 /* IOKit.framework */ /* IOKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOKit.framework; path = System/Library/Frameworks/IOKit.framework; sourceTree = SDKROOT; };
7A5AAE9EE573FC6105CC4AAC /* SettingsContent.h */ /* SettingsContent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = SOURCE_ROOT; };
7B3243C92248D379A0489AA4 /* Utilities */ /* Utilities */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Utilities; path = ../../../Utilities; sourceTree = "<group>"; };
8447FC9882D85E6DAF0A4852 /* juce_animation */ /* juce_animation */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_animation; path = ../../../../modules/juce_animation; sourceTree = SOURCE_ROOT; };
87D5F938A115568F9CF3BE5A /* Security.framework */ /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; };
8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; };
903CD4126C779884797EF915 /* juce_core */ /* juce_core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_core; path = ../../../../modules/juce_core; sourceTree = SOURCE_ROOT; };
@ -122,6 +137,9 @@
B2BC383CE102EECCF49C7AF7 /* IntroScreen.h */ /* IntroScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = SOURCE_ROOT; };
B4389672DA4CC8E0A531062D /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
C1E93FAF6C68A40A664422CD /* include_juce_dsp.mm */ /* include_juce_dsp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_dsp.mm; path = ../../JuceLibraryCode/include_juce_dsp.mm; sourceTree = SOURCE_ROOT; };
C64CA4082EC267CDD63E6623 /* juce_javascript */ /* juce_javascript */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_javascript; path = ../../../../modules/juce_javascript; sourceTree = SOURCE_ROOT; };
CB4C64BACC1CA4AAD6D69565 /* include_juce_animation.cpp */ /* include_juce_animation.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_animation.cpp; path = ../../JuceLibraryCode/include_juce_animation.cpp; sourceTree = SOURCE_ROOT; };
CCC8AEBCE55002F970222BAD /* include_juce_graphics_Sheenbidi.c */ /* include_juce_graphics_Sheenbidi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = include_juce_graphics_Sheenbidi.c; path = ../../JuceLibraryCode/include_juce_graphics_Sheenbidi.c; sourceTree = SOURCE_ROOT; };
CE38E6469D98462A2C22C915 /* include_juce_osc.cpp */ /* include_juce_osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_osc.cpp; path = ../../JuceLibraryCode/include_juce_osc.cpp; sourceTree = SOURCE_ROOT; };
CFF2BBEB242CC8B3B904B5F9 /* App */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = BUILT_PRODUCTS_DIR; };
DC192EFA899E6CBE6B5CD394 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
@ -158,7 +176,10 @@
8584640341100008744861A5,
028383D0577D0236899D8CA5,
B1981F62F6A91FD2F579A198,
05E2CC77AE99E8A2E3A18777,
89AD16514B1F4133FFEA1DF9,
EFD00925ED57B2C5EB5412FC,
10D769051F1431A67AD2CB40,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -182,7 +203,10 @@
71A91516AFD980FEE694C0E1,
40BD06D4AB0D2C73E936A2F1,
23CD1A3F9067C3A0ECE7BB67,
87D5F938A115568F9CF3BE5A,
96D99A08027CA35D6A4E5CFD,
3644EF58D9EB1AB436A04E77,
2992DB69DCFB7DADDE907385,
);
name = Frameworks;
sourceTree = "<group>";
@ -191,6 +215,7 @@
isa = PBXGroup;
children = (
112FFCB73597157E721BCDF2,
8447FC9882D85E6DAF0A4852,
6847A9B2C5E3C2ED56D8D4E7,
60F2869DC345EAF2314D6C09,
491641F7632BCC81BBA0ED85,
@ -205,6 +230,7 @@
8CE533D611CD0984AD028D73,
5A9F2000C66D24E8B01BE60B,
A9315F8368A5771EC39631CB,
C64CA4082EC267CDD63E6623,
6C198AF93E1F6E682189E2F6,
651ECE3C7BA845DDCFEE48F3,
4FE6029FF76BCE9698595DC5,
@ -217,6 +243,7 @@
isa = PBXGroup;
children = (
5965349393850F41DF76F350,
CB4C64BACC1CA4AAD6D69565,
03B0F9318FD583525AB195A9,
03A63C3CA6F24977F19C316D,
E061A1C75FA5722167FC4997,
@ -226,13 +253,17 @@
EDDA01B246C6128CAF7A2914,
4DF215D350FFE5E119CBA7E5,
3BC9753E0CD75A36DC742EE0,
640B7C54D35F5DF408327886,
6C5E26B4D28F8450435B8AE1,
F5F2EA2238973488632FC322,
C1E93FAF6C68A40A664422CD,
FCD0D758C5767944BEC29730,
3E4ED41C374261CFFD309743,
483C3A8B4FB98B54BB42CB50,
CCC8AEBCE55002F970222BAD,
A1D6D36B96B6B37C31F32829,
979F23EA9E5E76131299E886,
4306E55904378CE5A6EB48B3,
94B6C88FE30861A47CD28709,
CE38E6469D98462A2C22C915,
0AB68DBAB6B7DAEDDDD5B683,
@ -347,6 +378,7 @@
AC6F0E9A0809A184B2C2B7DE = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1340;
ORGANIZATIONNAME = "Raw Material Software Limited";
TargetAttributes = {
@ -419,6 +451,7 @@
4FBBB55F4E347757F74F1F41,
F619F3887CEC064441BB6EE6,
C2BB2B6DA237FE0CB64C7EDA,
55F120E70543228568573D4A,
F28112945CEBEA4CE8975833,
9EACEA6BE8D0ACC72C12C080,
26652AB1BB77C8A39434775F,
@ -428,13 +461,17 @@
712D81867EC698463252FA79,
611298FAC1A543BDD10D4C41,
D183F8140174ACCDDCD230A2,
98D376BD41E5359370AD42D9,
FF87532E62753EDFA3D29CAD,
2F76CA28C8C0EFC7453D0EB8,
6B5560283DEEBD6DD2D6C984,
1DBDFEDE359CFC84F8E3DE4C,
CDABEA6258EC70C65C9ACCFE,
11D7AB57EC28DB48A066F7AD,
1BA36E8CA4B9E8D3F3B57D24,
E2F44A968EC2598DAE33A997,
5CB78489F16E82144914972D,
BE3AD5595805C8B8845146EF,
BC6036F22423CA0AFF0385A7,
AEA090DAC5C747C50C7D3FA7,
CDEB6BA5341494AF51D07C72,
@ -485,6 +522,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
OTHER_CODE_SIGN_FLAGS = --timestamp;
PRODUCT_NAME = "DemoRunner";
SDKROOT = macosx;
WARNING_CFLAGS = "-Wreorder";
@ -507,10 +545,9 @@
GCC_PREPROCESSOR_DEFINITIONS = (
"_NDEBUG=1",
"NDEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
"JUCE_PROJUCER_VERSION=0x70004",
"JUCE_PROJUCER_VERSION=0x80004",
"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",
@ -525,6 +562,7 @@
"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_opengl=1",
"JUCE_MODULE_AVAILABLE_juce_osc=1",
"JUCE_MODULE_AVAILABLE_juce_product_unlocking=1",
@ -539,9 +577,10 @@
"JUCE_STANDALONE_APPLICATION=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCE_SILENCE_XCODE_15_LINKER_WARNING=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
"JUCE_APP_VERSION=7.0.4",
"JUCE_APP_VERSION_HEX=0x70004",
"JUCE_APP_VERSION=8.0.4",
"JUCE_APP_VERSION_HEX=0x80004",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
@ -572,9 +611,9 @@
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
PRODUCT_NAME = "DemoRunner";
USE_HEADERMAP = NO;
@ -598,10 +637,9 @@
GCC_PREPROCESSOR_DEFINITIONS = (
"_DEBUG=1",
"DEBUG=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
"JUCE_PROJUCER_VERSION=0x70004",
"JUCE_PROJUCER_VERSION=0x80004",
"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",
@ -616,6 +654,7 @@
"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_opengl=1",
"JUCE_MODULE_AVAILABLE_juce_osc=1",
"JUCE_MODULE_AVAILABLE_juce_product_unlocking=1",
@ -630,9 +669,10 @@
"JUCE_STANDALONE_APPLICATION=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCE_SILENCE_XCODE_15_LINKER_WARNING=1",
"JUCER_XCODE_MAC_F6D2F4CF=1",
"JUCE_APP_VERSION=7.0.4",
"JUCE_APP_VERSION_HEX=0x70004",
"JUCE_APP_VERSION=8.0.4",
"JUCE_APP_VERSION_HEX=0x80004",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
@ -662,9 +702,9 @@
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.13;
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
PRODUCT_NAME = "DemoRunner";
USE_HEADERMAP = NO;
@ -714,6 +754,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_CODE_SIGN_FLAGS = --timestamp;
PRODUCT_NAME = "DemoRunner";
SDKROOT = macosx;
WARNING_CFLAGS = "-Wreorder";

View file

@ -24,11 +24,11 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>7.0.4</string>
<string>8.0.4</string>
<key>CFBundleVersion</key>
<string>7.0.4</string>
<string>8.0.4</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) 2020 - Raw Material Software Limited</string>
<string>Copyright (c) - Raw Material Software Limited</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>LSApplicationCategoryType</key>

View file

@ -1,21 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 15
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DemoRunner - App", "DemoRunner_App.vcxproj", "{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.ActiveCfg = Debug|x64
{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Debug|x64.Build.0 = Debug|x64
{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.ActiveCfg = Release|x64
{882FE2E3-F4EF-9825-1908-F6FEE5366B5C}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

View file

@ -1,36 +0,0 @@
#pragma code_page(65001)
#ifdef JUCE_USER_DEFINED_RC_FILE
#include JUCE_USER_DEFINED_RC_FILE
#else
#undef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION 7,0,4,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", "Raw Material Software Limited\0"
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"
VALUE "FileDescription", "DemoRunner\0"
VALUE "FileVersion", "7.0.4\0"
VALUE "ProductName", "DemoRunner\0"
VALUE "ProductVersion", "7.0.4\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
#endif
IDI_ICON1 ICON DISCARDABLE "icon.ico"
IDI_ICON2 ICON DISCARDABLE "icon.ico"

View file

@ -9,18 +9,18 @@
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION 7,0,4,0
FILEVERSION 8,0,4,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", "Raw Material Software Limited\0"
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"
VALUE "LegalCopyright", "Copyright (c) - Raw Material Software Limited\0"
VALUE "FileDescription", "DemoRunner\0"
VALUE "FileVersion", "7.0.4\0"
VALUE "FileVersion", "8.0.4\0"
VALUE "ProductName", "DemoRunner\0"
VALUE "ProductVersion", "7.0.4\0"
VALUE "ProductVersion", "8.0.4\0"
END
END

View file

@ -9,18 +9,18 @@
#include <windows.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION 7,0,4,0
FILEVERSION 8,0,4,0
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", "Raw Material Software Limited\0"
VALUE "LegalCopyright", "Copyright (c) 2020 - Raw Material Software Limited\0"
VALUE "LegalCopyright", "Copyright (c) - Raw Material Software Limited\0"
VALUE "FileDescription", "DemoRunner\0"
VALUE "FileVersion", "7.0.4\0"
VALUE "FileVersion", "8.0.4\0"
VALUE "ProductName", "DemoRunner\0"
VALUE "ProductVersion", "7.0.4\0"
VALUE "ProductVersion", "8.0.4\0"
END
END

View file

@ -9,8 +9,11 @@
/* Begin PBXBuildFile section */
0140787C0118A95E37DE90B4 /* include_juce_video.mm */ = {isa = PBXBuildFile; fileRef = 9144821E003E15E4042B57DB; };
0B0CE6D5062E5C02A41F24BC /* CoreText.framework */ = {isa = PBXBuildFile; fileRef = 873F9DD54978E601102353B4; };
10D769051F1431A67AD2CB40 /* MetalKit.framework */ = {isa = PBXBuildFile; fileRef = 2992DB69DCFB7DADDE907385; settings = { ATTRIBUTES = (Weak, ); }; };
11D7AB57EC28DB48A066F7AD /* include_juce_graphics_Harfbuzz.cpp */ = {isa = PBXBuildFile; fileRef = 483C3A8B4FB98B54BB42CB50; };
1351A13E78F38741C6075600 /* CoreAudio.framework */ = {isa = PBXBuildFile; fileRef = 4F0A137A4115946A346180E6; };
163B0CF2DD0990A63DF1D5A6 /* AudioToolbox.framework */ = {isa = PBXBuildFile; fileRef = 470C3E4553B513FFEF752779; };
1BA36E8CA4B9E8D3F3B57D24 /* include_juce_graphics_Sheenbidi.c */ = {isa = PBXBuildFile; fileRef = CCC8AEBCE55002F970222BAD; };
1C9AA8660D0DE180064ACF7B /* LaunchScreen.storyboard */ = {isa = PBXBuildFile; fileRef = 7FBD555B32197FEACDFF5AFB; };
1DBDFEDE359CFC84F8E3DE4C /* include_juce_events.mm */ = {isa = PBXBuildFile; fileRef = FCD0D758C5767944BEC29730; };
26652AB1BB77C8A39434775F /* include_juce_audio_formats.mm */ = {isa = PBXBuildFile; fileRef = E061A1C75FA5722167FC4997; };
@ -18,11 +21,13 @@
2F76CA28C8C0EFC7453D0EB8 /* include_juce_data_structures.mm */ = {isa = PBXBuildFile; fileRef = F5F2EA2238973488632FC322; };
34A4931AF1DD424D3A400EEF /* CoreGraphics.framework */ = {isa = PBXBuildFile; fileRef = 76A157A111866670A4678F04; };
36E115D98311F12AA06710E6 /* DemoPIPs2.cpp */ = {isa = PBXBuildFile; fileRef = 061AECBF1CC7056F4155812D; };
41AE56F8671DFE80720A6A18 /* UniformTypeIdentifiers.framework */ = {isa = PBXBuildFile; fileRef = AAF88452B7774FB605990B31; settings = { ATTRIBUTES = (Weak, ); }; };
46071CE2B98B562B7BF27CB1 /* CoreMedia.framework */ = {isa = PBXBuildFile; fileRef = 1CFE3935A3B810D5D68A2504; };
47ED2C78B05B8A6A00E36C46 /* Assets */ = {isa = PBXBuildFile; fileRef = 685A261BE78585293F3EAD36; };
48CF0B02E1D06E5DA51E6270 /* Accelerate.framework */ = {isa = PBXBuildFile; fileRef = A04E4408525F24F7DCBA000E; };
4FBBB55F4E347757F74F1F41 /* MainComponent.cpp */ = {isa = PBXBuildFile; fileRef = 25E5ED33876A2C752378C859; };
527DA2E6827BAFDDD3E8E80F /* CoreAudioKit.framework */ = {isa = PBXBuildFile; fileRef = B4389672DA4CC8E0A531062D; };
55F120E70543228568573D4A /* include_juce_animation.cpp */ = {isa = PBXBuildFile; fileRef = CB4C64BACC1CA4AAD6D69565; };
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; };
@ -40,6 +45,8 @@
89AD16514B1F4133FFEA1DF9 /* WebKit.framework */ = {isa = PBXBuildFile; fileRef = 96D99A08027CA35D6A4E5CFD; };
8C0AEA08A71075A6C765AEC9 /* AVKit.framework */ = {isa = PBXBuildFile; fileRef = 3B99CF94C44E2EE04635A439; };
8E63755144E29269FD82C897 /* Images.xcassets */ = {isa = PBXBuildFile; fileRef = 8135645508EEFDBDCDF2ADC6; };
9641E7E4F0B5C2A1B3E8709A /* UserNotifications.framework */ = {isa = PBXBuildFile; fileRef = 40D006CCDB1D33FF94B6ECAE; settings = { ATTRIBUTES = (Weak, ); }; };
98D376BD41E5359370AD42D9 /* include_juce_core_CompilationTime.cpp */ = {isa = PBXBuildFile; fileRef = 640B7C54D35F5DF408327886; };
9EACEA6BE8D0ACC72C12C080 /* include_juce_audio_devices.mm */ = {isa = PBXBuildFile; fileRef = 03A63C3CA6F24977F19C316D; };
AC783ECD84496E0B77911EEE /* OpenGLES.framework */ = {isa = PBXBuildFile; fileRef = 34F1320BC5C23702C08DF9F0; };
AE7FB2AC3885F4BF53A5DDA1 /* ImageIO.framework */ = {isa = PBXBuildFile; fileRef = 7983C452610C1638B7E78F12; };
@ -47,6 +54,7 @@
B1981F62F6A91FD2F579A198 /* QuartzCore.framework */ = {isa = PBXBuildFile; fileRef = 23CD1A3F9067C3A0ECE7BB67; };
B38728296BB32B7994CE28DF /* JUCEDemos.cpp */ = {isa = PBXBuildFile; fileRef = 934ACDCB3FD9D223A3481D8F; };
BC6036F22423CA0AFF0385A7 /* include_juce_opengl.mm */ = {isa = PBXBuildFile; fileRef = 94B6C88FE30861A47CD28709; };
BE3AD5595805C8B8845146EF /* include_juce_javascript.cpp */ = {isa = PBXBuildFile; fileRef = 4306E55904378CE5A6EB48B3; };
C2BB2B6DA237FE0CB64C7EDA /* include_juce_analytics.cpp */ = {isa = PBXBuildFile; fileRef = 5965349393850F41DF76F350; };
CDABEA6258EC70C65C9ACCFE /* include_juce_graphics.mm */ = {isa = PBXBuildFile; fileRef = 3E4ED41C374261CFFD309743; };
CDEB6BA5341494AF51D07C72 /* include_juce_product_unlocking.mm */ = {isa = PBXBuildFile; fileRef = 0AB68DBAB6B7DAEDDDD5B683; };
@ -54,6 +62,7 @@
E2F44A968EC2598DAE33A997 /* include_juce_gui_basics.mm */ = {isa = PBXBuildFile; fileRef = A1D6D36B96B6B37C31F32829; };
E6F58FC3ACAE774DB4D06420 /* DemoPIPs1.cpp */ = {isa = PBXBuildFile; fileRef = 3AB62BFF806112585B54DDA3; };
ECA44A41DA8A935178C1A1F4 /* UIKit.framework */ = {isa = PBXBuildFile; fileRef = F90C8B0233A54F1445343F67; };
EFD00925ED57B2C5EB5412FC /* Metal.framework */ = {isa = PBXBuildFile; fileRef = 3644EF58D9EB1AB436A04E77; settings = { ATTRIBUTES = (Weak, ); }; };
F28112945CEBEA4CE8975833 /* include_juce_audio_basics.mm */ = {isa = PBXBuildFile; fileRef = 03B0F9318FD583525AB195A9; };
F619F3887CEC064441BB6EE6 /* Main.cpp */ = {isa = PBXBuildFile; fileRef = 260481E972425474BB8155B0; };
FF87532E62753EDFA3D29CAD /* include_juce_cryptography.mm */ = {isa = PBXBuildFile; fileRef = 6C5E26B4D28F8450435B8AE1; };
@ -72,14 +81,19 @@
23CD1A3F9067C3A0ECE7BB67 /* QuartzCore.framework */ /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
25E5ED33876A2C752378C859 /* MainComponent.cpp */ /* MainComponent.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = MainComponent.cpp; path = ../../Source/UI/MainComponent.cpp; sourceTree = SOURCE_ROOT; };
260481E972425474BB8155B0 /* Main.cpp */ /* Main.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Main.cpp; path = ../../Source/Main.cpp; sourceTree = SOURCE_ROOT; };
2992DB69DCFB7DADDE907385 /* MetalKit.framework */ /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; };
2CDA0CB288452DA016E874BC /* App.entitlements */ /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = App.entitlements; path = App.entitlements; sourceTree = SOURCE_ROOT; };
346450C70C964FD9640B6086 /* juce_audio_processors */ /* juce_audio_processors */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_processors; path = ../../../../modules/juce_audio_processors; sourceTree = SOURCE_ROOT; };
34F1320BC5C23702C08DF9F0 /* OpenGLES.framework */ /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
3644EF58D9EB1AB436A04E77 /* Metal.framework */ /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
3AB62BFF806112585B54DDA3 /* DemoPIPs1.cpp */ /* DemoPIPs1.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = DemoPIPs1.cpp; path = ../../Source/Demos/DemoPIPs1.cpp; sourceTree = SOURCE_ROOT; };
3B99CF94C44E2EE04635A439 /* AVKit.framework */ /* AVKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVKit.framework; path = System/Library/Frameworks/AVKit.framework; sourceTree = SDKROOT; };
3BC9753E0CD75A36DC742EE0 /* include_juce_core.mm */ /* include_juce_core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_core.mm; path = ../../JuceLibraryCode/include_juce_core.mm; sourceTree = SOURCE_ROOT; };
3E4ED41C374261CFFD309743 /* include_juce_graphics.mm */ /* include_juce_graphics.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_graphics.mm; path = ../../JuceLibraryCode/include_juce_graphics.mm; sourceTree = SOURCE_ROOT; };
40D006CCDB1D33FF94B6ECAE /* UserNotifications.framework */ /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; };
4306E55904378CE5A6EB48B3 /* include_juce_javascript.cpp */ /* include_juce_javascript.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_javascript.cpp; path = ../../JuceLibraryCode/include_juce_javascript.cpp; sourceTree = SOURCE_ROOT; };
470C3E4553B513FFEF752779 /* AudioToolbox.framework */ /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
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; };
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; };
@ -92,6 +106,7 @@
5BD7D121AD30987C08BE10E8 /* include_juce_audio_processors_lv2_libs.cpp */ /* include_juce_audio_processors_lv2_libs.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_lv2_libs.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp; sourceTree = SOURCE_ROOT; };
60F2869DC345EAF2314D6C09 /* juce_audio_devices */ /* juce_audio_devices */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_devices; path = ../../../../modules/juce_audio_devices; sourceTree = SOURCE_ROOT; };
61AE09C749B007B70A265D9B /* CoreMIDI.framework */ /* CoreMIDI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMIDI.framework; path = System/Library/Frameworks/CoreMIDI.framework; sourceTree = SDKROOT; };
640B7C54D35F5DF408327886 /* include_juce_core_CompilationTime.cpp */ /* include_juce_core_CompilationTime.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_core_CompilationTime.cpp; path = ../../JuceLibraryCode/include_juce_core_CompilationTime.cpp; sourceTree = SOURCE_ROOT; };
651ECE3C7BA845DDCFEE48F3 /* juce_osc */ /* juce_osc */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_osc; path = ../../../../modules/juce_osc; sourceTree = SOURCE_ROOT; };
6847A9B2C5E3C2ED56D8D4E7 /* juce_audio_basics */ /* juce_audio_basics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_audio_basics; path = ../../../../modules/juce_audio_basics; sourceTree = SOURCE_ROOT; };
685A261BE78585293F3EAD36 /* Assets */ /* Assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Assets; path = ../../../Assets; sourceTree = "<group>"; };
@ -103,6 +118,7 @@
7A5AAE9EE573FC6105CC4AAC /* SettingsContent.h */ /* SettingsContent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SettingsContent.h; path = ../../Source/UI/SettingsContent.h; sourceTree = SOURCE_ROOT; };
7FBD555B32197FEACDFF5AFB /* LaunchScreen.storyboard */ /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = LaunchScreen.storyboard; sourceTree = SOURCE_ROOT; };
8135645508EEFDBDCDF2ADC6 /* Images.xcassets */ /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = DemoRunner/Images.xcassets; sourceTree = SOURCE_ROOT; };
8447FC9882D85E6DAF0A4852 /* juce_animation */ /* juce_animation */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_animation; path = ../../../../modules/juce_animation; sourceTree = SOURCE_ROOT; };
873F9DD54978E601102353B4 /* CoreText.framework */ /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; };
8CE533D611CD0984AD028D73 /* juce_graphics */ /* juce_graphics */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_graphics; path = ../../../../modules/juce_graphics; sourceTree = SOURCE_ROOT; };
8D44097417573B38729A0179 /* include_juce_audio_processors_ara.cpp */ /* include_juce_audio_processors_ara.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_audio_processors_ara.cpp; path = ../../JuceLibraryCode/include_juce_audio_processors_ara.cpp; sourceTree = SOURCE_ROOT; };
@ -117,10 +133,14 @@
A5256778E2EBD206B337B555 /* juce_video */ /* juce_video */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_video; path = ../../../../modules/juce_video; sourceTree = SOURCE_ROOT; };
A6F555BE0DDF01C285BD8BF5 /* juce_dsp */ /* juce_dsp */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_dsp; path = ../../../../modules/juce_dsp; sourceTree = SOURCE_ROOT; };
A9315F8368A5771EC39631CB /* juce_gui_extra */ /* juce_gui_extra */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_gui_extra; path = ../../../../modules/juce_gui_extra; sourceTree = SOURCE_ROOT; };
AAF88452B7774FB605990B31 /* UniformTypeIdentifiers.framework */ /* UniformTypeIdentifiers.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UniformTypeIdentifiers.framework; path = System/Library/Frameworks/UniformTypeIdentifiers.framework; sourceTree = SDKROOT; };
B28EFB9D1DF0B6D6499A7DEF /* CoreImage.framework */ /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = System/Library/Frameworks/CoreImage.framework; sourceTree = SDKROOT; };
B2BC383CE102EECCF49C7AF7 /* IntroScreen.h */ /* IntroScreen.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = IntroScreen.h; path = ../../Source/Demos/IntroScreen.h; sourceTree = SOURCE_ROOT; };
B4389672DA4CC8E0A531062D /* CoreAudioKit.framework */ /* CoreAudioKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
C1E93FAF6C68A40A664422CD /* include_juce_dsp.mm */ /* include_juce_dsp.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = include_juce_dsp.mm; path = ../../JuceLibraryCode/include_juce_dsp.mm; sourceTree = SOURCE_ROOT; };
C64CA4082EC267CDD63E6623 /* juce_javascript */ /* juce_javascript */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_javascript; path = ../../../../modules/juce_javascript; sourceTree = SOURCE_ROOT; };
CB4C64BACC1CA4AAD6D69565 /* include_juce_animation.cpp */ /* include_juce_animation.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_animation.cpp; path = ../../JuceLibraryCode/include_juce_animation.cpp; sourceTree = SOURCE_ROOT; };
CCC8AEBCE55002F970222BAD /* include_juce_graphics_Sheenbidi.c */ /* include_juce_graphics_Sheenbidi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = include_juce_graphics_Sheenbidi.c; path = ../../JuceLibraryCode/include_juce_graphics_Sheenbidi.c; sourceTree = SOURCE_ROOT; };
CE38E6469D98462A2C22C915 /* include_juce_osc.cpp */ /* include_juce_osc.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = include_juce_osc.cpp; path = ../../JuceLibraryCode/include_juce_osc.cpp; sourceTree = SOURCE_ROOT; };
CFF2BBEB242CC8B3B904B5F9 /* App */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoRunner.app; sourceTree = BUILT_PRODUCTS_DIR; };
DC192EFA899E6CBE6B5CD394 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
@ -163,6 +183,10 @@
B1981F62F6A91FD2F579A198,
ECA44A41DA8A935178C1A1F4,
89AD16514B1F4133FFEA1DF9,
EFD00925ED57B2C5EB5412FC,
10D769051F1431A67AD2CB40,
41AE56F8671DFE80720A6A18,
9641E7E4F0B5C2A1B3E8709A,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -190,6 +214,10 @@
23CD1A3F9067C3A0ECE7BB67,
F90C8B0233A54F1445343F67,
96D99A08027CA35D6A4E5CFD,
3644EF58D9EB1AB436A04E77,
2992DB69DCFB7DADDE907385,
AAF88452B7774FB605990B31,
40D006CCDB1D33FF94B6ECAE,
);
name = Frameworks;
sourceTree = "<group>";
@ -198,6 +226,7 @@
isa = PBXGroup;
children = (
112FFCB73597157E721BCDF2,
8447FC9882D85E6DAF0A4852,
6847A9B2C5E3C2ED56D8D4E7,
60F2869DC345EAF2314D6C09,
491641F7632BCC81BBA0ED85,
@ -212,6 +241,7 @@
8CE533D611CD0984AD028D73,
5A9F2000C66D24E8B01BE60B,
A9315F8368A5771EC39631CB,
C64CA4082EC267CDD63E6623,
6C198AF93E1F6E682189E2F6,
651ECE3C7BA845DDCFEE48F3,
4FE6029FF76BCE9698595DC5,
@ -224,6 +254,7 @@
isa = PBXGroup;
children = (
5965349393850F41DF76F350,
CB4C64BACC1CA4AAD6D69565,
03B0F9318FD583525AB195A9,
03A63C3CA6F24977F19C316D,
E061A1C75FA5722167FC4997,
@ -233,13 +264,17 @@
EDDA01B246C6128CAF7A2914,
4DF215D350FFE5E119CBA7E5,
3BC9753E0CD75A36DC742EE0,
640B7C54D35F5DF408327886,
6C5E26B4D28F8450435B8AE1,
F5F2EA2238973488632FC322,
C1E93FAF6C68A40A664422CD,
FCD0D758C5767944BEC29730,
3E4ED41C374261CFFD309743,
483C3A8B4FB98B54BB42CB50,
CCC8AEBCE55002F970222BAD,
A1D6D36B96B6B37C31F32829,
979F23EA9E5E76131299E886,
4306E55904378CE5A6EB48B3,
94B6C88FE30861A47CD28709,
CE38E6469D98462A2C22C915,
0AB68DBAB6B7DAEDDDD5B683,
@ -351,6 +386,7 @@
AC6F0E9A0809A184B2C2B7DE = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1340;
ORGANIZATIONNAME = "Raw Material Software Limited";
TargetAttributes = {
@ -423,6 +459,7 @@
4FBBB55F4E347757F74F1F41,
F619F3887CEC064441BB6EE6,
C2BB2B6DA237FE0CB64C7EDA,
55F120E70543228568573D4A,
F28112945CEBEA4CE8975833,
9EACEA6BE8D0ACC72C12C080,
26652AB1BB77C8A39434775F,
@ -432,13 +469,17 @@
712D81867EC698463252FA79,
611298FAC1A543BDD10D4C41,
D183F8140174ACCDDCD230A2,
98D376BD41E5359370AD42D9,
FF87532E62753EDFA3D29CAD,
2F76CA28C8C0EFC7453D0EB8,
6B5560283DEEBD6DD2D6C984,
1DBDFEDE359CFC84F8E3DE4C,
CDABEA6258EC70C65C9ACCFE,
11D7AB57EC28DB48A066F7AD,
1BA36E8CA4B9E8D3F3B57D24,
E2F44A968EC2598DAE33A997,
5CB78489F16E82144914972D,
BE3AD5595805C8B8845146EF,
BC6036F22423CA0AFF0385A7,
AEA090DAC5C747C50C7D3FA7,
CDEB6BA5341494AF51D07C72,
@ -489,7 +530,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
PRODUCT_NAME = "DemoRunner";
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
@ -515,10 +556,9 @@
"_NDEBUG=1",
"NDEBUG=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
"JUCE_PROJUCER_VERSION=0x70004",
"JUCE_PROJUCER_VERSION=0x80004",
"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",
@ -533,6 +573,7 @@
"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_opengl=1",
"JUCE_MODULE_AVAILABLE_juce_osc=1",
"JUCE_MODULE_AVAILABLE_juce_product_unlocking=1",
@ -547,9 +588,10 @@
"JUCE_STANDALONE_APPLICATION=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCE_SILENCE_XCODE_15_LINKER_WARNING=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
"JUCE_APP_VERSION=7.0.4",
"JUCE_APP_VERSION_HEX=0x70004",
"JUCE_APP_VERSION=8.0.4",
"JUCE_APP_VERSION_HEX=0x80004",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
@ -579,9 +621,9 @@
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
PRODUCT_NAME = "DemoRunner";
USE_HEADERMAP = NO;
@ -606,10 +648,9 @@
"_DEBUG=1",
"DEBUG=1",
"JUCE_CONTENT_SHARING=1",
"JUCE_DISPLAY_SPLASH_SCREEN=0",
"JUCE_USE_DARK_SPLASH_SCREEN=1",
"JUCE_PROJUCER_VERSION=0x70004",
"JUCE_PROJUCER_VERSION=0x80004",
"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",
@ -624,6 +665,7 @@
"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_opengl=1",
"JUCE_MODULE_AVAILABLE_juce_osc=1",
"JUCE_MODULE_AVAILABLE_juce_product_unlocking=1",
@ -638,9 +680,10 @@
"JUCE_STANDALONE_APPLICATION=1",
"JUCE_DEMO_RUNNER=1",
"JUCE_UNIT_TESTS=1",
"JUCE_SILENCE_XCODE_15_LINKER_WARNING=1",
"JUCER_XCODE_IPHONE_5BC26AE3=1",
"JUCE_APP_VERSION=7.0.4",
"JUCE_APP_VERSION_HEX=0x70004",
"JUCE_APP_VERSION=8.0.4",
"JUCE_APP_VERSION_HEX=0x80004",
"JucePlugin_Build_VST=0",
"JucePlugin_Build_VST3=0",
"JucePlugin_Build_AU=0",
@ -669,9 +712,9 @@
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wswitch-enum -Wsign-conversion -Wsign-compare -Wunreachable-code -Wcast-align -Wno-ignored-qualifiers -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wshadow-all -Wnullable-to-nonnull-conversion -Wmissing-prototypes -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-weak_framework Metal -weak_framework MetalKit -weak_framework UserNotifications";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
PRODUCT_NAME = "DemoRunner";
USE_HEADERMAP = NO;
@ -719,7 +762,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_NAME = "DemoRunner";
SDKROOT = iphoneos;

View file

@ -30,11 +30,11 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleShortVersionString</key>
<string>7.0.4</string>
<string>8.0.4</string>
<key>CFBundleVersion</key>
<string>7.0.4</string>
<string>8.0.4</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (c) 2020 - Raw Material Software Limited</string>
<string>Copyright (c) - Raw Material Software Limited</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>UIFileSharingEnabled</key>

View file

@ -1,82 +1,87 @@
# ==============================================================================
#
# This file is part of the JUCE library.
# Copyright (c) 2022 - Raw Material Software Limited
#
# JUCE is an open source library subject to commercial or open-source
# licensing.
#
# By using JUCE, you agree to the terms of both the JUCE 7 End-User License
# Agreement and JUCE Privacy Policy.
#
# End User License Agreement: www.juce.com/juce-7-licence
# Privacy Policy: www.juce.com/juce-privacy-policy
#
# Or: You may also use this code under the terms of the GPL v3 (see
# www.gnu.org/licenses).
#
# JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
# EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
# DISCLAIMED.
#
# ==============================================================================
juce_add_gui_app(DemoRunner
BUNDLE_ID com.juce.demorunner
ICON_BIG ${CMAKE_CURRENT_SOURCE_DIR}/Source/JUCEAppIcon.png
NEEDS_CURL TRUE
NEEDS_WEB_BROWSER TRUE
MICROPHONE_PERMISSION_ENABLED TRUE
CAMERA_PERMISSION_ENABLED TRUE
BLUETOOTH_PERMISSION_ENABLED TRUE
FILE_SHARING_ENABLED TRUE
DOCUMENT_BROWSER_ENABLED TRUE
REQUIRES_FULL_SCREEN FALSE
IPAD_SCREEN_ORIENTATIONS UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
IPHONE_SCREEN_ORIENTATIONS UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight)
juce_generate_juce_header(DemoRunner)
target_sources(DemoRunner PRIVATE
Source/Demos/DemoPIPs1.cpp
Source/Demos/DemoPIPs2.cpp
Source/Demos/JUCEDemos.cpp
Source/Main.cpp
Source/UI/DemoContentComponent.cpp
Source/UI/MainComponent.cpp)
target_compile_definitions(DemoRunner PRIVATE
PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples"
JUCE_ALLOW_STATIC_NULL_VARIABLES=0
JUCE_DEMO_RUNNER=1
JUCE_PLUGINHOST_LV2=1
JUCE_PLUGINHOST_VST3=1
JUCE_STRICT_REFCOUNTEDPOINTER=1
JUCE_UNIT_TESTS=1
JUCE_USE_CAMERA=1
JUCE_USE_CURL=1
JUCE_USE_MP3AUDIOFORMAT=1
JUCE_WEB_BROWSER=1)
target_link_libraries(DemoRunner PRIVATE
juce::juce_analytics
juce::juce_audio_utils
juce::juce_box2d
juce::juce_dsp
juce::juce_opengl
juce::juce_osc
juce::juce_product_unlocking
juce::juce_video
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)
foreach(folder IN ITEMS ../Assets ../Audio ../DSP ../GUI ../Utilities)
juce_add_bundle_resources_directory(DemoRunner ${folder})
endforeach()
# ==============================================================================
#
# This file is part of the JUCE framework examples.
# Copyright (c) Raw Material Software Limited
#
# The code included in this file is provided under the terms of the ISC license
# http://www.isc.org/downloads/software-support-policy/isc-license. Permission
# to use, copy, modify, and/or distribute this software for any purpose with or
# without fee is hereby granted provided that the above copyright notice and
# this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
# PERFORMANCE OF THIS SOFTWARE.
#
# ==============================================================================
juce_add_gui_app(DemoRunner
BUNDLE_ID com.juce.demorunner
ICON_BIG ${CMAKE_CURRENT_SOURCE_DIR}/Source/JUCEAppIcon.png
NEEDS_CURL TRUE
NEEDS_WEB_BROWSER TRUE
MICROPHONE_PERMISSION_ENABLED TRUE
CAMERA_PERMISSION_ENABLED TRUE
BLUETOOTH_PERMISSION_ENABLED TRUE
FILE_SHARING_ENABLED TRUE
DOCUMENT_BROWSER_ENABLED TRUE
REQUIRES_FULL_SCREEN FALSE
IPAD_SCREEN_ORIENTATIONS UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
IPHONE_SCREEN_ORIENTATIONS UIInterfaceOrientationPortrait
UIInterfaceOrientationPortraitUpsideDown
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight)
juce_generate_juce_header(DemoRunner)
target_sources(DemoRunner PRIVATE
Source/Demos/DemoPIPs1.cpp
Source/Demos/DemoPIPs2.cpp
Source/Demos/JUCEDemos.cpp
Source/Main.cpp
Source/UI/DemoContentComponent.cpp
Source/UI/MainComponent.cpp)
target_compile_definitions(DemoRunner PRIVATE
PIP_JUCE_EXAMPLES_DIRECTORY_STRING="${JUCE_SOURCE_DIR}/examples"
JUCE_ALLOW_STATIC_NULL_VARIABLES=0
JUCE_CONTENT_SHARING=1
JUCE_DEMO_RUNNER=1
JUCE_PLUGINHOST_LV2=1
JUCE_PLUGINHOST_VST3=1
JUCE_STRICT_REFCOUNTEDPOINTER=1
JUCE_UNIT_TESTS=1
JUCE_USE_CAMERA=1
JUCE_USE_CURL=1
JUCE_USE_MP3AUDIOFORMAT=1
JUCE_WEB_BROWSER=1
# This is a temporary workaround to allow builds to complete on Xcode 15.
# Add -Wl,-ld_classic to the OTHER_LDFLAGS build setting if you need to
# deploy to older versions of macOS/iOS.
JUCE_SILENCE_XCODE_15_LINKER_WARNING=1)
target_link_libraries(DemoRunner PRIVATE
juce::juce_analytics
juce::juce_animation
juce::juce_audio_utils
juce::juce_box2d
juce::juce_dsp
juce::juce_opengl
juce::juce_osc
juce::juce_product_unlocking
juce::juce_video
juce::juce_javascript
juce::juce_recommended_config_flags
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)
foreach(folder IN ITEMS ../Assets ../Audio ../DSP ../GUI ../Utilities)
juce_add_bundle_resources_directory(DemoRunner ${folder})
endforeach()

View file

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<JUCERPROJECT name="DemoRunner" projectType="guiapp" defines="JUCE_DEMO_RUNNER=1&#10;JUCE_UNIT_TESTS=1"
bundleIdentifier="com.rmsl.jucedemorunner" version="7.0.4" companyName="Raw Material Software Limited"
companyCopyright="Copyright (c) 2020 - Raw Material Software Limited"
bundleIdentifier="com.rmsl.jucedemorunner" version="8.0.4" companyName="Raw Material Software Limited"
companyCopyright="Copyright (c) - Raw Material Software Limited"
companyWebsite="https://www.juce.com/" companyEmail="info@juce.com"
id="yj7xMM" reportAppUsage="0" useAppConfig="0" addUsingNamespaceToJuceHeader="1"
id="yj7xMM" useAppConfig="0" addUsingNamespaceToJuceHeader="1"
jucerFormatVersion="1">
<MAINGROUP id="G8kbr7" name="DemoRunner">
<GROUP id="{20E3F84A-29E9-D5FF-4559-1A9E4A70CD60}" name="Source">
@ -34,7 +34,8 @@
<XCODE_MAC targetFolder="Builds/MacOSX" smallIcon="YyqWd2" bigIcon="YyqWd2"
customXcodeResourceFolders="../Assets&#10;../Audio &#10;../DSP &#10;../GUI &#10;../Utilities"
microphonePermissionNeeded="1" cameraPermissionNeeded="1" applicationCategory="public.app-category.developer-tools"
iosBluetoothPermissionNeeded="1">
iosBluetoothPermissionNeeded="1" extraDefs="JUCE_SILENCE_XCODE_15_LINKER_WARNING=1"
extraLinkerFlags="-Wl,-weak_reference_mismatches,weak">
<CONFIGURATIONS>
<CONFIGURATION isDebug="1" name="Debug" recommendedWarnings="LLVM"/>
<CONFIGURATION isDebug="0" name="Release" recommendedWarnings="LLVM"/>
@ -59,6 +60,8 @@
<MODULEPATH id="juce_dsp" path="../../modules"/>
<MODULEPATH id="juce_osc" path="../../modules"/>
<MODULEPATH id="juce_product_unlocking" path="../../modules"/>
<MODULEPATH id="juce_animation" path="../../modules"/>
<MODULEPATH id="juce_javascript" path="../../modules"/>
</MODULEPATHS>
</XCODE_MAC>
<LINUX_MAKE targetFolder="Builds/LinuxMakefile" smallIcon="YyqWd2" bigIcon="YyqWd2">
@ -86,6 +89,8 @@
<MODULEPATH id="juce_audio_devices" path="../../modules"/>
<MODULEPATH id="juce_audio_basics" path="../../modules"/>
<MODULEPATH id="juce_analytics" path="../../modules"/>
<MODULEPATH id="juce_animation" path="../../modules"/>
<MODULEPATH id="juce_javascript" path="../../modules"/>
</MODULEPATHS>
</LINUX_MAKE>
<ANDROIDSTUDIO targetFolder="Builds/Android" androidMinimumSDK="23" microphonePermissionNeeded="1"
@ -119,6 +124,8 @@
<MODULEPATH id="juce_audio_devices" path="../../modules"/>
<MODULEPATH id="juce_audio_basics" path="../../modules"/>
<MODULEPATH id="juce_analytics" path="../../modules"/>
<MODULEPATH id="juce_animation" path="../../modules"/>
<MODULEPATH id="juce_javascript" path="../../modules"/>
</MODULEPATHS>
</ANDROIDSTUDIO>
<XCODE_IPHONE targetFolder="Builds/iOS" UISupportsDocumentBrowser="1" microphonePermissionNeeded="1"
@ -126,7 +133,8 @@
customXcodeResourceFolders="../Assets" smallIcon="YyqWd2" bigIcon="YyqWd2"
iosBluetoothPermissionNeeded="1" iosScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
iPadScreenOrientation="UIInterfaceOrientationLandscapeLeft,UIInterfaceOrientationLandscapeRight,UIInterfaceOrientationPortrait,UIInterfaceOrientationPortraitUpsideDown"
UIRequiresFullScreen="0">
UIRequiresFullScreen="0" extraDefs="JUCE_SILENCE_XCODE_15_LINKER_WARNING=1"
extraLinkerFlags="-Wl,-weak_reference_mismatches,weak">
<CONFIGURATIONS>
<CONFIGURATION isDebug="1" name="Debug" recommendedWarnings="LLVM"/>
<CONFIGURATION isDebug="0" name="Release" recommendedWarnings="LLVM"/>
@ -151,36 +159,10 @@
<MODULEPATH id="juce_audio_devices" path="../../modules"/>
<MODULEPATH id="juce_audio_basics" path="../../modules"/>
<MODULEPATH id="juce_analytics" path="../../modules"/>
<MODULEPATH id="juce_animation" path="../../modules"/>
<MODULEPATH id="juce_javascript" path="../../modules"/>
</MODULEPATHS>
</XCODE_IPHONE>
<VS2017 targetFolder="Builds/VisualStudio2017" smallIcon="YyqWd2" bigIcon="YyqWd2"
extraCompilerFlags="/w44265 /w45038 /w44062">
<CONFIGURATIONS>
<CONFIGURATION isDebug="1" name="Debug"/>
<CONFIGURATION isDebug="0" name="Release" useRuntimeLibDLL="0"/>
</CONFIGURATIONS>
<MODULEPATHS>
<MODULEPATH id="juce_video" path="../../modules"/>
<MODULEPATH id="juce_product_unlocking" path="../../modules"/>
<MODULEPATH id="juce_osc" path="../../modules"/>
<MODULEPATH id="juce_opengl" path="../../modules"/>
<MODULEPATH id="juce_gui_extra" path="../../modules"/>
<MODULEPATH id="juce_gui_basics" path="../../modules"/>
<MODULEPATH id="juce_graphics" path="../../modules"/>
<MODULEPATH id="juce_events" path="../../modules"/>
<MODULEPATH id="juce_dsp" path="../../modules"/>
<MODULEPATH id="juce_data_structures" path="../../modules"/>
<MODULEPATH id="juce_cryptography" path="../../modules"/>
<MODULEPATH id="juce_core" path="../../modules"/>
<MODULEPATH id="juce_box2d" path="../../modules"/>
<MODULEPATH id="juce_audio_utils" path="../../modules"/>
<MODULEPATH id="juce_audio_processors" path="../../modules"/>
<MODULEPATH id="juce_audio_formats" path="../../modules"/>
<MODULEPATH id="juce_audio_devices" path="../../modules"/>
<MODULEPATH id="juce_audio_basics" path="../../modules"/>
<MODULEPATH id="juce_analytics" path="../../modules"/>
</MODULEPATHS>
</VS2017>
<VS2019 targetFolder="Builds/VisualStudio2019" smallIcon="YyqWd2" bigIcon="YyqWd2"
extraCompilerFlags="/w44265 /w45038 /w44062">
<CONFIGURATIONS>
@ -207,6 +189,8 @@
<MODULEPATH id="juce_audio_devices" path="../../modules"/>
<MODULEPATH id="juce_audio_basics" path="../../modules"/>
<MODULEPATH id="juce_analytics" path="../../modules"/>
<MODULEPATH id="juce_animation" path="../../modules"/>
<MODULEPATH id="juce_javascript" path="../../modules"/>
</MODULEPATHS>
</VS2019>
<VS2022 targetFolder="Builds/VisualStudio2022" smallIcon="YyqWd2" bigIcon="YyqWd2"
@ -235,11 +219,14 @@
<MODULEPATH id="juce_audio_devices" path="../../modules"/>
<MODULEPATH id="juce_audio_basics" path="../../modules"/>
<MODULEPATH id="juce_analytics" path="../../modules"/>
<MODULEPATH id="juce_animation" path="../../modules"/>
<MODULEPATH id="juce_javascript" path="../../modules"/>
</MODULEPATHS>
</VS2022>
</EXPORTFORMATS>
<MODULES>
<MODULE id="juce_analytics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_animation" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_audio_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_audio_devices" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_audio_formats" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
@ -254,6 +241,7 @@
<MODULE id="juce_graphics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_gui_basics" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_gui_extra" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_javascript" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_opengl" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_osc" showAllCode="1" useLocalCopy="0" useGlobalPath="0"/>
<MODULE id="juce_product_unlocking" showAllCode="1" useLocalCopy="0"

View file

@ -14,6 +14,7 @@
#include <juce_analytics/juce_analytics.h>
#include <juce_animation/juce_animation.h>
#include <juce_audio_basics/juce_audio_basics.h>
#include <juce_audio_devices/juce_audio_devices.h>
#include <juce_audio_formats/juce_audio_formats.h>
@ -28,6 +29,7 @@
#include <juce_graphics/juce_graphics.h>
#include <juce_gui_basics/juce_gui_basics.h>
#include <juce_gui_extra/juce_gui_extra.h>
#include <juce_javascript/juce_javascript.h>
#include <juce_opengl/juce_opengl.h>
#include <juce_osc/juce_osc.h>
#include <juce_product_unlocking/juce_product_unlocking.h>
@ -54,7 +56,7 @@ namespace ProjectInfo
{
const char* const projectName = "DemoRunner";
const char* const companyName = "Raw Material Software Limited";
const char* const versionString = "7.0.4";
const int versionNumber = 0x70004;
const char* const versionString = "8.0.4";
const int versionNumber = 0x80004;
}
#endif

View file

@ -5,4 +5,4 @@
*/
#include <juce_video/juce_video.mm>
#include <juce_animation/juce_animation.cpp>

View file

@ -0,0 +1,8 @@
/*
IMPORTANT! This file is auto-generated each time you save your
project - if you alter its contents, your changes may be overwritten!
*/
#include <juce_core/juce_core_CompilationTime.cpp>

View file

@ -0,0 +1,8 @@
/*
IMPORTANT! This file is auto-generated each time you save your
project - if you alter its contents, your changes may be overwritten!
*/
#include <juce_graphics/juce_graphics_Harfbuzz.cpp>

View file

@ -0,0 +1,8 @@
/*
IMPORTANT! This file is auto-generated each time you save your
project - if you alter its contents, your changes may be overwritten!
*/
#include <juce_graphics/juce_graphics_Sheenbidi.c>

View file

@ -0,0 +1,8 @@
/*
IMPORTANT! This file is auto-generated each time you save your
project - if you alter its contents, your changes may be overwritten!
*/
#include <juce_javascript/juce_javascript.cpp>

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -37,6 +35,7 @@
#include "../../../Audio/AudioRecordingDemo.h"
#include "../../../Audio/AudioSettingsDemo.h"
#include "../../../Audio/AudioSynthesiserDemo.h"
#include "../../../Audio/AudioWorkgroupDemo.h"
#include "../../../Audio/MidiDemo.h"
#include "../../../Audio/MPEDemo.h"
#include "../../../Audio/PluckedStringsDemo.h"
@ -75,6 +74,7 @@ void registerDemos_One() noexcept
REGISTER_DEMO (AudioRecordingDemo, Audio, false)
REGISTER_DEMO (AudioSettingsDemo, Audio, false)
REGISTER_DEMO (AudioSynthesiserDemo, Audio, false)
REGISTER_DEMO (AudioWorkgroupDemo, Audio, false)
REGISTER_DEMO (MidiDemo, Audio, false)
REGISTER_DEMO (MPEDemo, Audio, false)
REGISTER_DEMO (PluckedStringsDemo, Audio, false)
@ -86,9 +86,9 @@ void registerDemos_One() noexcept
REGISTER_DEMO (IIRFilterDemo, DSP, false)
REGISTER_DEMO (OscillatorDemo, DSP, false)
REGISTER_DEMO (OverdriveDemo, DSP, false)
#if JUCE_USE_SIMD
REGISTER_DEMO (SIMDRegisterDemo, DSP, false)
#endif
#if JUCE_USE_SIMD
REGISTER_DEMO (SIMDRegisterDemo, DSP, false)
#endif
REGISTER_DEMO (StateVariableFilterDemo, DSP, false)
REGISTER_DEMO (WaveShaperTanhDemo, DSP, false)

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -34,7 +32,8 @@
#include "../../../GUI/AccessibilityDemo.h"
#endif
#include "../../../GUI/AnimationAppDemo.h"
#include "../../../GUI/AnimationDemo.h"
#include "../../../GUI/AnimationEasingDemo.h"
#include "../../../GUI/AnimatorsDemo.h"
#include "../../../GUI/BouncingBallWavetableDemo.h"
#if JUCE_USE_CAMERA && ! (JUCE_LINUX || JUCE_BSD)
#include "../../../GUI/CameraDemo.h"
@ -74,7 +73,8 @@ void registerDemos_Two() noexcept
REGISTER_DEMO (AccessibilityDemo, GUI, false)
#endif
REGISTER_DEMO (AnimationAppDemo, GUI, false)
REGISTER_DEMO (AnimationDemo, GUI, false)
REGISTER_DEMO (AnimationEasingDemo, GUI, false)
REGISTER_DEMO (AnimatorsDemo, GUI, false)
REGISTER_DEMO (BouncingBallWavetableDemo, GUI, false)
#if JUCE_USE_CAMERA && ! (JUCE_LINUX || JUCE_BSD)
REGISTER_DEMO (CameraDemo, GUI, true)
@ -104,7 +104,9 @@ void registerDemos_Two() noexcept
#if ! (JUCE_LINUX || JUCE_BSD)
REGISTER_DEMO (VideoDemo, GUI, true)
#endif
#if JUCE_WEB_BROWSER
REGISTER_DEMO (WebBrowserDemo, GUI, true)
#endif
REGISTER_DEMO (WidgetsDemo, GUI, false)
REGISTER_DEMO (WindowsDemo, GUI, false)
}

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -27,7 +25,7 @@
//==============================================================================
class IntroScreen : public Component
class IntroScreen final : public Component
{
public:
IntroScreen()
@ -70,8 +68,8 @@ private:
HyperlinkButton linkButton { "www.juce.com", { "http://www.juce.com" } };
//==============================================================================
struct LogoDrawComponent : public Component,
private Timer
struct LogoDrawComponent final : public Component,
private Timer
{
LogoDrawComponent()
{

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -31,8 +29,8 @@
//==============================================================================
#if JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD
// Just add a simple icon to the Window system tray area or Mac menu bar..
struct DemoTaskbarComponent : public SystemTrayIconComponent,
private Timer
struct DemoTaskbarComponent final : public SystemTrayIconComponent,
private Timer
{
DemoTaskbarComponent()
{
@ -76,7 +74,7 @@
std::unique_ptr<AudioDeviceManager> sharedAudioDeviceManager;
//==============================================================================
class DemoRunnerApplication : public JUCEApplication
class DemoRunnerApplication final : public JUCEApplication
{
public:
//==============================================================================
@ -117,7 +115,7 @@ public:
ApplicationCommandManager& getGlobalCommandManager() { return commandManager; }
private:
class MainAppWindow : public DocumentWindow
class MainAppWindow final : public DocumentWindow
{
public:
MainAppWindow (const String& name)

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -28,7 +26,7 @@
#include "MainComponent.h"
//==============================================================================
struct DemoContent : public Component
struct DemoContent final : public Component
{
DemoContent() noexcept {}
@ -58,7 +56,7 @@ private:
//==============================================================================
#if ! (JUCE_ANDROID || JUCE_IOS)
struct CodeContent : public Component
struct CodeContent final : public Component
{
CodeContent()
{
@ -67,7 +65,7 @@ struct CodeContent : public Component
codeEditor.setReadOnly (true);
codeEditor.setScrollbarThickness (8);
lookAndFeelChanged();
updateLookAndFeel();
}
void resized() override
@ -83,9 +81,9 @@ struct CodeContent : public Component
"*******************************************************************************/\n");
}
void lookAndFeelChanged() override
void updateLookAndFeel()
{
auto* v4 = dynamic_cast <LookAndFeel_V4*> (&Desktop::getInstance().getDefaultLookAndFeel());
auto* v4 = dynamic_cast<LookAndFeel_V4*> (&Desktop::getInstance().getDefaultLookAndFeel());
if (v4 != nullptr && (v4->getCurrentColourScheme() != LookAndFeel_V4::getLightColourScheme()))
codeEditor.setColourScheme (getDarkColourScheme());
@ -93,6 +91,11 @@ struct CodeContent : public Component
codeEditor.setColourScheme (getLightColourScheme());
}
void lookAndFeelChanged() override
{
updateLookAndFeel();
}
CodeDocument document;
CPlusPlusCodeTokeniser cppTokensier;
CodeEditorComponent codeEditor { document, &cppTokensier };
@ -115,7 +118,7 @@ DemoContentComponent::DemoContentComponent (Component& mainComponent, std::funct
addTab ("Settings", Colours::transparentBlack, new SettingsContent (dynamic_cast<MainComponent&> (mainComponent)), true);
setTabBarDepth (40);
lookAndFeelChanged();
updateLookAndFeel();
}
DemoContentComponent::~DemoContentComponent()
@ -182,7 +185,7 @@ void DemoContentComponent::clearCurrentDemo()
demoChangedCallback (false);
}
void DemoContentComponent::lookAndFeelChanged()
void DemoContentComponent::updateLookAndFeel()
{
auto backgroundColour = findColour (ResizableWindow::backgroundColourId);
@ -190,6 +193,11 @@ void DemoContentComponent::lookAndFeelChanged()
setTabBackgroundColour (i, backgroundColour);
}
void DemoContentComponent::lookAndFeelChanged()
{
updateLookAndFeel();
}
String DemoContentComponent::trimPIP (const String& fileContents)
{
auto lines = StringArray::fromLines (fileContents);

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -32,7 +30,7 @@ struct DemoContent;
struct CodeContent;
//==============================================================================
class DemoContentComponent : public TabbedComponent
class DemoContentComponent final : public TabbedComponent
{
public:
DemoContentComponent (Component& mainComponent, std::function<void (bool)> demoChangedCallback);
@ -63,6 +61,7 @@ private:
int tabBarIndent = 0;
//==============================================================================
void updateLookAndFeel();
void lookAndFeelChanged() override;
String trimPIP (const String& fileContents);

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -26,7 +24,7 @@
#include "MainComponent.h"
//==============================================================================
struct SidePanelHeader : public Component
struct SidePanelHeader final : public Component
{
SidePanelHeader (MainComponent& o)
: owner (o)
@ -80,7 +78,7 @@ struct SidePanelHeader : public Component
addAndMakeVisible (settingsButton);
settingsButton.onClick = [this] { owner.settingsButtonClicked(); };
lookAndFeelChanged();
updateLookAndFeel();
}
void paint (Graphics& g) override
@ -102,7 +100,7 @@ struct SidePanelHeader : public Component
titleLabel.setBounds (bounds);
}
void lookAndFeelChanged() override
void updateLookAndFeel()
{
auto& sidePanel = owner.getSidePanel();
auto& lf = sidePanel.getLookAndFeel();
@ -117,6 +115,12 @@ struct SidePanelHeader : public Component
homeButton.setColours (normal, over, down);
settingsButton.setColours (normal, over, down);
}
void lookAndFeelChanged() override
{
updateLookAndFeel();
}
MainComponent& owner;
@ -126,8 +130,8 @@ struct SidePanelHeader : public Component
};
//==============================================================================
class DemoList : public Component,
public ListBoxModel
class DemoList final : public Component,
public ListBoxModel
{
public:
DemoList (DemoContentComponent& holder)
@ -208,7 +212,7 @@ public:
private:
//==============================================================================
class CategoryListHeaderComponent : public Button
class CategoryListHeaderComponent final : public Button
{
public:
explicit CategoryListHeaderComponent (DemoList& o)
@ -284,7 +288,7 @@ MainComponent::MainComponent()
{
#if JUCE_MAC && USE_COREGRAPHICS_RENDERING
setRenderingEngine (1);
#else
#elif ! JUCE_WINDOWS
setRenderingEngine (0);
#endif
}
@ -357,8 +361,10 @@ void MainComponent::resized()
{
auto bounds = getLocalBounds();
#if JUCE_IOS || JUCE_ANDROID
if (auto* display = Desktop::getInstance().getDisplays().getDisplayForRect (getScreenBounds()))
return display->safeAreaInsets.subtractedFrom (display->keyboardInsets.subtractedFrom (bounds));
#endif
return bounds;
}();

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -29,7 +27,7 @@
#include "DemoContentComponent.h"
//==============================================================================
class MainComponent : public Component
class MainComponent final : public Component
{
public:
//==============================================================================

View file

@ -1,24 +1,22 @@
/*
==============================================================================
This file is part of the JUCE library.
Copyright (c) 2022 - Raw Material Software Limited
This file is part of the JUCE framework examples.
Copyright (c) Raw Material Software Limited
JUCE is an open source library subject to commercial or open-source
licensing.
The code included in this file is provided under the terms of the ISC license
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
to use, copy, modify, and/or distribute this software for any purpose with or
without fee is hereby granted provided that the above copyright notice and
this permission notice appear in all copies.
By using JUCE, you agree to the terms of both the JUCE 7 End-User License
Agreement and JUCE Privacy Policy.
End User License Agreement: www.juce.com/juce-7-licence
Privacy Policy: www.juce.com/juce-privacy-policy
Or: You may also use this code under the terms of the GPL v3 (see
www.gnu.org/licenses).
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
DISCLAIMED.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
==============================================================================
*/
@ -28,7 +26,7 @@
#include "MainComponent.h"
//==============================================================================
class SettingsContent : public Component
class SettingsContent final : public Component
{
public:
SettingsContent (MainComponent& topLevelComponent)
@ -67,8 +65,8 @@ private:
static constexpr int itemHeight = 30;
static constexpr int itemSpacing = 7;
class GraphicsSettingsGroup : public Component,
private ComponentMovementWatcher
class GraphicsSettingsGroup final : public Component,
private ComponentMovementWatcher
{
public:
GraphicsSettingsGroup (MainComponent& comp)
@ -76,7 +74,7 @@ private:
mainComponent (comp)
{
addAndMakeVisible (titleLabel);
titleLabel.setFont (titleLabelFontHeight);
titleLabel.setFont (FontOptions { titleLabelFontHeight });
addLookAndFeels();
@ -179,14 +177,14 @@ private:
OwnedArray<LookAndFeel> lookAndFeels;
};
class AudioSettingsGroup : public Component
class AudioSettingsGroup final : public Component
{
public:
AudioSettingsGroup()
: deviceSelectorComp (getSharedAudioDeviceManager(), 0, 256, 0, 256, true, true, true, false)
{
addAndMakeVisible (titleLabel);
titleLabel.setFont (titleLabelFontHeight);
titleLabel.setFont (FontOptions { titleLabelFontHeight });
addAndMakeVisible (deviceSelectorComp);
deviceSelectorComp.setItemHeight (itemHeight);
@ -211,7 +209,7 @@ private:
};
//==============================================================================
class InnerContent : public Component
class InnerContent final : public Component
{
public:
InnerContent (MainComponent& mainComponent)
@ -236,12 +234,12 @@ private:
audioSettings.setBounds (bounds);
}
private:
std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override
{
return createIgnoredAccessibilityHandler (*this);
}
private:
GraphicsSettingsGroup graphicsSettings;
AudioSettingsGroup audioSettings;
};

Some files were not shown because too many files have changed in this diff Show more