From: IOhannes m zmölnig (Debian/GNU) Date: Wed, 11 Jan 2023 14:37:58 +0000 (+0100) Subject: New upstream version 7.0.4+ds X-Git-Tag: archive/raspbian/7.0.4+ds-2+rpi1^2~17^2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=62ac20fc29aa586e755eff4bc8cdb1524e2cdaaf;p=juce.git New upstream version 7.0.4+ds --- diff --git a/BREAKING-CHANGES.txt b/BREAKING-CHANGES.txt index 5d8cb457..973f3e07 100644 --- a/BREAKING-CHANGES.txt +++ b/BREAKING-CHANGES.txt @@ -1,7 +1,7 @@ JUCE breaking changes ===================== -Version 7.0.2 +Version 7.0.3 ============= Change diff --git a/CMakeLists.txt b/CMakeLists.txt index b10f454e..cb7252c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ cmake_minimum_required(VERSION 3.15) -project(JUCE VERSION 7.0.3 LANGUAGES C CXX) +project(JUCE VERSION 7.0.4 LANGUAGES C CXX) include(CMakeDependentOption) diff --git a/ChangeList.txt b/ChangeList.txt index de903b0d..ca5cc3c9 100644 --- a/ChangeList.txt +++ b/ChangeList.txt @@ -3,12 +3,19 @@ This file just lists the more notable headline features. For more detailed info about changes and bugfixes please see the git log and BREAKING-CHANGES.txt. +Version 7.0.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 - Added a unique machine ID - Added new threading classes - Improved the performance of multiple OpenGL contexts - Refactored AudioProcessorGraph - - Improved AudioDeviceManager sample rate handling + - Improved AudioDeviceManager sample rate handling - Fixed Studio One drawing performance - Updated the FLAC library diff --git a/docs/doxygen/process_source_files.py b/docs/doxygen/process_source_files.py index c38135da..85ec8ee2 100644 --- a/docs/doxygen/process_source_files.py +++ b/docs/doxygen/process_source_files.py @@ -87,7 +87,7 @@ if __name__ == "__main__": juce_modules = args.subdirs.split(",") else: juce_modules = [] - for item in os.listdir(args.source_dir): + for item in sorted(os.listdir(args.source_dir)): if os.path.isdir(os.path.join(args.source_dir, item)): juce_modules.append(item) @@ -136,7 +136,7 @@ if __name__ == "__main__": # Create a list of the directories in the module that we can use as # subgroups and create the Doxygen group hierarchy string. - dir_contents = os.listdir(module_path) + dir_contents = sorted(os.listdir(module_path)) # Ignore "native" folders as these are excluded by doxygen. try: dir_contents.remove("native") diff --git a/examples/Assets/DSPDemos_Common.h b/examples/Assets/DSPDemos_Common.h index 49ccc278..9fa1d5c3 100644 --- a/examples/Assets/DSPDemos_Common.h +++ b/examples/Assets/DSPDemos_Common.h @@ -25,7 +25,7 @@ using namespace dsp; struct DSPDemoParameterBase : public ChangeBroadcaster { DSPDemoParameterBase (const String& labelName) : name (labelName) {} - virtual ~DSPDemoParameterBase() {} + virtual ~DSPDemoParameterBase() = default; virtual Component* getComponent() = 0; @@ -142,7 +142,7 @@ public: loadURL (u); } - URL getCurrentURL() { return currentURL; } + URL getCurrentURL() const { return currentURL; } void setTransportSource (AudioTransportSource* newSource) { @@ -189,21 +189,7 @@ private: currentURL = u; - InputSource* inputSource = nullptr; - - #if ! JUCE_IOS - if (u.isLocalFile()) - { - inputSource = new FileInputSource (u.getLocalFile()); - } - else - #endif - { - if (inputSource == nullptr) - inputSource = new URLInputSource (u); - } - - thumbnail.setSource (inputSource); + thumbnail.setSource (makeInputSource (u).release()); if (notify) sendChangeMessage(); @@ -407,33 +393,27 @@ public: transportSource.reset(); readerSource.reset(); - AudioFormatReader* newReader = nullptr; + auto source = makeInputSource (fileToPlay); - #if ! JUCE_IOS - if (fileToPlay.isLocalFile()) - { - newReader = formatManager.createReaderFor (fileToPlay.getLocalFile()); - } - else - #endif - { - if (newReader == nullptr) - newReader = formatManager.createReaderFor (fileToPlay.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress))); - } + if (source == nullptr) + return false; - reader.reset (newReader); + auto stream = rawToUniquePtr (source->createInputStream()); - if (reader.get() != nullptr) - { - readerSource.reset (new AudioFormatReaderSource (reader.get(), false)); - readerSource->setLooping (loopState.getValue()); + if (stream == nullptr) + return false; - init(); + reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream))); - return true; - } + if (reader == nullptr) + return false; + + readerSource.reset (new AudioFormatReaderSource (reader.get(), false)); + readerSource->setLooping (loopState.getValue()); + + init(); - return false; + return true; } void togglePlay() @@ -613,7 +593,7 @@ private: { if (fc.getURLResults().size() > 0) { - auto u = fc.getURLResult(); + const auto u = fc.getURLResult(); if (! audioFileReader.loadURL (u)) NativeMessageBox::showAsync (MessageBoxOptions() diff --git a/examples/Assets/DemoUtilities.h b/examples/Assets/DemoUtilities.h index bfc1c5d2..ffdfc363 100644 --- a/examples/Assets/DemoUtilities.h +++ b/examples/Assets/DemoUtilities.h @@ -242,4 +242,19 @@ struct SlowerBouncingNumber : public BouncingNumber } }; +inline std::unique_ptr makeInputSource (const URL& url) +{ + #if JUCE_ANDROID + if (auto doc = AndroidDocument::fromDocument (url)) + return std::make_unique (doc); + #endif + + #if ! JUCE_IOS + if (url.isLocalFile()) + return std::make_unique (url.getLocalFile()); + #endif + + return std::make_unique (url); +} + #endif // PIP_DEMO_UTILITIES_INCLUDED diff --git a/examples/Audio/AudioPlaybackDemo.h b/examples/Audio/AudioPlaybackDemo.h index 54cbbcc4..6d317f44 100644 --- a/examples/Audio/AudioPlaybackDemo.h +++ b/examples/Audio/AudioPlaybackDemo.h @@ -48,22 +48,6 @@ #include "../Assets/DemoUtilities.h" -inline std::unique_ptr makeInputSource (const URL& url) -{ - #if JUCE_ANDROID - if (auto doc = AndroidDocument::fromDocument (url)) - return std::make_unique (doc); - #endif - - #if ! JUCE_IOS - if (url.isLocalFile()) - return std::make_unique (url.getLocalFile()); - #endif - - return std::make_unique (url); -} - -//============================================================================== class DemoThumbnailComp : public Component, public ChangeListener, public FileDragAndDropTarget, diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index 8f539503..24bafafc 100644 --- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt +++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt @@ -14,7 +14,7 @@ add_subdirectory (${OBOE_DIR} ./oboe) add_library("cpufeatures" STATIC "${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c") set_source_files_properties("${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c" PROPERTIES COMPILE_FLAGS "-Wno-sign-conversion -Wno-gnu-statement-expression") -add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.3]] [[-DJUCE_APP_VERSION_HEX=0x70003]]) +add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.4]] [[-DJUCE_APP_VERSION_HEX=0x70004]]) include_directories( AFTER "../../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src" @@ -34,9 +34,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.3]] [[-DJUCE_APP_VERSION_HEX=0x70003]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-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_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.4]] [[-DJUCE_APP_VERSION_HEX=0x70004]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.3]] [[-DJUCE_APP_VERSION_HEX=0x70003]] [[-DNDEBUG=1]]) + add_definitions([[-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_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=7.0.4]] [[-DJUCE_APP_VERSION_HEX=0x70004]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -66,6 +66,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" "../../../../../modules/juce_analytics/juce_analytics.cpp" "../../../../../modules/juce_analytics/juce_analytics.h" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -84,6 +85,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -140,6 +142,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -783,6 +786,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -1205,6 +1209,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -1744,6 +1749,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -1894,6 +1900,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" @@ -2041,6 +2048,7 @@ set_source_files_properties( "../../../../../modules/juce_analytics/destinations/juce_ThreadedAnalyticsDestination.h" "../../../../../modules/juce_analytics/juce_analytics.cpp" "../../../../../modules/juce_analytics/juce_analytics.h" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -2059,6 +2067,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -2115,6 +2124,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -2758,6 +2768,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -3180,6 +3191,7 @@ set_source_files_properties( "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -3719,6 +3731,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -3869,6 +3882,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" diff --git a/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml b/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml index 359f6b00..4ce8fe70 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml +++ b/examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml @@ -1,21 +1,27 @@ - + - + + + + - - + + + + + - diff --git a/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h b/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h index 49ccc278..9fa1d5c3 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h +++ b/examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h @@ -25,7 +25,7 @@ using namespace dsp; struct DSPDemoParameterBase : public ChangeBroadcaster { DSPDemoParameterBase (const String& labelName) : name (labelName) {} - virtual ~DSPDemoParameterBase() {} + virtual ~DSPDemoParameterBase() = default; virtual Component* getComponent() = 0; @@ -142,7 +142,7 @@ public: loadURL (u); } - URL getCurrentURL() { return currentURL; } + URL getCurrentURL() const { return currentURL; } void setTransportSource (AudioTransportSource* newSource) { @@ -189,21 +189,7 @@ private: currentURL = u; - InputSource* inputSource = nullptr; - - #if ! JUCE_IOS - if (u.isLocalFile()) - { - inputSource = new FileInputSource (u.getLocalFile()); - } - else - #endif - { - if (inputSource == nullptr) - inputSource = new URLInputSource (u); - } - - thumbnail.setSource (inputSource); + thumbnail.setSource (makeInputSource (u).release()); if (notify) sendChangeMessage(); @@ -407,33 +393,27 @@ public: transportSource.reset(); readerSource.reset(); - AudioFormatReader* newReader = nullptr; + auto source = makeInputSource (fileToPlay); - #if ! JUCE_IOS - if (fileToPlay.isLocalFile()) - { - newReader = formatManager.createReaderFor (fileToPlay.getLocalFile()); - } - else - #endif - { - if (newReader == nullptr) - newReader = formatManager.createReaderFor (fileToPlay.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress))); - } + if (source == nullptr) + return false; - reader.reset (newReader); + auto stream = rawToUniquePtr (source->createInputStream()); - if (reader.get() != nullptr) - { - readerSource.reset (new AudioFormatReaderSource (reader.get(), false)); - readerSource->setLooping (loopState.getValue()); + if (stream == nullptr) + return false; - init(); + reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream))); - return true; - } + if (reader == nullptr) + return false; + + readerSource.reset (new AudioFormatReaderSource (reader.get(), false)); + readerSource->setLooping (loopState.getValue()); + + init(); - return false; + return true; } void togglePlay() @@ -613,7 +593,7 @@ private: { if (fc.getURLResults().size() > 0) { - auto u = fc.getURLResult(); + const auto u = fc.getURLResult(); if (! audioFileReader.loadURL (u)) NativeMessageBox::showAsync (MessageBoxOptions() diff --git a/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h b/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h index bfc1c5d2..ffdfc363 100644 --- a/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h +++ b/examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h @@ -242,4 +242,19 @@ struct SlowerBouncingNumber : public BouncingNumber } }; +inline std::unique_ptr makeInputSource (const URL& url) +{ + #if JUCE_ANDROID + if (auto doc = AndroidDocument::fromDocument (url)) + return std::make_unique (doc); + #endif + + #if ! JUCE_IOS + if (url.isLocalFile()) + return std::make_unique (url.getLocalFile()); + #endif + + return std::make_unique (url); +} + #endif // PIP_DEMO_UTILITIES_INCLUDED diff --git a/examples/DemoRunner/Builds/LinuxMakefile/Makefile b/examples/DemoRunner/Builds/LinuxMakefile/Makefile index e9567f81..1ca83fed 100644 --- a/examples/DemoRunner/Builds/LinuxMakefile/Makefile +++ b/examples/DemoRunner/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ 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=0x70003" "-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.3" "-DJUCE_APP_VERSION_HEX=0x70003" $(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_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_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := DemoRunner @@ -60,7 +60,7 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := endif - JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70003" "-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.3" "-DJUCE_APP_VERSION_HEX=0x70003" $(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_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_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 diff --git a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj index 470a7d82..dc8dee81 100644 --- a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj @@ -509,7 +509,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -540,8 +540,8 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=7.0.3", - "JUCE_APP_VERSION_HEX=0x70003", + "JUCE_APP_VERSION=7.0.4", + "JUCE_APP_VERSION_HEX=0x70004", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", @@ -600,7 +600,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -631,8 +631,8 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=7.0.3", - "JUCE_APP_VERSION_HEX=0x70003", + "JUCE_APP_VERSION=7.0.4", + "JUCE_APP_VERSION_HEX=0x70004", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", diff --git a/examples/DemoRunner/Builds/MacOSX/Info-App.plist b/examples/DemoRunner/Builds/MacOSX/Info-App.plist index 4fd55db1..220f811d 100644 --- a/examples/DemoRunner/Builds/MacOSX/Info-App.plist +++ b/examples/DemoRunner/Builds/MacOSX/Info-App.plist @@ -24,9 +24,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 7.0.3 + 7.0.4 CFBundleVersion - 7.0.3 + 7.0.4 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj index 13aa9ac3..fec6624d 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -161,6 +161,9 @@ true + + true + true @@ -176,6 +179,9 @@ true + + true + true @@ -248,6 +254,9 @@ true + + true + true @@ -989,6 +998,9 @@ true + + true + true @@ -1544,6 +1556,9 @@ true + + true + true @@ -2510,6 +2525,9 @@ true + + true + true @@ -3596,6 +3614,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters index 08bf3a8e..57a30d71 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters @@ -721,6 +721,9 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -736,6 +739,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -808,6 +814,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1564,6 +1573,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -2158,6 +2170,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -3184,6 +3199,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -6180,6 +6198,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/examples/DemoRunner/Builds/VisualStudio2017/resources.rc b/examples/DemoRunner/Builds/VisualStudio2017/resources.rc index c612927c..c2627af5 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2017/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,3,0 +FILEVERSION 7,0,4,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ 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.3\0" + VALUE "FileVersion", "7.0.4\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "7.0.3\0" + VALUE "ProductVersion", "7.0.4\0" END END diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj index c52380d1..4b4a13b1 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -161,6 +161,9 @@ true + + true + true @@ -176,6 +179,9 @@ true + + true + true @@ -248,6 +254,9 @@ true + + true + true @@ -989,6 +998,9 @@ true + + true + true @@ -1544,6 +1556,9 @@ true + + true + true @@ -2510,6 +2525,9 @@ true + + true + true @@ -3596,6 +3614,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index 4f1ee801..c91a76b8 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -721,6 +721,9 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -736,6 +739,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -808,6 +814,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1564,6 +1573,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -2158,6 +2170,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -3184,6 +3199,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -6180,6 +6198,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/examples/DemoRunner/Builds/VisualStudio2019/resources.rc b/examples/DemoRunner/Builds/VisualStudio2019/resources.rc index c612927c..c2627af5 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2019/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,3,0 +FILEVERSION 7,0,4,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ 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.3\0" + VALUE "FileVersion", "7.0.4\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "7.0.3\0" + VALUE "ProductVersion", "7.0.4\0" END END diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj index 863f6283..b3086658 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\DemoRunner.exe @@ -161,6 +161,9 @@ true + + true + true @@ -176,6 +179,9 @@ true + + true + true @@ -248,6 +254,9 @@ true + + true + true @@ -989,6 +998,9 @@ true + + true + true @@ -1544,6 +1556,9 @@ true + + true + true @@ -2510,6 +2525,9 @@ true + + true + true @@ -3596,6 +3614,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters index 03330a3d..c430519c 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters @@ -721,6 +721,9 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -736,6 +739,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -808,6 +814,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1564,6 +1573,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -2158,6 +2170,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -3184,6 +3199,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -6180,6 +6198,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/examples/DemoRunner/Builds/VisualStudio2022/resources.rc b/examples/DemoRunner/Builds/VisualStudio2022/resources.rc index c612927c..c2627af5 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/resources.rc +++ b/examples/DemoRunner/Builds/VisualStudio2022/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,3,0 +FILEVERSION 7,0,4,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ 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.3\0" + VALUE "FileVersion", "7.0.4\0" VALUE "ProductName", "DemoRunner\0" - VALUE "ProductVersion", "7.0.3\0" + VALUE "ProductVersion", "7.0.4\0" END END diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj index e730f99c..21513e1a 100644 --- a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj +++ b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj @@ -517,7 +517,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -548,8 +548,8 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_IPHONE_5BC26AE3=1", - "JUCE_APP_VERSION=7.0.3", - "JUCE_APP_VERSION_HEX=0x70003", + "JUCE_APP_VERSION=7.0.4", + "JUCE_APP_VERSION_HEX=0x70004", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", @@ -608,7 +608,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -639,8 +639,8 @@ "JUCE_DEMO_RUNNER=1", "JUCE_UNIT_TESTS=1", "JUCER_XCODE_IPHONE_5BC26AE3=1", - "JUCE_APP_VERSION=7.0.3", - "JUCE_APP_VERSION_HEX=0x70003", + "JUCE_APP_VERSION=7.0.4", + "JUCE_APP_VERSION_HEX=0x70004", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", diff --git a/examples/DemoRunner/Builds/iOS/Info-App.plist b/examples/DemoRunner/Builds/iOS/Info-App.plist index 7f7a3e28..b53338e0 100644 --- a/examples/DemoRunner/Builds/iOS/Info-App.plist +++ b/examples/DemoRunner/Builds/iOS/Info-App.plist @@ -30,9 +30,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 7.0.3 + 7.0.4 CFBundleVersion - 7.0.3 + 7.0.4 NSHumanReadableCopyright Copyright (c) 2020 - Raw Material Software Limited NSHighResolutionCapable diff --git a/examples/DemoRunner/DemoRunner.jucer b/examples/DemoRunner/DemoRunner.jucer index 3345ee05..63a94a5f 100644 --- a/examples/DemoRunner/DemoRunner.jucer +++ b/examples/DemoRunner/DemoRunner.jucer @@ -1,7 +1,7 @@ + androidExternalWriteNeeded="1" androidEnableContentSharing="1" + androidExtraAssetsFolder="../Assets" smallIcon="YyqWd2" bigIcon="YyqWd2" + cameraPermissionNeeded="1" androidReadMediaAudioPermission="1" + androidReadMediaImagesPermission="1" androidReadMediaVideoPermission="1" + androidBluetoothScanNeeded="1" androidBluetoothAdvertiseNeeded="1" + androidBluetoothConnectNeeded="1"> diff --git a/examples/DemoRunner/JuceLibraryCode/JuceHeader.h b/examples/DemoRunner/JuceLibraryCode/JuceHeader.h index 678a2081..b771efe1 100644 --- a/examples/DemoRunner/JuceLibraryCode/JuceHeader.h +++ b/examples/DemoRunner/JuceLibraryCode/JuceHeader.h @@ -54,7 +54,7 @@ namespace ProjectInfo { const char* const projectName = "DemoRunner"; const char* const companyName = "Raw Material Software Limited"; - const char* const versionString = "7.0.3"; - const int versionNumber = 0x70003; + const char* const versionString = "7.0.4"; + const int versionNumber = 0x70004; } #endif diff --git a/examples/GUI/OpenGLAppDemo.h b/examples/GUI/OpenGLAppDemo.h index ee5cbd65..2fbcc8b1 100644 --- a/examples/GUI/OpenGLAppDemo.h +++ b/examples/GUI/OpenGLAppDemo.h @@ -205,7 +205,7 @@ public: attributes.reset(); uniforms .reset(); - shader.reset (newShader.release()); + shader = std::move (newShader); shader->use(); shape .reset (new Shape()); diff --git a/examples/Plugins/ARAPluginDemo.h b/examples/Plugins/ARAPluginDemo.h index 89f7d1bd..17befd7b 100644 --- a/examples/Plugins/ARAPluginDemo.h +++ b/examples/Plugins/ARAPluginDemo.h @@ -117,6 +117,18 @@ private: SpinLock processingFlag; }; +static void crossfade (const float* sourceA, + const float* sourceB, + float aProportionAtStart, + float aProportionAtFinish, + float* destinationBuffer, + int numSamples) +{ + AudioBuffer destination { &destinationBuffer, 1, numSamples }; + destination.copyFromWithRamp (0, 0, sourceA, numSamples, aProportionAtStart, aProportionAtFinish); + destination.addFromWithRamp (0, 0, sourceB, numSamples, 1.0f - aProportionAtStart, 1.0f - aProportionAtFinish); +} + class Looper { public: @@ -138,28 +150,60 @@ public: } const auto numChannelsToCopy = std::min (inputBuffer->getNumChannels(), buffer.getNumChannels()); + const auto actualCrossfadeLengthSamples = std::min (loopRange.getLength() / 2, (int64) desiredCrossfadeLengthSamples); for (auto samplesCopied = 0; samplesCopied < buffer.getNumSamples();) { - const auto numSamplesToCopy = - std::min (buffer.getNumSamples() - samplesCopied, (int) (loopRange.getEnd() - pos)); + const auto [needsCrossfade, samplePosOfNextCrossfadeTransition] = [&]() -> std::pair + { + if (const auto endOfFadeIn = loopRange.getStart() + actualCrossfadeLengthSamples; pos < endOfFadeIn) + return { true, endOfFadeIn }; + + return { false, loopRange.getEnd() - actualCrossfadeLengthSamples }; + }(); + + const auto samplesToNextCrossfadeTransition = samplePosOfNextCrossfadeTransition - pos; + const auto numSamplesToCopy = std::min (buffer.getNumSamples() - samplesCopied, + (int) samplesToNextCrossfadeTransition); + + const auto getFadeInGainAtPos = [this, actualCrossfadeLengthSamples] (auto p) + { + return jmap ((float) p, (float) loopRange.getStart(), (float) loopRange.getStart() + (float) actualCrossfadeLengthSamples - 1.0f, 0.0f, 1.0f); + }; for (int i = 0; i < numChannelsToCopy; ++i) { - buffer.copyFrom (i, samplesCopied, *inputBuffer, i, (int) pos, numSamplesToCopy); + if (needsCrossfade) + { + const auto overlapStart = loopRange.getEnd() - actualCrossfadeLengthSamples + + (pos - loopRange.getStart()); + + crossfade (inputBuffer->getReadPointer (i, (int) pos), + inputBuffer->getReadPointer (i, (int) overlapStart), + getFadeInGainAtPos (pos), + getFadeInGainAtPos (pos + numSamplesToCopy), + buffer.getWritePointer (i, samplesCopied), + numSamplesToCopy); + } + else + { + buffer.copyFrom (i, samplesCopied, *inputBuffer, i, (int) pos, numSamplesToCopy); + } } samplesCopied += numSamplesToCopy; pos += numSamplesToCopy; - jassert (pos <= loopRange.getEnd()); + jassert (pos <= loopRange.getEnd() - actualCrossfadeLengthSamples); - if (pos == loopRange.getEnd()) + if (pos == loopRange.getEnd() - actualCrossfadeLengthSamples) pos = loopRange.getStart(); } } private: + static constexpr int desiredCrossfadeLengthSamples = 50; + const AudioBuffer* inputBuffer; Range loopRange; int64 pos; @@ -510,8 +554,21 @@ public: if (! locked) return true; + const auto fadeOutIfNecessary = [this, &buffer] + { + if (std::exchange (wasPreviewing, false)) + { + previewLooper.writeInto (buffer); + const auto fadeOutStart = std::max (0, buffer.getNumSamples() - 50); + buffer.applyGainRamp (fadeOutStart, buffer.getNumSamples() - fadeOutStart, 1.0f, 0.0f); + } + }; + if (positionInfo.getIsPlaying()) + { + fadeOutIfNecessary(); return true; + } if (const auto previewedRegion = previewState->previewedRegion.load()) { @@ -565,9 +622,19 @@ public: else { previewLooper.writeInto (buffer); + + if (! std::exchange (wasPreviewing, true)) + { + const auto fadeInLength = std::min (50, buffer.getNumSamples()); + buffer.applyGainRamp (0, fadeInLength, 0.0f, 1.0f); + } } } } + else + { + fadeOutIfNecessary(); + } return true; }); @@ -599,6 +666,7 @@ private: double lastPreviewTime = 0.0; ARAPlaybackRegion* lastPlaybackRegion = nullptr; bool lastPreviewDimmed = false; + bool wasPreviewing = false; std::unique_ptr> previewBuffer; Looper previewLooper; @@ -1624,7 +1692,7 @@ private: const auto end = chordsReader.end(); auto it = begin; - while (it->position <= quarterPosition && it != end) + while (it != end && it->position <= quarterPosition) ++it; if (it != begin) @@ -1930,9 +1998,10 @@ public: selectMusicalContext (musicalContext); } - void willDestroyMusicalContext (ARAMusicalContext*) override + void willDestroyMusicalContext (ARAMusicalContext* musicalContext) override { - selectMusicalContext (nullptr); + if (selectedMusicalContext == musicalContext) + selectMusicalContext (nullptr); } void didReorderRegionSequencesInDocument (ARADocument*) override @@ -1980,9 +2049,6 @@ public: if (newSelectedMusicalContext != selectedMusicalContext) selectMusicalContext (newSelectedMusicalContext); - // If no context is used yet and the selection does not yield a new one, the DocumentView - // uses the first musical context in the document. - if (const auto timeRange = viewSelection.getTimeRange()) overlay.setSelectedTimeRange (*timeRange); else diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt index e44d4969..beca6d5f 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt @@ -25,9 +25,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70004]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70004]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -38,6 +38,7 @@ add_library( ${BINARY_NAME} "../../../Source/Main.cpp" "../../../Source/MainComponent.h" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -56,6 +57,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -112,6 +114,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -755,6 +758,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -1066,6 +1070,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -1521,6 +1526,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -1671,6 +1677,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" @@ -1711,6 +1718,7 @@ add_library( ${BINARY_NAME} set_source_files_properties( "../../../Source/MainComponent.h" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -1729,6 +1737,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -1785,6 +1794,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -2428,6 +2438,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -2739,6 +2750,7 @@ set_source_files_properties( "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -3194,6 +3206,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -3344,6 +3357,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" diff --git a/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml b/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml index e11b635d..7ab456a9 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml +++ b/extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml @@ -4,15 +4,14 @@ - - - - - + + + + - diff --git a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile index d6737d55..f3c3b918 100644 --- a/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile +++ b/extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(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_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPerformanceTest @@ -60,7 +60,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPerformanceTest diff --git a/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj b/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj index f8e50a10..add82c40 100644 --- a/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj +++ b/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj @@ -328,7 +328,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -390,7 +390,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj index 052ce4cf..431e244e 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPerformanceTest.exe @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPerformanceTest.exe @@ -142,6 +142,9 @@ + + true + true @@ -157,6 +160,9 @@ true + + true + true @@ -229,6 +235,9 @@ true + + true + true @@ -970,6 +979,9 @@ true + + true + true @@ -1363,6 +1375,9 @@ true + + true + true @@ -2221,6 +2236,9 @@ true + + true + true @@ -3095,6 +3113,7 @@ + diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters index 5fec3578..81bc0c6d 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters @@ -571,6 +571,9 @@ AudioPerformanceTest\Source + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -586,6 +589,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -658,6 +664,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1414,6 +1423,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1843,6 +1855,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2758,6 +2773,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5295,6 +5313,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj index 3366c6d0..bdcd7ccd 100644 --- a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj +++ b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj @@ -345,7 +345,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -406,7 +406,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/extras/AudioPerformanceTest/Source/Main.cpp b/extras/AudioPerformanceTest/Source/Main.cpp index 292f9efe..c893b151 100644 --- a/extras/AudioPerformanceTest/Source/Main.cpp +++ b/extras/AudioPerformanceTest/Source/Main.cpp @@ -62,7 +62,7 @@ public: : DocumentWindow (name, Colours::lightgrey, DocumentWindow::allButtons) { setUsingNativeTitleBar (true); - setContentOwned (createMainContentComponent(), true); + setContentOwned (new MainContentComponent(), true); setResizable (false, false); #if JUCE_IOS || JUCE_ANDROID diff --git a/extras/AudioPerformanceTest/Source/MainComponent.h b/extras/AudioPerformanceTest/Source/MainComponent.h index 8785b1cd..28dbcdbf 100644 --- a/extras/AudioPerformanceTest/Source/MainComponent.h +++ b/extras/AudioPerformanceTest/Source/MainComponent.h @@ -271,7 +271,3 @@ private: //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; - - -// (This function is called by the app startup code to create our main component) -Component* createMainContentComponent() { return new MainContentComponent(); } diff --git a/extras/AudioPluginHost/AudioPluginHost.jucer b/extras/AudioPluginHost/AudioPluginHost.jucer index 5e1d2c72..5e56f67f 100644 --- a/extras/AudioPluginHost/AudioPluginHost.jucer +++ b/extras/AudioPluginHost/AudioPluginHost.jucer @@ -150,8 +150,9 @@ + microphonePermissionNeeded="1" smallIcon="c97aUr" bigIcon="c97aUr" + androidExtraAssetsFolder="../../examples/Assets" androidBluetoothScanNeeded="1" + androidBluetoothAdvertiseNeeded="1" androidBluetoothConnectNeeded="1"> diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt index 34879e65..ab1f8da5 100644 --- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt @@ -34,9 +34,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70004]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70004]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_PLUGINHOST_LV2=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) if(NOT (ANDROID_ABI STREQUAL "mips" OR ANDROID_ABI STREQUAL "mips64")) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto") @@ -71,6 +71,7 @@ add_library( ${BINARY_NAME} "../../../../../examples/Assets/proaudio.path" "../../../../../examples/Assets/reverb_ir.wav" "../../../../../examples/Assets/singing.ogg" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -89,6 +90,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -145,6 +147,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -788,6 +791,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -1114,6 +1118,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -1653,6 +1658,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -1803,6 +1809,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" @@ -1899,6 +1906,7 @@ set_source_files_properties( "../../../../../examples/Assets/proaudio.path" "../../../../../examples/Assets/reverb_ir.wav" "../../../../../examples/Assets/singing.ogg" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -1917,6 +1925,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -1973,6 +1982,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -2616,6 +2626,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -2942,6 +2953,7 @@ set_source_files_properties( "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -3481,6 +3493,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -3631,6 +3644,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml b/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml index e623d1a8..ed0fcf1b 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml @@ -4,17 +4,23 @@ - + + + + - - + + + + + - diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h index 49ccc278..9fa1d5c3 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h @@ -25,7 +25,7 @@ using namespace dsp; struct DSPDemoParameterBase : public ChangeBroadcaster { DSPDemoParameterBase (const String& labelName) : name (labelName) {} - virtual ~DSPDemoParameterBase() {} + virtual ~DSPDemoParameterBase() = default; virtual Component* getComponent() = 0; @@ -142,7 +142,7 @@ public: loadURL (u); } - URL getCurrentURL() { return currentURL; } + URL getCurrentURL() const { return currentURL; } void setTransportSource (AudioTransportSource* newSource) { @@ -189,21 +189,7 @@ private: currentURL = u; - InputSource* inputSource = nullptr; - - #if ! JUCE_IOS - if (u.isLocalFile()) - { - inputSource = new FileInputSource (u.getLocalFile()); - } - else - #endif - { - if (inputSource == nullptr) - inputSource = new URLInputSource (u); - } - - thumbnail.setSource (inputSource); + thumbnail.setSource (makeInputSource (u).release()); if (notify) sendChangeMessage(); @@ -407,33 +393,27 @@ public: transportSource.reset(); readerSource.reset(); - AudioFormatReader* newReader = nullptr; + auto source = makeInputSource (fileToPlay); - #if ! JUCE_IOS - if (fileToPlay.isLocalFile()) - { - newReader = formatManager.createReaderFor (fileToPlay.getLocalFile()); - } - else - #endif - { - if (newReader == nullptr) - newReader = formatManager.createReaderFor (fileToPlay.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress))); - } + if (source == nullptr) + return false; - reader.reset (newReader); + auto stream = rawToUniquePtr (source->createInputStream()); - if (reader.get() != nullptr) - { - readerSource.reset (new AudioFormatReaderSource (reader.get(), false)); - readerSource->setLooping (loopState.getValue()); + if (stream == nullptr) + return false; - init(); + reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream))); - return true; - } + if (reader == nullptr) + return false; + + readerSource.reset (new AudioFormatReaderSource (reader.get(), false)); + readerSource->setLooping (loopState.getValue()); + + init(); - return false; + return true; } void togglePlay() @@ -613,7 +593,7 @@ private: { if (fc.getURLResults().size() > 0) { - auto u = fc.getURLResult(); + const auto u = fc.getURLResult(); if (! audioFileReader.loadURL (u)) NativeMessageBox::showAsync (MessageBoxOptions() diff --git a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h index bfc1c5d2..ffdfc363 100644 --- a/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h +++ b/extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h @@ -242,4 +242,19 @@ struct SlowerBouncingNumber : public BouncingNumber } }; +inline std::unique_ptr makeInputSource (const URL& url) +{ + #if JUCE_ANDROID + if (auto doc = AndroidDocument::fromDocument (url)) + return std::make_unique (doc); + #endif + + #if ! JUCE_IOS + if (url.isLocalFile()) + return std::make_unique (url.getLocalFile()); + #endif + + return std::make_unique (url); +} + #endif // PIP_DEMO_UTILITIES_INCLUDED diff --git a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile index 0231f77b..62bd9658 100644 --- a/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile +++ b/extras/AudioPluginHost/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(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_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPluginHost @@ -60,7 +60,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := AudioPluginHost diff --git a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj index df72b0ff..a69b047b 100644 --- a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj @@ -442,7 +442,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -580,7 +580,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj index 363bf73b..cfdb7b07 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -150,6 +150,9 @@ + + true + true @@ -165,6 +168,9 @@ true + + true + true @@ -237,6 +243,9 @@ true + + true + true @@ -978,6 +987,9 @@ true + + true + true @@ -1392,6 +1404,9 @@ true + + true + true @@ -2358,6 +2373,9 @@ true + + true + true @@ -3332,6 +3350,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters index 3bd2b5f3..644f19ed 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters @@ -646,6 +646,9 @@ AudioPluginHost\Source + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -661,6 +664,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -733,6 +739,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1489,6 +1498,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1942,6 +1954,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2968,6 +2983,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5736,6 +5754,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj index a4c96d59..e770966a 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -150,6 +150,9 @@ + + true + true @@ -165,6 +168,9 @@ true + + true + true @@ -237,6 +243,9 @@ true + + true + true @@ -978,6 +987,9 @@ true + + true + true @@ -1392,6 +1404,9 @@ true + + true + true @@ -2358,6 +2373,9 @@ true + + true + true @@ -3332,6 +3350,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index c3f40dbd..4cc5b50e 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -646,6 +646,9 @@ AudioPluginHost\Source + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -661,6 +664,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -733,6 +739,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1489,6 +1498,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1942,6 +1954,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2968,6 +2983,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5736,6 +5754,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj index cc0d648a..dfc0ff8e 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -79,7 +79,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -107,7 +107,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -122,7 +122,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_PLUGINHOST_LV2=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\AudioPluginHost.exe @@ -150,6 +150,9 @@ + + true + true @@ -165,6 +168,9 @@ true + + true + true @@ -237,6 +243,9 @@ true + + true + true @@ -978,6 +987,9 @@ true + + true + true @@ -1392,6 +1404,9 @@ true + + true + true @@ -2358,6 +2373,9 @@ true + + true + true @@ -3332,6 +3350,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters index 6f2efc47..1e370716 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters @@ -646,6 +646,9 @@ AudioPluginHost\Source + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -661,6 +664,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -733,6 +739,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1489,6 +1498,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1942,6 +1954,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2968,6 +2983,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5736,6 +5754,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj index 991397e2..e228fd1e 100644 --- a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj +++ b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj @@ -455,7 +455,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -594,7 +594,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile b/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile index 798fe975..2fc836ef 100644 --- a/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile +++ b/extras/BinaryBuilder/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(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_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := BinaryBuilder @@ -60,7 +60,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := BinaryBuilder diff --git a/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj b/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj index 7e6a1404..79a24dbd 100644 --- a/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj +++ b/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj @@ -200,7 +200,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_STANDALONE_APPLICATION=1", @@ -296,7 +296,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1", "JUCE_STANDALONE_APPLICATION=1", diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj index 6ede8280..813c7e80 100644 --- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj +++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\BinaryBuilder.exe @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\BinaryBuilder.exe diff --git a/extras/Build/CMake/JUCEUtils.cmake b/extras/Build/CMake/JUCEUtils.cmake index d86ce8a9..954a435d 100644 --- a/extras/Build/CMake/JUCEUtils.cmake +++ b/extras/Build/CMake/JUCEUtils.cmake @@ -843,7 +843,7 @@ function(_juce_add_lv2_manifest_helper_target) set(source "${module_path}/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp") add_executable(juce_lv2_helper "${source}") add_executable(juce::juce_lv2_helper ALIAS juce_lv2_helper) - target_compile_features(juce_lv2_helper PRIVATE cxx_std_14) + target_compile_features(juce_lv2_helper PRIVATE cxx_std_17) set_target_properties(juce_lv2_helper PROPERTIES BUILD_WITH_INSTALL_RPATH ON) target_link_libraries(juce_lv2_helper PRIVATE ${CMAKE_DL_LIBS}) endfunction() diff --git a/extras/Build/juce_build_tools/juce_build_tools.h b/extras/Build/juce_build_tools/juce_build_tools.h index 54b4156e..764ff3ec 100644 --- a/extras/Build/juce_build_tools/juce_build_tools.h +++ b/extras/Build/juce_build_tools/juce_build_tools.h @@ -34,7 +34,7 @@ ID: juce_build_tools vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE Build Tools description: Classes for generating intermediate files for JUCE projects. website: http://www.juce.com/juce diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt index dd9a16d9..bad671c0 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt @@ -25,9 +25,9 @@ include_directories( AFTER enable_language(ASM) if(JUCE_BUILD_CONFIGURATION MATCHES "DEBUG") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70004]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]]) elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE") - add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70003]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) + add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x70004]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]]) else() message( FATAL_ERROR "No matching build-configuration found." ) endif() @@ -42,6 +42,7 @@ add_library( ${BINARY_NAME} "../../../Source/ClientComponent.h" "../../../Source/SharedCanvas.h" "../../../Source/juce_icon.png" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -60,6 +61,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -116,6 +118,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -759,6 +762,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -1085,6 +1089,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -1540,6 +1545,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -1690,6 +1696,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" @@ -1795,6 +1802,7 @@ set_source_files_properties( "../../../Source/ClientComponent.h" "../../../Source/SharedCanvas.h" "../../../Source/juce_icon.png" + "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp" "../../../../../modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.cpp" "../../../../../modules/juce_audio_basics/buffers/juce_AudioChannelSet.h" @@ -1813,6 +1821,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPConverters.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPDispatcher.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPFactory.h" + "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPIterator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToBytestreamTranslator.h" "../../../../../modules/juce_audio_basics/midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" @@ -1869,6 +1878,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_basics/sources/juce_MemoryAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_MixerAudioSource.h" + "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_PositionableAudioSource.h" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp" "../../../../../modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h" @@ -2512,6 +2522,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_RangedAudioParameter.h" "../../../../../modules/juce_audio_processors/utilities/juce_VST3ClientExtensions.h" + "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp" "../../../../../modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h" "../../../../../modules/juce_audio_processors/juce_audio_processors.cpp" "../../../../../modules/juce_audio_processors/juce_audio_processors.mm" @@ -2838,6 +2849,7 @@ set_source_files_properties( "../../../../../modules/juce_data_structures/app_properties/juce_ApplicationProperties.h" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp" "../../../../../modules/juce_data_structures/app_properties/juce_PropertiesFile.h" + "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.cpp" "../../../../../modules/juce_data_structures/undomanager/juce_UndoManager.h" @@ -3293,6 +3305,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h" "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h" + "../../../../../modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_DragAndDrop.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.cpp" "../../../../../modules/juce_gui_basics/native/x11/juce_linux_X11_Symbols.h" @@ -3443,6 +3456,7 @@ set_source_files_properties( "../../../../../modules/juce_gui_extra/misc/juce_SplashScreen.h" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h" + "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp" "../../../../../modules/juce_gui_extra/misc/juce_WebBrowserComponent.h" "../../../../../modules/juce_gui_extra/native/juce_android_PushNotifications.cpp" "../../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp" diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml b/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml index f6b609a8..e8e438e0 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml @@ -4,16 +4,15 @@ - - - - - + + + + - diff --git a/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile b/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile index 2222e3db..3b31b187 100644 --- a/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile +++ b/extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(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_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo @@ -60,7 +60,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo diff --git a/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj b/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj index 4e036e84..d2282923 100644 --- a/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj +++ b/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj @@ -368,7 +368,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -530,7 +530,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj index c3d567af..8dac97c8 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\JUCE Network Graphics Demo.exe @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\JUCE Network Graphics Demo.exe @@ -142,6 +142,9 @@ + + true + true @@ -157,6 +160,9 @@ true + + true + true @@ -229,6 +235,9 @@ true + + true + true @@ -970,6 +979,9 @@ true + + true + true @@ -1384,6 +1396,9 @@ true + + true + true @@ -2242,6 +2257,9 @@ true + + true + true @@ -3193,6 +3211,7 @@ + diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters index 4364fbae..0dc2f237 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters @@ -601,6 +601,9 @@ NetworkGraphicsDemo\Source + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -616,6 +619,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -688,6 +694,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1444,6 +1453,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1897,6 +1909,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2812,6 +2827,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5457,6 +5475,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj index ae653aec..9ecfe132 100644 --- a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj +++ b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj @@ -385,7 +385,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", @@ -550,7 +550,7 @@ "JUCE_CONTENT_SHARING=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", "JUCE_MODULE_AVAILABLE_juce_audio_formats=1", diff --git a/extras/NetworkGraphicsDemo/Source/Demos.h b/extras/NetworkGraphicsDemo/Source/Demos.h index 3f683266..4a368ef6 100644 --- a/extras/NetworkGraphicsDemo/Source/Demos.h +++ b/extras/NetworkGraphicsDemo/Source/Demos.h @@ -490,7 +490,7 @@ struct MultiLogo : public BackgroundLogo }; //============================================================================== -void createAllDemos (OwnedArray& demos) +inline void createAllDemos (OwnedArray& demos) { demos.add (new FlockDemo()); demos.add (new FlockWithText()); diff --git a/extras/Projucer/Builds/LinuxMakefile/Makefile b/extras/Projucer/Builds/LinuxMakefile/Makefile index fc90aee1..3f3a33f4 100644 --- a/extras/Projucer/Builds/LinuxMakefile/Makefile +++ b/extras/Projucer/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.3" "-DJUCE_APP_VERSION_HEX=0x70003" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.4" "-DJUCE_APP_VERSION_HEX=0x70004" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := Projucer @@ -60,7 +60,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.3" "-DJUCE_APP_VERSION_HEX=0x70003" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x70004" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=7.0.4" "-DJUCE_APP_VERSION_HEX=0x70004" $(shell $(PKG_CONFIG) --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_APP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_APP := Projucer diff --git a/extras/Projucer/Builds/MacOSX/Info-App.plist b/extras/Projucer/Builds/MacOSX/Info-App.plist index e33f9971..8c250b2b 100644 --- a/extras/Projucer/Builds/MacOSX/Info-App.plist +++ b/extras/Projucer/Builds/MacOSX/Info-App.plist @@ -22,9 +22,9 @@ CFBundleSignature ???? CFBundleShortVersionString - 7.0.3 + 7.0.4 CFBundleVersion - 7.0.3 + 7.0.4 NSHumanReadableCopyright Raw Material Software Limited NSHighResolutionCapable diff --git a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj index ca542304..00c55074 100644 --- a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj +++ b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj @@ -1132,7 +1132,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_build_tools=1", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", @@ -1150,8 +1150,8 @@ "JUCE_WEB_BROWSER=0", "JUCE_STANDALONE_APPLICATION=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=7.0.3", - "JUCE_APP_VERSION_HEX=0x70003", + "JUCE_APP_VERSION=7.0.4", + "JUCE_APP_VERSION_HEX=0x70004", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", @@ -1201,7 +1201,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_build_tools=1", "JUCE_MODULE_AVAILABLE_juce_core=1", "JUCE_MODULE_AVAILABLE_juce_cryptography=1", @@ -1219,8 +1219,8 @@ "JUCE_WEB_BROWSER=0", "JUCE_STANDALONE_APPLICATION=1", "JUCER_XCODE_MAC_F6D2F4CF=1", - "JUCE_APP_VERSION=7.0.3", - "JUCE_APP_VERSION_HEX=0x70003", + "JUCE_APP_VERSION=7.0.4", + "JUCE_APP_VERSION_HEX=0x70004", "JucePlugin_Build_VST=0", "JucePlugin_Build_VST3=0", "JucePlugin_Build_AU=0", diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj index 8537ed39..86b8b865 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -79,7 +79,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -107,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -623,6 +623,9 @@ true + + true + true @@ -1481,6 +1484,9 @@ true + + true + true @@ -2086,6 +2092,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters index 696ac002..c01b7709 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters @@ -922,6 +922,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -1837,6 +1840,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -3573,6 +3579,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/Projucer/Builds/VisualStudio2017/resources.rc b/extras/Projucer/Builds/VisualStudio2017/resources.rc index 789264c7..2d7d3f43 100644 --- a/extras/Projucer/Builds/VisualStudio2017/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2017/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,3,0 +FILEVERSION 7,0,4,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "7.0.3\0" + VALUE "FileVersion", "7.0.4\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "7.0.3\0" + VALUE "ProductVersion", "7.0.4\0" END END diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj index c9891796..0756e37e 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -79,7 +79,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -107,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -623,6 +623,9 @@ true + + true + true @@ -1481,6 +1484,9 @@ true + + true + true @@ -2086,6 +2092,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters index 6dc8cae7..bf82efb3 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters @@ -922,6 +922,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -1837,6 +1840,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -3573,6 +3579,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/Projucer/Builds/VisualStudio2019/resources.rc b/extras/Projucer/Builds/VisualStudio2019/resources.rc index 789264c7..2d7d3f43 100644 --- a/extras/Projucer/Builds/VisualStudio2019/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2019/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,3,0 +FILEVERSION 7,0,4,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "7.0.3\0" + VALUE "FileVersion", "7.0.4\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "7.0.3\0" + VALUE "ProductVersion", "7.0.4\0" END END diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj index 5b17c2ec..75190717 100644 --- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebug true NotUsing @@ -79,7 +79,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -107,7 +107,7 @@ Full ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreaded true NotUsing @@ -122,7 +122,7 @@ ..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.3;JUCE_APP_VERSION_HEX=0x70003;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=7.0.4;JUCE_APP_VERSION_HEX=0x70004;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\Projucer.exe @@ -623,6 +623,9 @@ true + + true + true @@ -1481,6 +1484,9 @@ true + + true + true @@ -2086,6 +2092,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters index db5808cb..3e3eb445 100644 --- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters @@ -922,6 +922,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -1837,6 +1840,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -3573,6 +3579,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/Projucer/Builds/VisualStudio2022/resources.rc b/extras/Projucer/Builds/VisualStudio2022/resources.rc index 789264c7..2d7d3f43 100644 --- a/extras/Projucer/Builds/VisualStudio2022/resources.rc +++ b/extras/Projucer/Builds/VisualStudio2022/resources.rc @@ -9,7 +9,7 @@ #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 7,0,3,0 +FILEVERSION 7,0,4,0 BEGIN BLOCK "StringFileInfo" BEGIN @@ -18,9 +18,9 @@ BEGIN VALUE "CompanyName", "Raw Material Software Limited\0" VALUE "LegalCopyright", "Raw Material Software Limited\0" VALUE "FileDescription", "Projucer\0" - VALUE "FileVersion", "7.0.3\0" + VALUE "FileVersion", "7.0.4\0" VALUE "ProductName", "Projucer\0" - VALUE "ProductVersion", "7.0.3\0" + VALUE "ProductVersion", "7.0.4\0" END END diff --git a/extras/Projucer/JuceLibraryCode/JuceHeader.h b/extras/Projucer/JuceLibraryCode/JuceHeader.h index 4ebb05cf..29047f34 100644 --- a/extras/Projucer/JuceLibraryCode/JuceHeader.h +++ b/extras/Projucer/JuceLibraryCode/JuceHeader.h @@ -44,7 +44,7 @@ namespace ProjectInfo { const char* const projectName = "Projucer"; const char* const companyName = "Raw Material Software Limited"; - const char* const versionString = "7.0.3"; - const int versionNumber = 0x70003; + const char* const versionString = "7.0.4"; + const int versionNumber = 0x70004; } #endif diff --git a/extras/Projucer/Projucer.jucer b/extras/Projucer/Projucer.jucer index b268a4a1..975920de 100644 --- a/extras/Projucer/Projucer.jucer +++ b/extras/Projucer/Projucer.jucer @@ -1,7 +1,7 @@ diff --git a/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp b/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp index 111c0f09..9c4b1eec 100644 --- a/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp +++ b/extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp @@ -573,7 +573,7 @@ bool JucerDocument::reloadFromDocument() if (currentXML != nullptr && currentXML->isEquivalentTo (newXML.get(), true)) return true; - currentXML.reset (newXML.release()); + currentXML = std::move (newXML); stopTimer(); resources.loadFromCpp (getCppFile(), cppContent); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h index d585bfe6..a030a959 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h @@ -71,6 +71,12 @@ public: createOtherExporterProperties (props); } + void updateDeprecatedSettings() override + { + updateExternalReadPermission(); + updateBluetoothPermission(); + } + static String getDisplayName() { return "Android"; } static String getValueTreeTypeName() { return "ANDROIDSTUDIO"; } static String getTargetFolderName() { return "Android"; } @@ -94,7 +100,9 @@ public: androidCustomActivityClass, androidCustomApplicationClass, androidManifestCustomXmlElements, androidGradleSettingsContent, androidVersionCode, androidMinimumSDK, androidTargetSDK, androidTheme, androidExtraAssetsFolder, androidOboeRepositoryPath, androidInternetNeeded, androidMicNeeded, androidCameraNeeded, - androidBluetoothNeeded, androidExternalReadPermission, androidExternalWritePermission, + androidBluetoothScanNeeded, androidBluetoothAdvertiseNeeded, androidBluetoothConnectNeeded, + androidReadMediaAudioPermission, androidReadMediaImagesPermission, + androidReadMediaVideoPermission, androidExternalWritePermission, androidInAppBillingPermission, androidVibratePermission, androidOtherPermissions, androidPushNotifications, androidEnableRemoteNotifications, androidRemoteNotificationsConfigFile, androidEnableContentSharing, androidKeyStore, androidKeyStorePass, androidKeyAlias, androidKeyAliasPass, gradleVersion, gradleToolchain, androidPluginVersion; @@ -123,8 +131,12 @@ public: androidInternetNeeded (settings, Ids::androidInternetNeeded, getUndoManager(), true), androidMicNeeded (settings, Ids::microphonePermissionNeeded, getUndoManager(), false), androidCameraNeeded (settings, Ids::cameraPermissionNeeded, getUndoManager(), false), - androidBluetoothNeeded (settings, Ids::androidBluetoothNeeded, getUndoManager(), true), - androidExternalReadPermission (settings, Ids::androidExternalReadNeeded, getUndoManager(), true), + androidBluetoothScanNeeded (settings, Ids::androidBluetoothScanNeeded, getUndoManager(), false), + androidBluetoothAdvertiseNeeded (settings, Ids::androidBluetoothAdvertiseNeeded, getUndoManager(), false), + androidBluetoothConnectNeeded (settings, Ids::androidBluetoothConnectNeeded, getUndoManager(), false), + androidReadMediaAudioPermission (settings, Ids::androidReadMediaAudioPermission, getUndoManager(), true), + androidReadMediaImagesPermission (settings, Ids::androidReadMediaImagesPermission, getUndoManager(), true), + androidReadMediaVideoPermission (settings, Ids::androidReadMediaVideoPermission, getUndoManager(), true), androidExternalWritePermission (settings, Ids::androidExternalWriteNeeded, getUndoManager(), true), androidInAppBillingPermission (settings, Ids::androidInAppBilling, getUndoManager(), false), androidVibratePermission (settings, Ids::androidVibratePermissionNeeded, getUndoManager(), false), @@ -342,6 +354,32 @@ protected: } private: + void updateExternalReadPermission() + { + const auto needsExternalRead = getSettingString (Ids::androidExternalReadNeeded); + settings.removeProperty (Ids::androidExternalReadNeeded, nullptr); + + if (needsExternalRead.isEmpty()) + return; + + androidReadMediaAudioPermission .setValue (needsExternalRead, nullptr); + androidReadMediaImagesPermission.setValue (needsExternalRead, nullptr); + androidReadMediaVideoPermission .setValue (needsExternalRead, nullptr); + } + + void updateBluetoothPermission() + { + const auto needsBluetooth = getSettingString (Ids::androidBluetoothNeeded); + settings.removeProperty (Ids::androidBluetoothNeeded, nullptr); + + if (needsBluetooth.isEmpty()) + return; + + androidBluetoothScanNeeded .setValue (needsBluetooth, nullptr); + androidBluetoothAdvertiseNeeded.setValue (needsBluetooth, nullptr); + androidBluetoothConnectNeeded .setValue (needsBluetooth, nullptr); + } + void writeCmakeFile (const File& file) const { build_tools::writeStreamToFile (file, [&] (MemoryOutputStream& mo) @@ -1100,11 +1138,23 @@ private: props.add (new ChoicePropertyComponent (androidCameraNeeded, "Camera Required"), "If enabled, this will set the android.permission.CAMERA flag in the manifest."); - props.add (new ChoicePropertyComponent (androidBluetoothNeeded, "Bluetooth Permissions Required"), - "If enabled, this will set the android.permission.BLUETOOTH and android.permission.BLUETOOTH_ADMIN flag in the manifest. This is required for Bluetooth MIDI on Android."); + props.add (new ChoicePropertyComponent (androidBluetoothScanNeeded, "Bluetooth Scan Required"), + "If enabled, this will set the android.permission.BLUETOOTH_SCAN, android.permission.BLUETOOTH and android.permission.BLUETOOTH_ADMIN flags in the manifest. This is required for Bluetooth MIDI on Android."); + + props.add (new ChoicePropertyComponent (androidBluetoothAdvertiseNeeded, "Bluetooth Advertise Required"), + "If enabled, this will set the android.permission.BLUETOOTH_ADVERTISE, android.permission.BLUETOOTH and android.permission.BLUETOOTH_ADMIN flags in the manifest."); - props.add (new ChoicePropertyComponent (androidExternalReadPermission, "Read From External Storage"), - "If enabled, this will set the android.permission.READ_EXTERNAL_STORAGE flag in the manifest."); + props.add (new ChoicePropertyComponent (androidBluetoothConnectNeeded, "Bluetooth Connect Required"), + "If enabled, this will set the android.permission.BLUETOOTH_CONNECT, android.permission.BLUETOOTH and android.permission.BLUETOOTH_ADMIN flags in the manifest. This is required for Bluetooth MIDI on Android."); + + props.add (new ChoicePropertyComponent (androidReadMediaAudioPermission, "Read Audio From External Storage"), + "If enabled, this will set the android.permission.READ_MEDIA_AUDIO and android.permission.READ_EXTERNAL_STORAGE flags in the manifest."); + + props.add (new ChoicePropertyComponent (androidReadMediaImagesPermission, "Read Images From External Storage"), + "If enabled, this will set the android.permission.READ_MEDIA_IMAGES and android.permission.READ_EXTERNAL_STORAGE flags in the manifest."); + + props.add (new ChoicePropertyComponent (androidReadMediaVideoPermission, "Read Video From External Storage"), + "If enabled, this will set the android.permission.READ_MEDIA_VIDEO and android.permission.READ_EXTERNAL_STORAGE flags in the manifest."); props.add (new ChoicePropertyComponent (androidExternalWritePermission, "Write to External Storage"), "If enabled, this will set the android.permission.WRITE_EXTERNAL_STORAGE flag in the manifest."); @@ -1680,6 +1730,22 @@ private: // This permission only has an effect on SDK version 28 and lower if (permission == "android.permission.WRITE_EXTERNAL_STORAGE") usesPermission->setAttribute ("android:maxSdkVersion", "28"); + + // https://developer.android.com/training/data-storage/shared/documents-files + // If the SDK version is <= 28, READ_EXTERNAL_STORAGE is required to access any + // media file, including files created by the current app. + // If the SDK version is <= 32, READ_EXTERNAL_STORAGE is required to access other + // apps' media files. + // This permission has no effect on later Android versions. + if (permission == "android.permission.READ_EXTERNAL_STORAGE") + usesPermission->setAttribute ("android:maxSdkVersion", "32"); + + // These permissions are obsoleted by new more fine-grained permissions in API level 31 + if (permission == "android.permission.BLUETOOTH" + || permission == "android.permission.BLUETOOTH_ADMIN") + { + usesPermission->setAttribute ("android:maxSdkVersion", "30"); + } } } @@ -1736,7 +1802,7 @@ private: setAttributeIfNotPresent (*act, "android:name", getActivityClassString()); if (! act->hasAttribute ("android:configChanges")) - act->setAttribute ("android:configChanges", "keyboardHidden|orientation|screenSize"); + act->setAttribute ("android:configChanges", "keyboard|keyboardHidden|orientation|screenSize|navigation"); if (androidScreenOrientation.get() == "landscape") { @@ -1837,7 +1903,18 @@ private: if (androidCameraNeeded.get()) s.add ("android.permission.CAMERA"); - if (androidBluetoothNeeded.get()) + if (androidBluetoothScanNeeded.get()) + s.add ("android.permission.BLUETOOTH_SCAN"); + + if (androidBluetoothAdvertiseNeeded.get()) + s.add ("android.permission.BLUETOOTH_ADVERTISE"); + + if (androidBluetoothConnectNeeded.get()) + s.add ("android.permission.BLUETOOTH_CONNECT"); + + if ( androidBluetoothScanNeeded.get() + || androidBluetoothAdvertiseNeeded.get() + || androidBluetoothConnectNeeded.get()) { s.add ("android.permission.BLUETOOTH"); s.add ("android.permission.BLUETOOTH_ADMIN"); @@ -1845,8 +1922,21 @@ private: s.add ("android.permission.ACCESS_COARSE_LOCATION"); } - if (androidExternalReadPermission.get()) + if (androidReadMediaAudioPermission.get()) + s.add ("android.permission.READ_MEDIA_AUDIO"); + + if (androidReadMediaImagesPermission.get()) + s.add ("android.permission.READ_MEDIA_IMAGES"); + + if (androidReadMediaVideoPermission.get()) + s.add ("android.permission.READ_MEDIA_VIDEO"); + + if ( androidReadMediaAudioPermission.get() + || androidReadMediaImagesPermission.get() + || androidReadMediaVideoPermission.get()) + { s.add ("android.permission.READ_EXTERNAL_STORAGE"); + } if (androidExternalWritePermission.get()) s.add ("android.permission.WRITE_EXTERNAL_STORAGE"); diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h index a84cdc93..d2f5f708 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h @@ -218,7 +218,7 @@ public: } else if (type == LV2PlugIn) { - s.add ("JUCE_LV2DIR := " + targetName + ".lv2"); + s.add ("JUCE_LV2DIR := " + escapeQuotesAndSpaces (targetName) + ".lv2"); targetName = "$(JUCE_LV2DIR)/" + targetName + ".so"; } else if (type == LV2TurtleProgram) @@ -399,7 +399,7 @@ public: } else if (type == LV2PlugIn) { - out << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER) $(abspath $(JUCE_LV2_FULL_PATH))" << newLine + out << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER) $(JUCE_LV2_FULL_PATH)" << newLine << "\t-$(V_AT)[ ! \"$(JUCE_LV2DESTDIR)\" ] || (mkdir -p $(JUCE_LV2DESTDIR) && cp -R $(JUCE_COPYCMD_LV2_PLUGIN))" << newLine; } diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h index 350d7c41..88800347 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h @@ -234,7 +234,13 @@ namespace Ids DECLARE_ID (androidGradleSettingsContent); DECLARE_ID (androidCustomStringXmlElements); DECLARE_ID (androidBluetoothNeeded); + DECLARE_ID (androidBluetoothScanNeeded); + DECLARE_ID (androidBluetoothAdvertiseNeeded); + DECLARE_ID (androidBluetoothConnectNeeded); DECLARE_ID (androidExternalReadNeeded); + DECLARE_ID (androidReadMediaAudioPermission); + DECLARE_ID (androidReadMediaImagesPermission); + DECLARE_ID (androidReadMediaVideoPermission); DECLARE_ID (androidExternalWriteNeeded); DECLARE_ID (androidInAppBilling); DECLARE_ID (androidVibratePermissionNeeded); diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h index 37e4e895..8795a092 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h @@ -296,7 +296,6 @@ struct TranslationHelpers const StringArray& originalKeys (originalStrings.getAllKeys()); const StringArray& originalValues (originalStrings.getAllValues()); - int numRemoved = 0; for (int i = preStrings.size(); --i >= 0;) { @@ -304,7 +303,6 @@ struct TranslationHelpers { preStrings.remove (i); postStrings.remove (i); - ++numRemoved; } } diff --git a/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp b/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp index 88aa018f..ea203361 100644 --- a/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp +++ b/extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp @@ -265,6 +265,9 @@ ValueTree PIPGenerator::createExporterChild (const Identifier& exporterIdentifie } } + if (exporterIdentifier.toString() == AndroidProjectExporter::getValueTreeTypeName()) + exporter.setProperty (Ids::androidBluetoothNeeded, true, nullptr); + { ValueTree configs (Ids::CONFIGURATIONS); diff --git a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile index e044c6aa..1a17190b 100644 --- a/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile +++ b/extras/UnitTestRunner/Builds/LinuxMakefile/Makefile @@ -39,7 +39,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(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_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := UnitTestRunner @@ -60,7 +60,7 @@ 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=0x70003" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) + JUCE_CPPFLAGS := $(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_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_LV2=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell $(PKG_CONFIG) --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd -I../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 -I../../../../modules/juce_audio_processors/format_types/LV2_SDK -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS) JUCE_CPPFLAGS_CONSOLEAPP := "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0" "-DJucePlugin_Build_LV2=0" JUCE_TARGET_CONSOLEAPP := UnitTestRunner diff --git a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj index 299fd409..5f94dd2b 100644 --- a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj +++ b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj @@ -406,7 +406,7 @@ "NDEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", @@ -537,7 +537,7 @@ "DEBUG=1", "JUCE_DISPLAY_SPLASH_SCREEN=0", "JUCE_USE_DARK_SPLASH_SCREEN=1", - "JUCE_PROJUCER_VERSION=0x70003", + "JUCE_PROJUCER_VERSION=0x70004", "JUCE_MODULE_AVAILABLE_juce_analytics=1", "JUCE_MODULE_AVAILABLE_juce_audio_basics=1", "JUCE_MODULE_AVAILABLE_juce_audio_devices=1", diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj index b3a2f0b6..c5b30150 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -80,7 +80,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -108,7 +108,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -124,7 +124,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -158,6 +158,9 @@ true + + true + true @@ -173,6 +176,9 @@ true + + true + true @@ -245,6 +251,9 @@ true + + true + true @@ -986,6 +995,9 @@ true + + true + true @@ -1400,6 +1412,9 @@ true + + true + true @@ -2366,6 +2381,9 @@ true + + true + true @@ -3398,6 +3416,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters index c3f821af..e0a95f88 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -670,6 +670,9 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -685,6 +688,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -757,6 +763,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1513,6 +1522,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1966,6 +1978,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2992,6 +3007,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5826,6 +5844,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj index f6788fdf..2e99de2a 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -80,7 +80,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -108,7 +108,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -124,7 +124,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -158,6 +158,9 @@ true + + true + true @@ -173,6 +176,9 @@ true + + true + true @@ -245,6 +251,9 @@ true + + true + true @@ -986,6 +995,9 @@ true + + true + true @@ -1400,6 +1412,9 @@ true + + true + true @@ -2366,6 +2381,9 @@ true + + true + true @@ -3398,6 +3416,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters index 15c6a1a4..2d93b6b1 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -670,6 +670,9 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -685,6 +688,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -757,6 +763,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1513,6 +1522,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1966,6 +1978,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2992,6 +3007,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5826,6 +5844,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj index 7482b348..f1574576 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -80,7 +80,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -108,7 +108,7 @@ Full ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -124,7 +124,7 @@ ..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_LV2=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;%(PreprocessorDefinitions) $(OutDir)\UnitTestRunner.exe @@ -158,6 +158,9 @@ true + + true + true @@ -173,6 +176,9 @@ true + + true + true @@ -245,6 +251,9 @@ true + + true + true @@ -986,6 +995,9 @@ true + + true + true @@ -1400,6 +1412,9 @@ true + + true + true @@ -2366,6 +2381,9 @@ true + + true + true @@ -3398,6 +3416,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters index e7e3721e..d785e613 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -670,6 +670,9 @@ JUCE Modules\juce_analytics + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -685,6 +688,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -757,6 +763,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1513,6 +1522,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1966,6 +1978,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2992,6 +3007,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5826,6 +5844,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj index 851c0fad..ccfd16c4 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj @@ -64,7 +64,7 @@ Disabled ProgramDatabase ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) MultiThreadedDebugDLL true NotUsing @@ -78,7 +78,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) $(OutDir)\juce_dll.lib @@ -106,7 +106,7 @@ Full ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) MultiThreadedDLL true NotUsing @@ -120,7 +120,7 @@ ..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70003;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x70004;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;JucePlugin_Build_LV2=0;_LIB;%(PreprocessorDefinitions) $(OutDir)\juce_dll.lib @@ -141,6 +141,9 @@ + + true + true @@ -156,6 +159,9 @@ true + + true + true @@ -228,6 +234,9 @@ true + + true + true @@ -969,6 +978,9 @@ true + + true + true @@ -1383,6 +1395,9 @@ true + + true + true @@ -2241,6 +2256,9 @@ true + + true + true @@ -3169,6 +3187,7 @@ + diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters index c7f9e9e0..33d4edb9 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters @@ -598,6 +598,9 @@ + + JUCE Modules\juce_audio_basics\audio_play_head + JUCE Modules\juce_audio_basics\buffers @@ -613,6 +616,9 @@ JUCE Modules\juce_audio_basics\midi\ump + + JUCE Modules\juce_audio_basics\midi\ump + JUCE Modules\juce_audio_basics\midi\ump @@ -685,6 +691,9 @@ JUCE Modules\juce_audio_basics\sources + + JUCE Modules\juce_audio_basics\sources + JUCE Modules\juce_audio_basics\sources @@ -1441,6 +1450,9 @@ JUCE Modules\juce_audio_processors\utilities + + JUCE Modules\juce_audio_processors\utilities + JUCE Modules\juce_audio_processors @@ -1894,6 +1906,9 @@ JUCE Modules\juce_data_structures\app_properties + + JUCE Modules\juce_data_structures\undomanager + JUCE Modules\juce_data_structures\undomanager @@ -2809,6 +2824,9 @@ JUCE Modules\juce_gui_extra\misc + + JUCE Modules\juce_gui_extra\misc + JUCE Modules\juce_gui_extra\native @@ -5424,6 +5442,9 @@ JUCE Modules\juce_gui_basics\native\accessibility + + JUCE Modules\juce_gui_basics\native\x11 + JUCE Modules\juce_gui_basics\native\x11 diff --git a/modules/juce_analytics/juce_analytics.h b/modules/juce_analytics/juce_analytics.h index 06a0b107..157a7cbb 100644 --- a/modules/juce_analytics/juce_analytics.h +++ b/modules/juce_analytics/juce_analytics.h @@ -35,7 +35,7 @@ ID: juce_analytics vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE analytics classes description: Classes to collect analytics and send to destinations website: http://www.juce.com/juce diff --git a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp new file mode 100644 index 00000000..72888e2f --- /dev/null +++ b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp @@ -0,0 +1,31 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +bool AudioPlayHead::canControlTransport() { return false; } +void AudioPlayHead::transportPlay ([[maybe_unused]] bool shouldStartPlaying) {} +void AudioPlayHead::transportRecord ([[maybe_unused]] bool shouldStartRecording) {} +void AudioPlayHead::transportRewind() {} + +} // namespace juce diff --git a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h index 21222b7f..3c47f85c 100644 --- a/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h +++ b/modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h @@ -578,16 +578,16 @@ public: virtual Optional getPosition() const = 0; /** Returns true if this object can control the transport. */ - virtual bool canControlTransport() { return false; } + virtual bool canControlTransport(); /** Starts or stops the audio. */ - virtual void transportPlay (bool shouldStartPlaying) { ignoreUnused (shouldStartPlaying); } + virtual void transportPlay (bool shouldStartPlaying); /** Starts or stops recording the audio. */ - virtual void transportRecord (bool shouldStartRecording) { ignoreUnused (shouldStartRecording); } + virtual void transportRecord (bool shouldStartRecording); /** Rewinds the audio. */ - virtual void transportRewind() {} + virtual void transportRewind(); }; } // namespace juce diff --git a/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h b/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h index 251a4a04..d583a593 100644 --- a/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h +++ b/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h @@ -558,7 +558,11 @@ public: if (! isClear) { for (int i = 0; i < numChannels; ++i) + { + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661) FloatVectorOperations::clear (channels[i], size); + JUCE_END_IGNORE_WARNINGS_MSVC + } isClear = true; } @@ -799,6 +803,8 @@ public: auto* d = channels[destChannel] + destStartSample; auto* s = source.channels[sourceChannel] + sourceStartSample; + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661) + if (isClear) { isClear = false; @@ -815,6 +821,8 @@ public: else FloatVectorOperations::add (d, s, numSamples); } + + JUCE_END_IGNORE_WARNINGS_MSVC } } @@ -877,7 +885,11 @@ public: @param numSamples the number of samples to process @param startGain the gain to apply to the first sample (this is multiplied with the source samples before they are added to this buffer) - @param endGain the gain to apply to the final sample. The gain is linearly + @param endGain The gain that would apply to the sample after the final sample. + The gain that applies to the final sample is + (numSamples - 1) / numSamples * (endGain - startGain). This + ensures a continuous ramp when supplying the same value in + endGain and startGain in subsequent blocks. The gain is linearly interpolated between the first and last samples. */ void addFromWithRamp (int destChannel, @@ -1043,7 +1055,11 @@ public: @param numSamples the number of samples to process @param startGain the gain to apply to the first sample (this is multiplied with the source samples before they are copied to this buffer) - @param endGain the gain to apply to the final sample. The gain is linearly + @param endGain The gain that would apply to the sample after the final sample. + The gain that applies to the final sample is + (numSamples - 1) / numSamples * (endGain - startGain). This + ensures a continuous ramp when supplying the same value in + endGain and startGain in subsequent blocks. The gain is linearly interpolated between the first and last samples. @see addFrom diff --git a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp index d65a8f25..2a576dc9 100644 --- a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp +++ b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp @@ -938,15 +938,13 @@ namespace #if JUCE_USE_VDSP_FRAMEWORK vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num); #else - FloatVectorHelpers::signMask32 signMask; + [[maybe_unused]] FloatVectorHelpers::signMask32 signMask; signMask.i = 0x7fffffffUL; JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]), Mode::bit_and (s, mask), JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, const Mode::ParallelType mask = Mode::load1 (signMask.f);) - - ignoreUnused (signMask); #endif } @@ -956,7 +954,7 @@ namespace #if JUCE_USE_VDSP_FRAMEWORK vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num); #else - FloatVectorHelpers::signMask64 signMask; + [[maybe_unused]] FloatVectorHelpers::signMask64 signMask; signMask.i = 0x7fffffffffffffffULL; JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]), @@ -964,8 +962,6 @@ namespace JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, const Mode::ParallelType mask = Mode::load1 (signMask.d);) - - ignoreUnused (signMask); #endif } @@ -1456,7 +1452,7 @@ intptr_t JUCE_CALLTYPE FloatVectorOperations::getFpStatusRegister() noexcept return fpsr; } -void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister (intptr_t fpsr) noexcept +void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister ([[maybe_unused]] intptr_t fpsr) noexcept { #if JUCE_INTEL && JUCE_USE_SSE_INTRINSICS // the volatile keyword here is needed to workaround a bug in AppleClang 13.0 @@ -1481,11 +1477,10 @@ void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister (intptr_t fpsr) no #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM)) jassertfalse; // No support for getting the floating point status register for your platform #endif - ignoreUnused (fpsr); #endif } -void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnable) noexcept +void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode ([[maybe_unused]] bool shouldEnable) noexcept { #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || (JUCE_64BIT && JUCE_ARM)) #if JUCE_USE_SSE_INTRINSICS @@ -1498,11 +1493,10 @@ void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnab #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM)) jassertfalse; // No support for flush to zero mode on your platform #endif - ignoreUnused (shouldEnable); #endif } -void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool shouldDisable) noexcept +void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport ([[maybe_unused]] bool shouldDisable) noexcept { #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || (JUCE_64BIT && JUCE_ARM)) #if JUCE_USE_SSE_INTRINSICS @@ -1513,7 +1507,6 @@ void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool setFpStatusRegister ((getFpStatusRegister() & (~mask)) | (shouldDisable ? mask : 0)); #else - ignoreUnused (shouldDisable); #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM)) jassertfalse; // No support for disable denormals mode on your platform diff --git a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h index cf7ae84a..9c6ed499 100644 --- a/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h +++ b/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h @@ -142,65 +142,26 @@ struct FloatVectorOperationsBase namespace detail { -template -struct NameForwarder; - -template -struct NameForwarder : Head {}; - -template -struct NameForwarder : Head, NameForwarder +template +struct NameForwarder : public Bases... { - using Head::clear; - using NameForwarder::clear; - - using Head::fill; - using NameForwarder::fill; - - using Head::copy; - using NameForwarder::copy; - - using Head::copyWithMultiply; - using NameForwarder::copyWithMultiply; - - using Head::add; - using NameForwarder::add; - - using Head::subtract; - using NameForwarder::subtract; - - using Head::addWithMultiply; - using NameForwarder::addWithMultiply; - - using Head::subtractWithMultiply; - using NameForwarder::subtractWithMultiply; - - using Head::multiply; - using NameForwarder::multiply; - - using Head::negate; - using NameForwarder::negate; - - using Head::abs; - using NameForwarder::abs; - - using Head::min; - using NameForwarder::min; - - using Head::max; - using NameForwarder::max; - - using Head::clip; - using NameForwarder::clip; - - using Head::findMinAndMax; - using NameForwarder::findMinAndMax; - - using Head::findMinimum; - using NameForwarder::findMinimum; - - using Head::findMaximum; - using NameForwarder::findMaximum; + using Bases::clear..., + Bases::fill..., + Bases::copy..., + Bases::copyWithMultiply..., + Bases::add..., + Bases::subtract..., + Bases::addWithMultiply..., + Bases::subtractWithMultiply..., + Bases::multiply..., + Bases::negate..., + Bases::abs..., + Bases::min..., + Bases::max..., + Bases::clip..., + Bases::findMinAndMax..., + Bases::findMinimum..., + Bases::findMaximum...; }; } // namespace detail diff --git a/modules/juce_audio_basics/juce_audio_basics.cpp b/modules/juce_audio_basics/juce_audio_basics.cpp index 10f3a9bb..57097476 100644 --- a/modules/juce_audio_basics/juce_audio_basics.cpp +++ b/modules/juce_audio_basics/juce_audio_basics.cpp @@ -85,13 +85,16 @@ #include "sources/juce_ResamplingAudioSource.cpp" #include "sources/juce_ReverbAudioSource.cpp" #include "sources/juce_ToneGeneratorAudioSource.cpp" +#include "sources/juce_PositionableAudioSource.cpp" #include "synthesisers/juce_Synthesiser.cpp" +#include "audio_play_head/juce_AudioPlayHead.cpp" #include "midi/ump/juce_UMP.h" #include "midi/ump/juce_UMPUtils.cpp" #include "midi/ump/juce_UMPView.cpp" #include "midi/ump/juce_UMPSysEx7.cpp" #include "midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" +#include "midi/ump/juce_UMPIterator.cpp" #if JUCE_UNIT_TESTS #include "utilities/juce_ADSR_test.cpp" diff --git a/modules/juce_audio_basics/juce_audio_basics.h b/modules/juce_audio_basics/juce_audio_basics.h index 664d98e9..d2373825 100644 --- a/modules/juce_audio_basics/juce_audio_basics.h +++ b/modules/juce_audio_basics/juce_audio_basics.h @@ -32,7 +32,7 @@ ID: juce_audio_basics vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE audio and MIDI data classes description: Classes for audio buffer manipulation, midi message handling, synthesis, etc. website: http://www.juce.com/juce @@ -83,7 +83,9 @@ //============================================================================== #include "buffers/juce_AudioDataConverters.h" +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661) #include "buffers/juce_FloatVectorOperations.h" +JUCE_END_IGNORE_WARNINGS_MSVC #include "buffers/juce_AudioSampleBuffer.h" #include "buffers/juce_AudioChannelSet.h" #include "buffers/juce_AudioProcessLoadMeasurer.h" diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp b/modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp new file mode 100644 index 00000000..0ba7ce07 --- /dev/null +++ b/modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp @@ -0,0 +1,37 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ +namespace universal_midi_packets +{ + +Iterator::Iterator (const uint32_t* ptr, [[maybe_unused]] size_t bytes) noexcept + : view (ptr) + #if JUCE_DEBUG + , bytesRemaining (bytes) + #endif +{ +} + +} // namespace universal_midi_packets +} // namespace juce diff --git a/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h b/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h index b4dcea9a..eba62029 100644 --- a/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h +++ b/modules/juce_audio_basics/midi/ump/juce_UMPIterator.h @@ -43,14 +43,7 @@ public: Iterator() noexcept = default; /** Creates an iterator pointing at `ptr`. */ - explicit Iterator (const uint32_t* ptr, size_t bytes) noexcept - : view (ptr) - #if JUCE_DEBUG - , bytesRemaining (bytes) - #endif - { - ignoreUnused (bytes); - } + explicit Iterator (const uint32_t* ptr, size_t bytes) noexcept; using difference_type = std::iterator_traits::difference_type; using value_type = View; @@ -124,7 +117,7 @@ private: #endif }; -} -} +} // namespace universal_midi_packets +} // namespace juce #endif diff --git a/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp b/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp index 576b8b38..87f3df39 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp +++ b/modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp @@ -853,6 +853,14 @@ void MPEInstrument::releaseAllNotes() notes.clear(); } +//============================================================================== +void MPEInstrument::Listener::noteAdded ([[maybe_unused]] MPENote newNote) {} +void MPEInstrument::Listener::notePressureChanged ([[maybe_unused]] MPENote changedNote) {} +void MPEInstrument::Listener::notePitchbendChanged ([[maybe_unused]] MPENote changedNote) {} +void MPEInstrument::Listener::noteTimbreChanged ([[maybe_unused]] MPENote changedNote) {} +void MPEInstrument::Listener::noteKeyStateChanged ([[maybe_unused]] MPENote changedNote) {} +void MPEInstrument::Listener::noteReleased ([[maybe_unused]] MPENote finishedNote) {} +void MPEInstrument::Listener::zoneLayoutChanged() {} //============================================================================== //============================================================================== diff --git a/modules/juce_audio_basics/mpe/juce_MPEInstrument.h b/modules/juce_audio_basics/mpe/juce_MPEInstrument.h index 29195741..e7993c1d 100644 --- a/modules/juce_audio_basics/mpe/juce_MPEInstrument.h +++ b/modules/juce_audio_basics/mpe/juce_MPEInstrument.h @@ -265,12 +265,12 @@ public: /** Implement this callback to be informed whenever a new expressive MIDI note is triggered. */ - virtual void noteAdded (MPENote newNote) { ignoreUnused (newNote); } + virtual void noteAdded (MPENote newNote); /** Implement this callback to be informed whenever a currently playing MPE note's pressure value changes. */ - virtual void notePressureChanged (MPENote changedNote) { ignoreUnused (changedNote); } + virtual void notePressureChanged (MPENote changedNote); /** Implement this callback to be informed whenever a currently playing MPE note's pitchbend value changes. @@ -279,12 +279,12 @@ public: master channel pitchbend event, or if both occur simultaneously. Call MPENote::getFrequencyInHertz to get the effective note frequency. */ - virtual void notePitchbendChanged (MPENote changedNote) { ignoreUnused (changedNote); } + virtual void notePitchbendChanged (MPENote changedNote); /** Implement this callback to be informed whenever a currently playing MPE note's timbre value changes. */ - virtual void noteTimbreChanged (MPENote changedNote) { ignoreUnused (changedNote); } + virtual void noteTimbreChanged (MPENote changedNote); /** Implement this callback to be informed whether a currently playing MPE note's key state (whether the key is down and/or the note is @@ -293,19 +293,19 @@ public: Note: If the key state changes to MPENote::off, noteReleased is called instead. */ - virtual void noteKeyStateChanged (MPENote changedNote) { ignoreUnused (changedNote); } + virtual void noteKeyStateChanged (MPENote changedNote); /** Implement this callback to be informed whenever an MPE note is released (either by a note-off message, or by a sustain/sostenuto pedal release for a note that already received a note-off), and should therefore stop playing. */ - virtual void noteReleased (MPENote finishedNote) { ignoreUnused (finishedNote); } + virtual void noteReleased (MPENote finishedNote); /** Implement this callback to be informed whenever the MPE zone layout or legacy mode settings of this instrument have been changed. */ - virtual void zoneLayoutChanged() {} + virtual void zoneLayoutChanged(); }; //============================================================================== diff --git a/modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp b/modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp new file mode 100644 index 00000000..d7fbe375 --- /dev/null +++ b/modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp @@ -0,0 +1,28 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +void PositionableAudioSource::setLooping ([[maybe_unused]] bool shouldLoop) {} + +} // namespace juce diff --git a/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h b/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h index 1898bbbc..6fb6691e 100644 --- a/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h +++ b/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h @@ -70,7 +70,7 @@ public: virtual bool isLooping() const = 0; /** Tells the source whether you'd like it to play in a loop. */ - virtual void setLooping (bool shouldLoop) { ignoreUnused (shouldLoop); } + virtual void setLooping (bool shouldLoop); }; } // namespace juce diff --git a/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp b/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp index cfeb6a09..f9aaff23 100644 --- a/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp +++ b/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp @@ -482,15 +482,14 @@ void Synthesiser::handleSostenutoPedal (int midiChannel, bool isDown) } } -void Synthesiser::handleSoftPedal (int midiChannel, bool /*isDown*/) +void Synthesiser::handleSoftPedal ([[maybe_unused]] int midiChannel, bool /*isDown*/) { - ignoreUnused (midiChannel); jassert (midiChannel > 0 && midiChannel <= 16); } -void Synthesiser::handleProgramChange (int midiChannel, int programNumber) +void Synthesiser::handleProgramChange ([[maybe_unused]] int midiChannel, + [[maybe_unused]] int programNumber) { - ignoreUnused (midiChannel, programNumber); jassert (midiChannel > 0 && midiChannel <= 16); } diff --git a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp index 45a83d2b..63817286 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp +++ b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp @@ -23,6 +23,14 @@ namespace juce { +void AudioIODeviceCallback::audioDeviceIOCallbackWithContext ([[maybe_unused]] const float* const* inputChannelData, + [[maybe_unused]] int numInputChannels, + [[maybe_unused]] float* const* outputChannelData, + [[maybe_unused]] int numOutputChannels, + [[maybe_unused]] int numSamples, + [[maybe_unused]] const AudioIODeviceCallbackContext& context) {} + +//============================================================================== AudioIODevice::AudioIODevice (const String& deviceName, const String& deviceTypeName) : name (deviceName), typeName (deviceTypeName) { diff --git a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h index 086054f7..1405f7e2 100644 --- a/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h +++ b/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h @@ -98,10 +98,7 @@ public: float* const* outputChannelData, int numOutputChannels, int numSamples, - const AudioIODeviceCallbackContext& context) - { - ignoreUnused (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples, context); - } + const AudioIODeviceCallbackContext& context); /** Called to indicate that the device is about to start calling back. @@ -129,7 +126,6 @@ public: virtual void audioDeviceError (const String& errorMessage); }; - //============================================================================== /** Base class for an audio device with synchronised input and output channels. diff --git a/modules/juce_audio_devices/juce_audio_devices.cpp b/modules/juce_audio_devices/juce_audio_devices.cpp index f4b4de06..5449282b 100644 --- a/modules/juce_audio_devices/juce_audio_devices.cpp +++ b/modules/juce_audio_devices/juce_audio_devices.cpp @@ -188,7 +188,13 @@ //============================================================================== #elif JUCE_ANDROID - #include "native/juce_android_Audio.cpp" +namespace juce +{ + using RealtimeThreadFactory = pthread_t (*) (void* (*) (void*), void*); + RealtimeThreadFactory getAndroidRealtimeThreadFactory(); +} // namespace juce + +#include "native/juce_android_Audio.cpp" #include #include "native/juce_android_Midi.cpp" @@ -218,6 +224,12 @@ #include "native/juce_android_Oboe.cpp" #endif + #else +// No audio library, so no way to create realtime threads. + namespace juce + { + RealtimeThreadFactory getAndroidRealtimeThreadFactory() { return nullptr; } + } #endif #endif diff --git a/modules/juce_audio_devices/juce_audio_devices.h b/modules/juce_audio_devices/juce_audio_devices.h index 7452a511..aa269e89 100644 --- a/modules/juce_audio_devices/juce_audio_devices.h +++ b/modules/juce_audio_devices/juce_audio_devices.h @@ -32,7 +32,7 @@ ID: juce_audio_devices vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE audio and MIDI I/O device classes description: Classes to play and record from audio and MIDI I/O devices website: http://www.juce.com/juce diff --git a/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp b/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp index 47b7fae7..b2baf8c1 100644 --- a/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp +++ b/modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp @@ -23,6 +23,12 @@ namespace juce { +void MidiInputCallback::handlePartialSysexMessage ([[maybe_unused]] MidiInput* source, + [[maybe_unused]] const uint8* messageData, + [[maybe_unused]] int numBytesSoFar, + [[maybe_unused]] double timestamp) {} + +//============================================================================== MidiOutput::MidiOutput (const String& deviceName, const String& deviceIdentifier) : Thread ("midi out"), deviceInfo (deviceName, deviceIdentifier) { diff --git a/modules/juce_audio_devices/midi_io/juce_MidiDevices.h b/modules/juce_audio_devices/midi_io/juce_MidiDevices.h index 814cb7d8..5dab3f92 100644 --- a/modules/juce_audio_devices/midi_io/juce_MidiDevices.h +++ b/modules/juce_audio_devices/midi_io/juce_MidiDevices.h @@ -225,10 +225,7 @@ public: virtual void handlePartialSysexMessage (MidiInput* source, const uint8* messageData, int numBytesSoFar, - double timestamp) - { - ignoreUnused (source, messageData, numBytesSoFar, timestamp); - } + double timestamp); }; //============================================================================== diff --git a/modules/juce_audio_devices/native/juce_android_Midi.cpp b/modules/juce_audio_devices/native/juce_android_Midi.cpp index 371ac4c8..08825325 100644 --- a/modules/juce_audio_devices/native/juce_android_Midi.cpp +++ b/modules/juce_audio_devices/native/juce_android_Midi.cpp @@ -327,7 +327,7 @@ static const uint8 javaMidiByteCode[] = STATICMETHOD (getAndroidMidiDeviceManager, "getAndroidMidiDeviceManager", "(Landroid/content/Context;)Lcom/rmsl/juce/JuceMidiSupport$MidiDeviceManager;") \ STATICMETHOD (getAndroidBluetoothManager, "getAndroidBluetoothManager", "(Landroid/content/Context;)Lcom/rmsl/juce/JuceMidiSupport$BluetoothManager;") -DECLARE_JNI_CLASS_WITH_BYTECODE (JuceMidiSupport, "com/rmsl/juce/JuceMidiSupport", 23, javaMidiByteCode, sizeof (javaMidiByteCode)) +DECLARE_JNI_CLASS_WITH_BYTECODE (JuceMidiSupport, "com/rmsl/juce/JuceMidiSupport", 23, javaMidiByteCode) #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ diff --git a/modules/juce_audio_devices/native/juce_android_Oboe.cpp b/modules/juce_audio_devices/native/juce_android_Oboe.cpp index 5bedb179..42a9efc9 100644 --- a/modules/juce_audio_devices/native/juce_android_Oboe.cpp +++ b/modules/juce_audio_devices/native/juce_android_Oboe.cpp @@ -596,8 +596,7 @@ private: { if (stream != nullptr) { - oboe::Result result = stream->close(); - ignoreUnused (result); + [[maybe_unused]] oboe::Result result = stream->close(); JUCE_OBOE_LOG ("Requested Oboe stream close with result: " + getOboeString (result)); } } @@ -693,14 +692,15 @@ private: } // Not strictly required as these should not change, but recommended by Google anyway - void checkStreamSetup (OboeStream* stream, int deviceId, int numChannels, int expectedSampleRate, - int expectedBufferSize, oboe::AudioFormat format) + void checkStreamSetup (OboeStream* stream, + [[maybe_unused]] int deviceId, + [[maybe_unused]] int numChannels, + [[maybe_unused]] int expectedSampleRate, + [[maybe_unused]] int expectedBufferSize, + oboe::AudioFormat format) { - if (auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr) + if ([[maybe_unused]] auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr) { - ignoreUnused (deviceId, numChannels, sampleRate, expectedBufferSize); - ignoreUnused (streamFormat, bitDepth); - jassert (numChannels == 0 || numChannels == nativeStream->getChannelCount()); jassert (expectedSampleRate == 0 || expectedSampleRate == nativeStream->getSampleRate()); jassert (format == nativeStream->getFormat()); @@ -860,10 +860,8 @@ private: return oboe::DataCallbackResult::Continue; } - void printStreamDebugInfo (oboe::AudioStream* stream) + void printStreamDebugInfo ([[maybe_unused]] oboe::AudioStream* stream) { - ignoreUnused (stream); - JUCE_OBOE_LOG ("\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?")) + "\nDirection = " + (stream != nullptr ? getOboeString (stream->getDirection()) : String ("?")) + "\nSharingMode = " + (stream != nullptr ? getOboeString (stream->getSharingMode()) : String ("?")) @@ -928,10 +926,8 @@ private: return time.tv_sec * oboe::kNanosPerSecond + time.tv_nsec; } - void onErrorBeforeClose (oboe::AudioStream* stream, oboe::Result error) override + void onErrorBeforeClose (oboe::AudioStream* stream, [[maybe_unused]] oboe::Result error) override { - ignoreUnused (error); - // only output stream should be the master stream receiving callbacks jassert (stream->getDirection() == oboe::Direction::Output); @@ -1167,10 +1163,8 @@ public: JUCE_OBOE_LOG ("-----InputDevices:"); - for (auto& device : inputDevices) + for ([[maybe_unused]] auto& device : inputDevices) { - ignoreUnused (device); - JUCE_OBOE_LOG ("name = " << device.name); JUCE_OBOE_LOG ("id = " << String (device.id)); JUCE_OBOE_LOG ("sample rates size = " << String (device.sampleRates.size())); @@ -1179,10 +1173,8 @@ public: JUCE_OBOE_LOG ("-----OutputDevices:"); - for (auto& device : outputDevices) + for ([[maybe_unused]] auto& device : outputDevices) { - ignoreUnused (device); - JUCE_OBOE_LOG ("name = " << device.name); JUCE_OBOE_LOG ("id = " << String (device.id)); JUCE_OBOE_LOG ("sample rates size = " << String (device.sampleRates.size())); @@ -1259,7 +1251,12 @@ public: case 22: return "USB headset"; case 23: return "hearing aid"; case 24: return "built-in speaker safe"; - case 25: return {}; + case 25: return "remote submix"; + case 26: return "BLE headset"; + case 27: return "BLE speaker"; + case 28: return "echo reference"; + case 29: return "HDMI eARC"; + case 30: return "BLE broadcast"; default: jassertfalse; return {}; // type not supported yet, needs to be added! } } @@ -1392,17 +1389,15 @@ public: return oboe::DataCallbackResult::Continue; } - void onErrorBeforeClose (oboe::AudioStream*, oboe::Result error) override + void onErrorBeforeClose (oboe::AudioStream*, [[maybe_unused]] oboe::Result error) override { JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorBeforeClose(): " + getOboeString (error)); - ignoreUnused (error); jassertfalse; // Should never get here! } - void onErrorAfterClose (oboe::AudioStream*, oboe::Result error) override + void onErrorAfterClose (oboe::AudioStream*, [[maybe_unused]] oboe::Result error) override { JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorAfterClose(): " + getOboeString (error)); - ignoreUnused (error); jassertfalse; // Should never get here! } @@ -1420,20 +1415,22 @@ private: }; //============================================================================== -pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr); -pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr) +RealtimeThreadFactory getAndroidRealtimeThreadFactory() { - auto thread = std::make_unique(); + return [] (void* (*entry) (void*), void* userPtr) -> pthread_t + { + auto thread = std::make_unique(); - if (! thread->isOk()) - return {}; + if (! thread->isOk()) + return {}; - auto threadID = thread->startThread (entry, userPtr); + auto threadID = thread->startThread (entry, userPtr); - // the thread will de-allocate itself - thread.release(); + // the thread will de-allocate itself + thread.release(); - return threadID; + return threadID; + }; } } // namespace juce diff --git a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp index 674f827e..f0e6d939 100644 --- a/modules/juce_audio_devices/native/juce_android_OpenSL.cpp +++ b/modules/juce_audio_devices/native/juce_android_OpenSL.cpp @@ -601,7 +601,7 @@ public: } } - void process (const float** inputChannelData, float** outputChannelData) + void process (const float* const* inputChannelData, float* const* outputChannelData) { if (auto* cb = callback.exchange (nullptr)) { @@ -750,8 +750,8 @@ public: T* recorderBuffer = (inputChannels > 0 ? recorder->getNextBuffer() : nullptr); T* playerBuffer = (outputChannels > 0 ? player->getNextBuffer() : nullptr); - const float** inputChannelData = nullptr; - float** outputChannelData = nullptr; + const float* const* inputChannelData = nullptr; + float* const* outputChannelData = nullptr; if (recorderBuffer != nullptr) { @@ -1273,20 +1273,22 @@ private: }; //============================================================================== -pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr); -pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr) +RealtimeThreadFactory getAndroidRealtimeThreadFactory() { - auto thread = std::make_unique(); + return [] (void* (*entry) (void*), void* userPtr) -> pthread_t + { + auto thread = std::make_unique(); - if (! thread->isOk()) - return {}; + if (! thread->isOk()) + return {}; - auto threadID = thread->startThread (entry, userPtr); + auto threadID = thread->startThread (entry, userPtr); - // the thread will de-allocate itself - thread.release(); + // the thread will de-allocate itself + thread.release(); - return threadID; + return threadID; + }; } } // namespace juce diff --git a/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/modules/juce_audio_devices/native/juce_ios_Audio.cpp index 6fa620f2..edf1db75 100644 --- a/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ b/modules/juce_audio_devices/native/juce_ios_Audio.cpp @@ -579,16 +579,15 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater impl.fillHostCallbackInfo (callbackInfo); Boolean hostIsPlaying = NO; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - &hostIsPlaying, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr); + [[maybe_unused]] OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + &hostIsPlaying, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr); - ignoreUnused (err); jassert (err == noErr); if (hostIsPlaying != shouldSartPlaying) @@ -604,15 +603,14 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater impl.fillHostCallbackInfo (callbackInfo); Boolean hostIsRecording = NO; - OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, - nullptr, - &hostIsRecording, - nullptr, - nullptr, - nullptr, - nullptr, - nullptr); - ignoreUnused (err); + [[maybe_unused]] OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData, + nullptr, + &hostIsRecording, + nullptr, + nullptr, + nullptr, + nullptr, + nullptr); jassert (err == noErr); if (hostIsRecording != shouldStartRecording) @@ -808,11 +806,9 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater void handleAudioUnitPropertyChange (AudioUnit, AudioUnitPropertyID propertyID, - AudioUnitScope scope, - AudioUnitElement element) + [[maybe_unused]] AudioUnitScope scope, + [[maybe_unused]] AudioUnitElement element) { - ignoreUnused (scope); - ignoreUnused (element); JUCE_IOS_AUDIO_LOG ("handleAudioUnitPropertyChange: propertyID: " << String (propertyID) << " scope: " << String (scope) << " element: " << String (element)); @@ -834,9 +830,8 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater { UInt32 connected; UInt32 dataSize = sizeof (connected); - OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_IsInterAppConnected, - kAudioUnitScope_Global, 0, &connected, &dataSize); - ignoreUnused (err); + [[maybe_unused]] OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_IsInterAppConnected, + kAudioUnitScope_Global, 0, &connected, &dataSize); jassert (err == noErr); JUCE_IOS_AUDIO_LOG ("handleInterAppAudioConnectionChange: " << (connected ? "connected" @@ -1078,21 +1073,19 @@ struct iOSAudioIODevice::Pimpl : public AsyncUpdater { zerostruct (callbackInfo); UInt32 dataSize = sizeof (HostCallbackInfo); - OSStatus err = AudioUnitGetProperty (audioUnit, - kAudioUnitProperty_HostCallbacks, - kAudioUnitScope_Global, - 0, - &callbackInfo, - &dataSize); - ignoreUnused (err); + [[maybe_unused]] OSStatus err = AudioUnitGetProperty (audioUnit, + kAudioUnitProperty_HostCallbacks, + kAudioUnitScope_Global, + 0, + &callbackInfo, + &dataSize); jassert (err == noErr); } void handleAudioTransportEvent (AudioUnitRemoteControlEvent event) { - OSStatus err = AudioUnitSetProperty (audioUnit, kAudioOutputUnitProperty_RemoteControlToHost, - kAudioUnitScope_Global, 0, &event, sizeof (event)); - ignoreUnused (err); + [[maybe_unused]] OSStatus err = AudioUnitSetProperty (audioUnit, kAudioOutputUnitProperty_RemoteControlToHost, + kAudioUnitScope_Global, 0, &event, sizeof (event)); jassert (err == noErr); } diff --git a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp index c1be61a3..4cce7016 100644 --- a/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp +++ b/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp @@ -544,21 +544,19 @@ private: } } - static void infoShutdownCallback (jack_status_t code, const char* reason, void* arg) + static void infoShutdownCallback (jack_status_t code, [[maybe_unused]] const char* reason, void* arg) { jassertquiet (code == 0); JUCE_JACK_LOG ("Shutting down with message:"); JUCE_JACK_LOG (reason); - ignoreUnused (reason); shutdownCallback (arg); } - static void errorCallback (const char* msg) + static void errorCallback ([[maybe_unused]] const char* msg) { JUCE_JACK_LOG ("JackAudioIODevice::errorCallback " + String (msg)); - ignoreUnused (msg); } bool deviceIsOpen = false; diff --git a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp index 370874d3..90d54e38 100644 --- a/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ b/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp @@ -1605,8 +1605,7 @@ public: } } - open (inputChannelsRequested, outputChannelsRequested, - newSampleRate, newBufferSize); + open (inputChannelsRequested, outputChannelsRequested, newSampleRate, newBufferSize); start (cb); } @@ -1696,6 +1695,7 @@ private: CriticalSection closeLock; int targetLatency = 0; std::atomic xruns { -1 }; + std::atomic lastValidReadPosition { invalidSampleTime }; BigInteger inputChannelsRequested, outputChannelsRequested; double sampleRateRequested = 44100; @@ -1793,8 +1793,9 @@ private: } auto currentWritePos = writePos.load(); + const auto nextWritePos = currentWritePos + static_cast (n); - writePos.compare_exchange_strong (currentWritePos, currentWritePos + static_cast (n)); + writePos.compare_exchange_strong (currentWritePos, nextWritePos); if (currentWritePos == invalidSampleTime) return; @@ -1818,6 +1819,11 @@ private: scratchBuffer.getReadPointer (args.channel, args.inputPos), args.nItems); }); + + { + auto invalid = invalidSampleTime; + lastValidReadPosition.compare_exchange_strong (invalid, nextWritePos); + } } void outputAudioCallback (float* const* channels, int numChannels, int n) noexcept @@ -1840,16 +1846,29 @@ private: } } - accessFifo (currentReadPos, numChannels, n, [&] (const auto& args) + // If there was an xrun, we want to output zeros until we're sure that there's some valid + // input for us to read. + const auto longN = static_cast (n); + const auto nextReadPos = currentReadPos + longN; + const auto validReadPos = lastValidReadPosition.load(); + const auto sanitisedValidReadPos = validReadPos != invalidSampleTime ? validReadPos : nextReadPos; + const auto numZerosToWrite = sanitisedValidReadPos <= currentReadPos + ? 0 + : jmin (longN, sanitisedValidReadPos - currentReadPos); + + for (auto i = 0; i < numChannels; ++i) + std::fill (channels[i], channels[i] + numZerosToWrite, 0.0f); + + accessFifo (currentReadPos + numZerosToWrite, numChannels, static_cast (longN - numZerosToWrite), [&] (const auto& args) { - FloatVectorOperations::copy (channels[args.channel] + args.inputPos, + FloatVectorOperations::copy (channels[args.channel] + args.inputPos + numZerosToWrite, fifo.getReadPointer (args.channel, args.fifoPos), args.nItems); }); // use compare exchange here as we need to avoid the case // where we overwrite readPos being equal to invalidSampleTime - readPos.compare_exchange_strong (currentReadPos, currentReadPos + static_cast (n)); + readPos.compare_exchange_strong (currentReadPos, nextReadPos); } void xrun() noexcept @@ -1914,7 +1933,8 @@ private: struct DeviceWrapper : public AudioIODeviceCallback { DeviceWrapper (AudioIODeviceCombiner& cd, std::unique_ptr d, bool shouldBeInput) - : owner (cd), device (std::move (d)), + : owner (cd), + device (std::move (d)), input (shouldBeInput) { device->setAsyncRestarter (&owner); @@ -1974,7 +1994,7 @@ private: std::uint64_t nsToSampleTime (std::uint64_t ns) const noexcept { - return static_cast (std::round (static_cast (ns) * owner.currentSampleRate * 1e-9)); + return static_cast (std::round (static_cast (ns) * device->getCurrentSampleRate() * 1e-9)); } void updateSampleTimeFromContext (const AudioIODeviceCallbackContext& context) noexcept @@ -1987,7 +2007,7 @@ private: auto copy = invalidSampleTime; if (sampleTime.compare_exchange_strong (copy, callbackSampleTime) && (! input)) - owner.fifo.clear(); + owner.lastValidReadPosition = invalidSampleTime; } bool isInput() const { return input; } diff --git a/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm b/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm index 7e1511de..fd61986e 100644 --- a/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm +++ b/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm @@ -29,7 +29,7 @@ namespace juce namespace CoreMidiHelpers { - static bool checkError (OSStatus err, int lineNum) + static bool checkError (OSStatus err, [[maybe_unused]] int lineNum) { if (err == noErr) return true; @@ -38,7 +38,6 @@ namespace CoreMidiHelpers Logger::writeToLog ("CoreMIDI error: " + String (lineNum) + " - " + String::toHexString ((int) err)); #endif - ignoreUnused (lineNum); return false; } diff --git a/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp b/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp index 23980401..017bee61 100644 --- a/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp +++ b/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp @@ -251,8 +251,8 @@ public: if (pOutputBuffer != nullptr) { JUCE_DS_LOG ("closing output: " + name); - HRESULT hr = pOutputBuffer->Stop(); - JUCE_DS_LOG_ERROR (hr); ignoreUnused (hr); + [[maybe_unused]] HRESULT hr = pOutputBuffer->Stop(); + JUCE_DS_LOG_ERROR (hr); pOutputBuffer->Release(); pOutputBuffer = nullptr; @@ -555,8 +555,8 @@ public: if (pInputBuffer != nullptr) { JUCE_DS_LOG ("closing input: " + name); - HRESULT hr = pInputBuffer->Stop(); - JUCE_DS_LOG_ERROR (hr); ignoreUnused (hr); + [[maybe_unused]] HRESULT hr = pInputBuffer->Stop(); + JUCE_DS_LOG_ERROR (hr); pInputBuffer->Release(); pInputBuffer = nullptr; diff --git a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp index d20b6e02..b516cdbb 100644 --- a/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp +++ b/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp @@ -33,9 +33,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token") namespace WasapiClasses { -static void logFailure (HRESULT hr) +static void logFailure ([[maybe_unused]] HRESULT hr) { - ignoreUnused (hr); jassert (hr != (HRESULT) 0x800401f0); // If you hit this, it means you're trying to call from // a thread which hasn't been initialised with CoInitialize(). diff --git a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp index 586f2849..99eb16c1 100644 --- a/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp +++ b/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp @@ -61,10 +61,8 @@ void AudioSourcePlayer::audioDeviceIOCallbackWithContext (const float* const* in float* const* outputChannelData, int totalNumOutputChannels, int numSamples, - const AudioIODeviceCallbackContext& context) + [[maybe_unused]] const AudioIODeviceCallbackContext& context) { - ignoreUnused (context); - // these should have been prepared by audioDeviceAboutToStart()... jassert (sampleRate > 0 && bufferSize > 0); diff --git a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp index 2d1ed970..6974d048 100644 --- a/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp @@ -721,8 +721,7 @@ private: { using namespace AiffFileHelpers; - const bool couldSeekOk = output->setPosition (headerPosition); - ignoreUnused (couldSeekOk); + [[maybe_unused]] const bool couldSeekOk = output->setPosition (headerPosition); // if this fails, you've given it an output stream that can't seek! It needs // to be able to seek back to write the header diff --git a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp index 66783df8..e743ae66 100644 --- a/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp @@ -496,8 +496,7 @@ public: packUint32 ((FLAC__uint32) info.total_samples, buffer + 14, 4); memcpy (buffer + 18, info.md5sum, 16); - const bool seekOk = output->setPosition (streamStartPos + 4); - ignoreUnused (seekOk); + [[maybe_unused]] const bool seekOk = output->setPosition (streamStartPos + 4); // if this fails, you've given it an output stream that can't seek! It needs // to be able to seek back to write the header diff --git a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp index 1120b0ff..00f31082 100644 --- a/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp @@ -112,8 +112,8 @@ private: if (cp.start (processArgs)) { - auto childOutput = cp.readAllProcessOutput(); - DBG (childOutput); ignoreUnused (childOutput); + [[maybe_unused]] auto childOutput = cp.readAllProcessOutput(); + DBG (childOutput); cp.waitForProcessToFinish (10000); return tempMP3.getFile().getSize() > 0; diff --git a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp index 8ce23321..cb7af04c 100644 --- a/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp @@ -262,7 +262,7 @@ private: void checkCoInitialiseCalled() { - ignoreUnused (CoInitialize (nullptr)); + [[maybe_unused]] const auto result = CoInitialize (nullptr); } void scanFileForDetails() diff --git a/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp b/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp index d3b0f205..a8c974d2 100644 --- a/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp +++ b/modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp @@ -121,11 +121,11 @@ bool ARAAudioSourceReader::readSamples (int* const* destSamples, int numDestChan const auto destSize = (bitsPerSample / 8) * (size_t) numSamples; const auto bufferOffset = (int) (bitsPerSample / 8) * startOffsetInDestBuffer; - if (isValid() && hostReader != nullptr) + if (isValid()) { const ScopedTryReadLock readLock (lock); - if (readLock.isLocked()) + if (readLock.isLocked() && hostReader != nullptr) { for (size_t i = 0; i < tmpPtrs.size(); ++i) { diff --git a/modules/juce_audio_formats/juce_audio_formats.h b/modules/juce_audio_formats/juce_audio_formats.h index ee4bcab3..b0aee51d 100644 --- a/modules/juce_audio_formats/juce_audio_formats.h +++ b/modules/juce_audio_formats/juce_audio_formats.h @@ -35,7 +35,7 @@ ID: juce_audio_formats vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE audio file format codecs description: Classes for reading and writing various audio file formats. website: http://www.juce.com/juce diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp index 9e2bc3f0..f0c72288 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -71,11 +71,19 @@ static_assert (AAX_SDK_CURRENT_REVISION >= AAX_SDK_2p3p0_REVISION, "JUCE require #include #include -#ifdef AAX_SDK_2p3p1_REVISION - #if AAX_SDK_CURRENT_REVISION >= AAX_SDK_2p3p1_REVISION - #include - #include - #endif +#if defined (AAX_SDK_2p3p1_REVISION) && AAX_SDK_2p3p1_REVISION <= AAX_SDK_CURRENT_REVISION + #include + #include +#endif + +#if defined (AAX_SDK_2p4p0_REVISION) && AAX_SDK_2p4p0_REVISION <= AAX_SDK_CURRENT_REVISION + #define JUCE_AAX_HAS_TRANSPORT_NOTIFICATION 1 +#else + #define JUCE_AAX_HAS_TRANSPORT_NOTIFICATION 0 +#endif + +#if JUCE_AAX_HAS_TRANSPORT_NOTIFICATION + #include #endif JUCE_END_IGNORE_WARNINGS_MSVC @@ -739,8 +747,6 @@ namespace AAXClasses static AAX_CEffectParameters* AAX_CALLBACK Create() { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_AAX; - if (PluginHostType::jucePlugInIsRunningInAudioSuiteFn == nullptr) { PluginHostType::jucePlugInIsRunningInAudioSuiteFn = [] (AudioProcessor& processor) @@ -880,7 +886,7 @@ namespace AAXClasses case JUCEAlgorithmIDs::preparedFlag: { - const_cast(this)->preparePlugin(); + const_cast (this)->preparePlugin(); auto numObjects = dataSize / sizeof (uint32_t); auto* objects = static_cast (data); @@ -1049,14 +1055,16 @@ namespace AAXClasses return transport.GetCurrentTempo (&bpm) == AAX_SUCCESS ? makeOptional (bpm) : nullopt; }()); - info.setTimeSignature ([&] + const auto signature = [&] { int32_t num = 4, den = 4; return transport.GetCurrentMeter (&num, &den) == AAX_SUCCESS - ? makeOptional (TimeSignature { (int) num, (int) den }) - : nullopt; - }()); + ? makeOptional (TimeSignature { (int) num, (int) den }) + : nullopt; + }(); + + info.setTimeSignature (signature); info.setIsPlaying ([&] { @@ -1065,27 +1073,31 @@ namespace AAXClasses return transport.IsTransportPlaying (&isPlaying) == AAX_SUCCESS && isPlaying; }()); - info.setTimeInSamples ([&] + info.setIsRecording (recordingState.get().orFallback (false)); + + const auto optionalTimeInSamples = [&info, &transport] { int64_t timeInSamples = 0; - return ((! info.getIsPlaying() && transport.GetTimelineSelectionStartPosition (&timeInSamples) == AAX_SUCCESS) - || transport.GetCurrentNativeSampleLocation (&timeInSamples) == AAX_SUCCESS) - ? makeOptional (timeInSamples) - : nullopt; - }()); + || transport.GetCurrentNativeSampleLocation (&timeInSamples) == AAX_SUCCESS) + ? makeOptional (timeInSamples) + : nullopt; + }(); - info.setTimeInSeconds ((float) info.getTimeInSamples().orFallback (0) / sampleRate); + info.setTimeInSamples (optionalTimeInSamples); + info.setTimeInSeconds ((float) optionalTimeInSamples.orFallback (0) / sampleRate); - info.setPpqPosition ([&] + const auto tickPosition = [&] { int64_t ticks = 0; - return ((info.getIsPlaying() && transport.GetCustomTickPosition (&ticks, info.getTimeInSamples().orFallback (0))) == AAX_SUCCESS) - || transport.GetCurrentTickPosition (&ticks) == AAX_SUCCESS - ? makeOptional (ticks / 960000.0) - : nullopt; - }()); + return ((info.getIsPlaying() && transport.GetCustomTickPosition (&ticks, optionalTimeInSamples.orFallback (0))) == AAX_SUCCESS) + || transport.GetCurrentTickPosition (&ticks) == AAX_SUCCESS + ? makeOptional (ticks) + : nullopt; + }(); + + info.setPpqPosition (tickPosition.hasValue() ? makeOptional (static_cast (*tickPosition) / 960'000.0) : nullopt); bool isLooping = false; int64_t loopStartTick = 0, loopEndTick = 0; @@ -1142,6 +1154,28 @@ namespace AAXClasses const auto effectiveRate = info.getFrameRate().hasValue() ? info.getFrameRate()->getEffectiveRate() : 0.0; info.setEditOriginTime (makeOptional (effectiveRate != 0.0 ? offset / effectiveRate : offset)); + { + int32_t bars{}, beats{}; + int64_t displayTicks{}; + + if (optionalTimeInSamples.hasValue() + && transport.GetBarBeatPosition (&bars, &beats, &displayTicks, *optionalTimeInSamples) == AAX_SUCCESS) + { + info.setBarCount (bars); + + if (signature.hasValue()) + { + const auto ticksSinceBar = static_cast (((beats - 1) * 4 * 960'000) / signature->denominator) + displayTicks; + + if (tickPosition.hasValue() && ticksSinceBar <= tickPosition) + { + const auto barStartInTicks = static_cast (*tickPosition - ticksSinceBar); + info.setPpqPositionOfLastBarStart (barStartInTicks / 960'000.0); + } + } + } + } + return info; } @@ -1225,6 +1259,16 @@ namespace AAXClasses updateSidechainState(); break; } + + #if JUCE_AAX_HAS_TRANSPORT_NOTIFICATION + case AAX_eNotificationEvent_TransportStateChanged: + if (data != nullptr) + { + const auto& info = *static_cast (data); + recordingState.set (info.mIsRecording); + } + break; + #endif } return AAX_CEffectParameters::NotificationReceived (type, data, size); @@ -1237,7 +1281,7 @@ namespace AAXClasses if (idx < mainNumIns) return inputs[inputLayoutMap[idx]]; - return (sidechain != -1 ? inputs[sidechain] : sideChainBuffer.getData()); + return (sidechain != -1 ? inputs[sidechain] : sideChainBuffer.data()); } void process (const float* const* inputs, float* const* outputs, const int sideChainBufferIdx, @@ -1499,11 +1543,10 @@ namespace AAXClasses friend void AAX_CALLBACK AAXClasses::algorithmProcessCallback (JUCEAlgorithmContext* const instancesBegin[], const void* const instancesEnd); void process (float* const* channels, const int numChans, const int bufferSize, - const bool bypass, AAX_IMIDINode* midiNodeIn, AAX_IMIDINode* midiNodesOut) + const bool bypass, [[maybe_unused]] AAX_IMIDINode* midiNodeIn, [[maybe_unused]] AAX_IMIDINode* midiNodesOut) { AudioBuffer buffer (channels, numChans, bufferSize); midiBuffer.clear(); - ignoreUnused (midiNodeIn, midiNodesOut); #if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect { @@ -1525,19 +1568,15 @@ namespace AAXClasses if (lastBufferSize != bufferSize) { lastBufferSize = bufferSize; - pluginInstance->setRateAndBufferSizeDetails (sampleRate, bufferSize); + pluginInstance->setRateAndBufferSizeDetails (sampleRate, lastBufferSize); + // we only call prepareToPlay here if the new buffer size is larger than + // the one used last time prepareToPlay was called. + // currently, this should never actually happen, because as of Pro Tools 12, + // the maximum possible value is 1024, and we call prepareToPlay with that + // value during initialisation. if (bufferSize > maxBufferSize) - { - // we only call prepareToPlay here if the new buffer size is larger than - // the one used last time prepareToPlay was called. - // currently, this should never actually happen, because as of Pro Tools 12, - // the maximum possible value is 1024, and we call prepareToPlay with that - // value during initialisation. - pluginInstance->prepareToPlay (sampleRate, bufferSize); - maxBufferSize = bufferSize; - sideChainBuffer.calloc (static_cast (maxBufferSize)); - } + prepareProcessorWithSampleRateAndBufferSize (sampleRate, bufferSize); } if (bypass && pluginInstance->getBypassParameter() == nullptr) @@ -1802,14 +1841,10 @@ namespace AAXClasses audioProcessor.releaseResources(); } - audioProcessor.setRateAndBufferSizeDetails (sampleRate, lastBufferSize); - audioProcessor.prepareToPlay (sampleRate, lastBufferSize); - maxBufferSize = lastBufferSize; + prepareProcessorWithSampleRateAndBufferSize (sampleRate, lastBufferSize); midiBuffer.ensureSize (2048); midiBuffer.clear(); - - sideChainBuffer.calloc (static_cast (maxBufferSize)); } check (Controller()->SetSignalLatency (audioProcessor.getLatencySamples())); @@ -1871,6 +1906,16 @@ namespace AAXClasses } } + void prepareProcessorWithSampleRateAndBufferSize (double sr, int bs) + { + maxBufferSize = jmax (maxBufferSize, bs); + + auto& audioProcessor = getPluginInstance(); + audioProcessor.setRateAndBufferSizeDetails (sr, maxBufferSize); + audioProcessor.prepareToPlay (sr, maxBufferSize); + sideChainBuffer.resize (static_cast (maxBufferSize)); + } + //============================================================================== void updateSidechainState() { @@ -1878,7 +1923,7 @@ namespace AAXClasses return; auto& audioProcessor = getPluginInstance(); - bool sidechainActual = audioProcessor.getChannelCountOfBus (true, 1) > 0; + const auto sidechainActual = audioProcessor.getChannelCountOfBus (true, 1) > 0; if (hasSidechain && canDisableSidechain && sidechainDesired != sidechainActual) { @@ -1894,7 +1939,7 @@ namespace AAXClasses bus->setCurrentLayout (lastSideChainState ? AudioChannelSet::mono() : AudioChannelSet::disabled()); - audioProcessor.prepareToPlay (audioProcessor.getSampleRate(), audioProcessor.getBlockSize()); + prepareProcessorWithSampleRateAndBufferSize (audioProcessor.getSampleRate(), maxBufferSize); isPrepared = true; } @@ -2095,17 +2140,58 @@ namespace AAXClasses std::unique_ptr pluginInstance; + static constexpr auto maxSamplesPerBlock = 1 << AAX_eAudioBufferLength_Max; + bool isPrepared = false; MidiBuffer midiBuffer; Array channelList; int32_t juceChunkIndex = 0, numSetDirtyCalls = 0; AAX_CSampleRate sampleRate = 0; - int lastBufferSize = 1024, maxBufferSize = 1024; + int lastBufferSize = maxSamplesPerBlock, maxBufferSize = maxSamplesPerBlock; bool hasSidechain = false, canDisableSidechain = false, lastSideChainState = false; + /* Pro Tools 2021 sends TransportStateChanged on the main thread, but we read + the recording state on the audio thread. + I'm not sure whether Pro Tools ensures that these calls are mutually + exclusive, so to ensure there are no data races, we store the recording + state in an atomic int and convert it to/from an Optional as necessary. + */ + class RecordingState + { + public: + /* This uses Optional rather than std::optional for consistency with get() */ + void set (const Optional newState) + { + state.store (newState.hasValue() ? (flagValid | (*newState ? flagActive : 0)) + : 0, + std::memory_order_relaxed); + } + + /* PositionInfo::setIsRecording takes an Optional, so we use that type rather + than std::optional to avoid having to convert. + */ + Optional get() const + { + const auto loaded = state.load (std::memory_order_relaxed); + return ((loaded & flagValid) != 0) ? makeOptional ((loaded & flagActive) != 0) + : nullopt; + } + + private: + enum RecordingFlags + { + flagValid = 1 << 0, + flagActive = 1 << 1 + }; + + std::atomic state { 0 }; + }; + + RecordingState recordingState; + std::atomic processingSidechainChange, sidechainDesired; - HeapBlock sideChainBuffer; + std::vector sideChainBuffer; Array inputLayoutMap, outputLayoutMap; Array aaxParamIDs; @@ -2329,6 +2415,10 @@ namespace AAXClasses properties->AddProperty (AAX_eProperty_SupportsSaveRestore, false); #endif + #if JUCE_AAX_HAS_TRANSPORT_NOTIFICATION + properties->AddProperty (AAX_eProperty_ObservesTransportState, true); + #endif + if (fullLayout.getChannelSet (true, 1) == AudioChannelSet::mono()) { check (desc.AddSideChainIn (JUCEAlgorithmIDs::sideChainBuffers)); @@ -2391,10 +2481,9 @@ namespace AAXClasses return (AAX_STEM_FORMAT_INDEX (stemFormat) <= 12); } - static void getPlugInDescription (AAX_IEffectDescriptor& descriptor, const AAX_IFeatureInfo* featureInfo) + static void getPlugInDescription (AAX_IEffectDescriptor& descriptor, [[maybe_unused]] const AAX_IFeatureInfo* featureInfo) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_AAX; - std::unique_ptr plugin (createPluginFilterOfType (AudioProcessor::wrapperType_AAX)); + auto plugin = createPluginFilterOfType (AudioProcessor::wrapperType_AAX); auto numInputBuses = plugin->getBusCount (true); auto numOutputBuses = plugin->getBusCount (false); @@ -2424,7 +2513,6 @@ namespace AAXClasses #if JucePlugin_IsMidiEffect // MIDI effect plug-ins do not support any audio channels jassert (numInputBuses == 0 && numOutputBuses == 0); - ignoreUnused (featureInfo); if (auto* desc = descriptor.NewComponentDescriptor()) { diff --git a/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp b/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp index 1e4a4bc1..c4ca28b3 100644 --- a/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp +++ b/modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp @@ -25,11 +25,19 @@ #include #include +#include +#include #ifdef _WIN32 + #undef UNICODE + #undef _UNICODE + + #define UNICODE 1 + #define _UNICODE 1 + #include #include - HMODULE dlopen (const char* filename, int) { return LoadLibrary (filename); } + HMODULE dlopen (const TCHAR* filename, int) { return LoadLibrary (filename); } FARPROC dlsym (HMODULE handle, const char* name) { return GetProcAddress (handle, name); } void printError() { @@ -44,12 +52,61 @@ numElements - 1, nullptr); - _tprintf ("%s", messageBuffer); + _tprintf (_T ("%s"), messageBuffer); } + enum { RTLD_LAZY = 0 }; + + class ArgList + { + public: + ArgList (int, const char**) {} + ArgList (const ArgList&) = delete; + ArgList (ArgList&&) = delete; + ArgList& operator= (const ArgList&) = delete; + ArgList& operator= (ArgList&&) = delete; + ~ArgList() { LocalFree (argv); } + + LPWSTR get (int i) const { return argv[i]; } + + int size() const { return argc; } + + private: + int argc = 0; + LPWSTR* argv = CommandLineToArgvW (GetCommandLineW(), &argc); + }; + + std::vector toUTF8 (const TCHAR* str) + { + const auto numBytes = WideCharToMultiByte (CP_UTF8, 0, str, -1, nullptr, 0, nullptr, nullptr); + std::vector result (numBytes); + WideCharToMultiByte (CP_UTF8, 0, str, -1, result.data(), static_cast (result.size()), nullptr, nullptr); + return result; + } + #else #include void printError() { printf ("%s\n", dlerror()); } + class ArgList + { + public: + ArgList (int argcIn, const char** argvIn) : argc (argcIn), argv (argvIn) {} + ArgList (const ArgList&) = delete; + ArgList (ArgList&&) = delete; + ArgList& operator= (const ArgList&) = delete; + ArgList& operator= (ArgList&&) = delete; + ~ArgList() = default; + + const char* get (int i) const { return argv[i]; } + + int size() const { return argc; } + + private: + int argc = 0; + const char** argv = nullptr; + }; + + std::vector toUTF8 (const char* str) { return std::vector (str, str + std::strlen (str) + 1); } #endif // Replicating part of the LV2 header here so that we don't have to set up any @@ -74,10 +131,12 @@ extern "C" int main (int argc, const char** argv) { - if (argc != 2) + const ArgList argList { argc, argv }; + + if (argList.size() != 2) return 1; - const auto* libraryPath = argv[1]; + const auto* libraryPath = argList.get (1); struct RecallFeature { @@ -87,11 +146,22 @@ int main (int argc, const char** argv) if (auto* handle = dlopen (libraryPath, RTLD_LAZY)) { if (auto* getDescriptor = reinterpret_cast (dlsym (handle, "lv2_descriptor"))) + { if (auto* descriptor = getDescriptor (0)) + { if (auto* extensionData = descriptor->extension_data) + { if (auto* recallFeature = reinterpret_cast (extensionData ("https://lv2-extensions.juce.com/turtle_recall"))) + { if (auto* doRecall = recallFeature->doRecall) - return doRecall (libraryPath); + { + const auto converted = toUTF8 (libraryPath); + return doRecall (converted.data()); + } + } + } + } + } } else { diff --git a/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp index c27d3a71..2c1619b6 100644 --- a/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp +++ b/modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp @@ -124,7 +124,14 @@ public: */ static String getIri (const AudioProcessorParameter& param) { - return URL::addEscapeChars (LegacyAudioParameter::getParamID (¶m, false), true); + const auto urlSanitised = URL::addEscapeChars (LegacyAudioParameter::getParamID (¶m, false), true); + const auto ttlSanitised = lv2_shared::sanitiseStringAsTtlName (urlSanitised); + + // If this is hit, the parameter ID could not be represented directly in the plugin ttl. + // We'll replace offending characters with '_'. + jassert (urlSanitised == ttlSanitised); + + return ttlSanitised; } void setValueFromHost (LV2_URID urid, float value) noexcept @@ -217,6 +224,11 @@ private: result.push_back (urid); } + // If this is hit, some parameters have duplicate IDs. + // This may be because the IDs resolve to the same string when removing characters that + // are invalid in a TTL name. + jassert (std::set (result.begin(), result.end()).size() == result.size()); + return result; }(); const std::map uridToIndexMap = [&] @@ -505,8 +517,12 @@ public: void run (uint32_t numSteps) { + // If this is hit, the host is trying to process more samples than it told us to prepare + jassert (static_cast (numSteps) <= processor->getBlockSize()); + midi.clear(); playHead.invalidate(); + audio.setSize (audio.getNumChannels(), static_cast (numSteps), true, false, true); ports.forEachInputEvent ([&] (const LV2_Atom_Event* event) { @@ -536,7 +552,7 @@ public: processor->setNonRealtime (ports.isFreeWheeling()); for (auto i = 0, end = processor->getTotalNumInputChannels(); i < end; ++i) - audio.copyFrom (i, 0, ports.getBufferForAudioInput (i), (int) numSteps); + audio.copyFrom (i, 0, ports.getBufferForAudioInput (i), audio.getNumSamples()); jassert (countNaNs (audio) == 0); @@ -705,7 +721,7 @@ public: static std::unique_ptr createProcessorInstance() { - std::unique_ptr result { createPluginFilterOfType (AudioProcessor::wrapperType_LV2) }; + auto result = createPluginFilterOfType (AudioProcessor::wrapperType_LV2); #if defined (JucePlugin_PreferredChannelConfigurations) constexpr short channelConfigurations[][2] { JucePlugin_PreferredChannelConfigurations }; @@ -797,7 +813,11 @@ struct RecallFeature { const ScopedJuceInitialiser_GUI scope; const auto processor = LV2PluginInstance::createProcessorInstance(); - const File absolutePath { CharPointer_UTF8 { libraryPath } }; + + const String pathString { CharPointer_UTF8 { libraryPath } }; + + const auto absolutePath = File::isAbsolutePath (pathString) ? File (pathString) + : File::getCurrentWorkingDirectory().getChildFile (pathString); const auto writers = { writeManifestTtl, writeDspTtl, writeUiTtl }; @@ -820,15 +840,28 @@ private: return JucePlugin_LV2URI + String (uriSeparator) + "preset" + String (index + 1); } - static std::ofstream openStream (const File& libraryPath, StringRef name) + static FileOutputStream openStream (const File& libraryPath, StringRef name) { - return std::ofstream { libraryPath.getSiblingFile (name + ".ttl").getFullPathName().toRawUTF8() }; + return FileOutputStream { libraryPath.getSiblingFile (name + ".ttl") }; + } + + static Result prepareStream (FileOutputStream& stream) + { + if (const auto result = stream.getStatus(); ! result) + return result; + + stream.setPosition (0); + stream.truncate(); + return Result::ok(); } static Result writeManifestTtl (AudioProcessor& proc, const File& libraryPath) { auto os = openStream (libraryPath, "manifest"); + if (const auto result = prepareStream (os); ! result) + return result; + os << "@prefix lv2: .\n" "@prefix rdfs: .\n" "@prefix pset: .\n" @@ -847,7 +880,7 @@ private: #define JUCE_LV2_UI_KIND "CocoaUI" #elif JUCE_WINDOWS #define JUCE_LV2_UI_KIND "WindowsUI" - #elif JUCE_LINUX + #elif JUCE_LINUX || JUCE_BSD #define JUCE_LV2_UI_KIND "X11UI" #else #error "LV2 UI is unsupported on this platform" @@ -960,6 +993,9 @@ private: { auto os = openStream (libraryPath, "dsp"); + if (const auto result = prepareStream (os); ! result) + return result; + os << "@prefix atom: .\n" "@prefix bufs: .\n" "@prefix doap: .\n" @@ -1297,6 +1333,9 @@ private: auto os = openStream (libraryPath, "ui"); + if (const auto result = prepareStream (os); ! result) + return result; + const auto editorInstance = rawToUniquePtr (proc.createEditor()); const auto resizeFeatureString = editorInstance->isResizable() ? "ui:resize" : "ui:noUserResize"; @@ -1340,8 +1379,6 @@ private: //============================================================================== LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor (uint32_t index) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_LV2; - if (index != 0) return nullptr; diff --git a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp index 009707ec..1f13a1d8 100644 --- a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp +++ b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp @@ -50,8 +50,6 @@ class StandaloneFilterApp : public JUCEApplication public: StandaloneFilterApp() { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_Standalone; - PropertiesFile::Options options; options.applicationName = getApplicationName(); diff --git a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h index 884f7d40..6a96c9be 100644 --- a/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h +++ b/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h @@ -124,7 +124,7 @@ public: //============================================================================== virtual void createPlugin() { - processor.reset (createPluginFilterOfType (AudioProcessor::wrapperType_Standalone)); + processor = createPluginFilterOfType (AudioProcessor::wrapperType_Standalone); processor->disableNonMainBuses(); processor->setRateAndBufferSizeDetails (44100, 512); @@ -386,13 +386,12 @@ public: return false; } - Image getIAAHostIcon (int size) + Image getIAAHostIcon ([[maybe_unused]] int size) { #if JUCE_IOS && JucePlugin_Enable_IAA if (auto device = dynamic_cast (deviceManager.getCurrentAudioDevice())) return device->getIcon (size); #else - ignoreUnused (size); #endif return {}; diff --git a/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp b/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp index 74b5ec56..e2cc0f69 100644 --- a/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp @@ -158,10 +158,8 @@ private: return std::make_unique (Image (this)); } - void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override + void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, [[maybe_unused]] Image::BitmapData::ReadWriteMode mode) override { - ignoreUnused (mode); - const auto offset = (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride; bitmap.data = imageData + offset; bitmap.size = (size_t) (lineStride * height) - offset; @@ -294,7 +292,7 @@ class AudioProcessorUnityWrapper public: AudioProcessorUnityWrapper (bool isTemporary) { - pluginInstance.reset (createPluginFilterOfType (AudioProcessor::wrapperType_Unity)); + pluginInstance = createPluginFilterOfType (AudioProcessor::wrapperType_Unity); if (! isTemporary && pluginInstance->hasEditor()) { @@ -568,7 +566,6 @@ static UnityAudioEffectDefinition getEffectDefinition() result.setPosition = [] (UnityAudioEffectState* state, unsigned int pos) { ignoreUnused (state, pos); - return 0; }; @@ -674,11 +671,7 @@ UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API UnityGetAudioEffectDefinitions (U juce::initialiseJuce_GUI(); static std::once_flag flag; - std::call_once (flag, [] - { - juce::PluginHostType::jucePlugInClientCurrentWrapperType = juce::AudioProcessor::wrapperType_Unity; - juce::juce_createUnityPeerFn = juce::createUnityPeer; - }); + std::call_once (flag, [] { juce::juce_createUnityPeerFn = juce::createUnityPeer; }); static auto definition = juce::getEffectDefinition(); static UnityAudioEffectDefinition* definitions[] { &definition }; diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp index 1cee5c00..55226c66 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp @@ -962,14 +962,12 @@ public: , public Timer #endif { - EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor, float initialScale) + EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor, [[maybe_unused]] float initialScale) : wrapper (w) { editor.setOpaque (true); #if ! JUCE_MAC editor.setScaleFactor (initialScale); - #else - ignoreUnused (initialScale); #endif addAndMakeVisible (editor); @@ -1714,13 +1712,12 @@ private: return 0; } - pointer_sized_int handlePreAudioProcessingEvents (VstOpCodeArguments args) + pointer_sized_int handlePreAudioProcessingEvents ([[maybe_unused]] VstOpCodeArguments args) { #if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect VSTMidiEventList::addEventsToMidiBuffer ((Vst2::VstEvents*) args.ptr, midiEvents); return 1; #else - ignoreUnused (args); return 0; #endif } @@ -1973,13 +1970,13 @@ private: if (pluginHasSidechainsOrAuxs() || processor->isMidiEffect()) return false; - auto inputLayout = processor->getChannelLayoutOfBus (true, 0); - auto outputLayout = processor->getChannelLayoutOfBus (false, 0); + auto inputLayout = processor->getChannelLayoutOfBus (true, 0); + auto outputLayout = processor->getChannelLayoutOfBus (false, 0); - auto speakerBaseSize = sizeof (Vst2::VstSpeakerArrangement) - (sizeof (Vst2::VstSpeakerProperties) * 8); + const auto speakerBaseSize = offsetof (Vst2::VstSpeakerArrangement, speakers); - cachedInArrangement .malloc (speakerBaseSize + (static_cast (inputLayout. size()) * sizeof (Vst2::VstSpeakerArrangement)), 1); - cachedOutArrangement.malloc (speakerBaseSize + (static_cast (outputLayout.size()) * sizeof (Vst2::VstSpeakerArrangement)), 1); + cachedInArrangement .malloc (speakerBaseSize + (static_cast (inputLayout. size()) * sizeof (Vst2::VstSpeakerProperties)), 1); + cachedOutArrangement.malloc (speakerBaseSize + (static_cast (outputLayout.size()) * sizeof (Vst2::VstSpeakerProperties)), 1); *pluginInput = cachedInArrangement. getData(); *pluginOutput = cachedOutArrangement.getData(); @@ -2013,7 +2010,7 @@ private: return 0; } - pointer_sized_int handleSetContentScaleFactor (float scale, bool force = false) + pointer_sized_int handleSetContentScaleFactor ([[maybe_unused]] float scale, [[maybe_unused]] bool force = false) { checkWhetherMessageThreadIsCorrect(); #if JUCE_LINUX || JUCE_BSD @@ -2030,9 +2027,6 @@ private: if (editorComp != nullptr) editorComp->setContentScaleFactor (editorScaleFactor); } - - #else - ignoreUnused (scale, force); #endif return 1; @@ -2199,8 +2193,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster); JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST; - initialiseMacVST(); return pluginEntryPoint (audioMaster); } @@ -2208,8 +2200,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster); JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST; - initialiseMacVST(); return pluginEntryPoint (audioMaster); } @@ -2221,16 +2211,12 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster); JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST; - return pluginEntryPoint (audioMaster); } JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster) asm ("main"); JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST; - return VSTPluginMain (audioMaster); } @@ -2244,16 +2230,12 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") extern "C" __declspec (dllexport) Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST; - return pluginEntryPoint (audioMaster); } #if ! defined (JUCE_64BIT) && JUCE_MSVC // (can't compile this on win64, but it's not needed anyway with VST2.4) extern "C" __declspec (dllexport) int main (Vst2::audioMasterCallback audioMaster) { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST; - return (int) pluginEntryPoint (audioMaster); } #endif diff --git a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm index 8e3fab41..2c13881a 100644 --- a/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm +++ b/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm @@ -80,7 +80,7 @@ void initialiseMacVST() } JUCE_API void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, bool isNSView); -void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, bool isNSView) +void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, [[maybe_unused]] bool isNSView) { JUCE_AUTORELEASEPOOL { @@ -161,7 +161,6 @@ void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, } #endif - ignoreUnused (isNSView); NSView* parentView = [(NSView*) parentWindowOrView retain]; #if JucePlugin_EditorRequiresKeyboardFocus @@ -183,7 +182,7 @@ void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, } JUCE_API void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSView); -void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSView) +void detachComponentFromWindowRefVST (Component* comp, void* window, [[maybe_unused]] bool isNSView) { JUCE_AUTORELEASEPOOL { @@ -232,14 +231,13 @@ void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSVi } #endif - ignoreUnused (isNSView); comp->removeFromDesktop(); [(id) window release]; } } JUCE_API void setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, int newHeight, bool isNSView); -void setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, int newHeight, bool isNSView) +void setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, int newHeight, [[maybe_unused]] bool isNSView) { JUCE_AUTORELEASEPOOL { @@ -260,8 +258,6 @@ void setNativeHostWindowSizeVST (void* window, Component* component, int newWidt } #endif - ignoreUnused (isNSView); - if (NSView* hostView = (NSView*) window) { const int dx = newWidth - component->getWidth(); @@ -277,10 +273,10 @@ void setNativeHostWindowSizeVST (void* window, Component* component, int newWidt } JUCE_API void checkWindowVisibilityVST (void* window, Component* comp, bool isNSView); -void checkWindowVisibilityVST (void* window, Component* comp, bool isNSView) +void checkWindowVisibilityVST ([[maybe_unused]] void* window, + [[maybe_unused]] Component* comp, + [[maybe_unused]] bool isNSView) { - ignoreUnused (window, comp, isNSView); - #if ! JUCE_64BIT if (! isNSView) comp->setVisible ([((NSWindow*) window) isVisible]); @@ -288,7 +284,7 @@ void checkWindowVisibilityVST (void* window, Component* comp, bool isNSView) } JUCE_API bool forwardCurrentKeyEventToHostVST (Component* comp, bool isNSView); -bool forwardCurrentKeyEventToHostVST (Component* comp, bool isNSView) +bool forwardCurrentKeyEventToHostVST ([[maybe_unused]] Component* comp, [[maybe_unused]] bool isNSView) { #if ! JUCE_64BIT if (! isNSView) @@ -300,7 +296,6 @@ bool forwardCurrentKeyEventToHostVST (Component* comp, bool isNSView) } #endif - ignoreUnused (comp, isNSView); return false; } diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index 5e2c9749..da79dcc6 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -1075,14 +1075,15 @@ public: } //============================================================================== - tresult PLUGIN_API getMidiControllerAssignment (Steinberg::int32 /*busIndex*/, Steinberg::int16 channel, - Vst::CtrlNumber midiControllerNumber, Vst::ParamID& resultID) override + tresult PLUGIN_API getMidiControllerAssignment ([[maybe_unused]] Steinberg::int32 busIndex, + [[maybe_unused]] Steinberg::int16 channel, + [[maybe_unused]] Vst::CtrlNumber midiControllerNumber, + [[maybe_unused]] Vst::ParamID& resultID) override { #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS resultID = midiControllerToParameter[channel][midiControllerNumber]; return kResultTrue; // Returning false makes some hosts stop asking for further MIDI Controller Assignments #else - ignoreUnused (channel, midiControllerNumber, resultID); return kResultFalse; #endif } @@ -1991,7 +1992,7 @@ private: return kResultFalse; } - tresult PLUGIN_API setContentScaleFactor (const Steinberg::IPlugViewContentScaleSupport::ScaleFactor factor) override + tresult PLUGIN_API setContentScaleFactor ([[maybe_unused]] const Steinberg::IPlugViewContentScaleSupport::ScaleFactor factor) override { #if ! JUCE_MAC const auto scaleToApply = [&] @@ -2016,7 +2017,6 @@ private: return kResultTrue; #else - ignoreUnused (factor); return kResultFalse; #endif } @@ -2420,16 +2420,15 @@ class JuceVST3Component : public Vst::IComponent, { public: JuceVST3Component (Vst::IHostApplication* h) - : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3)), + : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3).release()), host (h) { inParameterChangedCallback = false; #ifdef JucePlugin_PreferredChannelConfigurations short configs[][2] = { JucePlugin_PreferredChannelConfigurations }; - const int numConfigs = numElementsInArray (configs); + [[maybe_unused]] const int numConfigs = numElementsInArray (configs); - ignoreUnused (numConfigs); jassert (numConfigs > 0 && (configs[0][0] > 0 || configs[0][1] > 0)); pluginInstance->setPlayConfigDetails (configs[0][0], configs[0][1], 44100.0, 1024); @@ -2552,27 +2551,32 @@ public: //============================================================================== tresult PLUGIN_API setActive (TBool state) override { - active = (state != 0); + const auto willBeActive = (state != 0); - if (! state) - { - getPluginInstance().releaseResources(); - } - else - { - auto sampleRate = getPluginInstance().getSampleRate(); - auto bufferSize = getPluginInstance().getBlockSize(); + active = false; + // Some hosts may call setBusArrangements in response to calls made during prepareToPlay + // or releaseResources. Specifically, Wavelab 11.1 calls setBusArrangements in the same + // call stack when the AudioProcessor calls setLatencySamples inside prepareToPlay. + // In order for setBusArrangements to return successfully, the plugin must not be activated + // until after prepareToPlay has completely finished. + const ScopeGuard scope { [&] { active = willBeActive; } }; - sampleRate = processSetup.sampleRate > 0.0 - ? processSetup.sampleRate - : sampleRate; + if (willBeActive) + { + const auto sampleRate = processSetup.sampleRate > 0.0 + ? processSetup.sampleRate + : getPluginInstance().getSampleRate(); - bufferSize = processSetup.maxSamplesPerBlock > 0 - ? (int) processSetup.maxSamplesPerBlock - : bufferSize; + const auto bufferSize = processSetup.maxSamplesPerBlock > 0 + ? (int) processSetup.maxSamplesPerBlock + : getPluginInstance().getBlockSize(); preparePlugin (sampleRate, bufferSize, CallPrepareToPlay::yes); } + else + { + getPluginInstance().releaseResources(); + } return kResultOk; } @@ -4164,8 +4168,6 @@ using namespace juce; // The VST3 plugin entry point. extern "C" SMTG_EXPORT_SYMBOL IPluginFactory* PLUGIN_API GetPluginFactory() { - PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST3; - #if (JUCE_MSVC || (JUCE_WINDOWS && JUCE_CLANG)) && JUCE_32BIT // Cunning trick to force this function to be exported. Life's too short to // faff around creating .def files for this kind of thing. diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h index c355cade..bb055d07 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client.h +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client.h @@ -35,7 +35,7 @@ ID: juce_audio_plugin_client vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE audio plugin wrapper classes description: Classes for building VST, VST3, AU, AUv3 and AAX plugins. website: http://www.juce.com/juce diff --git a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp index 0eaf4685..e4c5c25b 100644 --- a/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp +++ b/modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp @@ -44,6 +44,8 @@ JUCE_CREATE_APPLICATION_DEFINE(juce::StandaloneFilterApp) #endif -JUCE_MAIN_FUNCTION_DEFINITION +#if ! JUCE_USE_CUSTOM_PLUGIN_STANDALONE_ENTRYPOINT + JUCE_MAIN_FUNCTION_DEFINITION +#endif #endif diff --git a/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h b/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h index a5b7a1f5..50dfd51f 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h +++ b/modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h @@ -28,17 +28,18 @@ namespace juce { -inline AudioProcessor* JUCE_API JUCE_CALLTYPE createPluginFilterOfType (AudioProcessor::WrapperType type) +inline std::unique_ptr createPluginFilterOfType (AudioProcessor::WrapperType type) { + PluginHostType::jucePlugInClientCurrentWrapperType = type; AudioProcessor::setTypeOfNextNewPlugin (type); - AudioProcessor* const pluginInstance = ::createPluginFilter(); + auto pluginInstance = rawToUniquePtr (::createPluginFilter()); AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Undefined); // your createPluginFilter() method must return an object! jassert (pluginInstance != nullptr && pluginInstance->wrapperType == type); #if JucePlugin_Enable_ARA - jassert (dynamic_cast (pluginInstance) != nullptr); + jassert (dynamic_cast (pluginInstance.get()) != nullptr); #endif return pluginInstance; diff --git a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp index 0c2e7a17..f6b4b268 100644 --- a/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp +++ b/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp @@ -56,7 +56,7 @@ namespace juce const auto juce_strcat = [] (auto&& head, auto&&... tail) { strcat_s (head, numElementsInArray (head), tail...); }; const auto juce_sscanf = [] (auto&&... args) { sscanf_s (args...); }; #else - const auto juce_sprintf = [] (auto&&... args) { sprintf (args...); }; + const auto juce_sprintf = [] (auto&& head, auto&&... tail) { snprintf (head, (size_t) numElementsInArray (head), tail...); }; const auto juce_strcpy = [] (auto&&... args) { strcpy (args...); }; const auto juce_strcat = [] (auto&&... args) { strcat (args...); }; const auto juce_sscanf = [] (auto&&... args) { sscanf (args...); }; @@ -134,7 +134,10 @@ namespace juce #if JucePlugin_Build_VST bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float); - bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float) + bool JUCE_API handleManufacturerSpecificVST2Opcode ([[maybe_unused]] int32 index, + [[maybe_unused]] pointer_sized_int value, + [[maybe_unused]] void* ptr, + float) { #if VST3_REPLACEMENT_AVAILABLE if ((index == (int32) ByteOrder::bigEndianInt ("stCA") || index == (int32) ByteOrder::bigEndianInt ("stCa")) @@ -145,8 +148,6 @@ namespace juce ::memcpy (ptr, fuid, 16); return true; } - #else - ignoreUnused (index, value, ptr); #endif return false; } diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp index 9ba57bea..3e5c029b 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp @@ -64,10 +64,8 @@ void AudioPluginFormatManager::addDefaultFormats() #if JUCE_DEBUG // you should only call this method once! - for (auto* format : formats) + for (auto* format [[maybe_unused]] : formats) { - ignoreUnused (format); - #if HAS_VST jassert (dynamic_cast (format) == nullptr); #endif diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index 359c238f..ef7b30ad 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -179,14 +179,15 @@ namespace AudioUnitFormatHelpers return false; } - static bool getComponentDescFromFile (const String& fileOrIdentifier, AudioComponentDescription& desc, - String& name, String& version, String& manufacturer) + static bool getComponentDescFromFile ([[maybe_unused]] const String& fileOrIdentifier, + [[maybe_unused]] AudioComponentDescription& desc, + [[maybe_unused]] String& name, + [[maybe_unused]] String& version, + [[maybe_unused]] String& manufacturer) { zerostruct (desc); #if JUCE_IOS - ignoreUnused (fileOrIdentifier, name, version, manufacturer); - return false; #else const File file (fileOrIdentifier); @@ -434,7 +435,7 @@ namespace AudioUnitFormatHelpers } } -static bool hasARAExtension (AudioUnit audioUnit) +static bool hasARAExtension ([[maybe_unused]] AudioUnit audioUnit) { #if JUCE_PLUGINHOST_ARA UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory); @@ -449,8 +450,6 @@ static bool hasARAExtension (AudioUnit audioUnit) if ((status == noErr) && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) && ! isWriteable) return true; - #else - ignoreUnused (audioUnit); #endif return false; @@ -465,7 +464,7 @@ using AudioUnitUniquePtr = std::unique_ptr, Aud using AudioUnitSharedPtr = std::shared_ptr>; using AudioUnitWeakPtr = std::weak_ptr>; -static std::shared_ptr getARAFactory (AudioUnitSharedPtr audioUnit) +static std::shared_ptr getARAFactory ([[maybe_unused]] AudioUnitSharedPtr audioUnit) { #if JUCE_PLUGINHOST_ARA jassert (audioUnit != nullptr); @@ -491,8 +490,6 @@ static std::shared_ptr getARAFactory (AudioUnitSharedPtr [owningAuPtr = std::move (audioUnit)]() {}); } } - #else - ignoreUnused (audioUnit); #endif return {}; @@ -2640,13 +2637,12 @@ public: } } - void embedViewController (JUCE_IOS_MAC_VIEW* pluginView, const CGSize& size) + void embedViewController (JUCE_IOS_MAC_VIEW* pluginView, [[maybe_unused]] const CGSize& size) { wrapper.setView (pluginView); waitingForViewCallback = false; #if JUCE_MAC - ignoreUnused (size); if (pluginView != nil) wrapper.resizeToFitView(); #else @@ -2682,7 +2678,7 @@ private: bool waitingForViewCallback = false; - bool createView (bool createGenericViewIfNeeded) + bool createView ([[maybe_unused]] bool createGenericViewIfNeeded) { JUCE_IOS_MAC_VIEW* pluginView = nil; UInt32 dataSize = 0; @@ -2756,8 +2752,6 @@ private: pluginView = [[AUGenericView alloc] initWithAudioUnit: plugin.audioUnit]; } - #else - ignoreUnused (createGenericViewIfNeeded); #endif wrapper.setView (pluginView); diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp index cec1528a..6121dd84 100644 --- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp @@ -384,10 +384,8 @@ public: void getCurrentProgramStateInformation (MemoryBlock& destData) override { getStateInformation (destData); } void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override { setStateInformation (data, sizeInBytes); } - void setStateInformation (const void* data, int sizeInBytes) override + void setStateInformation (const void* data, [[maybe_unused]] int sizeInBytes) override { - ignoreUnused (sizeInBytes); - auto* p = static_cast (data); for (int i = 0; i < getParameters().size(); ++i) diff --git a/modules/juce_audio_processors/format_types/juce_LV2Common.h b/modules/juce_audio_processors/format_types/juce_LV2Common.h index d3f3275d..92a5a987 100644 --- a/modules/juce_audio_processors/format_types/juce_LV2Common.h +++ b/modules/juce_audio_processors/format_types/juce_LV2Common.h @@ -615,6 +615,55 @@ static inline std::vector findStableBusOrder (const String& mainGro return result; } +/* See https://www.w3.org/TeamSubmission/turtle/#sec-grammar-grammar +*/ +static inline bool isNameStartChar (juce_wchar input) +{ + return ('A' <= input && input <= 'Z') + || input == '_' + || ('a' <= input && input <= 'z') + || (0x000c0 <= input && input <= 0x000d6) + || (0x000d8 <= input && input <= 0x000f6) + || (0x000f8 <= input && input <= 0x000ff) + || (0x00370 <= input && input <= 0x0037d) + || (0x0037f <= input && input <= 0x01fff) + || (0x0200c <= input && input <= 0x0200d) + || (0x02070 <= input && input <= 0x0218f) + || (0x02c00 <= input && input <= 0x02fef) + || (0x03001 <= input && input <= 0x0d7ff) + || (0x0f900 <= input && input <= 0x0fdcf) + || (0x0fdf0 <= input && input <= 0x0fffd) + || (0x10000 <= input && input <= 0xeffff); +} + +static inline bool isNameChar (juce_wchar input) +{ + return isNameStartChar (input) + || input == '-' + || ('0' <= input && input <= '9') + || input == 0x000b7 + || (0x00300 <= input && input <= 0x0036f) + || (0x0203f <= input && input <= 0x02040); +} + +static inline String sanitiseStringAsTtlName (const String& input) +{ + if (input.isEmpty()) + return {}; + + std::vector sanitised; + sanitised.reserve (static_cast (input.length())); + + sanitised.push_back (isNameStartChar (input[0]) ? input[0] : '_'); + + std::for_each (std::begin (input) + 1, std::end (input), [&] (juce_wchar x) + { + sanitised.push_back (isNameChar (x) ? x : '_'); + }); + + return String (CharPointer_UTF32 { sanitised.data() }, sanitised.size()); +} + } } diff --git a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp index 933bad1d..4ef7f4b3 100644 --- a/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp @@ -1278,10 +1278,8 @@ private: LV2_Options_Option* options, LV2_Worker_Schedule* schedule, LV2_Resize_Port_Resize* resize, - LV2_Log_Log* log) + [[maybe_unused]] LV2_Log_Log* log) { - ignoreUnused (log); - return { LV2_Feature { LV2_STATE__loadDefaultState, nullptr }, LV2_Feature { LV2_BUF_SIZE__boundedBlockLength, nullptr }, LV2_Feature { LV2_URID__map, map }, @@ -2873,11 +2871,10 @@ private: ports.forEachPort ([&] (const PortHeader& header) { - const auto emplaced = result.emplace (header.symbol, header.index); + [[maybe_unused]] const auto emplaced = result.emplace (header.symbol, header.index); // This will complain if there are duplicate port symbols. jassert (emplaced.second); - ignoreUnused (emplaced); }); return result; @@ -4884,10 +4881,8 @@ private: : freeWheelingPort->info.min; } - void pushMessage (MessageHeader header, uint32_t size, const void* data) + void pushMessage (MessageHeader header, [[maybe_unused]] uint32_t size, const void* data) { - ignoreUnused (size); - if (header.protocol == 0 || header.protocol == instance->urids.mLV2_UI__floatProtocol) { const auto value = readUnaligned (data); diff --git a/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/modules/juce_audio_processors/format_types/juce_VST3Headers.h index 0acdc860..cd757c39 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Headers.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Headers.h @@ -68,7 +68,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-copy-dtor", "-Wtype-limits", "-Wcpp", "-W#warnings", - "-Wmaybe-uninitialized") + "-Wmaybe-uninitialized", + "-Wunused-but-set-variable") #undef DEVELOPMENT #define DEVELOPMENT 0 // This avoids a Clang warning in Steinberg code about unused values diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 43ec4476..7dca5a5b 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -375,9 +375,8 @@ struct VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0 tresult PLUGIN_API setDirty (TBool) override; //============================================================================== - tresult PLUGIN_API requestOpenEditor (FIDString name) override + tresult PLUGIN_API requestOpenEditor ([[maybe_unused]] FIDString name) override { - ignoreUnused (name); jassertfalse; return kResultFalse; } @@ -1388,7 +1387,7 @@ static int compareWithString (Type (&charArray)[N], const String& str) } template -static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb) +static void forEachARAFactory ([[maybe_unused]] IPluginFactory* pluginFactory, [[maybe_unused]] Callback&& cb) { #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX) const auto numClasses = pluginFactory->countClasses(); @@ -1404,12 +1403,11 @@ static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb) break; } } - #else - ignoreUnused (pluginFactory, cb); #endif } -static std::shared_ptr getARAFactory (Steinberg::IPluginFactory* pluginFactory, const String& pluginName) +static std::shared_ptr getARAFactory ([[maybe_unused]] Steinberg::IPluginFactory* pluginFactory, + [[maybe_unused]] const String& pluginName) { std::shared_ptr factory; @@ -1432,8 +1430,6 @@ static std::shared_ptr getARAFactory (Steinberg::IPluginF return true; }); - #else - ignoreUnused (pluginFactory, pluginName); #endif return factory; @@ -1667,8 +1663,8 @@ private: return; } - const auto attachedResult = view->attached ((void*) pluginHandle, defaultVST3WindowType); - ignoreUnused (warnOnFailure (attachedResult)); + [[maybe_unused]] const auto attachedResult = view->attached ((void*) pluginHandle, defaultVST3WindowType); + [[maybe_unused]] const auto warning = warnOnFailure (attachedResult); if (attachedResult == kResultOk) attachedCalled = true; @@ -1689,11 +1685,10 @@ private: { if (scaleInterface != nullptr) { - const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) getEffectiveScale()); - ignoreUnused (result); + [[maybe_unused]] const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) getEffectiveScale()); #if ! JUCE_MAC - ignoreUnused (warnOnFailure (result)); + [[maybe_unused]] const auto warning = warnOnFailure (result); #endif } } @@ -1885,8 +1880,7 @@ struct VST3ComponentHolder if (classIdx >= 0) { PClassInfo info; - bool success = (factory->getClassInfo (classIdx, &info) == kResultOk); - ignoreUnused (success); + [[maybe_unused]] bool success = (factory->getClassInfo (classIdx, &info) == kResultOk); jassert (success); VSTComSmartPtr pf2; @@ -2392,7 +2386,7 @@ public: auto configureParameters = [this] { - refreshParameterList(); + initialiseParameterList(); synchroniseStates(); syncProgramNames(); }; @@ -3091,9 +3085,9 @@ public: } /** @note Not applicable to VST3 */ - void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override + void setCurrentProgramStateInformation ([[maybe_unused]] const void* data, + [[maybe_unused]] int sizeInBytes) override { - ignoreUnused (data, sizeInBytes); } private: @@ -3222,7 +3216,7 @@ private: } } - void refreshParameterList() override + void initialiseParameterList() { AudioProcessorParameterGroup newParameterTree; diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index f4bf5f79..1f38a2a9 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -3028,10 +3028,8 @@ public: } //============================================================================== - void mouseDown (const MouseEvent& e) override + void mouseDown ([[maybe_unused]] const MouseEvent& e) override { - ignoreUnused (e); - #if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD toFront (true); #endif @@ -3442,7 +3440,7 @@ AudioProcessorEditor* VSTPluginInstance::createEditor() #endif } -bool VSTPluginInstance::updateSizeFromEditor (int w, int h) +bool VSTPluginInstance::updateSizeFromEditor ([[maybe_unused]] int w, [[maybe_unused]] int h) { #if ! JUCE_IOS && ! JUCE_ANDROID if (auto* editor = dynamic_cast (getActiveEditor())) diff --git a/modules/juce_audio_processors/juce_audio_processors.cpp b/modules/juce_audio_processors/juce_audio_processors.cpp index b0ff4b67..8bbc3a36 100644 --- a/modules/juce_audio_processors/juce_audio_processors.cpp +++ b/modules/juce_audio_processors/juce_audio_processors.cpp @@ -61,7 +61,7 @@ namespace juce { -#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && JUCE_LINUX) +#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD)) static bool arrayContainsPlugin (const OwnedArray& list, const PluginDescription& desc) @@ -220,6 +220,7 @@ private: #include "utilities/juce_AudioProcessorValueTreeState.cpp" #include "utilities/juce_PluginHostType.cpp" #include "utilities/juce_NativeScaleFactorNotifier.cpp" +#include "utilities/juce_VSTCallbackHandler.cpp" #include "utilities/ARA/juce_ARA_utils.cpp" #include "format_types/juce_LV2PluginFormat.cpp" diff --git a/modules/juce_audio_processors/juce_audio_processors.h b/modules/juce_audio_processors/juce_audio_processors.h index 2403f0da..a02e46ab 100644 --- a/modules/juce_audio_processors/juce_audio_processors.h +++ b/modules/juce_audio_processors/juce_audio_processors.h @@ -35,7 +35,7 @@ ID: juce_audio_processors vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE audio processor classes description: Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors. website: http://www.juce.com/juce diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp index 53aa9c3d..f5815241 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp @@ -340,7 +340,7 @@ void AudioProcessor::removeListener (AudioProcessorListener* listenerToRemove) void AudioProcessor::setPlayConfigDetails (int newNumIns, int newNumOuts, double newSampleRate, int newBlockSize) { - bool success = true; + [[maybe_unused]] bool success = true; if (getTotalNumInputChannels() != newNumIns) success &= setChannelLayoutOfBus (true, 0, AudioChannelSet::canonicalChannelSet (newNumIns)); @@ -362,7 +362,6 @@ void AudioProcessor::setPlayConfigDetails (int newNumIns, int newNumOuts, double jassert (success && newNumIns == getTotalNumInputChannels() && newNumOuts == getTotalNumOutputChannels()); setRateAndBufferSizeDetails (newSampleRate, newBlockSize); - ignoreUnused (success); } void AudioProcessor::setRateAndBufferSizeDetails (double newSampleRate, int newBlockSize) noexcept @@ -442,10 +441,8 @@ void AudioProcessor::validateParameter (AudioProcessorParameter* param) #endif } -void AudioProcessor::checkForDuplicateTrimmedParamID (AudioProcessorParameter* param) +void AudioProcessor::checkForDuplicateTrimmedParamID ([[maybe_unused]] AudioProcessorParameter* param) { - ignoreUnused (param); - #if JUCE_DEBUG && ! JUCE_DISABLE_CAUTIOUS_PARAMETER_ID_CHECKING if (auto* withID = dynamic_cast (param)) { @@ -476,10 +473,8 @@ void AudioProcessor::checkForDuplicateTrimmedParamID (AudioProcessorParameter* p #endif } -void AudioProcessor::checkForDuplicateParamID (AudioProcessorParameter* param) +void AudioProcessor::checkForDuplicateParamID ([[maybe_unused]] AudioProcessorParameter* param) { - ignoreUnused (param); - #if JUCE_DEBUG if (auto* withID = dynamic_cast (param)) { @@ -491,10 +486,8 @@ void AudioProcessor::checkForDuplicateParamID (AudioProcessorParameter* param) #endif } -void AudioProcessor::checkForDuplicateGroupIDs (const AudioProcessorParameterGroup& newGroup) +void AudioProcessor::checkForDuplicateGroupIDs ([[maybe_unused]] const AudioProcessorParameterGroup& newGroup) { - ignoreUnused (newGroup); - #if JUCE_DEBUG auto groups = newGroup.getSubgroups (true); groups.add (&newGroup); @@ -598,10 +591,9 @@ void AudioProcessor::processBypassed (AudioBuffer& buffer, MidiBuffer void AudioProcessor::processBlockBypassed (AudioBuffer& buffer, MidiBuffer& midi) { processBypassed (buffer, midi); } void AudioProcessor::processBlockBypassed (AudioBuffer& buffer, MidiBuffer& midi) { processBypassed (buffer, midi); } -void AudioProcessor::processBlock (AudioBuffer& buffer, MidiBuffer& midiMessages) +void AudioProcessor::processBlock ([[maybe_unused]] AudioBuffer& buffer, + [[maybe_unused]] MidiBuffer& midiMessages) { - ignoreUnused (buffer, midiMessages); - // If you hit this assertion then either the caller called the double // precision version of processBlock on a processor which does not support it // (i.e. supportsDoublePrecisionProcessing() returns false), or the implementation @@ -1493,6 +1485,9 @@ AudioProcessorParameter* AudioProcessor::getParamChecked (int index) const return p; } +bool AudioProcessor::canAddBus ([[maybe_unused]] bool isInput) const { return false; } +bool AudioProcessor::canRemoveBus ([[maybe_unused]] bool isInput) const { return false; } + JUCE_END_IGNORE_WARNINGS_GCC_LIKE JUCE_END_IGNORE_WARNINGS_MSVC diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/modules/juce_audio_processors/processors/juce_AudioProcessor.h index 2ea13dc9..b0acefa9 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ b/modules/juce_audio_processors/processors/juce_AudioProcessor.h @@ -524,7 +524,7 @@ public: @see addBus */ - virtual bool canAddBus (bool isInput) const { ignoreUnused (isInput); return false; } + virtual bool canAddBus (bool isInput) const; /** Callback to query if the last bus can currently be removed. @@ -537,7 +537,7 @@ public: The default implementation will always return false. */ - virtual bool canRemoveBus (bool isInput) const { ignoreUnused (isInput); return false; } + virtual bool canRemoveBus (bool isInput) const; /** Dynamically request an additional bus. diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp index 3b88ccee..7b20407c 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp @@ -216,13 +216,11 @@ void AudioProcessorEditor::setScaleFactor (float newScale) typedef ComponentPeer* (*createUnityPeerFunctionType) (Component&); createUnityPeerFunctionType juce_createUnityPeerFn = nullptr; -ComponentPeer* AudioProcessorEditor::createNewPeer (int styleFlags, void* nativeWindow) +ComponentPeer* AudioProcessorEditor::createNewPeer ([[maybe_unused]] int styleFlags, + [[maybe_unused]] void* nativeWindow) { if (juce_createUnityPeerFn != nullptr) - { - ignoreUnused (styleFlags, nativeWindow); return juce_createUnityPeerFn (*this); - } return Component::createNewPeer (styleFlags, nativeWindow); } diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index 218b4ac9..d9ef6303 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -498,6 +498,8 @@ struct GraphRenderSequence currentAudioInputBuffer = nullptr; } + JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661) + void addClearChannelOp (int index) { renderOps.push_back ([=] (const Context& c) { FloatVectorOperations::clear (c.audioBuffers[index], c.numSamples); }); @@ -513,6 +515,8 @@ struct GraphRenderSequence renderOps.push_back ([=] (const Context& c) { FloatVectorOperations::add (c.audioBuffers[dstIndex], c.audioBuffers[srcIndex], c.numSamples); }); } + JUCE_END_IGNORE_WARNINGS_MSVC + void addClearMidiBufferOp (int index) { renderOps.push_back ([=] (const Context& c) { c.midiBuffers[index].clear(); }); @@ -1405,7 +1409,7 @@ bool AudioProcessorGraph::Connection::operator< (const Connection& other) const } //============================================================================== -class AudioProcessorGraph::Pimpl : private AsyncUpdater +class AudioProcessorGraph::Pimpl : public AsyncUpdater { public: explicit Pimpl (AudioProcessorGraph& o) : owner (&o) {} @@ -1453,8 +1457,7 @@ public: if (lastNodeID < idToUse) lastNodeID = idToUse; - if (auto* ioProc = dynamic_cast (added->getProcessor())) - ioProc->setParentGraph (owner); + setParentGraph (added->getProcessor()); topologyChanged (updateKind); return added; @@ -1606,6 +1609,12 @@ public: auto* getAudioThreadState() const { return renderSequenceExchange.getAudioThreadState(); } private: + void setParentGraph (AudioProcessor* p) const + { + if (auto* ioProc = dynamic_cast (p)) + ioProc->setParentGraph (owner); + } + void topologyChanged (UpdateKind updateKind) { owner->sendChangeMessage(); @@ -1620,6 +1629,9 @@ private: { if (const auto newSettings = nodeStates.applySettings (nodes)) { + for (const auto node : nodes.getNodes()) + setParentGraph (node->getProcessor()); + auto sequence = std::make_unique (*newSettings, nodes, connections); owner->setLatencySamples (sequence->getLatencySamples()); renderSequenceExchange.set (std::move (sequence)); diff --git a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp index ad908494..d153c3d2 100644 --- a/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +++ b/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp @@ -102,6 +102,8 @@ class ParameterComponent : public Component, { public: using ParameterListener::ParameterListener; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterComponent) }; //============================================================================== diff --git a/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h b/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h index 0485808d..f72d160c 100644 --- a/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h +++ b/modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h @@ -32,7 +32,7 @@ namespace juce @tags{Audio} */ -struct HostedAudioProcessorParameter : public AudioProcessorParameter +struct JUCE_API HostedAudioProcessorParameter : public AudioProcessorParameter { using AudioProcessorParameter::AudioProcessorParameter; diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp index dc7414c5..6e819cda 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp @@ -834,138 +834,122 @@ ARAEditorView* ARADocumentControllerSpecialisation::doCreateEditorView() return new ARAEditorView (getDocumentController()); } -bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource, - ARA::ARAContentType type) +bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAvailable ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource, + [[maybe_unused]] ARA::ARAContentType type) { - juce::ignoreUnused (audioSource, type); return false; } -ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource, - ARA::ARAContentType type) +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioSourceContentGrade ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource, + [[maybe_unused]] ARA::ARAContentType type) { // Overriding doIsAudioSourceContentAvailable() requires overriding // doGetAudioSourceContentGrade() accordingly! jassertfalse; - juce::ignoreUnused (audioSource, type); return ARA::kARAContentGradeInitial; } -ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource, - ARA::ARAContentType type, - const ARA::ARAContentTimeRange* range) +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioSourceContentReader ([[maybe_unused]] ARA::PlugIn::AudioSource* audioSource, + [[maybe_unused]] ARA::ARAContentType type, + [[maybe_unused]] const ARA::ARAContentTimeRange* range) { // Overriding doIsAudioSourceContentAvailable() requires overriding // doCreateAudioSourceContentReader() accordingly! jassertfalse; - juce::ignoreUnused (audioSource, type, range); return nullptr; } -bool ARADocumentControllerSpecialisation::doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification, - ARA::ARAContentType type) +bool ARADocumentControllerSpecialisation::doIsAudioModificationContentAvailable ([[maybe_unused]] const ARA::PlugIn::AudioModification* audioModification, + [[maybe_unused]] ARA::ARAContentType type) { - juce::ignoreUnused (audioModification, type); return false; } -ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification, - ARA::ARAContentType type) +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioModificationContentGrade ([[maybe_unused]] const ARA::PlugIn::AudioModification* audioModification, + [[maybe_unused]] ARA::ARAContentType type) { // Overriding doIsAudioModificationContentAvailable() requires overriding // doGetAudioModificationContentGrade() accordingly! jassertfalse; - juce::ignoreUnused (audioModification, type); return ARA::kARAContentGradeInitial; } -ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification, - ARA::ARAContentType type, - const ARA::ARAContentTimeRange* range) +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioModificationContentReader ([[maybe_unused]] ARA::PlugIn::AudioModification* audioModification, + [[maybe_unused]] ARA::ARAContentType type, + [[maybe_unused]] const ARA::ARAContentTimeRange* range) { // Overriding doIsAudioModificationContentAvailable() requires overriding // doCreateAudioModificationContentReader() accordingly! jassertfalse; - juce::ignoreUnused (audioModification, type, range); return nullptr; } -bool ARADocumentControllerSpecialisation::doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion, - ARA::ARAContentType type) +bool ARADocumentControllerSpecialisation::doIsPlaybackRegionContentAvailable ([[maybe_unused]] const ARA::PlugIn::PlaybackRegion* playbackRegion, + [[maybe_unused]] ARA::ARAContentType type) { - juce::ignoreUnused (playbackRegion, type); return false; } -ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion, - ARA::ARAContentType type) +ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetPlaybackRegionContentGrade ([[maybe_unused]] const ARA::PlugIn::PlaybackRegion* playbackRegion, + [[maybe_unused]] ARA::ARAContentType type) { // Overriding doIsPlaybackRegionContentAvailable() requires overriding // doGetPlaybackRegionContentGrade() accordingly! jassertfalse; - juce::ignoreUnused (playbackRegion, type); return ARA::kARAContentGradeInitial; } -ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion, - ARA::ARAContentType type, - const ARA::ARAContentTimeRange* range) +ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreatePlaybackRegionContentReader ([[maybe_unused]] ARA::PlugIn::PlaybackRegion* playbackRegion, + [[maybe_unused]] ARA::ARAContentType type, + [[maybe_unused]] const ARA::ARAContentTimeRange* range) { // Overriding doIsPlaybackRegionContentAvailable() requires overriding // doCreatePlaybackRegionContentReader() accordingly! jassertfalse; - juce::ignoreUnused (playbackRegion, type, range); return nullptr; } -bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource, - ARA::ARAContentType type) +bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAnalysisIncomplete ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource, + [[maybe_unused]] ARA::ARAContentType type) { - juce::ignoreUnused (audioSource, type); return false; } -void ARADocumentControllerSpecialisation::doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource, - std::vector const& contentTypes) +void ARADocumentControllerSpecialisation::doRequestAudioSourceContentAnalysis ([[maybe_unused]] ARA::PlugIn::AudioSource* audioSource, + [[maybe_unused]] std::vector const& contentTypes) { - juce::ignoreUnused (audioSource, contentTypes); } ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmsCount() { return 0; } const ARA::ARAProcessingAlgorithmProperties* - ARADocumentControllerSpecialisation::doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex) + ARADocumentControllerSpecialisation::doGetProcessingAlgorithmProperties ([[maybe_unused]] ARA::ARAInt32 algorithmIndex) { - juce::ignoreUnused (algorithmIndex); return nullptr; } -ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource) +ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmForAudioSource ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource) { // doGetProcessingAlgorithmForAudioSource() must be implemented if the supported // algorithm count is greater than zero. if (getDocumentController()->getProcessingAlgorithmsCount() > 0) jassertfalse; - juce::ignoreUnused (audioSource); return 0; } -void ARADocumentControllerSpecialisation::doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource, - ARA::ARAInt32 algorithmIndex) +void ARADocumentControllerSpecialisation::doRequestProcessingAlgorithmForAudioSource ([[maybe_unused]] ARA::PlugIn::AudioSource* audioSource, + [[maybe_unused]] ARA::ARAInt32 algorithmIndex) { // doRequestProcessingAlgorithmForAudioSource() must be implemented if the supported // algorithm count is greater than zero. - if (getDocumentController()->getProcessingAlgorithmsCount() > 0) - jassertfalse; - - juce::ignoreUnused (audioSource, algorithmIndex); + jassert (getDocumentController()->getProcessingAlgorithmsCount() <= 0); } } // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp index 918aee43..3db14330 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp @@ -196,4 +196,98 @@ void ARAPlaybackRegion::notifyContentChanged (ARAContentUpdateScopes scopeFlags, notifyARAHost); } +//============================================================================== +void ARADocumentListener::willBeginEditing ([[maybe_unused]] ARADocument* document) {} +void ARADocumentListener::didEndEditing ([[maybe_unused]] ARADocument* document) {} +void ARADocumentListener::willNotifyModelUpdates ([[maybe_unused]] ARADocument* document) {} +void ARADocumentListener::didNotifyModelUpdates ([[maybe_unused]] ARADocument* document) {} +void ARADocumentListener::willUpdateDocumentProperties ([[maybe_unused]] ARADocument* document, + [[maybe_unused]] ARA::PlugIn::PropertiesPtr newProperties) {} +void ARADocumentListener::didUpdateDocumentProperties ([[maybe_unused]] ARADocument* document) {} +void ARADocumentListener::didAddMusicalContextToDocument ([[maybe_unused]] ARADocument* document, + [[maybe_unused]] ARAMusicalContext* musicalContext) {} +void ARADocumentListener::willRemoveMusicalContextFromDocument ([[maybe_unused]] ARADocument* document, + [[maybe_unused]] ARAMusicalContext* musicalContext) {} +void ARADocumentListener::didReorderMusicalContextsInDocument ([[maybe_unused]] ARADocument* document) {} +void ARADocumentListener::didAddRegionSequenceToDocument ([[maybe_unused]] ARADocument* document, + [[maybe_unused]] ARARegionSequence* regionSequence) {} +void ARADocumentListener::willRemoveRegionSequenceFromDocument ([[maybe_unused]] ARADocument* document, + [[maybe_unused]] ARARegionSequence* regionSequence) {} +void ARADocumentListener::didReorderRegionSequencesInDocument ([[maybe_unused]] ARADocument* document) {} +void ARADocumentListener::didAddAudioSourceToDocument ([[maybe_unused]] ARADocument* document, + [[maybe_unused]] ARAAudioSource* audioSource) {} +void ARADocumentListener::willRemoveAudioSourceFromDocument ([[maybe_unused]] ARADocument* document, + [[maybe_unused]] ARAAudioSource* audioSource) {} +void ARADocumentListener::willDestroyDocument ([[maybe_unused]] ARADocument* document) {} + +//============================================================================== +void ARAMusicalContextListener::willUpdateMusicalContextProperties ([[maybe_unused]] ARAMusicalContext* musicalContext, + [[maybe_unused]] ARA::PlugIn::PropertiesPtr newProperties) {} +void ARAMusicalContextListener::didUpdateMusicalContextProperties ([[maybe_unused]] ARAMusicalContext* musicalContext) {} +void ARAMusicalContextListener::doUpdateMusicalContextContent ([[maybe_unused]] ARAMusicalContext* musicalContext, + [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {} +void ARAMusicalContextListener::didAddRegionSequenceToMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext, + [[maybe_unused]] ARARegionSequence* regionSequence) {} +void ARAMusicalContextListener::willRemoveRegionSequenceFromMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext, + [[maybe_unused]] ARARegionSequence* regionSequence) {} +void ARAMusicalContextListener::didReorderRegionSequencesInMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext) {} +void ARAMusicalContextListener::willDestroyMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext) {} + +//============================================================================== +void ARAPlaybackRegionListener::willUpdatePlaybackRegionProperties ([[maybe_unused]] ARAPlaybackRegion* playbackRegion, + [[maybe_unused]] ARA::PlugIn::PropertiesPtr newProperties) {} +void ARAPlaybackRegionListener::didUpdatePlaybackRegionProperties ([[maybe_unused]] ARAPlaybackRegion* playbackRegion) {} +void ARAPlaybackRegionListener::didUpdatePlaybackRegionContent ([[maybe_unused]] ARAPlaybackRegion* playbackRegion, + [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {} +void ARAPlaybackRegionListener::willDestroyPlaybackRegion ([[maybe_unused]] ARAPlaybackRegion* playbackRegion) {} + +//============================================================================== +void ARARegionSequenceListener::willUpdateRegionSequenceProperties ([[maybe_unused]] ARARegionSequence* regionSequence, + [[maybe_unused]] ARA::PlugIn::PropertiesPtr newProperties) {} +void ARARegionSequenceListener::didUpdateRegionSequenceProperties ([[maybe_unused]] ARARegionSequence* regionSequence) {} +void ARARegionSequenceListener::willRemovePlaybackRegionFromRegionSequence ([[maybe_unused]] ARARegionSequence* regionSequence, + [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {} +void ARARegionSequenceListener::didAddPlaybackRegionToRegionSequence ([[maybe_unused]] ARARegionSequence* regionSequence, + [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {} +void ARARegionSequenceListener::willDestroyRegionSequence ([[maybe_unused]] ARARegionSequence* regionSequence) {} + +//============================================================================== +void ARAAudioSourceListener::willUpdateAudioSourceProperties ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] ARA::PlugIn::PropertiesPtr newProperties) {} +void ARAAudioSourceListener::didUpdateAudioSourceProperties ([[maybe_unused]] ARAAudioSource* audioSource) {} +void ARAAudioSourceListener::doUpdateAudioSourceContent ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {} +void ARAAudioSourceListener::didUpdateAudioSourceAnalysisProgress ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] ARA::ARAAnalysisProgressState state, + [[maybe_unused]] float progress) {} +void ARAAudioSourceListener::willEnableAudioSourceSamplesAccess ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] bool enable) {} +void ARAAudioSourceListener::didEnableAudioSourceSamplesAccess ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] bool enable) {} +void ARAAudioSourceListener::willDeactivateAudioSourceForUndoHistory ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] bool deactivate) {} +void ARAAudioSourceListener::didDeactivateAudioSourceForUndoHistory ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] bool deactivate) {} +void ARAAudioSourceListener::didAddAudioModificationToAudioSource ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] ARAAudioModification* audioModification) {} +void ARAAudioSourceListener::willRemoveAudioModificationFromAudioSource ([[maybe_unused]] ARAAudioSource* audioSource, + [[maybe_unused]] ARAAudioModification* audioModification) {} +void ARAAudioSourceListener::willDestroyAudioSource ([[maybe_unused]] ARAAudioSource* audioSource) {} + +//============================================================================== +void ARAAudioModificationListener::willUpdateAudioModificationProperties ([[maybe_unused]] ARAAudioModification* audioModification, + [[maybe_unused]] ARA::PlugIn::PropertiesPtr newProperties) {} +void ARAAudioModificationListener::didUpdateAudioModificationProperties ([[maybe_unused]] ARAAudioModification* audioModification) {} +void ARAAudioModificationListener::didUpdateAudioModificationContent ([[maybe_unused]] ARAAudioModification* audioModification, + [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {} +void ARAAudioModificationListener::willDeactivateAudioModificationForUndoHistory ([[maybe_unused]] ARAAudioModification* audioModification, + [[maybe_unused]] bool deactivate) {} +void ARAAudioModificationListener::didDeactivateAudioModificationForUndoHistory ([[maybe_unused]] ARAAudioModification* audioModification, + [[maybe_unused]] bool deactivate) {} +void ARAAudioModificationListener::didAddPlaybackRegionToAudioModification ([[maybe_unused]] ARAAudioModification* audioModification, + [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {} +void ARAAudioModificationListener::willRemovePlaybackRegionFromAudioModification ([[maybe_unused]] ARAAudioModification* audioModification, + [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {} +void ARAAudioModificationListener::willDestroyAudioModification ([[maybe_unused]] ARAAudioModification* audioModification) {} + } // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h index e5434e3c..2f3096f2 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h @@ -181,76 +181,49 @@ public: /** Destructor */ virtual ~ARADocumentListener() = default; - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN - /** Called before the document enters an editing state. @param document The document about to enter an editing state. */ - virtual void willBeginEditing (ARADocument* document) - { - ignoreUnused (document); - } + virtual void willBeginEditing (ARADocument* document); /** Called after the document exits an editing state. @param document The document about exit an editing state. */ - virtual void didEndEditing (ARADocument* document) - { - ignoreUnused (document); - } + virtual void didEndEditing (ARADocument* document); /** Called before sending model updates do the host. @param document The document whose model updates are about to be sent. */ - virtual void willNotifyModelUpdates (ARADocument* document) - { - ignoreUnused (document); - } + virtual void willNotifyModelUpdates (ARADocument* document); /** Called after sending model updates do the host. @param document The document whose model updates have just been sent. */ - virtual void didNotifyModelUpdates (ARADocument* document) - { - ignoreUnused (document); - } + virtual void didNotifyModelUpdates (ARADocument* document); /** Called before the document's properties are updated. @param document The document whose properties will be updated. @param newProperties The document properties that will be assigned to \p document. */ virtual void willUpdateDocumentProperties (ARADocument* document, - ARA::PlugIn::PropertiesPtr newProperties) - { - ignoreUnused (document, newProperties); - } + ARA::PlugIn::PropertiesPtr newProperties); /** Called after the document's properties are updated. @param document The document whose properties were updated. */ - virtual void didUpdateDocumentProperties (ARADocument* document) - { - ignoreUnused (document); - } + virtual void didUpdateDocumentProperties (ARADocument* document); /** Called after a musical context is added to the document. @param document The document that \p musicalContext was added to. @param musicalContext The musical context that was added to \p document. */ - virtual void didAddMusicalContextToDocument (ARADocument* document, ARAMusicalContext* musicalContext) - { - ignoreUnused (document, musicalContext); - } + virtual void didAddMusicalContextToDocument (ARADocument* document, ARAMusicalContext* musicalContext); /** Called before a musical context is removed from the document. @param document The document that \p musicalContext will be removed from. @param musicalContext The musical context that will be removed from \p document. */ - virtual void willRemoveMusicalContextFromDocument (ARADocument* document, - ARAMusicalContext* musicalContext) - { - ignoreUnused (document, musicalContext); - } + virtual void willRemoveMusicalContextFromDocument (ARADocument* document, ARAMusicalContext* musicalContext); /** Called after the musical contexts are reordered in an ARA document @@ -259,29 +232,19 @@ public: @param document The document with reordered musical contexts. */ - virtual void didReorderMusicalContextsInDocument (ARADocument* document) - { - ignoreUnused (document); - } + virtual void didReorderMusicalContextsInDocument (ARADocument* document); /** Called after a region sequence is added to the document. @param document The document that \p regionSequence was added to. @param regionSequence The region sequence that was added to \p document. */ - virtual void didAddRegionSequenceToDocument (ARADocument* document, ARARegionSequence* regionSequence) - { - ignoreUnused (document, regionSequence); - } + virtual void didAddRegionSequenceToDocument (ARADocument* document, ARARegionSequence* regionSequence); /** Called before a region sequence is removed from the document. @param document The document that \p regionSequence will be removed from. @param regionSequence The region sequence that will be removed from \p document. */ - virtual void willRemoveRegionSequenceFromDocument (ARADocument* document, - ARARegionSequence* regionSequence) - { - ignoreUnused (document, regionSequence); - } + virtual void willRemoveRegionSequenceFromDocument (ARADocument* document, ARARegionSequence* regionSequence); /** Called after the region sequences are reordered in an ARA document @@ -290,38 +253,24 @@ public: @param document The document with reordered region sequences. */ - virtual void didReorderRegionSequencesInDocument (ARADocument* document) - { - ignoreUnused (document); - } + virtual void didReorderRegionSequencesInDocument (ARADocument* document); /** Called after an audio source is added to the document. @param document The document that \p audioSource was added to. @param audioSource The audio source that was added to \p document. */ - virtual void didAddAudioSourceToDocument (ARADocument* document, ARAAudioSource* audioSource) - { - ignoreUnused (document, audioSource); - } + virtual void didAddAudioSourceToDocument (ARADocument* document, ARAAudioSource* audioSource); /** Called before an audio source is removed from the document. @param document The document that \p audioSource will be removed from . @param audioSource The audio source that will be removed from \p document. */ - virtual void willRemoveAudioSourceFromDocument (ARADocument* document, ARAAudioSource* audioSource) - { - ignoreUnused (document, audioSource); - } + virtual void willRemoveAudioSourceFromDocument (ARADocument* document, ARAAudioSource* audioSource); /** Called before the document is destroyed by the ARA host. @param document The document that will be destroyed. */ - virtual void willDestroyDocument (ARADocument* document) - { - ignoreUnused (document); - } - - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + virtual void willDestroyDocument (ARADocument* document); }; //============================================================================== @@ -395,55 +344,36 @@ class JUCE_API ARAMusicalContextListener public: virtual ~ARAMusicalContextListener() = default; - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN - /** Called before the musical context's properties are updated. @param musicalContext The musical context whose properties will be updated. @param newProperties The musical context properties that will be assigned to \p musicalContext. */ virtual void willUpdateMusicalContextProperties (ARAMusicalContext* musicalContext, - ARA::PlugIn::PropertiesPtr newProperties) - { - ignoreUnused (musicalContext, newProperties); - } + ARA::PlugIn::PropertiesPtr newProperties); /** Called after the musical context's properties are updated by the host. @param musicalContext The musical context whose properties were updated. */ - virtual void didUpdateMusicalContextProperties (ARAMusicalContext* musicalContext) - { - ignoreUnused (musicalContext); - } + virtual void didUpdateMusicalContextProperties (ARAMusicalContext* musicalContext); /** Called when the musical context's content (i.e tempo entries or chords) changes. @param musicalContext The musical context with updated content. @param scopeFlags The scope of the content update indicating what has changed. */ - virtual void doUpdateMusicalContextContent (ARAMusicalContext* musicalContext, - ARAContentUpdateScopes scopeFlags) - { - ignoreUnused (musicalContext, scopeFlags); - } + virtual void doUpdateMusicalContextContent (ARAMusicalContext* musicalContext, ARAContentUpdateScopes scopeFlags); /** Called after a region sequence is added to the musical context. @param musicalContext The musical context that \p regionSequence was added to. @param regionSequence The region sequence that was added to \p musicalContext. */ - virtual void didAddRegionSequenceToMusicalContext (ARAMusicalContext* musicalContext, - ARARegionSequence* regionSequence) - { - ignoreUnused (musicalContext, regionSequence); - } + virtual void didAddRegionSequenceToMusicalContext (ARAMusicalContext* musicalContext, ARARegionSequence* regionSequence); /** Called before a region sequence is removed from the musical context. @param musicalContext The musical context that \p regionSequence will be removed from. @param regionSequence The region sequence that will be removed from \p musicalContext. */ virtual void willRemoveRegionSequenceFromMusicalContext (ARAMusicalContext* musicalContext, - ARARegionSequence* regionSequence) - { - ignoreUnused (musicalContext, regionSequence); - } + ARARegionSequence* regionSequence); /** Called after the region sequences are reordered in an ARA MusicalContext @@ -452,20 +382,12 @@ public: @param musicalContext The musical context with reordered region sequences. */ - virtual void didReorderRegionSequencesInMusicalContext (ARAMusicalContext* musicalContext) - { - ignoreUnused (musicalContext); - } + virtual void didReorderRegionSequencesInMusicalContext (ARAMusicalContext* musicalContext); /** Called before the musical context is destroyed. @param musicalContext The musical context that will be destroyed. */ - virtual void willDestroyMusicalContext (ARAMusicalContext* musicalContext) - { - ignoreUnused (musicalContext); - } - - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + virtual void willDestroyMusicalContext (ARAMusicalContext* musicalContext); }; //============================================================================== @@ -528,45 +450,29 @@ public: /** Destructor. */ virtual ~ARAPlaybackRegionListener() = default; - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN - /** Called before the playback region's properties are updated. @param playbackRegion The playback region whose properties will be updated. @param newProperties The playback region properties that will be assigned to \p playbackRegion. */ virtual void willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion, - ARA::PlugIn::PropertiesPtr newProperties) - { - ignoreUnused (playbackRegion, newProperties); - } + ARA::PlugIn::PropertiesPtr newProperties); /** Called after the playback region's properties are updated. @param playbackRegion The playback region whose properties were updated. */ - virtual void didUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion) - { - ignoreUnused (playbackRegion); - } + virtual void didUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion); /** Called when the playback region's content (i.e. samples or notes) changes. @param playbackRegion The playback region with updated content. @param scopeFlags The scope of the content update. */ virtual void didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion, - ARAContentUpdateScopes scopeFlags) - { - ignoreUnused (playbackRegion, scopeFlags); - } + ARAContentUpdateScopes scopeFlags); /** Called before the playback region is destroyed. @param playbackRegion The playback region that will be destroyed. */ - virtual void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion) - { - ignoreUnused (playbackRegion); - } - - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + virtual void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion); }; //============================================================================== @@ -665,55 +571,36 @@ public: /** Destructor. */ virtual ~ARARegionSequenceListener() = default; - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN - /** Called before the region sequence's properties are updated. @param regionSequence The region sequence whose properties will be updated. @param newProperties The region sequence properties that will be assigned to \p regionSequence. */ virtual void willUpdateRegionSequenceProperties (ARARegionSequence* regionSequence, - ARA::PlugIn::PropertiesPtr newProperties) - { - ignoreUnused (regionSequence, newProperties); - } + ARA::PlugIn::PropertiesPtr newProperties); /** Called after the region sequence's properties are updated. @param regionSequence The region sequence whose properties were updated. */ - virtual void didUpdateRegionSequenceProperties (ARARegionSequence* regionSequence) - { - ignoreUnused (regionSequence); - } + virtual void didUpdateRegionSequenceProperties (ARARegionSequence* regionSequence); /** Called before a playback region is removed from the region sequence. @param regionSequence The region sequence that \p playbackRegion will be removed from. @param playbackRegion The playback region that will be removed from \p regionSequence. */ virtual void willRemovePlaybackRegionFromRegionSequence (ARARegionSequence* regionSequence, - ARAPlaybackRegion* playbackRegion) - { - ignoreUnused (regionSequence, playbackRegion); - } + ARAPlaybackRegion* playbackRegion); /** Called after a playback region is added to the region sequence. @param regionSequence The region sequence that \p playbackRegion was added to. @param playbackRegion The playback region that was added to \p regionSequence. */ virtual void didAddPlaybackRegionToRegionSequence (ARARegionSequence* regionSequence, - ARAPlaybackRegion* playbackRegion) - { - ignoreUnused (regionSequence, playbackRegion); - } + ARAPlaybackRegion* playbackRegion); /** Called before the region sequence is destroyed. @param regionSequence The region sequence that will be destroyed. */ - virtual void willDestroyRegionSequence (ARARegionSequence* regionSequence) - { - ignoreUnused (regionSequence); - } - - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + virtual void willDestroyRegionSequence (ARARegionSequence* regionSequence); }; //============================================================================== @@ -800,34 +687,23 @@ public: /** Destructor. */ virtual ~ARAAudioSourceListener() = default; - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN - /** Called before the audio source's properties are updated. @param audioSource The audio source whose properties will be updated. @param newProperties The audio source properties that will be assigned to \p audioSource. */ virtual void willUpdateAudioSourceProperties (ARAAudioSource* audioSource, - ARA::PlugIn::PropertiesPtr newProperties) - { - ignoreUnused (audioSource, newProperties); - } + ARA::PlugIn::PropertiesPtr newProperties); /** Called after the audio source's properties are updated. @param audioSource The audio source whose properties were updated. */ - virtual void didUpdateAudioSourceProperties (ARAAudioSource* audioSource) - { - ignoreUnused (audioSource); - } + virtual void didUpdateAudioSourceProperties (ARAAudioSource* audioSource); /** Called when the audio source's content (i.e. samples or notes) changes. @param audioSource The audio source with updated content. @param scopeFlags The scope of the content update. */ - virtual void doUpdateAudioSourceContent (ARAAudioSource* audioSource, ARAContentUpdateScopes scopeFlags) - { - ignoreUnused (audioSource, scopeFlags); - } + virtual void doUpdateAudioSourceContent (ARAAudioSource* audioSource, ARAContentUpdateScopes scopeFlags); /** Called to notify progress when an audio source is being analyzed. @param audioSource The audio source being analyzed. @@ -836,76 +712,54 @@ public: */ virtual void didUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource, ARA::ARAAnalysisProgressState state, - float progress) - { - ignoreUnused (audioSource, state, progress); - } + float progress); /** Called before access to an audio source's samples is enabled or disabled. @param audioSource The audio source whose sample access state will be changed. @param enable A bool indicating whether or not sample access will be enabled or disabled. */ - virtual void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) - { - ignoreUnused (audioSource, enable); - } + virtual void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, + bool enable); /** Called after access to an audio source's samples is enabled or disabled. @param audioSource The audio source whose sample access state was changed. @param enable A bool indicating whether or not sample access was enabled or disabled. */ - virtual void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable) - { - ignoreUnused (audioSource, enable); - } + virtual void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, + bool enable); /** Called before an audio source is activated or deactivated when being removed / added from the host's undo history. @param audioSource The audio source that will be activated or deactivated @param deactivate A bool indicating whether \p audioSource was deactivated or activated. */ - virtual void willDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate) - { - ignoreUnused (audioSource, deactivate); - } + virtual void willDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, + bool deactivate); /** Called after an audio source is activated or deactivated when being removed / added from the host's undo history. @param audioSource The audio source that was activated or deactivated @param deactivate A bool indicating whether \p audioSource was deactivated or activated. */ - virtual void didDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate) - { - ignoreUnused (audioSource, deactivate); - } + virtual void didDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, + bool deactivate); /** Called after an audio modification is added to the audio source. @param audioSource The region sequence that \p audioModification was added to. @param audioModification The playback region that was added to \p audioSource. */ virtual void didAddAudioModificationToAudioSource (ARAAudioSource* audioSource, - ARAAudioModification* audioModification) - { - ignoreUnused (audioSource, audioModification); - } + ARAAudioModification* audioModification); /** Called before an audio modification is removed from the audio source. @param audioSource The audio source that \p audioModification will be removed from. @param audioModification The audio modification that will be removed from \p audioSource. */ virtual void willRemoveAudioModificationFromAudioSource (ARAAudioSource* audioSource, - ARAAudioModification* audioModification) - { - ignoreUnused (audioSource, audioModification); - } + ARAAudioModification* audioModification); /** Called before the audio source is destroyed. @param audioSource The audio source that will be destroyed. */ - virtual void willDestroyAudioSource (ARAAudioSource* audioSource) - { - ignoreUnused (audioSource); - } - - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + virtual void willDestroyAudioSource (ARAAudioSource* audioSource); }; //============================================================================== @@ -1004,82 +858,57 @@ public: /** Destructor. */ virtual ~ARAAudioModificationListener() = default; - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN - /** Called before the audio modification's properties are updated. @param audioModification The audio modification whose properties will be updated. @param newProperties The audio modification properties that will be assigned to \p audioModification. */ virtual void willUpdateAudioModificationProperties (ARAAudioModification* audioModification, - ARA::PlugIn::PropertiesPtr newProperties) - { - ignoreUnused (audioModification, newProperties); - } + ARA::PlugIn::PropertiesPtr newProperties); /** Called after the audio modification's properties are updated. @param audioModification The audio modification whose properties were updated. */ - virtual void didUpdateAudioModificationProperties (ARAAudioModification* audioModification) - { - ignoreUnused (audioModification); - } + virtual void didUpdateAudioModificationProperties (ARAAudioModification* audioModification); /** Called when the audio modification's content (i.e. samples or notes) changes. @param audioModification The audio modification with updated content. @param scopeFlags The scope of the content update. */ - virtual void didUpdateAudioModificationContent (ARAAudioModification* audioModification, ARAContentUpdateScopes scopeFlags) - { - ignoreUnused (audioModification, scopeFlags); - } + virtual void didUpdateAudioModificationContent (ARAAudioModification* audioModification, + ARAContentUpdateScopes scopeFlags); /** Called before an audio modification is activated or deactivated when being removed / added from the host's undo history. @param audioModification The audio modification that was activated or deactivated @param deactivate A bool indicating whether \p audioModification was deactivated or activated. */ - virtual void willDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate) - { - ignoreUnused (audioModification, deactivate); - } + virtual void willDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, + bool deactivate); /** Called after an audio modification is activated or deactivated when being removed / added from the host's undo history. @param audioModification The audio modification that was activated or deactivated @param deactivate A bool indicating whether \p audioModification was deactivated or activated. */ - virtual void didDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate) - { - ignoreUnused (audioModification, deactivate); - } + virtual void didDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, + bool deactivate); /** Called after a playback region is added to the audio modification. @param audioModification The audio modification that \p playbackRegion was added to. @param playbackRegion The playback region that was added to \p audioModification. */ virtual void didAddPlaybackRegionToAudioModification (ARAAudioModification* audioModification, - ARAPlaybackRegion* playbackRegion) - { - ignoreUnused (audioModification, playbackRegion); - } + ARAPlaybackRegion* playbackRegion); /** Called before a playback region is removed from the audio modification. @param audioModification The audio modification that \p playbackRegion will be removed from. @param playbackRegion The playback region that will be removed from \p audioModification. */ virtual void willRemovePlaybackRegionFromAudioModification (ARAAudioModification* audioModification, - ARAPlaybackRegion* playbackRegion) - { - ignoreUnused (audioModification, playbackRegion); - } + ARAPlaybackRegion* playbackRegion); /** Called before the audio modification is destroyed. @param audioModification The audio modification that will be destroyed. */ - virtual void willDestroyAudioModification (ARAAudioModification* audioModification) - { - ignoreUnused (audioModification); - } - - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + virtual void willDestroyAudioModification (ARAAudioModification* audioModification); }; //============================================================================== diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp index fcece498..c80e1027 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp @@ -28,12 +28,10 @@ namespace juce { -bool ARARenderer::processBlock (AudioBuffer& buffer, - AudioProcessor::Realtime realtime, - const AudioPlayHead::PositionInfo& positionInfo) noexcept +bool ARARenderer::processBlock ([[maybe_unused]] AudioBuffer& buffer, + [[maybe_unused]] AudioProcessor::Realtime realtime, + [[maybe_unused]] const AudioPlayHead::PositionInfo& positionInfo) noexcept { - ignoreUnused (buffer, realtime, positionInfo); - // If you hit this assertion then either the caller called the double // precision version of processBlock on a processor which does not support it // (i.e. supportsDoublePrecisionProcessing() returns false), or the implementation @@ -43,6 +41,12 @@ bool ARARenderer::processBlock (AudioBuffer& buffer, return false; } +void ARARenderer::prepareToPlay ([[maybe_unused]] double sampleRate, + [[maybe_unused]] int maximumSamplesPerBlock, + [[maybe_unused]] int numChannels, + [[maybe_unused]] AudioProcessor::ProcessingPrecision precision, + [[maybe_unused]] AlwaysNonRealtime alwaysNonRealtime) {} + //============================================================================== #if ARA_VALIDATE_API_CALLS void ARAPlaybackRenderer::addPlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept @@ -62,6 +66,21 @@ void ARAPlaybackRenderer::removePlaybackRegion (ARA::ARAPlaybackRegionRef playba } #endif +bool ARAPlaybackRenderer::processBlock ([[maybe_unused]] AudioBuffer& buffer, + [[maybe_unused]] AudioProcessor::Realtime realtime, + [[maybe_unused]] const AudioPlayHead::PositionInfo& positionInfo) noexcept +{ + return false; +} + +//============================================================================== +bool ARAEditorRenderer::processBlock ([[maybe_unused]] AudioBuffer& buffer, + [[maybe_unused]] AudioProcessor::Realtime isNonRealtime, + [[maybe_unused]] const AudioPlayHead::PositionInfo& positionInfo) noexcept +{ + return true; +} + //============================================================================== void ARAEditorView::doNotifySelection (const ARA::PlugIn::ViewSelection* viewSelection) noexcept { @@ -89,4 +108,7 @@ void ARAEditorView::removeListener (Listener* l) listeners.remove (l); } +void ARAEditorView::Listener::onNewSelection ([[maybe_unused]] const ARAViewSelection& viewSelection) {} +void ARAEditorView::Listener::onHideRegionSequences ([[maybe_unused]] const std::vector& regionSequences) {} + } // namespace juce diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h index 4306d922..490e5667 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h @@ -59,10 +59,7 @@ public: int maximumSamplesPerBlock, int numChannels, AudioProcessor::ProcessingPrecision precision, - AlwaysNonRealtime alwaysNonRealtime = AlwaysNonRealtime::no) - { - ignoreUnused (sampleRate, maximumSamplesPerBlock, numChannels, precision, alwaysNonRealtime); - } + AlwaysNonRealtime alwaysNonRealtime = AlwaysNonRealtime::no); /** Frees render resources allocated in prepareToPlay(). */ virtual void releaseResources() {} @@ -128,11 +125,7 @@ public: bool processBlock (AudioBuffer& buffer, AudioProcessor::Realtime realtime, - const AudioPlayHead::PositionInfo& positionInfo) noexcept override - { - ignoreUnused (buffer, realtime, positionInfo); - return false; - } + const AudioPlayHead::PositionInfo& positionInfo) noexcept override; using ARARenderer::processBlock; @@ -191,11 +184,7 @@ public: // isNonRealtime of the process context - typically preview is limited to realtime. bool processBlock (AudioBuffer& buffer, AudioProcessor::Realtime isNonRealtime, - const AudioPlayHead::PositionInfo& positionInfo) noexcept override - { - ignoreUnused (buffer, isNonRealtime, positionInfo); - return true; - } + const AudioPlayHead::PositionInfo& positionInfo) noexcept override; using ARARenderer::processBlock; @@ -218,7 +207,7 @@ public: // Shadowing templated getters to default to JUCE versions of the returned classes template - std::vector const& getHiddenRegionSequences() const noexcept + const std::vector& getHiddenRegionSequences() const noexcept { return ARA::PlugIn::EditorView::getHiddenRegionSequences(); } @@ -227,7 +216,7 @@ public: void doNotifySelection (const ARA::PlugIn::ViewSelection* currentSelection) noexcept override; // Base class implementation must be called if overridden - void doNotifyHideRegionSequences (std::vector const& regionSequences) noexcept override; + void doNotifyHideRegionSequences (const std::vector& regionSequences) noexcept override; /** A base class for listeners that want to know about changes to an ARAEditorView object. @@ -239,25 +228,15 @@ public: /** Destructor. */ virtual ~Listener() = default; - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN - /** Called when the editor view's selection changes. @param viewSelection The current selection state */ - virtual void onNewSelection (const ARAViewSelection& viewSelection) - { - ignoreUnused (viewSelection); - } + virtual void onNewSelection (const ARAViewSelection& viewSelection); /** Called when region sequences are flagged as hidden in the host UI. @param regionSequences A vector containing all hidden region sequences. */ - virtual void onHideRegionSequences (std::vector const& regionSequences) - { - ignoreUnused (regionSequences); - } - - ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END + virtual void onHideRegionSequences (const std::vector& regionSequences); }; /** \copydoc ARAListenableModelClass::addListener */ diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h index 0b90483f..a6e0de39 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h @@ -135,12 +135,7 @@ public: void add (std::unique_ptr... items) { parameters.reserve (parameters.size() + sizeof... (items)); - - // We can replace this with some nicer code once generic lambdas become available. A - // sequential context like an array initialiser is required to ensure we get the correct - // order from the parameter pack. - int unused[] { (parameters.emplace_back (MakeContents() (std::move (items))), 0)... }; - ignoreUnused (unused); + (parameters.push_back (makeParameterStorage (std::move (items))), ...); } template > @@ -150,7 +145,7 @@ public: std::transform (std::make_move_iterator (begin), std::make_move_iterator (end), std::back_inserter (parameters), - MakeContents()); + [] (auto item) { return makeParameterStorage (std::move (item)); }); } ParameterLayout (const ParameterLayout& other) = delete; @@ -191,14 +186,11 @@ public: std::unique_ptr contents; }; - struct MakeContents final + template + static std::unique_ptr> makeParameterStorage (std::unique_ptr contents) { - template - std::unique_ptr operator() (std::unique_ptr item) const - { - return std::unique_ptr (new ParameterStorage (std::move (item))); - } - }; + return std::make_unique> (std::move (contents)); + } void add() {} diff --git a/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp b/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp index 6651bddf..78f7ea23 100644 --- a/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp +++ b/modules/juce_audio_processors/utilities/juce_PluginHostType.cpp @@ -56,7 +56,7 @@ void PluginHostType::switchToHostApplication() const #endif } -bool PluginHostType::isInAAXAudioSuite (AudioProcessor& processor) +bool PluginHostType::isInAAXAudioSuite ([[maybe_unused]] AudioProcessor& processor) { #if JucePlugin_Build_AAX if (PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_AAX @@ -66,14 +66,11 @@ bool PluginHostType::isInAAXAudioSuite (AudioProcessor& processor) } #endif - ignoreUnused (processor); return false; } -Image PluginHostType::getHostIcon (int size) const +Image PluginHostType::getHostIcon ([[maybe_unused]] int size) const { - ignoreUnused (size); - #if JucePlugin_Enable_IAA && JucePlugin_Build_Standalone && JUCE_IOS && (! JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP) if (isInterAppAudioConnected()) return juce_getIAAHostIcon (size); @@ -101,10 +98,12 @@ const char* PluginHostType::getHostDescription() const noexcept case AdobeAudition: return "Adobe Audition"; case AdobePremierePro: return "Adobe Premiere"; case AppleGarageBand: return "Apple GarageBand"; + case AppleInfoHelper: return "com.apple.audio.InfoHelper"; case AppleLogic: return "Apple Logic"; case AppleMainStage: return "Apple MainStage"; case Ardour: return "Ardour"; case AULab: return "AU Lab"; + case AUVal: return "auval"; case AvidProTools: return "ProTools"; case BitwigStudio: return "Bitwig Studio"; case CakewalkSonar8: return "Cakewalk Sonar 8"; @@ -215,6 +214,8 @@ PluginHostType::HostType PluginHostType::getHostType() if (hostFilename.containsIgnoreCase ("pluginval")) return pluginval; if (hostFilename.containsIgnoreCase ("AudioPluginHost")) return JUCEPluginHost; if (hostFilename.containsIgnoreCase ("Vienna Ensemble Pro")) return ViennaEnsemblePro; + if (hostFilename.containsIgnoreCase ("auvaltool")) return AUVal; + if (hostFilename.containsIgnoreCase ("com.apple.audio.infohelper")) return AppleInfoHelper; if (hostIdReportedByWrapper == "com.apple.logic.pro") return AppleLogic; if (hostIdReportedByWrapper == "com.apple.garageband") return AppleGarageBand; diff --git a/modules/juce_audio_processors/utilities/juce_PluginHostType.h b/modules/juce_audio_processors/utilities/juce_PluginHostType.h index c222899f..cf5f0e40 100644 --- a/modules/juce_audio_processors/utilities/juce_PluginHostType.h +++ b/modules/juce_audio_processors/utilities/juce_PluginHostType.h @@ -58,10 +58,12 @@ public: AdobeAudition, /**< Represents Adobe Audition. */ AdobePremierePro, /**< Represents Adobe Premiere Pro. */ AppleGarageBand, /**< Represents Apple GarageBand. */ + AppleInfoHelper, /**< Represents Apple com.apple.audio.InfoHelper. */ AppleLogic, /**< Represents Apple Logic Pro. */ AppleMainStage, /**< Represents Apple Main Stage. */ Ardour, /**< Represents Ardour. */ AULab, /**< Represents AU Lab. */ + AUVal, /**< Represents Apple AU validator. */ AvidProTools, /**< Represents Avid Pro Tools. */ BitwigStudio, /**< Represents Bitwig Studio. */ CakewalkSonar8, /**< Represents Cakewalk Sonar 8. */ @@ -121,10 +123,14 @@ public: || type == AbletonLiveGeneric; } /** Returns true if the host is Adobe Audition. */ bool isAdobeAudition() const noexcept { return type == AdobeAudition; } + /** Returns true if the host is com.apple.audio.InfoHelper. */ + bool isAppleInfoHelper() const noexcept { return type == AppleInfoHelper; } /** Returns true if the host is Ardour. */ bool isArdour() const noexcept { return type == Ardour; } /** Returns true if the host is AU Lab. */ bool isAULab() const noexcept { return type == AULab; } + /** Returns true if the host is auval. */ + bool isAUVal() const noexcept { return type == AUVal; } /** Returns true if the host is Bitwig Studio. */ bool isBitwigStudio() const noexcept { return type == BitwigStudio; } /** Returns true if the host is any version of Steinberg Cubase. */ diff --git a/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp b/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp new file mode 100644 index 00000000..e8b42e9b --- /dev/null +++ b/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp @@ -0,0 +1,39 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +pointer_sized_int VSTCallbackHandler::handleVstPluginCanDo ([[maybe_unused]] int32 index, + [[maybe_unused]] pointer_sized_int value, + [[maybe_unused]] void* ptr, + [[maybe_unused]] float opt) +{ + return 0; +} + +void VSTCallbackHandler::handleVstHostCallbackAvailable ([[maybe_unused]] std::function&& callback) {} + +} // namespace juce diff --git a/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h b/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h index d5a4ea5e..9fe3a0ad 100644 --- a/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h +++ b/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h @@ -46,11 +46,7 @@ struct VSTCallbackHandler virtual pointer_sized_int handleVstPluginCanDo (int32 index, pointer_sized_int value, void* ptr, - float opt) - { - ignoreUnused (index, value, ptr, opt); - return 0; - } + float opt); /** This is called by the VST plug-in wrapper when it receives unhandled vendor specific calls from the host. @@ -71,10 +67,7 @@ struct VSTCallbackHandler /** This is called once by the VST plug-in wrapper after its constructor. You can use the supplied function to query the VST host. */ - virtual void handleVstHostCallbackAvailable (std::function&& callback) - { - ignoreUnused (callback); - } + virtual void handleVstHostCallbackAvailable (std::function&& callback); }; } // namespace juce diff --git a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp index 3ffc4438..809162f5 100644 --- a/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp @@ -1193,11 +1193,18 @@ void AudioDeviceSelectorComponent::updateAllControls() void AudioDeviceSelectorComponent::handleBluetoothButton() { - if (! RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi)) - RuntimePermissions::request (RuntimePermissions::bluetoothMidi, nullptr); - if (RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi)) + { BluetoothMidiDevicePairingDialogue::open(); + } + else + { + RuntimePermissions::request (RuntimePermissions::bluetoothMidi, [] (auto) + { + if (RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi)) + BluetoothMidiDevicePairingDialogue::open(); + }); + } } ListBox* AudioDeviceSelectorComponent::getMidiInputSelectorListBox() const noexcept diff --git a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp index be3ff67d..fbd90eac 100644 --- a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp +++ b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp @@ -478,4 +478,9 @@ void MidiKeyboardComponent::handleNoteOff (MidiKeyboardState*, int /*midiChannel noPendingUpdates.store (false); } +//============================================================================== +bool MidiKeyboardComponent::mouseDownOnKey ([[maybe_unused]] int midiNoteNumber, [[maybe_unused]] const MouseEvent& e) { return true; } +bool MidiKeyboardComponent::mouseDraggedToKey ([[maybe_unused]] int midiNoteNumber, [[maybe_unused]] const MouseEvent& e) { return true; } +void MidiKeyboardComponent::mouseUpOnKey ([[maybe_unused]] int midiNoteNumber, [[maybe_unused]] const MouseEvent& e) {} + } // namespace juce diff --git a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h index 70dedb68..2c9c6ab6 100644 --- a/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h +++ b/modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h @@ -193,7 +193,7 @@ public: @see mouseDraggedToKey */ - virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e) { ignoreUnused (midiNoteNumber, e); return true; } + virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e); /** Callback when the mouse is dragged from one key onto another. @@ -202,13 +202,13 @@ public: @see mouseDownOnKey */ - virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e) { ignoreUnused (midiNoteNumber, e); return true; } + virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e); /** Callback when the mouse is released from a key. @see mouseDownOnKey */ - virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e) { ignoreUnused (midiNoteNumber, e); } + virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e); /** Allows text to be drawn on the white notes. diff --git a/modules/juce_audio_utils/juce_audio_utils.h b/modules/juce_audio_utils/juce_audio_utils.h index d9f41d7a..ae550992 100644 --- a/modules/juce_audio_utils/juce_audio_utils.h +++ b/modules/juce_audio_utils/juce_audio_utils.h @@ -35,7 +35,7 @@ ID: juce_audio_utils vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE extra audio utility classes description: Classes for audio-related GUI and miscellaneous tasks. website: http://www.juce.com/juce diff --git a/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm b/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm index 381c98fc..9eb0d6e0 100644 --- a/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm +++ b/modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm @@ -171,8 +171,7 @@ void AudioCDReader::refreshTrackLengths() if (toc.exists()) { XmlDocument doc (toc); - const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples); - ignoreUnused (error); // could be logged.. + [[maybe_unused]] const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples); lengthInSamples = trackStartSamples.getLast() - trackStartSamples.getFirst(); } diff --git a/modules/juce_box2d/juce_box2d.h b/modules/juce_box2d/juce_box2d.h index 3b6bf308..db26e24a 100644 --- a/modules/juce_box2d/juce_box2d.h +++ b/modules/juce_box2d/juce_box2d.h @@ -35,7 +35,7 @@ ID: juce_box2d vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE wrapper for the Box2D physics engine description: The Box2D physics engine and some utility classes. website: http://www.juce.com/juce diff --git a/modules/juce_core/containers/juce_Array.h b/modules/juce_core/containers/juce_Array.h index d80046b0..316e5452 100644 --- a/modules/juce_core/containers/juce_Array.h +++ b/modules/juce_core/containers/juce_Array.h @@ -727,32 +727,7 @@ public: @see addSorted, sort */ template - int indexOfSorted (ElementComparator& comparator, TargetValueType elementToLookFor) const - { - ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - const ScopedLockType lock (getLock()); - - for (int s = 0, e = values.size();;) - { - if (s >= e) - return -1; - - if (comparator.compareElements (elementToLookFor, values[s]) == 0) - return s; - - auto halfway = (s + e) / 2; - - if (halfway == s) - return -1; - - if (comparator.compareElements (elementToLookFor, values[halfway]) >= 0) - s = halfway; - else - e = halfway; - } - } + int indexOfSorted (ElementComparator& comparator, TargetValueType elementToLookFor) const; //============================================================================== /** Removes an element from the array. @@ -1106,14 +1081,7 @@ public: @see addSorted, indexOfSorted, sortArray */ template - void sort (ElementComparator& comparator, - bool retainOrderOfEquivalentItems = false) - { - const ScopedLockType lock (getLock()); - ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems); - } + void sort (ElementComparator& comparator, bool retainOrderOfEquivalentItems = false); //============================================================================== /** Returns the CriticalSection that locks this array. @@ -1150,4 +1118,43 @@ private: } }; +//============================================================================== +template +template +int Array::indexOfSorted ( + [[maybe_unused]] ElementComparator& comparator, + TargetValueType elementToLookFor) const +{ + const ScopedLockType lock (getLock()); + + for (int s = 0, e = values.size();;) + { + if (s >= e) + return -1; + + if (comparator.compareElements (elementToLookFor, values[s]) == 0) + return s; + + auto halfway = (s + e) / 2; + + if (halfway == s) + return -1; + + if (comparator.compareElements (elementToLookFor, values[halfway]) >= 0) + s = halfway; + else + e = halfway; + } +} + +template +template +void Array::sort ( + [[maybe_unused]] ElementComparator& comparator, + bool retainOrderOfEquivalentItems) +{ + const ScopedLockType lock (getLock()); + sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems); +} + } // namespace juce diff --git a/modules/juce_core/containers/juce_ArrayBase.h b/modules/juce_core/containers/juce_ArrayBase.h index af0d1be3..353fcfae 100644 --- a/modules/juce_core/containers/juce_ArrayBase.h +++ b/modules/juce_core/containers/juce_ArrayBase.h @@ -542,7 +542,7 @@ private: template void addImpl (Elements&&... toAdd) { - ignoreUnused (std::initializer_list { (((void) checkSourceIsNotAMember (toAdd)), 0)... }); + (checkSourceIsNotAMember (toAdd), ...); ensureAllocatedSize (numUsed + (int) sizeof... (toAdd)); addAssumingCapacityIsReady (std::forward (toAdd)...); } @@ -550,7 +550,7 @@ private: template void addAssumingCapacityIsReady (Elements&&... toAdd) { - ignoreUnused (std::initializer_list { ((void) (new (elements + numUsed++) ElementType (std::forward (toAdd))), 0)... }); + (new (elements + numUsed++) ElementType (std::forward (toAdd)), ...); } //============================================================================== diff --git a/modules/juce_core/containers/juce_ElementComparator.h b/modules/juce_core/containers/juce_ElementComparator.h index 5bf7d5e1..8f7ce2bb 100644 --- a/modules/juce_core/containers/juce_ElementComparator.h +++ b/modules/juce_core/containers/juce_ElementComparator.h @@ -123,7 +123,7 @@ static void sortArray (ElementComparator& comparator, @param lastElement the index of the last element in the range (this is non-inclusive) */ template -static int findInsertIndexInSortedArray (ElementComparator& comparator, +static int findInsertIndexInSortedArray ([[maybe_unused]] ElementComparator& comparator, ElementType* const array, const ElementType newElement, int firstElement, @@ -131,9 +131,6 @@ static int findInsertIndexInSortedArray (ElementComparator& comparator, { jassert (firstElement <= lastElement); - ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - while (firstElement < lastElement) { if (comparator.compareElements (newElement, array [firstElement]) == 0) diff --git a/modules/juce_core/containers/juce_Optional.h b/modules/juce_core/containers/juce_Optional.h index 63bcbd9f..b7609278 100644 --- a/modules/juce_core/containers/juce_Optional.h +++ b/modules/juce_core/containers/juce_Optional.h @@ -126,7 +126,7 @@ public: decltype (auto) operator* () { return opt.operator* (); } decltype (auto) operator* () const { return opt.operator* (); } - operator bool() const noexcept { return opt.has_value(); } + explicit operator bool() const noexcept { return opt.has_value(); } bool hasValue() const noexcept { return opt.has_value(); } template diff --git a/modules/juce_core/containers/juce_OwnedArray.h b/modules/juce_core/containers/juce_OwnedArray.h index 5bc789ed..c89b1125 100644 --- a/modules/juce_core/containers/juce_OwnedArray.h +++ b/modules/juce_core/containers/juce_OwnedArray.h @@ -46,7 +46,6 @@ namespace juce */ template - class OwnedArray { public: @@ -531,17 +530,7 @@ public: @see add, sort, indexOfSorted */ template - int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept - { - // If you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - ignoreUnused (comparator); - - const ScopedLockType lock (getLock()); - auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size()); - insert (index, newObject); - return index; - } + int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept; /** Finds the index of an object in the array, assuming that the array is sorted. @@ -556,33 +545,7 @@ public: @see addSorted, sort */ template - int indexOfSorted (ElementComparator& comparator, const ObjectClass* objectToLookFor) const noexcept - { - // If you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - ignoreUnused (comparator); - - const ScopedLockType lock (getLock()); - int s = 0, e = values.size(); - - while (s < e) - { - if (comparator.compareElements (objectToLookFor, values[s]) == 0) - return s; - - auto halfway = (s + e) / 2; - - if (halfway == s) - break; - - if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0) - s = halfway; - else - e = halfway; - } - - return -1; - } + int indexOfSorted (ElementComparator& comparator, const ObjectClass* objectToLookFor) const noexcept; //============================================================================== /** Removes an object from the array. @@ -818,18 +781,7 @@ public: @see sortArray, indexOfSorted */ template - void sort (ElementComparator& comparator, - bool retainOrderOfEquivalentItems = false) noexcept - { - // If you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - ignoreUnused (comparator); - - const ScopedLockType lock (getLock()); - - if (size() > 1) - sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems); - } + void sort (ElementComparator& comparator, bool retainOrderOfEquivalentItems = false) noexcept; //============================================================================== /** Returns the CriticalSection that locks this array. @@ -870,4 +822,57 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray) }; +//============================================================================== +template +template +int OwnedArray::addSorted ( + [[maybe_unused]] ElementComparator& comparator, + ObjectClass* newObject) noexcept +{ + const ScopedLockType lock (getLock()); + auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size()); + insert (index, newObject); + return index; +} + +template +template +int OwnedArray::indexOfSorted ( + [[maybe_unused]] ElementComparator& comparator, + const ObjectClass* objectToLookFor) const noexcept +{ + const ScopedLockType lock (getLock()); + int s = 0, e = values.size(); + + while (s < e) + { + if (comparator.compareElements (objectToLookFor, values[s]) == 0) + return s; + + auto halfway = (s + e) / 2; + + if (halfway == s) + break; + + if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0) + s = halfway; + else + e = halfway; + } + + return -1; +} + +template +template +void OwnedArray::sort ( + [[maybe_unused]] ElementComparator& comparator, + bool retainOrderOfEquivalentItems) noexcept +{ + const ScopedLockType lock (getLock()); + + if (size() > 1) + sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems); +} + } // namespace juce diff --git a/modules/juce_core/containers/juce_ReferenceCountedArray.h b/modules/juce_core/containers/juce_ReferenceCountedArray.h index c281a1c4..fe7dbdf5 100644 --- a/modules/juce_core/containers/juce_ReferenceCountedArray.h +++ b/modules/juce_core/containers/juce_ReferenceCountedArray.h @@ -563,31 +563,7 @@ public: @see addSorted, sort */ template - int indexOfSorted (ElementComparator& comparator, - const ObjectClass* objectToLookFor) const noexcept - { - ignoreUnused (comparator); - const ScopedLockType lock (getLock()); - int s = 0, e = values.size(); - - while (s < e) - { - if (comparator.compareElements (objectToLookFor, values[s]) == 0) - return s; - - auto halfway = (s + e) / 2; - - if (halfway == s) - break; - - if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0) - s = halfway; - else - e = halfway; - } - - return -1; - } + int indexOfSorted (ElementComparator& comparator, const ObjectClass* objectToLookFor) const noexcept; //============================================================================== /** Removes an object from the array. @@ -828,16 +804,7 @@ public: @see sortArray */ template - void sort (ElementComparator& comparator, - bool retainOrderOfEquivalentItems = false) noexcept - { - // If you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - ignoreUnused (comparator); - - const ScopedLockType lock (getLock()); - sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems); - } + void sort (ElementComparator& comparator, bool retainOrderOfEquivalentItems = false) noexcept; //============================================================================== /** Reduces the amount of storage being used by the array. @@ -904,4 +871,43 @@ private: } }; +//============================================================================== +template +template +int ReferenceCountedArray::indexOfSorted ( + [[maybe_unused]] ElementComparator& comparator, + const ObjectClass* objectToLookFor) const noexcept +{ + const ScopedLockType lock (getLock()); + int s = 0, e = values.size(); + + while (s < e) + { + if (comparator.compareElements (objectToLookFor, values[s]) == 0) + return s; + + auto halfway = (s + e) / 2; + + if (halfway == s) + break; + + if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0) + s = halfway; + else + e = halfway; + } + + return -1; +} + +template +template +void ReferenceCountedArray::sort ( + [[maybe_unused]] ElementComparator& comparator, + bool retainOrderOfEquivalentItems) noexcept +{ + const ScopedLockType lock (getLock()); + sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems); +} + } // namespace juce diff --git a/modules/juce_core/containers/juce_Variant.cpp b/modules/juce_core/containers/juce_Variant.cpp index 2321da3d..e84baa02 100644 --- a/modules/juce_core/containers/juce_Variant.cpp +++ b/modules/juce_core/containers/juce_Variant.cpp @@ -493,18 +493,6 @@ struct var::Instance static constexpr VariantType attributesObject { VariantType::ObjectTag{} }; }; -constexpr var::VariantType var::Instance::attributesVoid; -constexpr var::VariantType var::Instance::attributesUndefined; -constexpr var::VariantType var::Instance::attributesInt; -constexpr var::VariantType var::Instance::attributesInt64; -constexpr var::VariantType var::Instance::attributesBool; -constexpr var::VariantType var::Instance::attributesDouble; -constexpr var::VariantType var::Instance::attributesMethod; -constexpr var::VariantType var::Instance::attributesArray; -constexpr var::VariantType var::Instance::attributesString; -constexpr var::VariantType var::Instance::attributesBinary; -constexpr var::VariantType var::Instance::attributesObject; - //============================================================================== var::var() noexcept : type (&Instance::attributesVoid) {} var::var (const VariantType& t) noexcept : type (&t) {} diff --git a/modules/juce_core/files/juce_File.cpp b/modules/juce_core/files/juce_File.cpp index 20561f39..d19f14b8 100644 --- a/modules/juce_core/files/juce_File.cpp +++ b/modules/juce_core/files/juce_File.cpp @@ -953,7 +953,7 @@ File File::createTempFile (StringRef fileNameEnding) } bool File::createSymbolicLink (const File& linkFileToCreate, - const String& nativePathOfTarget, + [[maybe_unused]] const String& nativePathOfTarget, bool overwriteExisting) { if (linkFileToCreate.exists()) @@ -986,7 +986,6 @@ bool File::createSymbolicLink (const File& linkFileToCreate, nativePathOfTarget.toWideCharPointer(), targetFile.isDirectory() ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0) != FALSE; #else - ignoreUnused (nativePathOfTarget); jassertfalse; // symbolic links not supported on this platform! return false; #endif diff --git a/modules/juce_core/javascript/juce_Javascript.cpp b/modules/juce_core/javascript/juce_Javascript.cpp index 3ad6c775..1582571c 100644 --- a/modules/juce_core/javascript/juce_Javascript.cpp +++ b/modules/juce_core/javascript/juce_Javascript.cpp @@ -1278,7 +1278,7 @@ struct JavascriptEngine::RootObject : public DynamicObject Expression* parseFunctionCall (FunctionCall* call, ExpPtr& function) { std::unique_ptr s (call); - s->object.reset (function.release()); + s->object = std::move (function); match (TokenTypes::openParen); while (currentType != TokenTypes::closeParen) @@ -1304,7 +1304,7 @@ struct JavascriptEngine::RootObject : public DynamicObject if (matchIf (TokenTypes::openBracket)) { std::unique_ptr s (new ArraySubscript (location)); - s->object.reset (input.release()); + s->object = std::move (input); s->index.reset (parseExpression()); match (TokenTypes::closeBracket); return parseSuffixes (s.release()); @@ -1513,7 +1513,7 @@ struct JavascriptEngine::RootObject : public DynamicObject Expression* parseTernaryOperator (ExpPtr& condition) { std::unique_ptr e (new ConditionalOp (location)); - e->condition.reset (condition.release()); + e->condition = std::move (condition); e->trueBranch.reset (parseExpression()); match (TokenTypes::colon); e->falseBranch.reset (parseExpression()); @@ -1539,9 +1539,9 @@ struct JavascriptEngine::RootObject : public DynamicObject setMethod ("clone", cloneFn); } - static Identifier getClassName() { static const Identifier i ("Object"); return i; } - static var dump (Args a) { DBG (JSON::toString (a.thisObject)); ignoreUnused (a); return var::undefined(); } - static var cloneFn (Args a) { return a.thisObject.clone(); } + static Identifier getClassName() { static const Identifier i ("Object"); return i; } + static var dump ([[maybe_unused]] Args a) { DBG (JSON::toString (a.thisObject)); return var::undefined(); } + static var cloneFn (Args a) { return a.thisObject.clone(); } }; //============================================================================== diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h index 1920c0d4..1e08fb4d 100644 --- a/modules/juce_core/juce_core.h +++ b/modules/juce_core/juce_core.h @@ -32,7 +32,7 @@ ID: juce_core vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE core classes description: The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality. website: http://www.juce.com/juce diff --git a/modules/juce_core/maths/juce_Expression.cpp b/modules/juce_core/maths/juce_Expression.cpp index f4dd5e45..49542942 100644 --- a/modules/juce_core/maths/juce_Expression.cpp +++ b/modules/juce_core/maths/juce_Expression.cpp @@ -424,9 +424,8 @@ struct Expression::Helpers String getName() const { return "-"; } TermPtr negated() { return input; } - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* t, double overallTarget, Term* topLevelTerm) const + TermPtr createTermToEvaluateInput (const Scope& scope, [[maybe_unused]] const Term* t, double overallTarget, Term* topLevelTerm) const { - ignoreUnused (t); jassert (t == input); const Term* const dest = findDestinationFor (topLevelTerm, this); diff --git a/modules/juce_core/memory/juce_ContainerDeletePolicy.h b/modules/juce_core/memory/juce_ContainerDeletePolicy.h index 1e3fcd2e..2eddc07d 100644 --- a/modules/juce_core/memory/juce_ContainerDeletePolicy.h +++ b/modules/juce_core/memory/juce_ContainerDeletePolicy.h @@ -49,7 +49,7 @@ struct ContainerDeletePolicy // implementation of all methods trying to use the OwnedArray (e.g. the destructor // of the class owning it) into cpp files where they can see to the definition // of ObjectType. This should fix the error. - ignoreUnused (sizeof (ObjectType)); + [[maybe_unused]] constexpr auto size = sizeof (ObjectType); delete object; } diff --git a/modules/juce_core/misc/juce_Functional.h b/modules/juce_core/misc/juce_Functional.h index 05eaca51..e2a8bbfd 100644 --- a/modules/juce_core/misc/juce_Functional.h +++ b/modules/juce_core/misc/juce_Functional.h @@ -113,4 +113,19 @@ Object withMember (Object copy, Member OtherObject::* member, Other&& value) template struct ScopeGuard : Fn { ~ScopeGuard() { Fn::operator()(); } }; template ScopeGuard (Fn) -> ScopeGuard; +#ifndef DOXYGEN +namespace detail +{ +template +static constexpr auto toFnPtr (Functor functor, Return (Functor::*) (Args...) const) +{ + return static_cast (functor); +} +} // namespace detail +#endif + +/** Converts a captureless lambda to its equivalent function pointer type. */ +template +static constexpr auto toFnPtr (Functor functor) { return detail::toFnPtr (functor, &Functor::operator()); } + } // namespace juce diff --git a/modules/juce_core/misc/juce_RuntimePermissions.h b/modules/juce_core/misc/juce_RuntimePermissions.h index 3f1cd113..ca8d139f 100644 --- a/modules/juce_core/misc/juce_RuntimePermissions.h +++ b/modules/juce_core/misc/juce_RuntimePermissions.h @@ -86,7 +86,22 @@ public: writeExternalStorage = 4, /** Permission to use camera */ - camera = 5 + camera = 5, + + /** Permission to read audio files that your app didn't create. + Has the same effect as readExternalStorage on iOS and Android versions before 33. + */ + readMediaAudio = 6, + + /** Permission to read image files that your app didn't create. + Has the same effect as readExternalStorage on iOS and Android versions before 33. + */ + readMediaImages = 7, + + /** Permission to read video files that your app didn't create. + Has the same effect as readExternalStorage on iOS and Android versions before 33. + */ + readMediaVideo = 8 }; //============================================================================== diff --git a/modules/juce_core/native/juce_android_AndroidDocument.cpp b/modules/juce_core/native/juce_android_AndroidDocument.cpp index e3dba249..d86eb2f0 100644 --- a/modules/juce_core/native/juce_android_AndroidDocument.cpp +++ b/modules/juce_core/native/juce_android_AndroidDocument.cpp @@ -101,8 +101,7 @@ struct AndroidDocumentDetail auto* env = getEnv(); LocalRef array { env->NewObjectArray (sizeof... (args), JavaString, nullptr) }; - int unused[] { (env->SetObjectArrayElement (array.get(), Ix, args.get()), 0)... }; - ignoreUnused (unused); + (env->SetObjectArrayElement (array.get(), Ix, args.get()), ...); return array; } @@ -745,21 +744,17 @@ struct AndroidDocument::Utils }; //============================================================================== -void AndroidDocumentPermission::takePersistentReadWriteAccess (const URL& url) +void AndroidDocumentPermission::takePersistentReadWriteAccess ([[maybe_unused]] const URL& url) { #if JUCE_ANDROID AndroidDocumentDetail::setPermissions (url, ContentResolver19.takePersistableUriPermission); - #else - ignoreUnused (url); #endif } -void AndroidDocumentPermission::releasePersistentReadWriteAccess (const URL& url) +void AndroidDocumentPermission::releasePersistentReadWriteAccess ([[maybe_unused]] const URL& url) { #if JUCE_ANDROID AndroidDocumentDetail::setPermissions (url, ContentResolver19.releasePersistableUriPermission); - #else - ignoreUnused (url); #endif } @@ -817,7 +812,7 @@ AndroidDocument AndroidDocument::fromFile (const File& filePath) : nullptr }; } -AndroidDocument AndroidDocument::fromDocument (const URL& documentUrl) +AndroidDocument AndroidDocument::fromDocument ([[maybe_unused]] const URL& documentUrl) { #if JUCE_ANDROID if (getAndroidSDKVersion() < 19) @@ -839,12 +834,11 @@ AndroidDocument AndroidDocument::fromDocument (const URL& documentUrl) return AndroidDocument { Utils::createPimplForSdk (javaUri) }; #else - ignoreUnused (documentUrl); return AndroidDocument{}; #endif } -AndroidDocument AndroidDocument::fromTree (const URL& treeUrl) +AndroidDocument AndroidDocument::fromTree ([[maybe_unused]] const URL& treeUrl) { #if JUCE_ANDROID if (getAndroidSDKVersion() < 21) @@ -874,7 +868,6 @@ AndroidDocument AndroidDocument::fromTree (const URL& treeUrl) return AndroidDocument { Utils::createPimplForSdk (documentUri) }; #else - ignoreUnused (treeUrl); return AndroidDocument{}; #endif } diff --git a/modules/juce_core/native/juce_android_JNIHelpers.cpp b/modules/juce_core/native/juce_android_JNIHelpers.cpp index eb2c3838..45eb542f 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.cpp +++ b/modules/juce_core/native/juce_android_JNIHelpers.cpp @@ -62,7 +62,7 @@ static const uint8 invocationHandleByteCode[] = CALLBACK (juce_invokeImplementer, "dispatchInvoke", "(JLjava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;") \ CALLBACK (juce_dispatchDelete, "dispatchFinalize", "(J)V") - DECLARE_JNI_CLASS_WITH_BYTECODE (JuceInvocationHandler, "com/rmsl/juce/JuceInvocationHandler", 10, invocationHandleByteCode, sizeof (invocationHandleByteCode)) + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceInvocationHandler, "com/rmsl/juce/JuceInvocationHandler", 10, invocationHandleByteCode) #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ @@ -116,7 +116,7 @@ struct SystemJavaClassComparator }; //============================================================================== -JNIClassBase::JNIClassBase (const char* cp, int classMinSDK, const void* bc, size_t n) +JNIClassBase::JNIClassBase (const char* cp, int classMinSDK, const uint8* bc, size_t n) : classPath (cp), byteCode (bc), byteCodeSize (n), minSDK (classMinSDK), classRef (nullptr) { SystemJavaClassComparator comparator; @@ -552,12 +552,12 @@ static const uint8 javaFragmentOverlay[] = #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (construct, "", "()V") \ METHOD (close, "close", "()V") \ - CALLBACK (FragmentOverlay::onActivityResultNative, "onActivityResultNative", "(JIILandroid/content/Intent;)V") \ - CALLBACK (FragmentOverlay::onCreateNative, "onCreateNative", "(JLandroid/os/Bundle;)V") \ - CALLBACK (FragmentOverlay::onStartNative, "onStartNative", "(J)V") \ - CALLBACK (FragmentOverlay::onRequestPermissionsResultNative, "onRequestPermissionsResultNative", "(JI[Ljava/lang/String;[I)V") + CALLBACK (generatedCallback<&FragmentOverlay::onActivityResultCallback>, "onActivityResultNative", "(JIILandroid/content/Intent;)V") \ + CALLBACK (generatedCallback<&FragmentOverlay::onCreatedCallback>, "onCreateNative", "(JLandroid/os/Bundle;)V") \ + CALLBACK (generatedCallback<&FragmentOverlay::onStartCallback>, "onStartNative", "(J)V") \ + CALLBACK (generatedCallback<&FragmentOverlay::onRequestPermissionsResultCallback>, "onRequestPermissionsResultNative", "(JI[Ljava/lang/String;[I)V") - DECLARE_JNI_CLASS_WITH_BYTECODE (JuceFragmentOverlay, "com/rmsl/juce/FragmentOverlay", 16, javaFragmentOverlay, sizeof(javaFragmentOverlay)) + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceFragmentOverlay, "com/rmsl/juce/FragmentOverlay", 16, javaFragmentOverlay) #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ @@ -590,47 +590,39 @@ void FragmentOverlay::open() env->CallVoidMethod (native.get(), AndroidDialogFragment.show, fm.get(), javaString ("FragmentOverlay").get()); } -void FragmentOverlay::onActivityResultNative (JNIEnv* env, jobject, jlong host, - jint requestCode, jint resultCode, jobject data) +void FragmentOverlay::onCreatedCallback (JNIEnv* env, FragmentOverlay& t, jobject obj) { - if (auto* myself = reinterpret_cast (host)) - myself->onActivityResult (requestCode, resultCode, LocalRef (env->NewLocalRef (data))); + t.onCreated (LocalRef { env->NewLocalRef (obj) }); } -void FragmentOverlay::onCreateNative (JNIEnv* env, jobject, jlong host, jobject bundle) +void FragmentOverlay::onStartCallback (JNIEnv*, FragmentOverlay& t) { - if (auto* myself = reinterpret_cast (host)) - myself->onCreated (LocalRef (env->NewLocalRef (bundle))); + t.onStart(); } -void FragmentOverlay::onStartNative (JNIEnv*, jobject, jlong host) +void FragmentOverlay::onRequestPermissionsResultCallback (JNIEnv* env, FragmentOverlay& t, jint requestCode, jobjectArray jPermissions, jintArray jGrantResults) { - if (auto* myself = reinterpret_cast (host)) - myself->onStart(); -} + Array grantResults; + int n = (jGrantResults != nullptr ? env->GetArrayLength (jGrantResults) : 0); -void FragmentOverlay::onRequestPermissionsResultNative (JNIEnv* env, jobject, jlong host, jint requestCode, - jobjectArray jPermissions, jintArray jGrantResults) -{ - if (auto* myself = reinterpret_cast (host)) + if (n > 0) { - Array grantResults; - int n = (jGrantResults != nullptr ? env->GetArrayLength (jGrantResults) : 0); + auto* data = env->GetIntArrayElements (jGrantResults, nullptr); - if (n > 0) - { - auto* data = env->GetIntArrayElements (jGrantResults, nullptr); + for (int i = 0; i < n; ++i) + grantResults.add (data[i]); - for (int i = 0; i < n; ++i) - grantResults.add (data[i]); + env->ReleaseIntArrayElements (jGrantResults, data, 0); + } - env->ReleaseIntArrayElements (jGrantResults, data, 0); - } + t.onRequestPermissionsResult (requestCode, + javaStringArrayToJuce (LocalRef (jPermissions)), + grantResults); +} - myself->onRequestPermissionsResult (requestCode, - javaStringArrayToJuce (LocalRef (jPermissions)), - grantResults); - } +void FragmentOverlay::onActivityResultCallback (JNIEnv* env, FragmentOverlay& t, jint requestCode, jint resultCode, jobject data) +{ + t.onActivityResult (requestCode, resultCode, LocalRef (env->NewLocalRef (data))); } jobject FragmentOverlay::getNativeHandle() diff --git a/modules/juce_core/native/juce_android_JNIHelpers.h b/modules/juce_core/native/juce_android_JNIHelpers.h index bdfa4c38..aeb49f97 100644 --- a/modules/juce_core/native/juce_android_JNIHelpers.h +++ b/modules/juce_core/native/juce_android_JNIHelpers.h @@ -172,7 +172,7 @@ struct SystemJavaClassComparator; class JNIClassBase { public: - JNIClassBase (const char* classPath, int minSDK, const void* byteCode, size_t byteCodeSize); + JNIClassBase (const char* classPath, int minSDK, const uint8* byteCode, size_t byteCodeSize); virtual ~JNIClassBase(); operator jclass() const noexcept { return classRef; } @@ -210,6 +210,9 @@ private: }; //============================================================================== +template constexpr auto numBytes (const T (&) [N]) { return N; } + constexpr auto numBytes (std::nullptr_t) { return static_cast (0); } + #define CREATE_JNI_METHOD(methodID, stringName, params) methodID = resolveMethod (env, stringName, params); #define CREATE_JNI_STATICMETHOD(methodID, stringName, params) methodID = resolveStaticMethod (env, stringName, params); #define CREATE_JNI_FIELD(fieldID, stringName, signature) fieldID = resolveField (env, stringName, signature); @@ -219,26 +222,26 @@ private: #define DECLARE_JNI_FIELD(fieldID, stringName, signature) jfieldID fieldID; #define DECLARE_JNI_CALLBACK(fieldID, stringName, signature) -#define DECLARE_JNI_CLASS_WITH_BYTECODE(CppClassName, javaPath, minSDK, byteCodeData, byteCodeSize) \ - class CppClassName ## _Class : public JNIClassBase \ - { \ - public: \ - CppClassName ## _Class() : JNIClassBase (javaPath, minSDK, byteCodeData, byteCodeSize) {} \ - \ - void initialiseFields (JNIEnv* env) \ - { \ - Array callbacks; \ - JNI_CLASS_MEMBERS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD, CREATE_JNI_CALLBACK); \ - resolveCallbacks (env, callbacks); \ - } \ - \ - JNI_CLASS_MEMBERS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD, DECLARE_JNI_CALLBACK) \ - }; \ - static CppClassName ## _Class CppClassName; +#define DECLARE_JNI_CLASS_WITH_BYTECODE(CppClassName, javaPath, minSDK, byteCodeData) \ + class CppClassName ## _Class : public JNIClassBase \ + { \ + public: \ + CppClassName ## _Class() : JNIClassBase (javaPath, minSDK, byteCodeData, numBytes (byteCodeData)) {} \ + \ + void initialiseFields (JNIEnv* env) \ + { \ + Array callbacks; \ + JNI_CLASS_MEMBERS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD, CREATE_JNI_CALLBACK); \ + resolveCallbacks (env, callbacks); \ + } \ + \ + JNI_CLASS_MEMBERS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD, DECLARE_JNI_CALLBACK) \ + }; \ + static inline const CppClassName ## _Class CppClassName; //============================================================================== #define DECLARE_JNI_CLASS_WITH_MIN_SDK(CppClassName, javaPath, minSDK) \ - DECLARE_JNI_CLASS_WITH_BYTECODE (CppClassName, javaPath, minSDK, nullptr, 0) + DECLARE_JNI_CLASS_WITH_BYTECODE (CppClassName, javaPath, minSDK, nullptr) //============================================================================== #define DECLARE_JNI_CLASS(CppClassName, javaPath) \ @@ -1005,20 +1008,20 @@ public: const Array& /*grantResults*/) {} virtual void onActivityResult (int /*requestCode*/, int /*resultCode*/, LocalRef /*data*/) {} + /** @internal */ + static void onCreatedCallback (JNIEnv*, FragmentOverlay&, jobject obj); + /** @internal */ + static void onStartCallback (JNIEnv*, FragmentOverlay&); + /** @internal */ + static void onRequestPermissionsResultCallback (JNIEnv*, FragmentOverlay&, jint requestCode, jobjectArray jPermissions, jintArray jGrantResults); + /** @internal */ + static void onActivityResultCallback (JNIEnv*, FragmentOverlay&, jint requestCode, jint resultCode, jobject data); + protected: jobject getNativeHandle(); private: - GlobalRef native; - -public: - /* internal: do not use */ - static void onActivityResultNative (JNIEnv*, jobject, jlong, jint, jint, jobject); - static void onCreateNative (JNIEnv*, jobject, jlong, jobject); - static void onStartNative (JNIEnv*, jobject, jlong); - static void onRequestPermissionsResultNative (JNIEnv*, jobject, jlong, jint, - jobjectArray, jintArray); }; //============================================================================== @@ -1030,4 +1033,30 @@ void startAndroidActivityForResult (const LocalRef& intent, int request bool androidHasSystemFeature (const String& property); String audioManagerGetProperty (const String& property); +namespace detail +{ + +template +inline constexpr auto generatedCallbackImpl = + juce::toFnPtr (JNICALL [] (JNIEnv* env, jobject, jlong host, Args... args) -> Result + { + if (auto* object = reinterpret_cast (host)) + return Fn (env, *object, args...); + + return {}; + }); + +template +constexpr auto generateCallbackImpl (Result (*) (JNIEnv*, Class&, Args...)) { return generatedCallbackImpl; } + +template +constexpr auto generateCallbackImpl (Result (*) (JNIEnv*, const Class&, Args...)) { return generatedCallbackImpl; } + +} // namespace detail + +// Evaluates to a static function that forwards to the provided Fn, assuming that the +// 'host' argument points to an object on which it is valid to call Fn +template +inline constexpr auto generatedCallback = detail::generateCallbackImpl (Fn); + } // namespace juce diff --git a/modules/juce_core/native/juce_android_Network.cpp b/modules/juce_core/native/juce_android_Network.cpp index f5a3afa8..c128cc69 100644 --- a/modules/juce_core/native/juce_android_Network.cpp +++ b/modules/juce_core/native/juce_android_Network.cpp @@ -195,7 +195,7 @@ DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer") METHOD (isExhausted, "isExhausted", "()Z") \ METHOD (setPosition, "setPosition", "(J)Z") \ -DECLARE_JNI_CLASS_WITH_BYTECODE (HTTPStream, "com/rmsl/juce/JuceHTTPStream", 16, javaJuceHttpStream, sizeof(javaJuceHttpStream)) +DECLARE_JNI_CLASS_WITH_BYTECODE (HTTPStream, "com/rmsl/juce/JuceHTTPStream", 16, javaJuceHttpStream) #undef JNI_CLASS_MEMBERS //============================================================================== diff --git a/modules/juce_core/native/juce_android_RuntimePermissions.cpp b/modules/juce_core/native/juce_android_RuntimePermissions.cpp index 1bbc073b..285b92c1 100644 --- a/modules/juce_core/native/juce_android_RuntimePermissions.cpp +++ b/modules/juce_core/native/juce_android_RuntimePermissions.cpp @@ -24,15 +24,47 @@ namespace juce { //============================================================================== -static String jucePermissionToAndroidPermission (RuntimePermissions::PermissionID permission) +static StringArray jucePermissionToAndroidPermissions (RuntimePermissions::PermissionID permission) { + const auto externalStorageOrMedia = [] (const auto* newPermission) + { + return getAndroidSDKVersion() < 33 ? "android.permission.READ_EXTERNAL_STORAGE" : newPermission; + }; + switch (permission) { - case RuntimePermissions::recordAudio: return "android.permission.RECORD_AUDIO"; - case RuntimePermissions::bluetoothMidi: return "android.permission.ACCESS_FINE_LOCATION"; - case RuntimePermissions::readExternalStorage: return "android.permission.READ_EXTERNAL_STORAGE"; - case RuntimePermissions::writeExternalStorage: return "android.permission.WRITE_EXTERNAL_STORAGE"; - case RuntimePermissions::camera: return "android.permission.CAMERA"; + case RuntimePermissions::recordAudio: return { "android.permission.RECORD_AUDIO" }; + case RuntimePermissions::bluetoothMidi: + { + if (getAndroidSDKVersion() < 31) + return { "android.permission.ACCESS_FINE_LOCATION" }; + + return { "android.permission.BLUETOOTH_SCAN", + "android.permission.BLUETOOTH_CONNECT" }; + } + + case RuntimePermissions::writeExternalStorage: return { "android.permission.WRITE_EXTERNAL_STORAGE" }; + case RuntimePermissions::camera: return { "android.permission.CAMERA" }; + + case RuntimePermissions::readExternalStorage: + { + // See: https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE + if (getAndroidSDKVersion() < 33) + return { "android.permission.READ_EXTERNAL_STORAGE" }; + + return { "android.permission.READ_MEDIA_AUDIO", + "android.permission.READ_MEDIA_IMAGES", + "android.permission.READ_MEDIA_VIDEO" }; + } + + case RuntimePermissions::readMediaAudio: + return { externalStorageOrMedia ("android.permission.READ_MEDIA_AUDIO") }; + + case RuntimePermissions::readMediaImages: + return { externalStorageOrMedia ("android.permission.READ_MEDIA_IMAGES") }; + + case RuntimePermissions::readMediaVideo: + return { externalStorageOrMedia ("android.permission.READ_MEDIA_VIDEO") }; } // invalid permission @@ -42,53 +74,29 @@ static String jucePermissionToAndroidPermission (RuntimePermissions::PermissionI static RuntimePermissions::PermissionID androidPermissionToJucePermission (const String& permission) { - if (permission == "android.permission.RECORD_AUDIO") return RuntimePermissions::recordAudio; - else if (permission == "android.permission.ACCESS_FINE_LOCATION") return RuntimePermissions::bluetoothMidi; - else if (permission == "android.permission.READ_EXTERNAL_STORAGE") return RuntimePermissions::readExternalStorage; - else if (permission == "android.permission.WRITE_EXTERNAL_STORAGE") return RuntimePermissions::writeExternalStorage; - else if (permission == "android.permission.CAMERA") return RuntimePermissions::camera; + static const std::map map + { + { "android.permission.RECORD_AUDIO", RuntimePermissions::recordAudio }, + { "android.permission.ACCESS_FINE_LOCATION", RuntimePermissions::bluetoothMidi }, + { "android.permission.READ_EXTERNAL_STORAGE", RuntimePermissions::readExternalStorage }, + { "android.permission.WRITE_EXTERNAL_STORAGE", RuntimePermissions::writeExternalStorage }, + { "android.permission.CAMERA", RuntimePermissions::camera }, + { "android.permission.READ_MEDIA_AUDIO", RuntimePermissions::readMediaAudio }, + { "android.permission.READ_MEDIA_IMAGES", RuntimePermissions::readMediaImages }, + { "android.permission.READ_MEDIA_VIDEO", RuntimePermissions::readMediaVideo }, + { "android.permission.BLUETOOTH_SCAN", RuntimePermissions::bluetoothMidi }, + }; - return static_cast (-1); + const auto iter = map.find (permission); + return iter != map.cend() ? iter->second + : static_cast (-1); } //============================================================================== struct PermissionsRequest { - PermissionsRequest() {} - - // using "= default" on the following method triggers an internal compiler error - // in Android NDK 17 - PermissionsRequest (const PermissionsRequest& o) - : callback (o.callback), permission (o.permission) - {} - - PermissionsRequest (PermissionsRequest&& o) - : callback (std::move (o.callback)), permission (o.permission) - { - o.permission = static_cast (-1); - } - - PermissionsRequest (RuntimePermissions::Callback && callbackToUse, - RuntimePermissions::PermissionID permissionToRequest) - : callback (std::move (callbackToUse)), permission (permissionToRequest) - {} - - PermissionsRequest& operator= (const PermissionsRequest & o) - { - callback = o.callback; - permission = o.permission; - return *this; - } - - PermissionsRequest& operator= (PermissionsRequest && o) - { - callback = std::move (o.callback); - permission = o.permission; - return *this; - } - RuntimePermissions::Callback callback; - RuntimePermissions::PermissionID permission; + RuntimePermissions::PermissionID permission = static_cast (-1); }; //============================================================================== @@ -165,8 +173,7 @@ struct PermissionsOverlay : FragmentOverlay { auto &request = requests.front(); - StringArray permissionsArray{ - jucePermissionToAndroidPermission (request.permission)}; + auto permissionsArray = jucePermissionToAndroidPermissions (request.permission); auto jPermissionsArray = juceStringArrayToJava (permissionsArray); @@ -199,9 +206,16 @@ struct PermissionsOverlay : FragmentOverlay //============================================================================== void RuntimePermissions::request (PermissionID permission, Callback callback) { - auto requestedPermission = jucePermissionToAndroidPermission (permission); + const auto requestedPermissions = jucePermissionToAndroidPermissions (permission); + + const auto allPermissionsInManifest = std::all_of (requestedPermissions.begin(), + requestedPermissions.end(), + [] (const auto& p) + { + return isPermissionDeclaredInManifest (p); + }); - if (! isPermissionDeclaredInManifest (requestedPermission)) + if (! allPermissionsInManifest) { // Error! If you want to be able to request this runtime permission, you // also need to declare it in your app's manifest. You can do so via @@ -220,7 +234,7 @@ void RuntimePermissions::request (PermissionID permission, Callback callback) return; } - PermissionsRequest request (std::move (callback), permission); + PermissionsRequest request { std::move (callback), permission }; static CriticalSection overlayGuard; ScopedLock lock (overlayGuard); @@ -250,12 +264,15 @@ bool RuntimePermissions::isGranted (PermissionID permission) { auto* env = getEnv(); - auto requestedPermission = jucePermissionToAndroidPermission (permission); - int result = env->CallIntMethod (getAppContext().get(), AndroidContext.checkCallingOrSelfPermission, - javaString (requestedPermission).get()); + const auto requestedPermissions = jucePermissionToAndroidPermissions (permission); + return std::all_of (requestedPermissions.begin(), requestedPermissions.end(), [env] (const auto& p) + { + return 0 == env->CallIntMethod (getAppContext().get(), + AndroidContext.checkCallingOrSelfPermission, + javaString (p).get()); + }); - return result == 0 /* PERMISSION_GRANTED */; } } // namespace juce diff --git a/modules/juce_core/native/juce_android_Threads.cpp b/modules/juce_core/native/juce_android_Threads.cpp index e69b3bd9..fe608855 100644 --- a/modules/juce_core/native/juce_android_Threads.cpp +++ b/modules/juce_core/native/juce_android_Threads.cpp @@ -344,34 +344,32 @@ LocalRef getMainActivity() noexcept } //============================================================================== -#if JUCE_ANDROID && JUCE_MODULE_AVAILABLE_juce_audio_devices && (JUCE_USE_ANDROID_OPENSLES || JUCE_USE_ANDROID_OBOE) - #define JUCE_ANDROID_REALTIME_THREAD_AVAILABLE 1 -#endif +using RealtimeThreadFactory = pthread_t (*) (void* (*entry) (void*), void* userPtr); +// This is defined in the juce_audio_devices module, with different definitions depending on +// whether OpenSL/Oboe are enabled. +RealtimeThreadFactory getAndroidRealtimeThreadFactory(); -#if JUCE_ANDROID_REALTIME_THREAD_AVAILABLE -pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr); +#if ! JUCE_MODULE_AVAILABLE_juce_audio_devices +RealtimeThreadFactory getAndroidRealtimeThreadFactory() { return nullptr; } #endif extern JavaVM* androidJNIJavaVM; -bool Thread::createNativeThread (Priority) +static auto setPriorityOfThisThread (Thread::Priority p) { - if (isRealtime()) - { - #if JUCE_ANDROID_REALTIME_THREAD_AVAILABLE - threadHandle = (void*) juce_createRealtimeAudioThread (threadEntryProc, this); - threadId = (ThreadID) threadHandle.get(); - return threadId != nullptr; - #else - jassertfalse; - #endif - } + return setpriority (PRIO_PROCESS, + (id_t) gettid(), + ThreadPriorities::getNativePriority (p)) == 0; +} - PosixThreadAttribute attr { threadStackSize }; - threadId = threadHandle = makeThreadHandle (attr, this, [] (void* userData) -> void* +bool Thread::createNativeThread (Priority) +{ + const auto threadEntryProc = [] (void* userData) -> void* { auto* myself = static_cast (userData); + setPriorityOfThisThread (myself->priority); + juce_threadEntryPoint (myself); if (androidJNIJavaVM != nullptr) @@ -385,7 +383,24 @@ bool Thread::createNativeThread (Priority) } return nullptr; - }); + }; + + if (isRealtime()) + { + if (const auto factory = getAndroidRealtimeThreadFactory()) + { + threadHandle = (void*) factory (threadEntryProc, this); + threadId = (ThreadID) threadHandle.load(); + return threadId != nullptr; + } + else + { + jassertfalse; + } + } + + PosixThreadAttribute attr { threadStackSize }; + threadId = threadHandle = makeThreadHandle (attr, this, threadEntryProc); return threadId != nullptr; } @@ -404,14 +419,15 @@ Thread::Priority Thread::getPriority() const return ThreadPriorities::getJucePriority (native); } -bool Thread::setPriority (Priority) +bool Thread::setPriority (Priority priorityIn) { jassert (Thread::getCurrentThreadId() == getThreadId()); if (isRealtime()) return false; - return setpriority (PRIO_PROCESS, (id_t) gettid(), ThreadPriorities::getNativePriority (priority)) == 0; + const auto priorityToUse = priority = priorityIn; + return setPriorityOfThisThread (priorityToUse) == 0; } //============================================================================== diff --git a/modules/juce_core/native/juce_mac_Files.mm b/modules/juce_core/native/juce_mac_Files.mm index dcee53f1..ffd68758 100644 --- a/modules/juce_core/native/juce_mac_Files.mm +++ b/modules/juce_core/native/juce_mac_Files.mm @@ -397,7 +397,7 @@ bool DirectoryIterator::NativeIterator::next (String& filenameFound, //============================================================================== -bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters) +bool JUCE_CALLTYPE Process::openDocument (const String& fileName, [[maybe_unused]] const String& parameters) { JUCE_AUTORELEASEPOOL { @@ -406,8 +406,6 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& : [NSURL URLWithString: fileNameAsNS]; #if JUCE_IOS - ignoreUnused (parameters); - if (@available (iOS 10.0, *)) { [[UIApplication sharedApplication] openURL: filenameAsURL diff --git a/modules/juce_core/native/juce_mac_Network.mm b/modules/juce_core/native/juce_mac_Network.mm index 51939b48..56110874 100644 --- a/modules/juce_core/native/juce_mac_Network.mm +++ b/modules/juce_core/native/juce_mac_Network.mm @@ -58,14 +58,12 @@ void MACAddress::findAllAddresses (Array& result) } //============================================================================== -bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) +bool JUCE_CALLTYPE Process::openEmailWithAttachments ([[maybe_unused]] const String& targetEmailAddress, + [[maybe_unused]] const String& emailSubject, + [[maybe_unused]] const String& bodyText, + [[maybe_unused]] const StringArray& filesToAttach) { #if JUCE_IOS - ignoreUnused (targetEmailAddress, emailSubject, bodyText, filesToAttach); - //xxx probably need to use MFMailComposeViewController jassertfalse; return false; @@ -282,9 +280,9 @@ public: return newRequest; } - void didFailWithError (NSError* error) + void didFailWithError ([[maybe_unused]] NSError* error) { - DBG (nsStringToJuce ([error description])); ignoreUnused (error); + DBG (nsStringToJuce ([error description])); nsUrlErrorCode = [error code]; hasFailed = true; initialised = true; @@ -951,10 +949,8 @@ public: connection.reset(); } - bool connect (WebInputStream::Listener* webInputListener, int numRetries = 0) + bool connect (WebInputStream::Listener* webInputListener, [[maybe_unused]] int numRetries = 0) { - ignoreUnused (numRetries); - { const ScopedLock lock (createConnectionLock); diff --git a/modules/juce_core/native/juce_mac_ObjCHelpers.h b/modules/juce_core/native/juce_mac_ObjCHelpers.h index ac67c4d7..de20b86a 100644 --- a/modules/juce_core/native/juce_mac_ObjCHelpers.h +++ b/modules/juce_core/native/juce_mac_ObjCHelpers.h @@ -342,15 +342,6 @@ namespace detail { return joinCompileTimeStr (v, makeCompileTimeStr (others...)); } - - template - static constexpr auto toFnPtr (Functor functor, Return (Functor::*) (Args...) const) - { - return static_cast (functor); - } - - template - static constexpr auto toFnPtr (Functor functor) { return toFnPtr (functor, &Functor::operator()); } } // namespace detail //============================================================================== @@ -391,12 +382,12 @@ struct ObjCClass template void addIvar (const char* name) { - BOOL b = class_addIvar (cls, name, sizeof (Type), (uint8_t) rint (log2 (sizeof (Type))), @encode (Type)); - jassert (b); ignoreUnused (b); + [[maybe_unused]] BOOL b = class_addIvar (cls, name, sizeof (Type), (uint8_t) rint (log2 (sizeof (Type))), @encode (Type)); + jassert (b); } template - void addMethod (SEL selector, Fn callbackFn) { addMethod (selector, detail::toFnPtr (callbackFn)); } + void addMethod (SEL selector, Fn callbackFn) { addMethod (selector, toFnPtr (callbackFn)); } template void addMethod (SEL selector, Result (*callbackFn) (id, SEL, Args...)) @@ -408,8 +399,8 @@ struct ObjCClass void addProtocol (Protocol* protocol) { - BOOL b = class_addProtocol (cls, protocol); - jassert (b); ignoreUnused (b); + [[maybe_unused]] BOOL b = class_addProtocol (cls, protocol); + jassert (b); } template diff --git a/modules/juce_core/native/juce_mac_SystemStats.mm b/modules/juce_core/native/juce_mac_SystemStats.mm index 32c02312..2b6939e0 100644 --- a/modules/juce_core/native/juce_mac_SystemStats.mm +++ b/modules/juce_core/native/juce_mac_SystemStats.mm @@ -153,6 +153,10 @@ String SystemStats::getOperatingSystemName() String SystemStats::getDeviceDescription() { + if (auto* userInfo = [[NSProcessInfo processInfo] environment]) + if (auto* simDeviceName = [userInfo objectForKey: @"SIMULATOR_MODEL_IDENTIFIER"]) + return nsStringToJuce (simDeviceName); + #if JUCE_IOS const char* name = "hw.machine"; #else @@ -166,22 +170,7 @@ String SystemStats::getDeviceDescription() HeapBlock model (size); if (sysctlbyname (name, model, &size, nullptr, 0) >= 0) - { - String description (model.get()); - - #if JUCE_IOS - if (description == "x86_64") // running in the simulator - { - if (auto* userInfo = [[NSProcessInfo processInfo] environment]) - { - if (auto* simDeviceName = [userInfo objectForKey: @"SIMULATOR_DEVICE_NAME"]) - return nsStringToJuce (simDeviceName); - } - } - #endif - - return description; - } + return String (model.get()); } return {}; diff --git a/modules/juce_core/native/juce_posix_NamedPipe.cpp b/modules/juce_core/native/juce_posix_NamedPipe.cpp index dde81fab..7d0e1ba5 100644 --- a/modules/juce_core/native/juce_posix_NamedPipe.cpp +++ b/modules/juce_core/native/juce_posix_NamedPipe.cpp @@ -254,8 +254,7 @@ void NamedPipe::close() pimpl->stopReadOperation = true; const char buffer[] { 0 }; - const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer)); - ignoreUnused (done); + [[maybe_unused]] const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer)); } } diff --git a/modules/juce_core/native/juce_posix_SharedCode.h b/modules/juce_core/native/juce_posix_SharedCode.h index dee843cb..a2649055 100644 --- a/modules/juce_core/native/juce_posix_SharedCode.h +++ b/modules/juce_core/native/juce_posix_SharedCode.h @@ -140,10 +140,9 @@ bool File::setAsCurrentWorkingDirectory() const //============================================================================== // The unix siginterrupt function is deprecated - this does the same job. -int juce_siginterrupt (int sig, int flag) +int juce_siginterrupt ([[maybe_unused]] int sig, [[maybe_unused]] int flag) { #if JUCE_WASM - ignoreUnused (sig, flag); return 0; #else #if JUCE_ANDROID @@ -693,8 +692,7 @@ int File::getVolumeSerialNumber() const void juce_runSystemCommand (const String&); void juce_runSystemCommand (const String& command) { - int result = system (command.toUTF8()); - ignoreUnused (result); + [[maybe_unused]] int result = system (command.toUTF8()); } String juce_getOutputFromCommand (const String&); @@ -1015,7 +1013,7 @@ void JUCE_CALLTYPE Thread::yield() #define SUPPORT_AFFINITIES 1 #endif -void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (uint32 affinityMask) +void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask ([[maybe_unused]] uint32 affinityMask) { #if SUPPORT_AFFINITIES cpu_set_t affinity; @@ -1042,7 +1040,6 @@ void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (uint32 affinityMask) // affinities aren't supported because either the appropriate header files weren't found, // or the SUPPORT_AFFINITIES macro was turned off jassertfalse; - ignoreUnused (affinityMask); #endif } diff --git a/modules/juce_core/native/juce_win32_Files.cpp b/modules/juce_core/native/juce_win32_Files.cpp index 7d93f26a..6bc65bf2 100644 --- a/modules/juce_core/native/juce_win32_Files.cpp +++ b/modules/juce_core/native/juce_win32_Files.cpp @@ -960,7 +960,7 @@ bool File::createShortcut (const String& description, const File& linkFileToCrea ComSmartPtr shellLink; ComSmartPtr persistFile; - ignoreUnused (CoInitialize (nullptr)); + [[maybe_unused]] const auto result = CoInitialize (nullptr); return SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)) && SUCCEEDED (shellLink->SetPath (getFullPathName().toWideCharPointer())) diff --git a/modules/juce_core/native/juce_win32_SystemStats.cpp b/modules/juce_core/native/juce_win32_SystemStats.cpp index 64b03b62..63163d14 100644 --- a/modules/juce_core/native/juce_win32_SystemStats.cpp +++ b/modules/juce_core/native/juce_win32_SystemStats.cpp @@ -457,8 +457,7 @@ public: #endif #if JUCE_WIN32_TIMER_PERIOD > 0 - auto res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD); - ignoreUnused (res); + [[maybe_unused]] auto res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD); jassert (res == TIMERR_NOERROR); #endif diff --git a/modules/juce_core/native/juce_win32_Threads.cpp b/modules/juce_core/native/juce_win32_Threads.cpp index 478978cb..590a9976 100644 --- a/modules/juce_core/native/juce_win32_Threads.cpp +++ b/modules/juce_core/native/juce_win32_Threads.cpp @@ -134,7 +134,7 @@ void Thread::killThread() } } -void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name) +void JUCE_CALLTYPE Thread::setCurrentThreadName ([[maybe_unused]] const String& name) { #if JUCE_DEBUG && JUCE_MSVC struct @@ -159,8 +159,6 @@ void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name) { OutputDebugStringA ("** Warning - Encountered noncontinuable exception **\n"); } - #else - ignoreUnused (name); #endif } diff --git a/modules/juce_core/network/juce_Socket.cpp b/modules/juce_core/network/juce_Socket.cpp index 0823d429..c020720b 100644 --- a/modules/juce_core/network/juce_Socket.cpp +++ b/modules/juce_core/network/juce_Socket.cpp @@ -91,15 +91,16 @@ namespace SocketHelpers : setOption (handle, IPPROTO_TCP, TCP_NODELAY, (int) 1)); } - static void closeSocket (std::atomic& handle, CriticalSection& readLock, - bool isListener, int portNumber, std::atomic& connected) noexcept + static void closeSocket (std::atomic& handle, + [[maybe_unused]] CriticalSection& readLock, + [[maybe_unused]] bool isListener, + [[maybe_unused]] int portNumber, + std::atomic& connected) noexcept { const auto h = (SocketHandle) handle.load(); handle = -1; #if JUCE_WINDOWS - ignoreUnused (portNumber, isListener, readLock); - if (h != invalidSocket || connected) closesocket (h); @@ -771,11 +772,9 @@ bool DatagramSocket::setMulticastLoopbackEnabled (bool enable) return SocketHelpers::setOption ((SocketHandle) handle.load(), IPPROTO_IP, IP_MULTICAST_LOOP, enable); } -bool DatagramSocket::setEnablePortReuse (bool enabled) +bool DatagramSocket::setEnablePortReuse ([[maybe_unused]] bool enabled) { - #if JUCE_ANDROID - ignoreUnused (enabled); - #else + #if ! JUCE_ANDROID if (handle >= 0) return SocketHelpers::setOption ((SocketHandle) handle.load(), #if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD diff --git a/modules/juce_core/network/juce_URL.cpp b/modules/juce_core/network/juce_URL.cpp index f2133077..dd10be08 100644 --- a/modules/juce_core/network/juce_URL.cpp +++ b/modules/juce_core/network/juce_URL.cpp @@ -630,8 +630,7 @@ public: } else { - auto desc = [error localizedDescription]; - ignoreUnused (desc); + [[maybe_unused]] auto desc = [error localizedDescription]; jassertfalse; } } @@ -664,8 +663,7 @@ private: return urlToUse.getLocalFile(); } - auto desc = [error localizedDescription]; - ignoreUnused (desc); + [[maybe_unused]] auto desc = [error localizedDescription]; jassertfalse; } diff --git a/modules/juce_core/network/juce_WebInputStream.cpp b/modules/juce_core/network/juce_WebInputStream.cpp index daffbc44..1183c1bc 100644 --- a/modules/juce_core/network/juce_WebInputStream.cpp +++ b/modules/juce_core/network/juce_WebInputStream.cpp @@ -96,4 +96,11 @@ void WebInputStream::createHeadersAndPostData (const URL& aURL, aURL.createHeadersAndPostData (headers, data, addParametersToBody); } +bool WebInputStream::Listener::postDataSendProgress ([[maybe_unused]] WebInputStream& request, + [[maybe_unused]] int bytesSent, + [[maybe_unused]] int totalBytes) +{ + return true; +} + } // namespace juce diff --git a/modules/juce_core/network/juce_WebInputStream.h b/modules/juce_core/network/juce_WebInputStream.h index 88301212..308adfe4 100644 --- a/modules/juce_core/network/juce_WebInputStream.h +++ b/modules/juce_core/network/juce_WebInputStream.h @@ -107,11 +107,7 @@ class JUCE_API WebInputStream : public InputStream @returns true to continue or false to cancel the upload */ - virtual bool postDataSendProgress (WebInputStream& request, int bytesSent, int totalBytes) - { - ignoreUnused (request, bytesSent, totalBytes); - return true; - } + virtual bool postDataSendProgress (WebInputStream& request, int bytesSent, int totalBytes); }; /** Wait until the first byte is ready for reading. diff --git a/modules/juce_core/streams/juce_MemoryOutputStream.cpp b/modules/juce_core/streams/juce_MemoryOutputStream.cpp index 2ca69dc6..d3be4a8b 100644 --- a/modules/juce_core/streams/juce_MemoryOutputStream.cpp +++ b/modules/juce_core/streams/juce_MemoryOutputStream.cpp @@ -176,11 +176,11 @@ int64 MemoryOutputStream::writeFromInputStream (InputStream& source, int64 maxNu if (availableData > 0) { - if (maxNumBytesToWrite > availableData || maxNumBytesToWrite < 0) + if (maxNumBytesToWrite < 0 || availableData < maxNumBytesToWrite) maxNumBytesToWrite = availableData; if (blockToUse != nullptr) - preallocate (position + (size_t) availableData); + preallocate (position + (size_t) maxNumBytesToWrite); } return OutputStream::writeFromInputStream (source, maxNumBytesToWrite); diff --git a/modules/juce_core/system/juce_StandardHeader.h b/modules/juce_core/system/juce_StandardHeader.h index 8b466006..96285478 100644 --- a/modules/juce_core/system/juce_StandardHeader.h +++ b/modules/juce_core/system/juce_StandardHeader.h @@ -29,7 +29,7 @@ */ #define JUCE_MAJOR_VERSION 7 #define JUCE_MINOR_VERSION 0 -#define JUCE_BUILDNUMBER 3 +#define JUCE_BUILDNUMBER 4 /** Current JUCE version number. @@ -43,8 +43,7 @@ #if ! DOXYGEN #define JUCE_VERSION_ID \ - volatile auto juceVersionId = "juce_version_" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) "_" JUCE_STRINGIFY(JUCE_MINOR_VERSION) "_" JUCE_STRINGIFY(JUCE_BUILDNUMBER); \ - ignoreUnused (juceVersionId); + [[maybe_unused]] volatile auto juceVersionId = "juce_version_" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) "_" JUCE_STRINGIFY(JUCE_MINOR_VERSION) "_" JUCE_STRINGIFY(JUCE_BUILDNUMBER); #endif //============================================================================== diff --git a/modules/juce_core/threads/juce_HighResolutionTimer.cpp b/modules/juce_core/threads/juce_HighResolutionTimer.cpp index e0f00e24..28ca899d 100644 --- a/modules/juce_core/threads/juce_HighResolutionTimer.cpp +++ b/modules/juce_core/threads/juce_HighResolutionTimer.cpp @@ -23,7 +23,7 @@ namespace juce { -class HighResolutionTimer::Pimpl : private Thread +class HighResolutionTimer::Pimpl : public Thread { using steady_clock = std::chrono::steady_clock; using milliseconds = std::chrono::milliseconds; @@ -45,6 +45,8 @@ public: nextTickTime = steady_clock::now() + milliseconds (periodMillis); } + waitEvent.notify_one(); + if (! isThreadRunning()) startThread (Thread::Priority::high); } diff --git a/modules/juce_core/threads/juce_Thread.cpp b/modules/juce_core/threads/juce_Thread.cpp index 2c970bd2..5b870311 100644 --- a/modules/juce_core/threads/juce_Thread.cpp +++ b/modules/juce_core/threads/juce_Thread.cpp @@ -81,10 +81,6 @@ void Thread::threadEntryPoint() const CurrentThreadHolder::Ptr currentThreadHolder (getCurrentThreadHolder()); currentThreadHolder->value = this; - #if JUCE_ANDROID - setPriority (priority); - #endif - if (threadName.isNotEmpty()) setCurrentThreadName (threadName); @@ -130,10 +126,10 @@ bool Thread::startThreadInternal (Priority threadPriority) shouldExit = false; // 'priority' is essentially useless on Linux as only realtime - // has any options but we need to set this here to satsify + // has any options but we need to set this here to satisfy // later queries, otherwise we get inconsistent results across // platforms. - #if JUCE_LINUX || JUCE_BSD + #if JUCE_ANDROID || JUCE_LINUX || JUCE_BSD priority = threadPriority; #endif diff --git a/modules/juce_core/threads/juce_Thread.h b/modules/juce_core/threads/juce_Thread.h index 37fd6bf5..97b66ff6 100644 --- a/modules/juce_core/threads/juce_Thread.h +++ b/modules/juce_core/threads/juce_Thread.h @@ -75,9 +75,9 @@ public: /** Linux only: A value with a range of 0-10, where 10 is the highest priority. */ int priority = 5; - /* iOS/macOS only: A millisecond value representing the estimated time between each - 'Thread::run' call. Your thread may be penalised if you frequently - overrun this. + /** iOS/macOS only: A millisecond value representing the estimated time between each + 'Thread::run' call. Your thread may be penalised if you frequently + overrun this. */ uint32_t workDurationMs = 0; }; diff --git a/modules/juce_core/time/juce_RelativeTime.cpp b/modules/juce_core/time/juce_RelativeTime.cpp index efa17b82..60b1a1e9 100644 --- a/modules/juce_core/time/juce_RelativeTime.cpp +++ b/modules/juce_core/time/juce_RelativeTime.cpp @@ -86,7 +86,7 @@ String RelativeTime::getApproximateDescription() const if (weeks > 8) return describeMonths ((weeks * 12) / 52); if (weeks > 1) return describeWeeks (weeks); - auto days = (int) inWeeks(); + auto days = (int) inDays(); if (days > 1) return describeDays (days); diff --git a/modules/juce_cryptography/encryption/juce_BlowFish.cpp b/modules/juce_cryptography/encryption/juce_BlowFish.cpp index 150890e4..a47e4598 100644 --- a/modules/juce_cryptography/encryption/juce_BlowFish.cpp +++ b/modules/juce_cryptography/encryption/juce_BlowFish.cpp @@ -280,9 +280,8 @@ void BlowFish::encrypt (MemoryBlock& data) const auto size = data.getSize(); data.setSize (size + (8u - (size % 8u))); - auto success = encrypt (data.getData(), size, data.getSize()); + [[maybe_unused]] auto success = encrypt (data.getData(), size, data.getSize()); - ignoreUnused (success); jassert (success >= 0); } diff --git a/modules/juce_cryptography/juce_cryptography.h b/modules/juce_cryptography/juce_cryptography.h index cfce3db6..57c6e670 100644 --- a/modules/juce_cryptography/juce_cryptography.h +++ b/modules/juce_cryptography/juce_cryptography.h @@ -35,7 +35,7 @@ ID: juce_cryptography vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE cryptography classes description: Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc. website: http://www.juce.com/juce diff --git a/modules/juce_data_structures/juce_data_structures.cpp b/modules/juce_data_structures/juce_data_structures.cpp index 4b482629..90d0d3d1 100644 --- a/modules/juce_data_structures/juce_data_structures.cpp +++ b/modules/juce_data_structures/juce_data_structures.cpp @@ -39,6 +39,7 @@ #include "values/juce_ValueTreeSynchroniser.cpp" #include "values/juce_CachedValue.cpp" #include "undomanager/juce_UndoManager.cpp" +#include "undomanager/juce_UndoableAction.cpp" #include "app_properties/juce_ApplicationProperties.cpp" #include "app_properties/juce_PropertiesFile.cpp" diff --git a/modules/juce_data_structures/juce_data_structures.h b/modules/juce_data_structures/juce_data_structures.h index cb4f8b9f..0c931323 100644 --- a/modules/juce_data_structures/juce_data_structures.h +++ b/modules/juce_data_structures/juce_data_structures.h @@ -35,7 +35,7 @@ ID: juce_data_structures vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE data model helper classes description: Classes for undo/redo management, and smart data structures. website: http://www.juce.com/juce diff --git a/modules/juce_data_structures/undomanager/juce_UndoableAction.cpp b/modules/juce_data_structures/undomanager/juce_UndoableAction.cpp new file mode 100644 index 00000000..f9396269 --- /dev/null +++ b/modules/juce_data_structures/undomanager/juce_UndoableAction.cpp @@ -0,0 +1,31 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +UndoableAction* UndoableAction::createCoalescedAction ([[maybe_unused]] UndoableAction* nextAction) { return nullptr; } + +} // namespace juce diff --git a/modules/juce_data_structures/undomanager/juce_UndoableAction.h b/modules/juce_data_structures/undomanager/juce_UndoableAction.h index 51e495ab..df868b06 100644 --- a/modules/juce_data_structures/undomanager/juce_UndoableAction.h +++ b/modules/juce_data_structures/undomanager/juce_UndoableAction.h @@ -94,7 +94,7 @@ public: If it's not possible to merge the two actions, the method should return a nullptr. */ - virtual UndoableAction* createCoalescedAction (UndoableAction* nextAction) { ignoreUnused (nextAction); return nullptr; } + virtual UndoableAction* createCoalescedAction (UndoableAction* nextAction); }; } // namespace juce diff --git a/modules/juce_dsp/containers/juce_FixedSizeFunction.h b/modules/juce_dsp/containers/juce_FixedSizeFunction.h index 234c4aa9..1051e853 100644 --- a/modules/juce_dsp/containers/juce_FixedSizeFunction.h +++ b/modules/juce_dsp/containers/juce_FixedSizeFunction.h @@ -70,10 +70,9 @@ namespace detail template void clear (void* s) { - auto& fn = *reinterpret_cast (s); - fn.~Fn(); // I know this looks insane, for some reason MSVC 14 sometimes thinks fn is unreferenced - ignoreUnused (fn); + [[maybe_unused]] auto& fn = *reinterpret_cast (s); + fn.~Fn(); } template diff --git a/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp b/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp index 6c4aa84a..e8122191 100644 --- a/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp +++ b/modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp @@ -334,8 +334,8 @@ public: bool smallCalled = false; bool largeCalled = false; - SmallFn small = [&smallCalled, a = std::array{}] { smallCalled = true; juce::ignoreUnused (a); }; - LargeFn large = [&largeCalled, a = std::array{}] { largeCalled = true; juce::ignoreUnused (a); }; + SmallFn small = [&smallCalled, a = std::array{}] { smallCalled = true; ignoreUnused (a); }; + LargeFn large = [&largeCalled, a = std::array{}] { largeCalled = true; ignoreUnused (a); }; large = std::move (small); diff --git a/modules/juce_dsp/juce_dsp.h b/modules/juce_dsp/juce_dsp.h index f4d2591b..05bd7ca2 100644 --- a/modules/juce_dsp/juce_dsp.h +++ b/modules/juce_dsp/juce_dsp.h @@ -35,7 +35,7 @@ ID: juce_dsp vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE DSP classes description: Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc. website: http://www.juce.com/juce @@ -208,10 +208,10 @@ namespace juce inline void snapToZero (long double& x) noexcept { JUCE_SNAP_TO_ZERO (x); } #endif #else - inline void snapToZero (float& x) noexcept { ignoreUnused (x); } + inline void snapToZero ([[maybe_unused]] float& x) noexcept {} #ifndef DOXYGEN - inline void snapToZero (double& x) noexcept { ignoreUnused (x); } - inline void snapToZero (long double& x) noexcept { ignoreUnused (x); } + inline void snapToZero ([[maybe_unused]] double& x) noexcept {} + inline void snapToZero ([[maybe_unused]] long double& x) noexcept {} #endif #endif } diff --git a/modules/juce_events/juce_events.h b/modules/juce_events/juce_events.h index 1a988592..7906e7b7 100644 --- a/modules/juce_events/juce_events.h +++ b/modules/juce_events/juce_events.h @@ -32,7 +32,7 @@ ID: juce_events vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE message and event handling classes description: Classes for running an application's main event loop and sending/receiving messages, timers, etc. website: http://www.juce.com/juce diff --git a/modules/juce_events/messages/juce_ApplicationBase.cpp b/modules/juce_events/messages/juce_ApplicationBase.cpp index 604a649e..04f534be 100644 --- a/modules/juce_events/messages/juce_ApplicationBase.cpp +++ b/modules/juce_events/messages/juce_ApplicationBase.cpp @@ -199,14 +199,12 @@ String JUCEApplicationBase::getCommandLineParameters() { String argString; - for (int i = 1; i < juce_argc; ++i) + for (const auto& arg : getCommandLineParameterArray()) { - String arg { CharPointer_UTF8 (juce_argv[i]) }; - - if (arg.containsChar (' ') && ! arg.isQuotedString()) - arg = arg.quoted ('"'); - - argString << arg << ' '; + const auto withQuotes = arg.containsChar (' ') && ! arg.isQuotedString() + ? arg.quoted ('"') + : arg; + argString << withQuotes << ' '; } return argString.trim(); @@ -214,7 +212,12 @@ String JUCEApplicationBase::getCommandLineParameters() StringArray JUCEApplicationBase::getCommandLineParameterArray() { - return StringArray (juce_argv + 1, juce_argc - 1); + StringArray result; + + for (int i = 1; i < juce_argc; ++i) + result.add (CharPointer_UTF8 (juce_argv[i])); + + return result; } int JUCEApplicationBase::main (int argc, const char* argv[]) diff --git a/modules/juce_events/native/juce_linux_Messaging.cpp b/modules/juce_events/native/juce_linux_Messaging.cpp index dcf58334..69fa2394 100644 --- a/modules/juce_events/native/juce_linux_Messaging.cpp +++ b/modules/juce_events/native/juce_linux_Messaging.cpp @@ -68,8 +68,7 @@ public: ScopedUnlock ul (lock); unsigned char x = 0xff; - auto numBytes = write (getWriteHandle(), &x, 1); - ignoreUnused (numBytes); + [[maybe_unused]] auto numBytes = write (getWriteHandle(), &x, 1); } } @@ -97,8 +96,7 @@ private: ScopedUnlock ul (lock); unsigned char x; - auto numBytes = read (fd, &x, 1); - ignoreUnused (numBytes); + [[maybe_unused]] auto numBytes = read (fd, &x, 1); } return queue.removeAndReturn (0); diff --git a/modules/juce_events/native/juce_win32_Messaging.cpp b/modules/juce_events/native/juce_win32_Messaging.cpp index 3266f7a3..0e91c215 100644 --- a/modules/juce_events/native/juce_win32_Messaging.cpp +++ b/modules/juce_events/native/juce_win32_Messaging.cpp @@ -288,7 +288,7 @@ void MessageManager::broadcastMessage (const String& value) //============================================================================== void MessageManager::doPlatformSpecificInitialisation() { - ignoreUnused (OleInitialize (nullptr)); + [[maybe_unused]] const auto result = OleInitialize (nullptr); InternalMessageQueue::getInstance(); } diff --git a/modules/juce_events/native/juce_win32_WinRTWrapper.h b/modules/juce_events/native/juce_win32_WinRTWrapper.h index af0e1b96..12c67f2f 100644 --- a/modules/juce_events/native/juce_win32_WinRTWrapper.h +++ b/modules/juce_events/native/juce_win32_WinRTWrapper.h @@ -30,7 +30,7 @@ public: ~WinRTWrapper(); bool isInitialised() const noexcept { return initialised; } - JUCE_DECLARE_SINGLETON (WinRTWrapper, true) + JUCE_DECLARE_SINGLETON (WinRTWrapper, false) //============================================================================== template diff --git a/modules/juce_graphics/geometry/juce_RectangleList.h b/modules/juce_graphics/geometry/juce_RectangleList.h index 8e106cd4..c05a6984 100644 --- a/modules/juce_graphics/geometry/juce_RectangleList.h +++ b/modules/juce_graphics/geometry/juce_RectangleList.h @@ -201,76 +201,108 @@ public: Any rectangles in the list which overlap this will be clipped and subdivided if necessary. */ - void subtract (RectangleType rect) + void subtract (const RectangleType rect) { if (auto numRects = rects.size()) { - auto x1 = rect.getX(); - auto y1 = rect.getY(); - auto x2 = x1 + rect.getWidth(); - auto y2 = y1 + rect.getHeight(); + const auto x1 = rect.getX(); + const auto y1 = rect.getY(); + const auto x2 = x1 + rect.getWidth(); + const auto y2 = y1 + rect.getHeight(); for (int i = numRects; --i >= 0;) { auto& r = rects.getReference (i); - auto rx1 = r.getX(); - auto ry1 = r.getY(); - auto rx2 = rx1 + r.getWidth(); - auto ry2 = ry1 + r.getHeight(); + const auto rx1 = r.getX(); + const auto ry1 = r.getY(); + const auto rx2 = rx1 + r.getWidth(); + const auto ry2 = ry1 + r.getHeight(); - if (! (x2 <= rx1 || x1 >= rx2 || y2 <= ry1 || y1 >= ry2)) + const auto isNotEqual = [&] (const RectangleType newRect) { - if (x1 > rx1 && x1 < rx2) + // When subtracting tiny slices from relatively large rectangles, the + // subtraction may have no effect (due to limited-precision floating point + // maths) and the original rectangle may remain unchanged. + // We check that any 'new' rectangle has different dimensions to the rectangle + // being tested before adding it to the rects array. + // Integer arithmetic is not susceptible to this problem, so there's no need + // for this additional equality check when working with integral rectangles. + if constexpr (std::is_floating_point_v) { - if (y1 <= ry1 && y2 >= ry2 && x2 >= rx2) + return newRect != r; + } + else + { + ignoreUnused (newRect); + return true; + } + }; + + if (rx1 < x2 && x1 < rx2 && ry1 < y2 && y1 < ry2) + { + if (rx1 < x1 && x1 < rx2) + { + if (y1 <= ry1 && ry2 <= y2 && rx2 <= x2) { r.setWidth (x1 - rx1); } else { - r.setX (x1); - r.setWidth (rx2 - x1); - - rects.insert (++i, RectangleType (rx1, ry1, x1 - rx1, ry2 - ry1)); - ++i; + if (const RectangleType newRect (rx1, ry1, x1 - rx1, ry2 - ry1); isNotEqual (newRect)) + { + r.setX (x1); + r.setWidth (rx2 - x1); + + rects.insert (++i, newRect); + ++i; + } } } - else if (x2 > rx1 && x2 < rx2) + else if (rx1 < x2 && x2 < rx2) { r.setX (x2); r.setWidth (rx2 - x2); - if (y1 > ry1 || y2 < ry2 || x1 > rx1) + if (ry1 < y1 || y2 < ry2 || rx1 < x1) { - rects.insert (++i, RectangleType (rx1, ry1, x2 - rx1, ry2 - ry1)); - ++i; + if (const RectangleType newRect (rx1, ry1, x2 - rx1, ry2 - ry1); isNotEqual (newRect)) + { + rects.insert (++i, newRect); + ++i; + } } } - else if (y1 > ry1 && y1 < ry2) + else if (ry1 < y1 && y1 < ry2) { - if (x1 <= rx1 && x2 >= rx2 && y2 >= ry2) + if (x1 <= rx1 && rx2 <= x2 && ry2 <= y2) { r.setHeight (y1 - ry1); } else { - r.setY (y1); - r.setHeight (ry2 - y1); - - rects.insert (++i, RectangleType (rx1, ry1, rx2 - rx1, y1 - ry1)); - ++i; + if (const RectangleType newRect (rx1, ry1, rx2 - rx1, y1 - ry1); isNotEqual (newRect)) + { + r.setY (y1); + r.setHeight (ry2 - y1); + + rects.insert (++i, newRect); + ++i; + } } } - else if (y2 > ry1 && y2 < ry2) + else if (ry1 < y2 && y2 < ry2) { r.setY (y2); r.setHeight (ry2 - y2); - if (x1 > rx1 || x2 < rx2 || y1 > ry1) + if (rx1 < x1 || x2 < rx2 || ry1 < y1) { - rects.insert (++i, RectangleType (rx1, ry1, rx2 - rx1, y2 - ry1)); - ++i; + if (const RectangleType newRect (rx1, ry1, rx2 - rx1, y2 - ry1); isNotEqual (newRect)) + { + rects.insert (++i, newRect); + ++i; + } } } else diff --git a/modules/juce_graphics/juce_graphics.h b/modules/juce_graphics/juce_graphics.h index 187e2002..2e5699e4 100644 --- a/modules/juce_graphics/juce_graphics.h +++ b/modules/juce_graphics/juce_graphics.h @@ -35,7 +35,7 @@ ID: juce_graphics vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE graphics classes description: Classes for 2D vector graphics, image loading/saving, font handling, etc. website: http://www.juce.com/juce diff --git a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp index b5e3340f..d848addf 100644 --- a/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp +++ b/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp @@ -528,8 +528,8 @@ Direct2DLowLevelGraphicsContext::Direct2DLowLevelGraphicsContext (HWND hwnd_) if (pimpl->factories->d2dFactory != nullptr) { - auto hr = pimpl->factories->d2dFactory->CreateHwndRenderTarget ({}, { hwnd, size }, pimpl->renderingTarget.resetAndGetPointerAddress()); - jassert (SUCCEEDED (hr)); ignoreUnused (hr); + [[maybe_unused]] auto hr = pimpl->factories->d2dFactory->CreateHwndRenderTarget ({}, { hwnd, size }, pimpl->renderingTarget.resetAndGetPointerAddress()); + jassert (SUCCEEDED (hr)); hr = pimpl->renderingTarget->CreateSolidColorBrush (D2D1::ColorF::ColorF (0.0f, 0.0f, 0.0f, 1.0f), pimpl->colourBrush.resetAndGetPointerAddress()); } } diff --git a/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp b/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp index b82b4c53..f565a583 100644 --- a/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp +++ b/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp @@ -200,8 +200,7 @@ namespace DirectWriteTypeLayout } ComSmartPtr dwFont; - auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress()); - ignoreUnused (hr); + [[maybe_unused]] auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress()); jassert (dwFont != nullptr); ComSmartPtr dwFontFamily; @@ -299,8 +298,7 @@ namespace DirectWriteTypeLayout fontIndex = 0; ComSmartPtr fontFamily; - auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress()); - ignoreUnused (hr); + [[maybe_unused]] auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress()); ComSmartPtr dwFont; uint32 fontFacesCount = 0; @@ -420,8 +418,7 @@ namespace DirectWriteTypeLayout return; UINT32 actualLineCount = 0; - auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount); - ignoreUnused (hr); + [[maybe_unused]] auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount); layout.ensureStorageAllocated ((int) actualLineCount); @@ -486,7 +483,7 @@ static bool canAllTypefacesAndFontsBeUsedInLayout (const AttributedString& text) #endif -bool TextLayout::createNativeLayout (const AttributedString& text) +bool TextLayout::createNativeLayout ([[maybe_unused]] const AttributedString& text) { #if JUCE_USE_DIRECTWRITE if (! canAllTypefacesAndFontsBeUsedInLayout (text)) @@ -506,8 +503,6 @@ bool TextLayout::createNativeLayout (const AttributedString& text) return true; } - #else - ignoreUnused (text); #endif return false; diff --git a/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp b/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp index da59341e..5da13351 100644 --- a/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp +++ b/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp @@ -35,8 +35,7 @@ namespace uint32 index = 0; BOOL exists = false; - auto hr = names->FindLocaleName (L"en-us", &index, &exists); - ignoreUnused (hr); + [[maybe_unused]] auto hr = names->FindLocaleName (L"en-us", &index, &exists); if (! exists) index = 0; @@ -152,8 +151,7 @@ public: jassert (fontCollection != nullptr); uint32 fontIndex = 0; - auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound); - ignoreUnused (hr); + [[maybe_unused]] auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound); if (! fontFound) fontIndex = 0; diff --git a/modules/juce_graphics/native/juce_win32_Fonts.cpp b/modules/juce_graphics/native/juce_win32_Fonts.cpp index b7d4afe2..005061ef 100644 --- a/modules/juce_graphics/native/juce_win32_Fonts.cpp +++ b/modules/juce_graphics/native/juce_win32_Fonts.cpp @@ -234,8 +234,7 @@ StringArray Font::findAllTypefaceStyles (const String& family) { BOOL fontFound = false; uint32 fontIndex = 0; - auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound); - ignoreUnused (hr); + [[maybe_unused]] auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound); if (! fontFound) fontIndex = 0; diff --git a/modules/juce_gui_basics/components/juce_Component.cpp b/modules/juce_gui_basics/components/juce_Component.cpp index 3ed50b82..9f8d9d74 100644 --- a/modules/juce_gui_basics/components/juce_Component.cpp +++ b/modules/juce_gui_basics/components/juce_Component.cpp @@ -123,47 +123,32 @@ public: template static void sendMouseEvent (HierarchyChecker& checker, EventMethod&& eventMethod, Params&&... params) { - auto* parent = checker.nearestNonNullParent(); - - if (parent == nullptr) - return; - - if (auto* list = parent->mouseListeners.get()) + const auto callListeners = [&] (auto& parentComp, const auto findNumListeners) { - for (int i = list->listeners.size(); --i >= 0;) + if (auto* list = parentComp.mouseListeners.get()) { - (list->listeners.getUnchecked (i)->*eventMethod) (checker.eventWithNearestParent(), params...); + const WeakReference safePointer { &parentComp }; - if (checker.shouldBailOut()) - return; + for (int i = findNumListeners (*list); --i >= 0; i = jmin (i, findNumListeners (*list))) + { + (list->listeners.getUnchecked (i)->*eventMethod) (checker.eventWithNearestParent(), params...); - i = jmin (i, list->listeners.size()); + if (checker.shouldBailOut() || safePointer == nullptr) + return false; + } } - } - - for (Component* p = checker.nearestNonNullParent()->parentComponent; p != nullptr; p = p->parentComponent) - { - if (auto* list = p->mouseListeners.get()) - { - if (list->numDeepMouseListeners > 0) - { - const auto shouldBailOut = [&checker, safePointer = WeakReference { p }] - { - return checker.shouldBailOut() || safePointer == nullptr; - }; - for (int i = list->numDeepMouseListeners; --i >= 0;) - { - (list->listeners.getUnchecked(i)->*eventMethod) (checker.eventWithNearestParent(), params...); + return true; + }; - if (shouldBailOut()) - return; + if (auto* parent = checker.nearestNonNullParent()) + if (! callListeners (*parent, [] (auto& list) { return list.listeners.size(); })) + return; - i = jmin (i, list->numDeepMouseListeners); - } - } - } - } + if (auto* parent = checker.nearestNonNullParent()) + for (Component* p = parent->parentComponent; p != nullptr; p = p->parentComponent) + if (! callListeners (*p, [] (auto& list) { return list.numDeepMouseListeners; })) + return; } private: @@ -2583,7 +2568,8 @@ void Component::internalMouseUp (MouseInputSource source, const PointerState& re // check for double-click if (me.getNumberOfClicks() >= 2) { - mouseDoubleClick (checker.eventWithNearestParent()); + if (checker.nearestNonNullParent() == this) + mouseDoubleClick (checker.eventWithNearestParent()); if (checker.shouldBailOut()) return; diff --git a/modules/juce_gui_basics/components/juce_Component.h b/modules/juce_gui_basics/components/juce_Component.h index 24529bf5..9f730496 100644 --- a/modules/juce_gui_basics/components/juce_Component.h +++ b/modules/juce_gui_basics/components/juce_Component.h @@ -2132,7 +2132,7 @@ public: @see runModalLoop, enterModalState, isCurrentlyModal */ - void exitModalState (int returnValue); + void exitModalState (int returnValue = 0); /** Returns true if this component is the modal one. diff --git a/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp b/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp index 9887b1c3..eb1c7514 100644 --- a/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp @@ -150,15 +150,13 @@ JUCE_IMPLEMENT_SINGLETON (ContentSharer) ContentSharer::ContentSharer() {} ContentSharer::~ContentSharer() { clearSingletonInstance(); } -void ContentSharer::shareFiles (const Array& files, +void ContentSharer::shareFiles ([[maybe_unused]] const Array& files, std::function callbackToUse) { #if JUCE_CONTENT_SHARING startNewShare (callbackToUse); pimpl->shareFiles (files); #else - ignoreUnused (files); - // Content sharing is not available on this platform! jassertfalse; @@ -188,15 +186,13 @@ void ContentSharer::startNewShare (std::function cal } #endif -void ContentSharer::shareText (const String& text, +void ContentSharer::shareText ([[maybe_unused]] const String& text, std::function callbackToUse) { #if JUCE_CONTENT_SHARING startNewShare (callbackToUse); pimpl->shareText (text); #else - ignoreUnused (text); - // Content sharing is not available on this platform! jassertfalse; @@ -205,16 +201,14 @@ void ContentSharer::shareText (const String& text, #endif } -void ContentSharer::shareImages (const Array& images, +void ContentSharer::shareImages ([[maybe_unused]] const Array& images, std::function callbackToUse, - ImageFileFormat* imageFileFormatToUse) + [[maybe_unused]] ImageFileFormat* imageFileFormatToUse) { #if JUCE_CONTENT_SHARING startNewShare (callbackToUse); prepareImagesThread.reset (new PrepareImagesThread (*this, images, imageFileFormatToUse)); #else - ignoreUnused (images, imageFileFormatToUse); - // Content sharing is not available on this platform! jassertfalse; @@ -238,15 +232,13 @@ void ContentSharer::filesToSharePrepared() } #endif -void ContentSharer::shareData (const MemoryBlock& mb, +void ContentSharer::shareData ([[maybe_unused]] const MemoryBlock& mb, std::function callbackToUse) { #if JUCE_CONTENT_SHARING startNewShare (callbackToUse); prepareDataThread.reset (new PrepareDataThread (*this, mb)); #else - ignoreUnused (mb); - if (callbackToUse) callbackToUse (false, "Content sharing not available on this platform!"); #endif diff --git a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp index 15593e6c..13e4f9d7 100644 --- a/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp @@ -440,7 +440,7 @@ void FileBrowserComponent::fileDoubleClicked (const File& f) void FileBrowserComponent::browserRootChanged (const File&) {} -bool FileBrowserComponent::keyPressed (const KeyPress& key) +bool FileBrowserComponent::keyPressed ([[maybe_unused]] const KeyPress& key) { #if JUCE_LINUX || JUCE_BSD || JUCE_WINDOWS if (key.getModifiers().isCommandDown() @@ -452,7 +452,6 @@ bool FileBrowserComponent::keyPressed (const KeyPress& key) } #endif - ignoreUnused (key); return false; } diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp index 4ba17166..daa71127 100644 --- a/modules/juce_gui_basics/juce_gui_basics.cpp +++ b/modules/juce_gui_basics/juce_gui_basics.cpp @@ -328,6 +328,7 @@ namespace juce JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wzero-as-null-pointer-constant") + #include "native/x11/juce_linux_ScopedWindowAssociation.h" #include "native/juce_linux_Windowing.cpp" #include "native/x11/juce_linux_XWindowSystem.cpp" @@ -336,6 +337,28 @@ namespace juce #include "native/juce_linux_FileChooser.cpp" #elif JUCE_ANDROID + +namespace juce +{ +static jobject makeAndroidRect (Rectangle r) +{ + return getEnv()->NewObject (AndroidRect, + AndroidRect.constructor, + r.getX(), + r.getY(), + r.getRight(), + r.getBottom()); +} + +static jobject makeAndroidPoint (Point p) +{ + return getEnv()->NewObject (AndroidPoint, + AndroidPoint.create, + p.getX(), + p.getY()); +} +} // namespace juce + #include "juce_core/files/juce_common_MimeTypes.h" #include "native/accessibility/juce_android_Accessibility.cpp" #include "native/juce_android_Windowing.cpp" diff --git a/modules/juce_gui_basics/juce_gui_basics.h b/modules/juce_gui_basics/juce_gui_basics.h index 843a3d81..bd449fb5 100644 --- a/modules/juce_gui_basics/juce_gui_basics.h +++ b/modules/juce_gui_basics/juce_gui_basics.h @@ -35,7 +35,7 @@ ID: juce_gui_basics vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE GUI core classes description: Basic user-interface components and related classes. website: http://www.juce.com/juce diff --git a/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h b/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h index b255a2a0..fe5ac1a3 100644 --- a/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h +++ b/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h @@ -26,7 +26,6 @@ namespace juce { -//============================================================================== /** An abstract base class which can be implemented by components that function as text editors. @@ -108,7 +107,8 @@ public: decimalKeyboard, urlKeyboard, emailAddressKeyboard, - phoneNumberKeyboard + phoneNumberKeyboard, + passwordKeyboard }; /** Returns the target's preference for the type of keyboard that would be most appropriate. diff --git a/modules/juce_gui_basics/layout/juce_SidePanel.cpp b/modules/juce_gui_basics/layout/juce_SidePanel.cpp index 758b5d96..dfd36a45 100644 --- a/modules/juce_gui_basics/layout/juce_SidePanel.cpp +++ b/modules/juce_gui_basics/layout/juce_SidePanel.cpp @@ -159,7 +159,8 @@ void SidePanel::paint (Graphics& g) : shadowArea.getTopLeft()).toFloat(), false)); g.fillRect (shadowArea); - g.excludeClipRegion (shadowArea); + g.reduceClipRegion (getLocalBounds().withTrimmedRight (shadowArea.getWidth()) + .withX (isOnLeft ? 0 : shadowArea.getWidth())); g.fillAll (bgColour); } @@ -242,10 +243,8 @@ void SidePanel::lookAndFeelChanged() titleLabel.setJustificationType (lf.getSidePanelTitleJustification (*this)); } -void SidePanel::componentMovedOrResized (Component& component, bool wasMoved, bool wasResized) +void SidePanel::componentMovedOrResized (Component& component, [[maybe_unused]] bool wasMoved, bool wasResized) { - ignoreUnused (wasMoved); - if (wasResized && (&component == parent)) setBounds (calculateBoundsInParent (component)); } diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp index 0ec5d7d2..3c6a6e66 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp @@ -464,10 +464,9 @@ void LookAndFeel_V3::drawLinearSliderBackground (Graphics& g, int x, int y, int g.strokePath (indent, PathStrokeType (0.5f)); } -void LookAndFeel_V3::drawPopupMenuBackground (Graphics& g, int width, int height) +void LookAndFeel_V3::drawPopupMenuBackground (Graphics& g, [[maybe_unused]] int width, [[maybe_unused]] int height) { g.fillAll (findColour (PopupMenu::backgroundColourId)); - ignoreUnused (width, height); #if ! JUCE_MAC g.setColour (findColour (PopupMenu::textColourId).withAlpha (0.6f)); diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp index bd87b26a..d400073a 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp @@ -353,12 +353,10 @@ void LookAndFeel_V4::drawToggleButton (Graphics& g, ToggleButton& button, void LookAndFeel_V4::drawTickBox (Graphics& g, Component& component, float x, float y, float w, float h, const bool ticked, - const bool isEnabled, - const bool shouldDrawButtonAsHighlighted, - const bool shouldDrawButtonAsDown) + [[maybe_unused]] const bool isEnabled, + [[maybe_unused]] const bool shouldDrawButtonAsHighlighted, + [[maybe_unused]] const bool shouldDrawButtonAsDown) { - ignoreUnused (isEnabled, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown); - Rectangle tickBounds (x, y, w, h); g.setColour (component.findColour (ToggleButton::tickDisabledColourId)); @@ -619,10 +617,8 @@ int LookAndFeel_V4::getDefaultScrollbarWidth() } void LookAndFeel_V4::drawScrollbar (Graphics& g, ScrollBar& scrollbar, int x, int y, int width, int height, - bool isScrollbarVertical, int thumbStartPosition, int thumbSize, bool isMouseOver, bool isMouseDown) + bool isScrollbarVertical, int thumbStartPosition, int thumbSize, bool isMouseOver, [[maybe_unused]] bool isMouseDown) { - ignoreUnused (isMouseDown); - Rectangle thumbBounds; if (isScrollbarVertical) @@ -1253,10 +1249,8 @@ void LookAndFeel_V4::drawPropertyComponentBackground (Graphics& g, int width, in g.fillRect (0, 0, width, height - 1); } -void LookAndFeel_V4::drawPropertyComponentLabel (Graphics& g, int width, int height, PropertyComponent& component) +void LookAndFeel_V4::drawPropertyComponentLabel (Graphics& g, [[maybe_unused]] int width, int height, PropertyComponent& component) { - ignoreUnused (width); - auto indent = getPropertyComponentIndent (component); g.setColour (component.findColour (PropertyComponent::labelTextColourId) diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp index ef413750..8dd13573 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp @@ -324,12 +324,16 @@ private: //============================================================================== struct MenuWindow : public Component { - MenuWindow (const PopupMenu& menu, MenuWindow* parentWindow, - Options opts, bool alignToRectangle, bool shouldDismissOnMouseUp, - ApplicationCommandManager** manager, float parentScaleFactor = 1.0f) + MenuWindow (const PopupMenu& menu, + MenuWindow* parentWindow, + Options opts, + bool alignToRectangle, + bool shouldDismissOnMouseUp, + ApplicationCommandManager** manager, + float parentScaleFactor = 1.0f) : Component ("menu"), parent (parentWindow), - options (opts.withParentComponent (getLookAndFeel().getParentComponentForMenuOptions (opts))), + options (opts.withParentComponent (findLookAndFeel (menu, parentWindow)->getParentComponentForMenuOptions (opts))), managerOfChosenCommand (manager), componentAttachedTo (options.getTargetComponent()), dismissOnMouseUp (shouldDismissOnMouseUp), @@ -343,8 +347,7 @@ struct MenuWindow : public Component setAlwaysOnTop (true); setFocusContainerType (FocusContainerType::focusContainer); - setLookAndFeel (parent != nullptr ? &(parent->getLookAndFeel()) - : menu.lookAndFeel.get()); + setLookAndFeel (findLookAndFeel (menu, parentWindow)); auto& lf = getLookAndFeel(); @@ -1291,6 +1294,17 @@ struct MenuWindow : public Component })); } + LookAndFeel* findLookAndFeel (const PopupMenu& menu, MenuWindow* parentWindow) const + { + if (parentWindow != nullptr) + return &(parentWindow->getLookAndFeel()); + + if (auto* lnf = menu.lookAndFeel.get()) + return lnf; + + return &getLookAndFeel(); + } + //============================================================================== MenuWindow* parent; const Options options; @@ -2098,7 +2112,7 @@ struct PopupMenuCompletionCallback : public ModalComponentManager::Callback int PopupMenu::showWithOptionalCallback (const Options& options, ModalComponentManager::Callback* userCallback, - bool canBeModal) + [[maybe_unused]] bool canBeModal) { std::unique_ptr userCallbackDeleter (userCallback); std::unique_ptr callback (new PopupMenuCompletionCallback()); @@ -2120,7 +2134,6 @@ int PopupMenu::showWithOptionalCallback (const Options& options, if (userCallback == nullptr && canBeModal) return window->runModalLoop(); #else - ignoreUnused (canBeModal); jassert (! (userCallback == nullptr && canBeModal)); #endif } diff --git a/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp b/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp index c36306d2..9b60308b 100644 --- a/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp +++ b/modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp @@ -62,10 +62,8 @@ static Rectangle getLogoArea (Rectangle parentRect) } //============================================================================== -JUCESplashScreen::JUCESplashScreen (Component& parent) +JUCESplashScreen::JUCESplashScreen ([[maybe_unused]] Component& parent) { - ignoreUnused (parent); - #if JUCE_DISPLAY_SPLASH_SCREEN if (splashDisplayTime == 0 || Time::getMillisecondCounter() < splashDisplayTime + (uint32) millisecondsToDisplaySplash) diff --git a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp index 24d0e63a..646cdd19 100644 --- a/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp +++ b/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp @@ -57,18 +57,18 @@ public: return lastPeer; } - Component* findComponentAt (Point screenPos) + static Component* findComponentAt (Point screenPos, ComponentPeer* peer) { - if (auto* peer = getPeer()) - { - auto relativePos = ScalingHelpers::unscaledScreenPosToScaled (peer->getComponent(), - peer->globalToLocal (screenPos)); - auto& comp = peer->getComponent(); + if (! ComponentPeer::isValidPeer (peer)) + return nullptr; - // (the contains() call is needed to test for overlapping desktop windows) - if (comp.contains (relativePos)) - return comp.getComponentAt (relativePos); - } + auto relativePos = ScalingHelpers::unscaledScreenPosToScaled (peer->getComponent(), + peer->globalToLocal (screenPos)); + auto& comp = peer->getComponent(); + + // (the contains() call is needed to test for overlapping desktop windows) + if (comp.contains (relativePos)) + return comp.getComponentAt (relativePos); return nullptr; } @@ -244,11 +244,12 @@ public: void setPeer (ComponentPeer& newPeer, const PointerState& pointerState, Time time) { - if (&newPeer != lastPeer) + if (&newPeer != lastPeer && ( findComponentAt (pointerState.position, &newPeer) != nullptr + || findComponentAt (pointerState.position, lastPeer) == nullptr)) { setComponentUnderMouse (nullptr, pointerState, time); lastPeer = &newPeer; - setComponentUnderMouse (findComponentAt (pointerState.position), pointerState, time); + setComponentUnderMouse (findComponentAt (pointerState.position, getPeer()), pointerState, time); } } @@ -257,7 +258,7 @@ public: const auto& newScreenPos = newPointerState.position; if (! isDragging()) - setComponentUnderMouse (findComponentAt (newScreenPos), newPointerState, time); + setComponentUnderMouse (findComponentAt (newScreenPos, getPeer()), newPointerState, time); if ((newPointerState != lastPointerState) || forceUpdate) { diff --git a/modules/juce_gui_basics/mouse/juce_TooltipClient.h b/modules/juce_gui_basics/mouse/juce_TooltipClient.h index a0976b45..0eba1c63 100644 --- a/modules/juce_gui_basics/mouse/juce_TooltipClient.h +++ b/modules/juce_gui_basics/mouse/juce_TooltipClient.h @@ -58,6 +58,7 @@ public: as a base class and calling setTooltip(). Many of the JUCE widgets already use this as a base class to implement their + tooltips. See the TooltipWindow docs for more information about implementing tooltips. @see TooltipClient, TooltipWindow diff --git a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp index 1ac5ed67..b6b2dee7 100644 --- a/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp +++ b/modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp @@ -297,21 +297,13 @@ public: { const auto scale = Desktop::getInstance().getDisplays().getPrimaryDisplay()->scale; - const auto screenBounds = accessibilityHandler.getComponent().getScreenBounds() * scale; + LocalRef screenBounds (makeAndroidRect (accessibilityHandler.getComponent().getScreenBounds() * scale)); - LocalRef rect (env->NewObject (AndroidRect, AndroidRect.constructor, - screenBounds.getX(), screenBounds.getY(), - screenBounds.getRight(), screenBounds.getBottom())); + env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInScreen, screenBounds.get()); - env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInScreen, rect.get()); + LocalRef boundsInParent (makeAndroidRect (accessibilityHandler.getComponent().getBoundsInParent() * scale)); - const auto boundsInParent = accessibilityHandler.getComponent().getBoundsInParent() * scale; - - rect = LocalRef (env->NewObject (AndroidRect, AndroidRect.constructor, - boundsInParent.getX(), boundsInParent.getY(), - boundsInParent.getRight(), boundsInParent.getBottom())); - - env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInParent, rect.get()); + env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInParent, boundsInParent.get()); } const auto state = accessibilityHandler.getCurrentState(); diff --git a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java index 48ae16e2..9a82e2c1 100644 --- a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java +++ b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java @@ -32,9 +32,19 @@ import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; +import android.graphics.Point; import android.graphics.Rect; +import android.os.Build; +import android.text.Selection; +import android.text.SpanWatcher; +import android.text.Spannable; +import android.text.Spanned; +import android.text.TextWatcher; +import android.util.Pair; import android.os.Bundle; +import android.text.Editable; import android.text.InputType; +import android.text.SpannableStringBuilder; import android.view.Choreographer; import android.view.KeyEvent; import android.view.MotionEvent; @@ -51,6 +61,7 @@ import android.view.inputmethod.InputMethodManager; import java.lang.reflect.Method; import java.util.ArrayList; + import java.util.List; public final class ComponentPeerView extends ViewGroup @@ -63,9 +74,10 @@ public final class ComponentPeerView extends ViewGroup if (Application.class.isInstance (context)) { ((Application) context).registerActivityLifecycleCallbacks (this); - } else + } + else { - ((Application) context.getApplicationContext ()).registerActivityLifecycleCallbacks (this); + ((Application) context.getApplicationContext()).registerActivityLifecycleCallbacks (this); } this.host = host; @@ -77,7 +89,7 @@ public final class ComponentPeerView extends ViewGroup setOnFocusChangeListener (this); // swap red and blue colours to match internal opengl texture format - ColorMatrix colorMatrix = new ColorMatrix (); + ColorMatrix colorMatrix = new ColorMatrix(); float[] colorTransform = {0, 0, 1.0f, 0, 0, 0, 1.0f, 0, 0, 0, @@ -91,10 +103,12 @@ public final class ComponentPeerView extends ViewGroup try { - method = getClass ().getMethod ("setLayerType", int.class, Paint.class); - } catch (SecurityException e) + method = getClass().getMethod ("setLayerType", int.class, Paint.class); + } + catch (SecurityException e) { - } catch (NoSuchMethodException e) + } + catch (NoSuchMethodException e) { } @@ -104,11 +118,14 @@ public final class ComponentPeerView extends ViewGroup { int layerTypeNone = 0; method.invoke (this, layerTypeNone, null); - } catch (java.lang.IllegalArgumentException e) + } + catch (java.lang.IllegalArgumentException e) { - } catch (java.lang.IllegalAccessException e) + } + catch (java.lang.IllegalAccessException e) { - } catch (java.lang.reflect.InvocationTargetException e) + } + catch (java.lang.reflect.InvocationTargetException e) { } } @@ -116,7 +133,7 @@ public final class ComponentPeerView extends ViewGroup Choreographer.getInstance().postFrameCallback (this); } - public void clear () + public void clear() { host = 0; } @@ -147,14 +164,14 @@ public final class ComponentPeerView extends ViewGroup } @Override - public boolean isOpaque () + public boolean isOpaque() { return opaque; } private final boolean opaque; private long host; - private final Paint paint = new Paint (); + private final Paint paint = new Paint(); //============================================================================== private native void handleMouseDown (long host, int index, float x, float y, long time); @@ -168,25 +185,25 @@ public final class ComponentPeerView extends ViewGroup if (host == 0) return false; - int action = event.getAction (); - long time = event.getEventTime (); + int action = event.getAction(); + long time = event.getEventTime(); switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: - handleMouseDown (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time); + handleMouseDown (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time); return true; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: - handleMouseUp (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time); + handleMouseUp (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time); return true; case MotionEvent.ACTION_MOVE: { - handleMouseDrag (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time); + handleMouseDrag (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time); - int n = event.getPointerCount (); + int n = event.getPointerCount(); if (n > 1) { @@ -206,8 +223,9 @@ public final class ComponentPeerView extends ViewGroup if (i == 0) { - handleMouseUp (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time); - } else + handleMouseUp (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time); + } + else { int point[] = new int[2]; getLocationOnScreen (point); @@ -223,8 +241,9 @@ public final class ComponentPeerView extends ViewGroup if (i == 0) { - handleMouseDown (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time); - } else + handleMouseDown (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time); + } + else { int point[] = new int[2]; getLocationOnScreen (point); @@ -253,32 +272,132 @@ public final class ComponentPeerView extends ViewGroup return false; } + //============================================================================== + public static class TextInputTarget + { + public TextInputTarget (long owner) { host = owner; } + + public boolean isTextInputActive() { return ComponentPeerView.textInputTargetIsTextInputActive (host); } + public int getHighlightedRegionBegin() { return ComponentPeerView.textInputTargetGetHighlightedRegionBegin (host); } + public int getHighlightedRegionEnd() { return ComponentPeerView.textInputTargetGetHighlightedRegionEnd (host); } + public void setHighlightedRegion (int b, int e) { ComponentPeerView.textInputTargetSetHighlightedRegion (host, b, e); } + public String getTextInRange (int b, int e) { return ComponentPeerView.textInputTargetGetTextInRange (host, b, e); } + public void insertTextAtCaret (String text) { ComponentPeerView.textInputTargetInsertTextAtCaret (host, text); } + public int getCaretPosition() { return ComponentPeerView.textInputTargetGetCaretPosition (host); } + public int getTotalNumChars() { return ComponentPeerView.textInputTargetGetTotalNumChars (host); } + public int getCharIndexForPoint (Point point) { return ComponentPeerView.textInputTargetGetCharIndexForPoint (host, point); } + public int getKeyboardType() { return ComponentPeerView.textInputTargetGetKeyboardType (host); } + public void setTemporaryUnderlining (List> list) { ComponentPeerView.textInputTargetSetTemporaryUnderlining (host, list); } + + //============================================================================== + private final long host; + } + + private native static boolean textInputTargetIsTextInputActive (long host); + private native static int textInputTargetGetHighlightedRegionBegin (long host); + private native static int textInputTargetGetHighlightedRegionEnd (long host); + private native static void textInputTargetSetHighlightedRegion (long host, int begin, int end); + private native static String textInputTargetGetTextInRange (long host, int begin, int end); + private native static void textInputTargetInsertTextAtCaret (long host, String text); + private native static int textInputTargetGetCaretPosition (long host); + private native static int textInputTargetGetTotalNumChars (long host); + private native static int textInputTargetGetCharIndexForPoint (long host, Point point); + private native static int textInputTargetGetKeyboardType (long host); + private native static void textInputTargetSetTemporaryUnderlining (long host, List> list); + + private native long getFocusedTextInputTargetPointer (long host); + + private TextInputTarget getFocusedTextInputTarget (long host) + { + final long ptr = getFocusedTextInputTargetPointer (host); + return ptr != 0 ? new TextInputTarget (ptr) : null; + } + //============================================================================== private native void handleKeyDown (long host, int keycode, int textchar, int kbFlags); private native void handleKeyUp (long host, int keycode, int textchar); private native void handleBackButton (long host); private native void handleKeyboardHidden (long host); - public void showKeyboard (String type) + private static int getInputTypeForJuceVirtualKeyboardType (int type) { - InputMethodManager imm = (InputMethodManager) getContext ().getSystemService (Context.INPUT_METHOD_SERVICE); - - if (imm != null) + switch (type) { - if (type.length () > 0) - { - imm.showSoftInput (this, android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT); - imm.setInputMethod (getWindowToken (), type); - keyboardDismissListener.startListening (); - } else - { - imm.hideSoftInputFromWindow (getWindowToken (), 0); - keyboardDismissListener.stopListening (); - } + case 0: // textKeyboard + return InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_NORMAL + | InputType.TYPE_TEXT_FLAG_MULTI_LINE + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + case 1: // numericKeyboard + return InputType.TYPE_CLASS_NUMBER + | InputType.TYPE_NUMBER_VARIATION_NORMAL; + case 2: // decimalKeyboard + return InputType.TYPE_CLASS_NUMBER + | InputType.TYPE_NUMBER_VARIATION_NORMAL + | InputType.TYPE_NUMBER_FLAG_DECIMAL; + case 3: // urlKeyboard + return InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_URI + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + case 4: // emailAddressKeyboard + return InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + case 5: // phoneNumberKeyboard + return InputType.TYPE_CLASS_PHONE; + case 6: // passwordKeyboard + return InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_PASSWORD + | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; } + + return 0; + } + + InputMethodManager getInputMethodManager() + { + return (InputMethodManager) getContext().getSystemService (Context.INPUT_METHOD_SERVICE); + } + + public void closeInputMethodContext() + { + InputMethodManager imm = getInputMethodManager(); + + if (imm == null) + return; + + if (cachedConnection != null) + cachedConnection.closeConnection(); + + imm.restartInput (this); + } + + public void showKeyboard (int virtualKeyboardType, int selectionStart, int selectionEnd) + { + InputMethodManager imm = getInputMethodManager(); + + if (imm == null) + return; + + // restartingInput causes a call back to onCreateInputConnection, where we'll pick + // up the correct keyboard characteristics to use for the focused TextInputTarget. + imm.restartInput (this); + imm.showSoftInput (this, 0); + keyboardDismissListener.startListening(); } - public void backButtonPressed () + public void hideKeyboard() + { + InputMethodManager imm = getInputMethodManager(); + + if (imm == null) + return; + + imm.hideSoftInputFromWindow (getWindowToken(), 0); + keyboardDismissListener.stopListening(); + } + + public void backButtonPressed() { if (host == 0) return; @@ -292,6 +411,11 @@ public final class ComponentPeerView extends ViewGroup if (host == 0) return false; + // The key event may move the cursor, or in some cases it might enter characters (e.g. + // digits). In this case, we need to reset the IME so that it's aware of the new contents + // of the TextInputTarget. + closeInputMethodContext(); + switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: @@ -299,7 +423,7 @@ public final class ComponentPeerView extends ViewGroup return super.onKeyDown (keyCode, event); case KeyEvent.KEYCODE_BACK: { - backButtonPressed (); + backButtonPressed(); return true; } @@ -309,8 +433,9 @@ public final class ComponentPeerView extends ViewGroup handleKeyDown (host, keyCode, - event.getUnicodeChar (), - event.getMetaState ()); + event.getUnicodeChar(), + event.getMetaState()); + return true; } @@ -320,7 +445,7 @@ public final class ComponentPeerView extends ViewGroup if (host == 0) return false; - handleKeyUp (host, keyCode, event.getUnicodeChar ()); + handleKeyUp (host, keyCode, event.getUnicodeChar()); return true; } @@ -330,17 +455,17 @@ public final class ComponentPeerView extends ViewGroup if (host == 0) return false; - if (keyCode != KeyEvent.KEYCODE_UNKNOWN || event.getAction () != KeyEvent.ACTION_MULTIPLE) + if (keyCode != KeyEvent.KEYCODE_UNKNOWN || (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && event.getAction() != KeyEvent.ACTION_MULTIPLE)) return super.onKeyMultiple (keyCode, count, event); - if (event.getCharacters () != null) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && event.getCharacters() != null) { - int utf8Char = event.getCharacters ().codePointAt (0); + int utf8Char = event.getCharacters().codePointAt (0); handleKeyDown (host, keyCode, utf8Char, - event.getMetaState ()); + event.getMetaState()); return true; } @@ -355,39 +480,40 @@ public final class ComponentPeerView extends ViewGroup view = viewToUse; } - private void startListening () + private void startListening() { - view.getViewTreeObserver ().addOnGlobalLayoutListener (viewTreeObserver); + view.getViewTreeObserver().addOnGlobalLayoutListener (viewTreeObserver); } - private void stopListening () + private void stopListening() { - view.getViewTreeObserver ().removeGlobalOnLayoutListener (viewTreeObserver); + view.getViewTreeObserver().removeOnGlobalLayoutListener (viewTreeObserver); } private class TreeObserver implements ViewTreeObserver.OnGlobalLayoutListener { - TreeObserver () + TreeObserver() { keyboardShown = false; } @Override - public void onGlobalLayout () + public void onGlobalLayout() { - Rect r = new Rect (); + Rect r = new Rect(); - View parentView = getRootView (); + View parentView = getRootView(); int diff; if (parentView == null) { getWindowVisibleDisplayFrame (r); - diff = getHeight () - (r.bottom - r.top); - } else + diff = getHeight() - (r.bottom - r.top); + } + else { parentView.getWindowVisibleDisplayFrame (r); - diff = parentView.getHeight () - (r.bottom - r.top); + diff = parentView.getHeight() - (r.bottom - r.top); } // Arbitrary threshold, surely keyboard would take more than 20 pix. @@ -397,7 +523,7 @@ public final class ComponentPeerView extends ViewGroup handleKeyboardHidden (view.host); } - if (!keyboardShown && diff > 20) + if (! keyboardShown && diff > 20) keyboardShown = true; } @@ -405,26 +531,219 @@ public final class ComponentPeerView extends ViewGroup } private final ComponentPeerView view; - private final TreeObserver viewTreeObserver = new TreeObserver (); + private final TreeObserver viewTreeObserver = new TreeObserver(); } private final KeyboardDismissListener keyboardDismissListener = new KeyboardDismissListener (this); - // this is here to make keyboard entry work on a Galaxy Tab2 10.1 + //============================================================================== + // This implementation is quite similar to the ChangeListener in Android's built-in TextView. + private static final class ChangeWatcher implements SpanWatcher, TextWatcher + { + public ChangeWatcher (ComponentPeerView viewIn, Editable editableIn, TextInputTarget targetIn) + { + view = viewIn; + editable = editableIn; + target = targetIn; + + updateEditableSelectionFromTarget (editable, target); + } + + @Override + public void onSpanAdded (Spannable text, Object what, int start, int end) + { + updateTargetRangesFromEditable (editable, target); + } + + @Override + public void onSpanRemoved (Spannable text, Object what, int start, int end) + { + updateTargetRangesFromEditable (editable, target); + } + + @Override + public void onSpanChanged (Spannable text, Object what, int ostart, int oend, int nstart, int nend) + { + updateTargetRangesFromEditable (editable, target); + } + + @Override + public void afterTextChanged (Editable s) + { + } + + @Override + public void beforeTextChanged (CharSequence s, int start, int count, int after) + { + contentsBeforeChange = s.toString(); + } + + @Override + public void onTextChanged (CharSequence s, int start, int before, int count) + { + if (editable != s || contentsBeforeChange == null) + return; + + final String newText = s.subSequence (start, start + count).toString(); + + int code = 0; + + if (newText.endsWith ("\n") || newText.endsWith ("\r")) + code = KeyEvent.KEYCODE_ENTER; + + if (newText.endsWith ("\t")) + code = KeyEvent.KEYCODE_TAB; + + target.setHighlightedRegion (contentsBeforeChange.codePointCount (0, start), + contentsBeforeChange.codePointCount (0, start + before)); + target.insertTextAtCaret (code != 0 ? newText.substring (0, newText.length() - 1) + : newText); + + // Treating return/tab as individual keypresses rather than part of the composition + // sequence allows TextEditor onReturn and onTab to work as expected. + if (code != 0) + view.onKeyDown (code, new KeyEvent (KeyEvent.ACTION_DOWN, code)); + + updateTargetRangesFromEditable (editable, target); + contentsBeforeChange = null; + } + + private static void updateEditableSelectionFromTarget (Editable editable, TextInputTarget text) + { + final int start = text.getHighlightedRegionBegin(); + final int end = text.getHighlightedRegionEnd(); + + if (start < 0 || end < 0) + return; + + final String string = editable.toString(); + Selection.setSelection (editable, + string.offsetByCodePoints (0, start), + string.offsetByCodePoints (0, end)); + } + + private static void updateTargetSelectionFromEditable (Editable editable, TextInputTarget target) + { + final int start = Selection.getSelectionStart (editable); + final int end = Selection.getSelectionEnd (editable); + + if (start < 0 || end < 0) + return; + + final String string = editable.toString(); + target.setHighlightedRegion (string.codePointCount (0, start), + string.codePointCount (0, end)); + } + + private static List> getUnderlinedRanges (Editable editable) + { + final int start = BaseInputConnection.getComposingSpanStart (editable); + final int end = BaseInputConnection.getComposingSpanEnd (editable); + + if (start < 0 || end < 0) + return null; + + final String string = editable.toString(); + + final ArrayList> pairs = new ArrayList<>(); + pairs.add (new Pair<> (string.codePointCount (0, start), string.codePointCount (0, end))); + return pairs; + } + + private static void updateTargetCompositionRangesFromEditable (Editable editable, TextInputTarget target) + { + target.setTemporaryUnderlining (getUnderlinedRanges (editable)); + } + + private static void updateTargetRangesFromEditable (Editable editable, TextInputTarget target) + { + updateTargetSelectionFromEditable (editable, target); + updateTargetCompositionRangesFromEditable (editable, target); + } + + private final ComponentPeerView view; + private final TextInputTarget target; + private final Editable editable; + private String contentsBeforeChange; + } + + private static final class Connection extends BaseInputConnection + { + Connection (ComponentPeerView viewIn, boolean fullEditor, TextInputTarget targetIn) + { + super (viewIn, fullEditor); + view = viewIn; + target = targetIn; + } + + @Override + public Editable getEditable() + { + if (cached != null) + return cached; + + if (target == null) + return cached = super.getEditable(); + + int length = target.getTotalNumChars(); + String initialText = target.getTextInRange (0, length); + cached = new SpannableStringBuilder (initialText); + // Span the entire range of text, so that we pick up changes at any location. + // Use cached.length rather than target.getTotalNumChars here, because this + // range is in UTF-16 code units, rather than code points. + changeWatcher = new ChangeWatcher (view, cached, target); + cached.setSpan (changeWatcher, 0, cached.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); + return cached; + } + + /** Call this to stop listening for selection/composition updates. + + We do this before closing the current input method context (e.g. when the user + taps on a text view to move the cursor), because otherwise the input system + might send another round of notifications *during* the restartInput call, after we've + requested that the input session should end. + */ + @Override + public void closeConnection() + { + if (cached != null && changeWatcher != null) + cached.removeSpan (changeWatcher); + + cached = null; + target = null; + + super.closeConnection(); + } + + private ComponentPeerView view; + private TextInputTarget target; + private Editable cached; + private ChangeWatcher changeWatcher; + } + @Override public InputConnection onCreateInputConnection (EditorInfo outAttrs) { + TextInputTarget focused = getFocusedTextInputTarget (host); + outAttrs.actionLabel = ""; outAttrs.hintText = ""; outAttrs.initialCapsMode = 0; - outAttrs.initialSelEnd = outAttrs.initialSelStart = -1; + outAttrs.initialSelStart = focused != null ? focused.getHighlightedRegionBegin() : -1; + outAttrs.initialSelEnd = focused != null ? focused.getHighlightedRegionEnd() : -1; outAttrs.label = ""; - outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI; - outAttrs.inputType = InputType.TYPE_NULL; - - return new BaseInputConnection (this, false); + outAttrs.imeOptions = EditorInfo.IME_ACTION_UNSPECIFIED + | EditorInfo.IME_FLAG_NO_EXTRACT_UI + | EditorInfo.IME_FLAG_NO_ENTER_ACTION; + outAttrs.inputType = focused != null ? getInputTypeForJuceVirtualKeyboardType (focused.getKeyboardType()) + : 0; + + cachedConnection = new Connection (this, true, focused); + return cachedConnection; } + private Connection cachedConnection; + //============================================================================== @Override protected void onSizeChanged (int w, int h, int oldw, int oldh) @@ -463,11 +782,13 @@ public final class ComponentPeerView extends ViewGroup Method systemUIVisibilityMethod = null; try { - systemUIVisibilityMethod = this.getClass ().getMethod ("setSystemUiVisibility", int.class); - } catch (SecurityException e) + systemUIVisibilityMethod = this.getClass().getMethod ("setSystemUiVisibility", int.class); + } + catch (SecurityException e) { return; - } catch (NoSuchMethodException e) + } + catch (NoSuchMethodException e) { return; } @@ -476,18 +797,21 @@ public final class ComponentPeerView extends ViewGroup try { systemUIVisibilityMethod.invoke (this, visibility); - } catch (java.lang.IllegalArgumentException e) + } + catch (java.lang.IllegalArgumentException e) { - } catch (java.lang.IllegalAccessException e) + } + catch (java.lang.IllegalAccessException e) { - } catch (java.lang.reflect.InvocationTargetException e) + } + catch (java.lang.reflect.InvocationTargetException e) { } } - public boolean isVisible () + public boolean isVisible() { - return getVisibility () == VISIBLE; + return getVisibility() == VISIBLE; } public void setVisible (boolean b) @@ -572,11 +896,22 @@ public final class ComponentPeerView extends ViewGroup if (host == 0) return null; - final AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfo.obtain (view, virtualViewId); + final AccessibilityNodeInfo nodeInfo; + + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) + { + nodeInfo = new AccessibilityNodeInfo (view, virtualViewId); + } + else + { + nodeInfo = AccessibilityNodeInfo.obtain (view, virtualViewId); + } if (! populateAccessibilityNodeInfo (host, virtualViewId, nodeInfo)) { - nodeInfo.recycle(); + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.R) + nodeInfo.recycle(); + return null; } @@ -617,10 +952,10 @@ public final class ComponentPeerView extends ViewGroup } private final JuceAccessibilityNodeProvider nodeProvider = new JuceAccessibilityNodeProvider (this); - private final AccessibilityManager accessibilityManager = (AccessibilityManager) getContext ().getSystemService (Context.ACCESSIBILITY_SERVICE); + private final AccessibilityManager accessibilityManager = (AccessibilityManager) getContext().getSystemService (Context.ACCESSIBILITY_SERVICE); @Override - public AccessibilityNodeProvider getAccessibilityNodeProvider () + public AccessibilityNodeProvider getAccessibilityNodeProvider() { return nodeProvider; } diff --git a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java index a89dc646..61f9a070 100644 --- a/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java +++ b/modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java @@ -34,7 +34,6 @@ public final class JuceContentProviderFileObserver extends FileObserver public JuceContentProviderFileObserver (long hostToUse, String path, int mask) { super (path, mask); - host = hostToUse; } diff --git a/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp b/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp index ba3f3376..9330d28d 100644 --- a/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp +++ b/modules/juce_gui_basics/native/juce_android_ContentSharer.cpp @@ -101,7 +101,7 @@ public: class Owner { public: - virtual ~Owner() {} + virtual ~Owner() = default; virtual void cursorClosed (const AndroidContentSharerCursor&) = 0; }; @@ -121,9 +121,9 @@ public: jobject getNativeCursor() { return cursor.get(); } - void cursorClosed() + static void cursorClosed (JNIEnv*, AndroidContentSharerCursor& t) { - MessageManager::callAsync ([this] { owner.cursorClosed (*this); }); + MessageManager::callAsync ([&t] { t.owner.cursorClosed (t); }); } void addRow (LocalRef& values) @@ -141,20 +141,12 @@ private: #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (addRow, "addRow", "([Ljava/lang/Object;)V") \ METHOD (constructor, "", "(J[Ljava/lang/String;)V") \ - CALLBACK (contentSharerCursorClosed, "contentSharerCursorClosed", "(J)V") \ + CALLBACK (generatedCallback<&AndroidContentSharerCursor::cursorClosed>, "contentSharerCursorClosed", "(J)V") \ - DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderCursor, "com/rmsl/juce/JuceContentProviderCursor", 16, javaJuceContentProviderCursor, sizeof (javaJuceContentProviderCursor)) + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderCursor, "com/rmsl/juce/JuceContentProviderCursor", 16, javaJuceContentProviderCursor) #undef JNI_CLASS_MEMBERS - - static void JNICALL contentSharerCursorClosed (JNIEnv*, jobject, jlong host) - { - if (auto* myself = reinterpret_cast (host)) - myself->cursorClosed(); - } }; -AndroidContentSharerCursor::JuceContentProviderCursor_Class AndroidContentSharerCursor::JuceContentProviderCursor; - //============================================================================== class AndroidContentSharerFileObserver { @@ -184,10 +176,8 @@ public: env->CallVoidMethod (fileObserver, JuceContentProviderFileObserver.startWatching); } - void onFileEvent (int event, const LocalRef& path) + void onFileEvent (int event, [[maybe_unused]] const LocalRef& path) { - ignoreUnused (path); - if (event == open) { ++numOpenedHandles; @@ -230,20 +220,17 @@ private: METHOD (constructor, "", "(JLjava/lang/String;I)V") \ METHOD (startWatching, "startWatching", "()V") \ METHOD (stopWatching, "stopWatching", "()V") \ - CALLBACK (contentSharerFileObserverEvent, "contentSharerFileObserverEvent", "(JILjava/lang/String;)V") \ + CALLBACK (generatedCallback<&AndroidContentSharerFileObserver::onFileEventCallback>, "contentSharerFileObserverEvent", "(JILjava/lang/String;)V") \ - DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderFileObserver, "com/rmsl/juce/JuceContentProviderFileObserver", 16, javaJuceContentProviderFileObserver, sizeof (javaJuceContentProviderFileObserver)) + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderFileObserver, "com/rmsl/juce/JuceContentProviderFileObserver", 16, javaJuceContentProviderFileObserver) #undef JNI_CLASS_MEMBERS - static void JNICALL contentSharerFileObserverEvent (JNIEnv*, jobject /*fileObserver*/, jlong host, int event, jstring path) + static void onFileEventCallback (JNIEnv*, AndroidContentSharerFileObserver& t, jint event, jstring path) { - if (auto* myself = reinterpret_cast (host)) - myself->onFileEvent (event, LocalRef (path)); + t.onFileEvent (event, LocalRef (path)); } }; -AndroidContentSharerFileObserver::JuceContentProviderFileObserver_Class AndroidContentSharerFileObserver::JuceContentProviderFileObserver; - //============================================================================== class AndroidContentSharerPrepareFilesThread : private Thread { @@ -513,10 +500,8 @@ public: //============================================================================== jobject openFile (const LocalRef& contentProvider, - const LocalRef& uri, const LocalRef& mode) + const LocalRef& uri, [[maybe_unused]] const LocalRef& mode) { - ignoreUnused (mode); - WeakReference weakRef (this); if (weakRef == nullptr) @@ -895,6 +880,4 @@ ContentSharer::Pimpl* ContentSharer::createPimpl() return new ContentSharerNativeImpl (*this); } -ContentSharer::ContentSharerNativeImpl::JuceSharingContentProvider_Class ContentSharer::ContentSharerNativeImpl::JuceSharingContentProvider; - } // namespace juce diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp index e3ade3c6..1fadc42a 100644 --- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -25,109 +25,768 @@ namespace juce { + // This byte-code is generated from native/java/com/rmsl/juce/ComponentPeerView.java with min sdk version 16 // See juce_core/native/java/README.txt on how to generate this byte-code. -static const uint8 javaComponentPeerView[] = -{ 31,139,8,8,136,16,72,99,0,3,74,97,118,97,68,101,120,66,121,116,101,67,111,100,101,46,100,101,120,0,165,155,11,124,220,85,149,199,207,253,255,255,51,147,76,38,201,100,242,108,155,180,147,52,208,36,52,201,36,233,35,33,45,180,77,90,154,52,109,98,51,13,52, - 97,23,38,201,36,153,118,242,159,233,204,36,77,4,165,101,89,169,110,113,1,43,139,80,21,177,160,235,11,84,240,193,178,187,40,42,174,136,128,143,69,87,101,169,139,90,21,92,20,20,151,5,187,191,115,239,157,201,164,15,89,119,147,207,119,206,185,231,62,254, - 247,113,238,185,247,159,199,120,120,206,29,104,91,75,23,61,245,207,167,202,99,239,248,192,190,187,191,252,216,84,255,10,199,175,90,191,95,180,235,111,191,112,251,209,245,68,113,34,154,27,90,227,35,253,245,240,58,162,181,66,217,59,65,183,131,104,27,100, - 192,73,180,156,203,230,18,93,15,57,229,38,114,112,186,128,40,85,71,84,81,72,244,53,20,248,58,120,28,124,27,124,15,252,24,156,4,191,1,111,128,194,21,68,171,64,19,104,1,107,193,70,176,9,116,131,237,96,7,232,7,54,184,17,188,11,188,27,220,10,110,3,119,130, - 187,192,61,224,31,193,203,160,192,79,84,15,186,193,56,184,1,220,7,254,5,252,4,188,10,242,171,137,58,192,229,32,14,142,130,207,131,111,130,159,129,229,53,68,151,130,4,184,23,60,11,10,86,162,143,32,4,110,6,79,131,37,181,68,65,112,16,188,31,124,9,156,4, - 214,5,68,43,193,70,48,0,82,224,14,112,31,248,54,248,25,112,92,136,250,96,59,24,7,215,128,163,224,3,224,4,248,12,120,16,60,10,158,6,223,3,63,2,207,129,83,224,215,224,119,224,53,64,171,208,30,200,5,5,160,24,84,128,229,160,6,52,128,70,208,10,218,193,70, - 208,13,122,193,46,48,8,70,192,40,152,0,251,192,219,193,123,192,7,193,199,193,231,193,163,224,73,240,67,240,115,240,50,56,13,60,88,247,101,160,5,116,128,109,96,0,236,7,179,96,30,28,5,199,192,113,112,2,124,18,60,0,190,4,190,5,158,5,191,7,142,122,140,1, - 148,130,86,208,14,54,131,110,176,3,76,131,57,112,29,184,9,220,1,62,6,30,3,63,5,47,1,209,128,241,131,85,160,5,108,4,59,192,16,216,15,230,192,77,224,78,112,47,248,60,248,42,248,22,120,6,60,15,126,15,156,23,97,92,160,1,92,12,174,0,127,9,198,193,36,56,12, - 110,5,39,192,231,192,87,193,119,193,73,240,42,200,89,141,53,6,117,96,45,232,5,65,48,13,14,130,183,129,67,224,40,184,5,220,13,62,13,190,12,158,0,63,4,63,5,47,130,255,2,102,35,214,20,212,131,86,176,3,12,131,16,136,131,89,240,118,240,14,240,78,240,183,224, - 118,112,55,184,31,124,1,252,19,248,10,120,6,188,0,254,8,138,154,176,15,193,102,16,4,211,96,6,220,0,142,129,187,193,39,193,195,224,171,224,73,240,44,120,1,188,2,222,0,174,102,172,27,88,10,234,65,0,244,131,81,16,6,54,184,21,220,9,238,1,143,130,111,128, - 39,193,191,131,23,129,51,64,84,6,106,193,37,96,15,72,128,235,192,187,193,29,224,99,224,11,224,49,240,12,248,25,160,22,212,5,30,80,2,42,65,13,88,5,26,193,122,112,49,216,12,122,193,0,8,129,40,120,59,184,9,188,15,28,7,31,4,31,6,31,1,31,7,247,129,207,130, - 60,60,6,33,142,138,64,37,168,34,21,7,17,114,8,33,133,16,54,8,97,130,16,22,8,33,128,176,197,73,111,77,130,91,19,220,146,224,82,4,183,32,44,37,97,218,9,211,70,205,28,83,213,16,168,21,180,129,53,96,45,64,8,38,132,102,106,7,29,224,98,29,139,55,128,141,224, - 18,112,41,216,4,54,131,45,160,139,99,53,216,74,42,94,95,6,182,131,30,208,11,118,128,62,176,11,188,5,140,3,27,196,72,197,250,3,164,198,154,254,242,104,233,173,82,227,23,233,180,214,217,206,115,98,104,187,79,235,21,176,151,66,58,181,189,2,228,240,92,105, - 123,129,182,151,234,182,210,122,73,150,94,174,245,50,176,68,63,107,137,214,235,116,59,75,179,218,231,53,9,84,41,157,215,162,93,151,169,207,106,103,181,110,167,92,235,155,170,84,27,172,111,135,190,76,175,203,128,110,135,245,43,116,59,1,221,14,151,225, - 181,186,90,247,135,215,107,170,74,205,231,90,93,38,168,117,126,214,30,173,199,161,15,105,157,159,123,185,214,175,133,126,133,214,143,66,223,171,245,219,161,15,107,253,4,244,17,173,127,2,250,149,90,255,2,244,191,208,250,35,208,175,210,250,215,179,236, - 79,101,233,223,135,30,210,250,115,89,246,23,178,244,87,178,244,215,179,218,180,150,47,216,61,89,122,9,244,171,181,94,153,101,127,189,114,65,231,181,248,75,173,111,207,106,179,54,171,60,207,243,168,214,87,195,62,166,245,53,89,101,186,179,244,190,229,202, - 127,215,233,57,15,107,61,8,251,132,214,175,204,210,167,160,79,106,61,5,125,74,235,215,66,143,104,253,8,244,253,90,63,6,125,159,214,143,103,217,217,247,162,90,63,1,251,180,214,31,200,42,255,200,114,222,59,130,254,154,148,172,22,28,55,234,232,58,82,242, - 235,82,10,122,92,203,39,180,252,150,150,79,106,249,148,46,255,67,226,88,83,67,203,133,146,171,4,199,157,117,244,111,196,178,154,86,8,142,65,42,191,90,231,87,35,167,65,240,94,168,160,183,17,75,131,254,69,202,106,250,129,148,43,232,121,41,215,209,107,82, - 230,209,27,196,49,44,32,247,45,75,151,148,235,200,173,211,249,82,10,218,173,211,131,188,86,216,97,253,196,247,192,11,201,33,120,207,59,233,46,98,89,70,247,67,230,98,135,89,82,174,39,55,242,221,136,132,156,206,211,246,60,60,37,79,240,60,169,180,23,37, - 63,34,101,35,25,130,227,139,65,31,32,150,229,244,33,82,233,191,215,242,211,196,49,71,229,179,252,160,148,22,157,208,233,143,75,105,210,39,72,197,166,79,106,249,41,41,5,125,78,203,207,179,31,163,252,61,82,94,68,15,18,239,249,85,178,63,165,136,182,175, - 72,185,129,126,39,101,37,253,129,56,134,4,232,176,150,57,130,227,69,7,253,43,113,76,200,167,159,74,137,241,8,142,47,106,92,203,16,237,89,46,71,196,126,76,202,213,84,32,88,110,161,10,185,174,109,50,127,5,102,226,22,41,151,208,109,58,253,119,82,118,210, - 105,185,222,45,178,156,31,237,254,150,120,157,85,189,106,216,19,90,38,165,244,82,74,202,165,180,68,40,185,84,250,67,157,44,95,131,21,155,145,178,149,102,165,236,166,131,82,150,208,156,150,243,82,118,209,91,165,92,74,55,104,249,78,41,47,166,119,75,89, - 69,239,145,114,37,189,79,202,98,58,46,101,1,189,95,74,39,125,88,251,223,61,58,255,94,41,219,233,163,82,186,233,62,237,127,159,209,229,62,43,101,14,61,32,165,90,15,120,55,125,81,63,239,33,45,255,65,203,135,181,95,255,163,148,126,250,39,237,223,255,172, - 243,31,209,245,191,164,229,151,181,124,84,202,26,250,138,148,151,208,87,165,236,160,239,105,249,140,148,23,208,41,41,107,233,23,90,254,82,203,95,233,252,23,116,250,69,45,127,45,101,33,253,167,148,245,244,146,148,205,244,27,41,55,211,203,82,42,191,170, - 209,126,197,233,223,235,253,248,170,148,202,207,184,252,127,73,121,41,9,185,126,107,201,163,101,190,148,77,228,149,114,25,249,164,92,67,197,58,93,162,203,149,106,89,166,243,203,133,154,151,58,193,251,88,249,103,61,60,248,99,82,110,165,239,202,125,109, - 208,183,165,244,209,133,130,207,66,85,174,9,59,239,110,226,243,208,164,119,73,105,208,179,196,103,98,41,125,135,248,14,179,84,251,177,58,219,211,103,52,94,25,233,1,156,9,87,235,67,210,175,237,124,198,242,89,193,249,223,132,188,78,231,87,235,250,77,89, - 245,127,132,252,91,117,62,159,241,69,164,206,102,171,74,229,191,128,252,135,116,254,74,157,159,174,159,163,229,189,8,208,187,215,170,123,202,27,56,188,173,181,234,46,83,160,109,43,33,27,128,169,243,215,64,191,68,151,185,76,218,77,169,127,174,69,181,57, - 34,220,20,247,242,211,70,140,60,248,124,14,90,225,119,226,47,181,168,187,159,79,4,71,221,116,192,187,14,246,60,163,12,83,211,98,24,86,135,97,145,203,91,68,193,209,60,58,224,175,198,206,245,16,151,11,142,169,178,38,229,89,7,6,218,105,203,140,219,232,48, - 94,60,109,123,121,188,46,111,221,207,45,253,252,103,90,212,253,170,6,51,30,247,30,150,163,229,103,115,191,79,182,168,51,242,124,207,54,169,72,248,124,109,171,150,156,253,204,64,7,109,113,120,176,55,95,194,51,121,223,187,133,237,175,71,44,247,136,186, - 159,157,93,250,98,89,186,238,23,28,199,45,217,159,87,91,212,221,56,24,87,229,56,167,204,144,119,92,163,3,101,124,216,23,193,3,238,236,124,67,220,32,222,235,186,247,160,179,19,35,115,83,221,75,38,250,203,99,180,90,213,186,142,248,242,49,198,107,97,243, - 209,149,94,143,188,63,230,32,197,99,205,111,85,247,164,98,103,9,213,24,30,148,227,89,8,38,243,41,216,86,64,182,247,50,148,242,136,14,177,97,193,230,223,1,239,88,40,209,141,18,110,115,55,46,238,187,47,16,244,233,224,45,100,90,107,175,94,74,123,146,152, - 7,179,140,124,230,149,208,210,229,131,169,124,244,187,21,35,241,88,220,127,75,206,195,122,234,114,112,249,14,211,69,235,175,118,144,175,152,235,240,179,150,192,147,109,111,5,143,236,140,103,212,125,139,215,146,125,174,29,99,40,148,227,44,208,227,228, - 40,22,247,55,98,7,140,120,65,113,161,190,127,11,57,47,219,81,158,247,88,220,203,111,12,5,25,251,64,198,190,70,218,13,125,99,191,162,85,249,115,208,91,40,247,4,123,16,63,247,234,86,117,199,15,250,11,209,71,126,83,192,56,171,189,232,245,114,60,185,32,83, - 110,242,188,229,86,200,114,5,240,120,30,137,141,114,28,51,124,46,95,89,220,191,20,231,116,141,149,135,222,56,209,171,145,99,101,72,85,83,28,47,135,199,114,71,142,21,35,181,2,169,58,153,42,65,187,93,88,107,143,181,212,113,45,218,197,10,66,95,97,85,160, - 94,17,85,90,14,216,230,113,174,187,173,118,107,156,86,184,57,141,119,66,26,62,238,131,150,194,73,117,229,157,165,208,166,113,151,179,253,182,252,140,225,60,170,65,155,113,47,143,189,216,42,161,149,155,215,35,150,241,109,219,246,91,232,121,144,251,228, - 192,254,245,59,136,91,116,225,169,62,211,246,190,77,247,164,80,248,46,92,57,209,129,241,140,230,84,209,206,28,167,203,87,94,153,147,39,53,59,48,71,65,167,199,108,55,75,200,103,248,106,87,118,95,76,62,199,1,239,53,152,7,143,115,167,211,114,248,74,125, - 82,218,129,67,244,30,235,128,244,100,143,101,251,221,116,140,61,195,203,190,206,99,84,99,57,70,117,119,228,91,117,47,130,95,129,95,128,239,128,167,225,40,153,247,34,245,117,232,82,250,179,210,103,126,169,124,190,131,151,97,111,242,30,247,242,58,155,23, - 221,37,26,62,32,90,142,11,163,249,132,104,188,91,144,142,52,68,63,214,254,51,232,247,201,152,108,201,40,72,244,124,218,223,2,131,84,109,22,96,255,59,100,236,123,177,85,253,92,48,190,39,74,213,93,110,233,219,233,58,175,165,243,2,91,81,199,35,253,49,157, - 103,182,165,243,54,103,242,92,242,70,137,153,211,121,179,206,43,100,148,224,54,29,58,6,44,107,83,251,103,112,147,47,43,214,152,152,101,182,196,3,253,184,137,213,189,182,48,158,149,186,45,126,39,28,198,152,10,116,31,248,171,190,77,157,3,62,236,149,28, - 216,184,92,91,155,42,59,56,112,86,251,176,196,47,31,32,71,72,175,47,241,250,14,80,221,203,233,189,119,73,91,122,239,149,232,119,101,101,239,214,246,61,222,82,217,119,67,239,225,222,54,146,247,109,219,219,35,199,41,99,38,250,226,163,186,63,154,186,143, - 3,109,250,204,146,245,212,219,247,112,150,205,169,207,129,209,55,153,151,157,122,94,210,229,163,111,82,126,87,102,30,85,63,102,207,209,143,67,231,176,29,201,178,89,250,89,55,183,169,51,222,39,248,134,48,18,48,72,73,147,246,182,32,126,190,180,55,224,162, - 189,1,167,182,230,98,15,192,11,188,123,3,22,242,115,228,237,38,30,168,37,191,40,210,227,229,117,250,96,155,58,243,207,221,255,224,150,50,138,239,190,156,172,183,212,253,129,253,202,148,190,251,247,231,173,211,182,245,244,105,57,238,77,155,200,10,113, - 29,55,158,195,103,254,231,218,212,253,35,120,168,8,235,228,39,206,105,71,79,7,15,35,26,121,249,13,198,141,40,82,194,210,178,177,190,144,14,27,167,125,46,229,57,93,135,102,115,250,180,127,241,154,186,241,44,246,239,71,219,212,187,163,207,59,152,64,79, - 248,172,22,56,171,133,58,49,87,231,240,207,55,56,199,246,22,232,246,242,89,58,93,7,196,13,179,206,183,96,126,235,94,140,5,150,209,141,185,56,65,79,217,222,13,24,97,29,191,224,25,106,156,252,243,140,37,90,22,107,60,250,204,62,217,166,126,246,228,163,193, - 235,241,108,167,124,182,179,67,152,120,114,71,110,46,158,153,135,72,225,22,190,154,214,106,23,197,54,85,210,237,15,225,41,191,181,113,22,231,225,116,109,23,124,67,81,186,237,127,59,251,173,131,91,226,62,230,113,31,15,139,99,170,143,62,111,221,51,106, - 238,121,189,78,183,169,251,219,226,185,87,35,102,27,143,213,73,110,35,190,123,55,86,13,117,127,71,58,26,224,220,95,179,224,83,185,58,238,84,173,81,107,25,187,162,138,130,179,217,173,182,227,153,202,135,103,225,195,92,167,80,175,101,19,234,84,162,161, - 193,167,81,218,228,145,11,83,206,186,40,20,182,151,207,93,119,46,175,93,1,229,185,190,119,203,105,186,72,252,94,122,109,221,111,6,191,237,131,180,253,197,184,239,240,58,151,112,89,7,175,119,1,143,249,233,217,156,32,143,184,168,238,71,111,94,114,72,149, - 124,236,205,75,238,65,73,219,203,49,203,157,231,43,90,191,172,129,124,213,43,43,219,17,119,182,209,19,228,91,186,246,161,106,226,86,184,141,79,113,27,254,50,150,194,231,232,118,120,28,215,239,249,90,169,237,47,87,150,178,110,167,199,121,253,196,215,202, - 210,237,126,223,237,22,117,207,161,31,127,133,55,7,188,108,62,120,203,73,183,200,233,112,87,208,255,118,4,245,52,113,58,187,63,255,151,158,112,75,117,63,252,243,123,16,212,61,184,224,255,221,131,160,236,1,150,89,184,164,175,177,111,113,28,106,214,146, - 227,23,191,155,38,165,239,25,242,238,115,207,26,245,174,129,62,226,254,224,34,143,177,212,196,45,187,100,101,55,238,15,142,81,39,238,15,242,46,48,71,173,22,223,71,93,232,119,62,246,63,120,221,231,91,89,131,219,131,201,183,135,28,220,9,118,90,134,201, - 183,134,3,70,221,175,243,141,186,23,192,47,193,41,246,247,34,244,109,153,220,187,136,122,70,115,89,99,133,121,81,93,195,106,254,85,71,38,222,62,157,181,55,76,109,253,193,26,117,151,110,55,92,196,51,146,64,137,2,242,109,170,251,111,30,159,138,201,255, - 177,70,197,1,190,139,241,173,121,169,241,180,188,139,85,227,105,43,48,239,237,136,30,182,247,58,236,80,183,216,40,138,49,219,118,96,21,5,48,226,94,89,222,14,92,72,94,43,216,82,140,27,114,64,182,159,206,241,25,118,224,2,242,26,42,175,133,231,247,183,11, - 247,217,63,172,73,223,91,175,149,189,230,223,35,242,87,250,231,205,60,182,90,216,86,107,123,250,171,253,140,244,246,51,210,92,191,76,175,87,49,158,80,168,109,105,106,180,204,33,117,230,151,232,254,84,106,123,181,150,134,166,70,207,101,19,93,44,237,1, - 109,15,224,148,86,82,200,113,8,253,237,160,133,243,222,208,253,72,159,243,86,70,23,186,125,67,231,187,228,207,224,149,109,157,44,107,102,234,231,103,234,178,116,234,60,39,173,147,249,108,115,105,153,171,165,71,215,45,144,189,163,204,28,20,103,198,188, - 78,143,173,70,218,249,12,114,72,153,30,133,42,191,94,203,118,93,79,232,187,23,203,124,221,15,214,139,50,249,69,89,99,204,207,140,125,73,166,63,170,109,159,126,94,77,166,36,233,159,79,169,210,130,212,190,18,117,228,104,105,10,52,97,20,27,200,185,33,98, - 71,82,151,144,113,73,39,21,108,30,24,232,235,233,218,28,236,233,223,117,85,79,55,185,183,236,233,233,235,190,42,184,119,96,43,121,183,204,68,162,227,93,49,123,34,50,217,180,47,52,27,162,178,174,216,116,60,102,135,237,212,64,56,156,24,138,132,15,42,187, - 163,123,235,150,61,151,145,216,70,198,182,30,114,110,235,219,60,212,191,155,68,15,25,61,245,0,119,177,94,50,122,251,168,170,119,102,44,188,121,108,44,156,76,70,70,35,209,72,106,126,87,108,60,60,144,136,205,70,198,195,9,42,223,17,158,31,141,133,18,227, - 221,145,228,116,36,153,236,139,36,83,97,27,25,162,143,140,62,180,214,135,102,250,250,200,236,67,2,31,189,252,209,71,101,125,33,123,60,17,139,140,55,135,226,241,230,205,99,169,200,44,90,238,164,53,139,237,241,120,52,50,22,74,69,98,118,109,186,76,95,100, - 34,60,54,63,22,13,119,133,162,209,209,208,216,254,100,39,45,57,95,173,236,172,177,152,141,158,165,154,187,88,206,165,178,179,38,19,161,248,84,100,44,217,220,21,178,103,67,104,112,249,57,178,98,209,88,98,91,36,154,10,39,206,159,191,51,148,74,68,230,58, - 169,254,79,230,47,106,170,226,236,162,3,161,136,141,254,149,159,157,179,59,60,134,140,226,76,70,44,217,188,101,198,30,143,134,59,169,36,219,216,179,37,98,143,115,235,13,25,235,44,86,190,185,107,42,150,8,199,100,115,225,68,237,182,68,104,58,51,141,157, - 84,249,39,202,102,247,70,230,98,217,183,206,134,185,155,75,23,103,236,140,241,196,235,188,250,197,121,236,125,181,253,246,182,216,216,76,178,107,42,100,79,134,211,238,146,61,168,76,209,236,201,201,24,47,75,196,102,226,157,180,238,236,156,96,34,28,238, - 31,77,134,19,179,24,91,191,125,89,52,54,26,138,246,133,230,99,51,169,133,199,172,248,211,245,58,169,101,113,129,80,182,231,55,47,218,7,59,67,118,104,146,171,180,254,175,171,240,214,233,177,39,98,103,245,255,77,234,164,183,91,39,53,45,174,23,177,227,51, - 169,233,112,106,42,54,222,188,37,148,68,227,72,195,195,109,56,138,244,255,11,206,95,126,235,120,36,21,75,168,238,52,156,191,216,89,77,54,190,73,217,157,82,207,204,206,165,125,99,177,233,230,196,116,50,218,188,15,161,164,249,172,120,84,251,39,35,76,39, - 109,123,211,6,206,19,131,106,23,175,108,199,255,181,157,78,170,126,179,170,157,84,43,139,192,217,18,144,241,144,61,223,60,59,26,13,217,251,155,179,34,114,39,213,244,141,135,162,179,145,253,205,33,219,142,165,100,140,106,222,106,143,69,99,201,136,61,217, - 21,13,37,101,240,57,187,76,15,166,63,161,243,171,207,145,191,51,60,61,170,11,132,81,164,234,28,69,6,35,147,118,40,53,147,8,243,182,226,35,160,25,221,155,196,54,15,37,6,195,7,102,194,246,24,114,138,178,115,212,227,106,178,76,61,209,104,120,50,20,85,139, - 181,117,110,44,28,87,46,81,123,142,50,137,201,153,105,204,80,86,169,226,236,82,8,194,147,106,106,23,140,187,98,131,51,99,83,202,127,178,234,249,178,138,244,143,238,147,49,176,42,203,54,24,30,155,73,192,109,206,83,101,16,49,215,158,100,191,93,176,37,194, - 19,81,180,131,110,204,198,212,81,17,12,37,38,195,217,189,93,122,142,226,170,107,157,84,170,242,102,82,145,104,243,230,68,34,52,207,174,210,73,133,89,102,182,144,247,12,67,39,89,242,152,246,100,123,38,137,33,242,12,109,221,61,200,231,121,87,127,247,214, - 133,212,174,205,59,183,146,49,212,67,142,161,30,124,65,237,37,231,80,111,207,182,109,189,100,65,114,70,47,103,152,67,189,210,194,39,237,80,239,48,10,178,194,167,237,144,52,245,13,35,183,111,24,103,241,208,48,90,24,150,173,137,97,50,161,145,133,143,62, - 86,251,200,49,220,203,186,5,129,243,123,152,173,56,183,157,195,125,210,236,96,9,251,8,46,13,35,61,228,27,57,219,91,138,71,206,177,88,110,21,222,106,3,129,64,70,111,201,210,91,179,244,182,44,125,77,150,190,54,75,95,151,165,175,207,210,219,161,231,41,125, - 91,52,52,153,164,252,69,113,149,74,66,231,136,223,228,12,201,192,198,53,89,246,133,70,195,81,202,9,233,251,6,45,9,141,143,159,251,52,161,220,144,118,242,36,137,81,42,226,99,116,203,76,42,21,179,7,18,120,76,120,156,156,163,49,36,167,33,229,41,77,206,49, - 121,193,32,215,152,60,253,198,201,129,139,76,40,65,121,99,28,241,98,56,246,55,167,56,145,185,42,80,129,76,4,19,33,59,57,17,75,76,83,25,162,75,83,86,148,105,82,81,134,242,249,122,131,123,67,82,182,130,7,168,91,14,30,16,155,65,122,217,88,34,28,74,157,29, - 101,57,250,147,53,30,153,152,32,215,120,76,94,8,72,132,201,17,230,243,155,252,19,184,70,156,179,78,114,203,124,144,155,207,229,18,242,60,39,199,132,20,158,137,133,211,125,156,242,100,138,35,100,207,56,21,76,112,251,193,200,116,120,87,200,142,37,105,25, - 54,220,162,214,183,101,21,174,60,51,115,209,181,51,87,230,202,101,43,204,168,59,67,201,253,120,102,41,27,22,238,128,250,190,71,249,48,115,176,195,194,134,19,73,202,225,36,251,44,185,89,211,133,60,28,3,120,236,220,75,249,148,237,225,200,228,84,138,138, - 161,202,211,45,187,143,121,210,152,76,133,16,59,101,137,62,29,76,250,237,65,76,120,216,150,237,33,104,132,6,17,132,85,123,42,132,200,94,203,165,66,212,150,43,228,89,48,160,101,23,82,187,67,7,175,72,43,123,229,179,118,199,98,41,126,52,121,145,24,156,135, - 23,78,15,34,132,68,240,244,2,88,246,216,17,246,35,30,164,236,205,153,151,27,57,5,67,145,204,118,224,58,151,99,253,98,7,131,177,253,232,108,101,38,45,11,69,195,56,7,227,209,208,188,114,11,11,185,87,200,207,189,36,166,168,2,43,12,151,94,180,68,219,99,252, - 148,66,157,19,143,15,132,102,120,23,120,51,134,221,225,36,246,75,198,178,37,179,97,40,95,89,186,181,15,234,36,14,228,238,216,65,108,205,76,114,79,156,74,50,9,121,88,111,143,140,143,163,243,250,169,59,99,120,164,172,179,200,144,8,77,166,219,148,6,52,163, - 219,148,151,109,42,214,137,112,130,119,153,246,172,156,169,80,82,249,118,249,20,188,110,48,54,161,93,32,17,155,86,243,132,34,168,45,119,130,53,21,67,192,23,17,114,195,115,250,229,25,146,36,51,50,61,77,133,252,234,22,9,69,187,66,241,228,78,172,15,229, - 107,195,96,56,186,213,30,207,228,35,9,55,73,96,83,201,43,85,112,62,30,38,143,84,175,82,215,43,202,193,195,134,66,209,25,4,146,8,14,174,253,97,60,44,153,113,192,156,72,178,63,30,194,73,78,75,34,201,96,12,39,233,214,185,56,130,135,244,200,173,118,8,11, - 58,142,182,147,122,113,201,181,63,60,223,197,253,41,223,127,158,119,184,252,116,198,224,20,207,168,35,42,67,99,62,92,34,156,224,238,237,194,29,136,172,104,120,34,69,206,104,216,158,76,77,145,83,119,85,216,100,217,188,146,46,59,124,112,23,43,57,118,58, - 222,120,236,236,173,236,140,141,114,224,34,43,22,29,159,146,159,7,169,40,102,167,223,247,186,100,224,26,167,226,5,83,119,56,153,74,196,230,217,143,22,140,218,215,178,106,166,157,109,217,130,105,48,52,27,78,207,151,218,146,89,229,229,228,47,110,98,48, - 21,139,199,97,42,71,24,145,253,56,227,50,140,206,219,240,173,131,148,31,203,126,171,161,130,216,162,3,131,60,49,91,238,13,25,90,40,55,102,167,29,59,95,170,59,103,162,169,72,156,151,68,38,225,156,57,124,14,201,170,40,49,24,121,107,56,29,80,209,146,90, - 90,217,146,51,166,22,220,165,228,85,168,55,131,35,36,133,248,230,136,75,199,118,199,67,9,148,148,81,35,63,190,200,189,29,113,121,84,84,197,99,241,153,232,121,15,135,162,56,252,122,209,155,34,137,4,185,18,234,37,156,106,18,225,73,118,151,196,249,223,207, - 185,48,78,185,36,92,64,43,87,81,101,34,60,141,9,81,147,212,111,159,113,174,58,18,50,230,154,201,112,138,10,146,28,157,51,47,204,228,65,90,78,53,251,51,149,103,167,122,212,212,200,61,198,213,178,222,70,100,181,190,180,223,82,5,82,231,124,15,165,210,100, - 58,178,238,137,100,133,202,101,231,52,243,107,64,8,7,118,82,197,90,233,230,249,201,69,49,214,157,78,70,85,159,46,143,68,163,187,98,41,233,52,158,36,182,85,58,140,161,34,82,153,24,131,194,236,142,170,95,184,190,34,27,190,184,144,172,72,170,222,244,44, - 60,75,143,212,146,7,153,149,154,138,36,201,201,159,181,1,45,91,96,229,99,205,68,75,80,121,34,114,102,82,19,237,242,192,16,179,228,152,149,177,197,37,69,255,4,89,252,126,71,133,252,153,237,130,185,108,8,198,246,96,65,189,179,103,29,49,179,145,68,106,38, - 20,213,39,164,123,118,97,42,196,65,18,115,100,204,5,64,11,104,5,109,96,13,137,121,122,208,50,232,99,134,171,96,184,145,30,182,196,39,12,87,149,145,247,180,49,87,181,207,164,231,197,210,159,236,160,39,44,227,253,6,236,5,244,29,75,188,79,184,170,30,55, - 222,90,245,91,147,238,20,141,141,183,58,136,126,98,153,159,48,174,251,43,225,42,120,116,5,189,108,8,66,91,27,232,53,131,92,171,71,76,227,6,35,255,157,166,56,45,74,155,230,94,53,233,61,194,216,183,65,20,21,69,54,24,201,42,7,109,16,121,78,52,96,168,30, - 24,235,246,26,59,14,54,210,191,27,226,126,126,220,153,242,20,154,44,120,128,94,84,98,163,121,179,120,93,124,67,184,86,27,207,81,167,241,71,113,208,120,74,28,156,51,190,115,205,115,71,132,225,112,111,110,220,208,180,97,195,37,35,38,29,21,238,107,77,113, - 147,104,223,112,111,181,105,62,39,218,68,121,105,96,185,105,252,88,24,162,168,194,97,204,25,253,232,139,67,56,76,167,219,184,232,132,195,237,36,167,112,26,78,179,161,193,152,93,237,48,26,140,228,106,106,87,125,104,55,238,55,62,45,21,139,149,207,24,159, - 93,108,205,40,142,116,246,3,156,188,147,251,252,174,74,154,135,216,65,175,152,198,125,198,131,108,191,73,136,227,152,184,163,75,71,232,55,22,242,232,118,158,62,250,165,201,159,119,88,198,97,113,35,178,233,152,37,14,179,252,163,41,37,26,186,71,89,254, - 166,146,222,157,41,117,151,46,117,68,203,15,153,226,13,44,215,142,29,141,195,59,134,155,232,122,33,142,168,202,143,152,198,61,198,99,92,125,89,35,189,42,196,109,80,143,136,178,66,63,157,48,140,31,112,178,234,70,163,180,202,152,174,50,10,59,155,118,132, - 141,153,222,43,141,249,94,250,134,97,254,64,220,34,243,141,162,119,24,137,170,219,70,246,29,49,29,168,212,28,190,148,30,209,117,11,110,244,87,222,70,95,52,29,239,20,207,138,187,141,119,25,239,224,206,220,111,90,159,50,190,40,78,137,159,35,181,241,198, - 97,250,168,122,238,141,198,215,169,202,120,232,186,170,29,102,238,117,70,159,233,250,144,97,26,143,210,94,99,211,106,81,92,24,80,120,251,204,188,147,194,216,184,193,244,28,54,58,54,10,97,186,31,23,70,163,168,204,191,212,225,118,120,90,28,121,251,156, - 238,38,81,92,102,92,211,185,193,233,217,40,170,74,217,190,216,104,108,19,85,5,244,164,41,62,137,153,247,155,226,184,209,38,124,101,134,103,53,198,185,194,164,247,138,192,114,7,73,165,105,165,131,78,6,26,232,113,83,252,7,247,253,63,77,113,3,100,164,146, - 142,24,226,195,168,253,21,147,158,16,43,154,246,237,152,187,122,201,141,228,228,197,50,106,197,61,70,69,141,113,129,113,141,229,59,41,202,139,141,85,48,84,186,202,69,121,79,121,97,249,206,114,179,188,181,220,161,74,85,203,82,6,74,13,100,202,151,24,23, - 114,121,81,225,87,138,81,177,162,162,218,89,126,211,122,167,88,177,222,37,44,81,110,144,33,44,247,205,126,225,171,59,124,200,122,106,121,189,120,105,185,16,79,173,16,226,5,112,202,143,108,225,49,196,205,254,198,67,135,172,7,170,155,196,247,171,201,116, - 82,1,215,16,190,102,212,57,190,82,28,241,127,147,63,158,231,143,215,87,10,227,88,173,48,30,174,37,231,146,202,34,31,182,131,79,125,175,69,225,231,107,81,228,225,58,124,124,151,63,94,224,143,35,245,248,56,193,31,143,212,59,174,55,72,0,11,184,180,254,231, - 80,2,220,96,131,248,81,189,16,71,27,132,248,40,120,184,193,20,127,104,40,23,55,95,132,52,248,38,120,14,188,2,78,172,22,226,187,224,20,120,29,220,220,40,196,243,224,246,38,148,3,119,53,99,55,5,132,56,214,34,172,167,192,243,45,200,107,117,136,231,214,97, - 138,214,27,226,80,187,33,78,180,59,73,80,249,18,145,249,62,200,19,211,81,148,245,123,156,180,76,255,95,26,255,14,33,253,191,105,252,187,133,244,255,167,169,191,177,85,255,163,198,191,87,72,255,159,154,147,22,254,87,205,244,42,157,127,207,36,252,234,255, - 47,6,160,59,253,170,62,255,157,162,240,42,59,255,109,162,225,87,207,229,255,109,51,117,121,254,251,63,203,175,126,119,196,127,39,232,240,171,254,241,223,22,242,31,55,114,251,242,111,29,189,202,206,255,83,247,63,73,81,207,80,140,55,0,0,0,0 }; +static const uint8 javaComponentPeerView[] +{ + 0x1f, 0x8b, 0x08, 0x08, 0x16, 0x5e, 0x87, 0x63, 0x00, 0x03, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0xad, 0x7c, + 0x0b, 0x7c, 0x94, 0xd5, 0xb5, 0xef, 0xda, 0xdf, 0x3c, 0x33, 0x79, 0xcd, + 0x4c, 0x02, 0xe1, 0xcd, 0x24, 0xa0, 0xe4, 0x9d, 0x21, 0xbc, 0x12, 0x12, + 0x20, 0x21, 0x04, 0x4c, 0x08, 0x10, 0xc8, 0x10, 0x24, 0xa1, 0xca, 0x90, + 0x0c, 0x64, 0x64, 0x98, 0x19, 0x66, 0x26, 0x01, 0x7c, 0x15, 0x29, 0x0a, + 0xf5, 0x51, 0xb1, 0xda, 0x4a, 0xd5, 0xf6, 0x58, 0xaf, 0x2f, 0x3c, 0xea, + 0x41, 0xc5, 0xfa, 0xa8, 0xb6, 0xd6, 0xaa, 0xd5, 0xa3, 0xa7, 0xea, 0x39, + 0xf6, 0x96, 0xdb, 0x63, 0xab, 0x1e, 0xb5, 0xad, 0xad, 0x57, 0xed, 0xa9, + 0xad, 0x7a, 0x8f, 0x3d, 0xde, 0xff, 0xda, 0x7b, 0xcf, 0xe4, 0x1b, 0x12, + 0xd4, 0xde, 0xdf, 0x4d, 0xf8, 0x7f, 0x6b, 0xed, 0xb5, 0xd6, 0x7e, 0xaf, + 0xbd, 0xf6, 0xde, 0xdf, 0x84, 0x19, 0x0c, 0xed, 0x75, 0xf9, 0xe7, 0x2d, + 0xa0, 0xee, 0xef, 0xbf, 0xfb, 0xe4, 0x77, 0xef, 0x38, 0xfe, 0xef, 0xe7, + 0xdc, 0x31, 0xe9, 0xf1, 0x87, 0x7e, 0x3c, 0xf2, 0xe2, 0x88, 0x38, 0x74, + 0xe6, 0xbc, 0x07, 0xde, 0xff, 0xaa, 0xbf, 0x8b, 0x28, 0x4e, 0x44, 0x7b, + 0x7b, 0xe7, 0x7b, 0x49, 0xff, 0x44, 0x56, 0x13, 0x85, 0x84, 0x92, 0xaf, + 0x04, 0xac, 0x76, 0xa2, 0x21, 0xd0, 0x69, 0x0e, 0xa2, 0x59, 0xa0, 0x9f, + 0xe6, 0x12, 0xfd, 0x1c, 0xb4, 0x38, 0x9f, 0x08, 0x22, 0x3a, 0x58, 0x44, + 0xf4, 0xc2, 0x22, 0xa2, 0xc1, 0x62, 0x22, 0x5f, 0x2d, 0x51, 0x19, 0x70, + 0x06, 0x50, 0x0e, 0x54, 0x01, 0xb5, 0x40, 0x3d, 0xb0, 0x00, 0x58, 0x02, + 0xb4, 0x02, 0xab, 0x80, 0x75, 0xc0, 0x39, 0xc0, 0x08, 0x70, 0x00, 0xb8, + 0x14, 0xf8, 0x3a, 0x70, 0x25, 0x70, 0x04, 0xb8, 0x0e, 0xf8, 0x0e, 0xf0, + 0x5d, 0xe0, 0x16, 0xe0, 0x76, 0xe0, 0x18, 0x70, 0x0f, 0x70, 0x1f, 0xf0, + 0x12, 0xf0, 0x0e, 0xf0, 0x2e, 0xf0, 0x01, 0xf0, 0x17, 0xe0, 0x13, 0xe0, + 0x33, 0xc0, 0x52, 0x47, 0xe4, 0x04, 0xf2, 0x01, 0x2f, 0x50, 0x09, 0x6c, + 0x05, 0x2e, 0x00, 0xbe, 0x0d, 0xdc, 0x07, 0xbc, 0x0c, 0xfc, 0x09, 0x98, + 0xe6, 0x27, 0x5a, 0x08, 0x74, 0x03, 0x61, 0xe0, 0x52, 0xe0, 0x06, 0xe0, + 0x38, 0xf0, 0x1c, 0xf0, 0x26, 0xf0, 0x19, 0x30, 0x79, 0x2e, 0x51, 0x0b, + 0xb0, 0x05, 0xd8, 0x0d, 0x5c, 0x06, 0xdc, 0x0f, 0xbc, 0x04, 0xbc, 0x03, + 0xd8, 0xea, 0x89, 0xfc, 0x40, 0x3b, 0x70, 0x2e, 0x70, 0x3d, 0xf0, 0x30, + 0xf0, 0x47, 0x60, 0xe6, 0x3c, 0xa2, 0x4d, 0xc0, 0x21, 0xe0, 0x5e, 0xe0, + 0x57, 0x40, 0xce, 0x7c, 0xa2, 0xc5, 0xc0, 0x10, 0x70, 0x0c, 0xf8, 0x13, + 0x50, 0xbd, 0x00, 0x79, 0x81, 0x03, 0xc0, 0xed, 0xc0, 0x33, 0xc0, 0x3b, + 0x80, 0x73, 0x21, 0xc6, 0x15, 0x58, 0x00, 0x6c, 0x06, 0xbe, 0x0a, 0x5c, + 0x07, 0x3c, 0x04, 0x3c, 0x0f, 0xfc, 0x01, 0xf8, 0x6f, 0xa0, 0x06, 0xf3, + 0xd0, 0x01, 0x6c, 0x05, 0x12, 0xc0, 0x41, 0xe0, 0x2a, 0xe0, 0x5a, 0xe0, + 0x56, 0xe0, 0x7e, 0xe0, 0x41, 0xe0, 0x11, 0xe0, 0x47, 0xc0, 0x53, 0xc0, + 0xf3, 0xc0, 0x8b, 0xc0, 0x2f, 0x81, 0x5f, 0x03, 0x6f, 0x01, 0xef, 0x00, + 0xef, 0x01, 0x1f, 0x02, 0x9f, 0x00, 0x7f, 0x03, 0x8c, 0x06, 0xb4, 0x03, + 0x28, 0x04, 0x8a, 0x81, 0xc9, 0x80, 0x0f, 0xa8, 0x00, 0xea, 0x80, 0xf9, + 0xc0, 0x62, 0xa0, 0x05, 0x58, 0x01, 0x74, 0x01, 0xeb, 0x80, 0x00, 0xd0, + 0x07, 0x9c, 0x0b, 0x0c, 0x00, 0xe7, 0x01, 0x71, 0x20, 0x05, 0xec, 0x03, + 0x2e, 0x01, 0x0e, 0x03, 0x57, 0x02, 0x47, 0x80, 0x5b, 0x81, 0x47, 0x80, + 0xa7, 0x81, 0x97, 0x81, 0xdf, 0x00, 0x7f, 0x04, 0x3e, 0x06, 0x6c, 0x8d, + 0x98, 0x4f, 0x60, 0x26, 0x50, 0x0d, 0x34, 0x02, 0x2b, 0x81, 0x1e, 0xe0, + 0x5c, 0x60, 0x27, 0xb0, 0x07, 0xf8, 0x1a, 0x70, 0x35, 0x70, 0x23, 0x70, + 0x07, 0xf0, 0x00, 0xf0, 0x04, 0xf0, 0x22, 0xf0, 0x36, 0xf0, 0x9f, 0xc0, + 0x47, 0x5c, 0xd6, 0x62, 0xa2, 0xd9, 0xc0, 0x22, 0xa0, 0x13, 0xd8, 0x00, + 0xf4, 0x01, 0x11, 0xe0, 0x02, 0xe0, 0x00, 0x70, 0x2d, 0x70, 0x37, 0xf0, + 0x08, 0xf0, 0x1c, 0x70, 0x12, 0x78, 0x0f, 0xc8, 0x6d, 0xc2, 0x38, 0x00, + 0x33, 0x80, 0x72, 0xa0, 0x13, 0xd8, 0x08, 0x0c, 0x00, 0xfb, 0x81, 0xef, + 0x01, 0xc7, 0x80, 0x47, 0x81, 0x97, 0x81, 0x37, 0x81, 0x4f, 0x00, 0x67, + 0x33, 0xea, 0x05, 0xe6, 0x00, 0x4b, 0x81, 0x4e, 0x60, 0x13, 0x10, 0x02, + 0xf6, 0x03, 0xb7, 0x00, 0xf7, 0x00, 0xcf, 0x02, 0x6f, 0x00, 0x7f, 0x05, + 0xf2, 0x97, 0x60, 0xee, 0x81, 0xe5, 0x40, 0x0f, 0x30, 0x04, 0x8c, 0x00, + 0x97, 0x00, 0xdf, 0x04, 0x6e, 0x06, 0x8e, 0x01, 0xf7, 0x03, 0x3f, 0x06, + 0x5e, 0x02, 0xde, 0x04, 0xfe, 0x02, 0xd8, 0x96, 0x12, 0x95, 0x00, 0xd5, + 0x40, 0x33, 0xb0, 0x1e, 0xd8, 0x0a, 0xc4, 0x81, 0x6f, 0x00, 0xd7, 0x01, + 0x37, 0x00, 0x27, 0x80, 0xa7, 0x81, 0x5f, 0x02, 0xef, 0x00, 0x1f, 0x03, + 0x8e, 0x65, 0xe8, 0x23, 0x50, 0x09, 0x34, 0x01, 0x5d, 0x40, 0x3f, 0x30, + 0x04, 0x5c, 0x04, 0x5c, 0x01, 0xdc, 0x0a, 0xdc, 0x0b, 0x9c, 0x00, 0x9e, + 0x00, 0x5e, 0x06, 0x5e, 0x07, 0xfe, 0x04, 0x7c, 0x0a, 0xb8, 0x5a, 0x88, + 0xa6, 0x03, 0x73, 0x80, 0x3a, 0xa0, 0x09, 0x68, 0x07, 0xce, 0x06, 0x92, + 0xc0, 0xc5, 0xc0, 0xf5, 0xc0, 0xed, 0xc0, 0x3d, 0xc0, 0x83, 0xc0, 0x0f, + 0x81, 0xe7, 0x80, 0x97, 0x81, 0xb7, 0x81, 0x8f, 0x81, 0xfc, 0x56, 0xcc, + 0x3b, 0x50, 0x0f, 0xac, 0x03, 0xb6, 0x01, 0xc3, 0xc0, 0x37, 0x80, 0x6f, + 0x03, 0xb7, 0x01, 0x0f, 0x02, 0x3f, 0x05, 0x7e, 0x0e, 0xfc, 0x1a, 0xf8, + 0x2d, 0xf0, 0x01, 0xf0, 0x19, 0x90, 0xb7, 0x9c, 0x68, 0x2a, 0x50, 0x09, + 0x34, 0x02, 0xab, 0x80, 0x75, 0x40, 0x2f, 0x10, 0x02, 0x0e, 0x02, 0xd7, + 0x03, 0x37, 0x03, 0x4f, 0x01, 0xff, 0x01, 0xbc, 0x07, 0x7c, 0x0a, 0x88, + 0x36, 0x22, 0x0f, 0x30, 0x13, 0x68, 0x00, 0xd6, 0x02, 0x5b, 0x80, 0x11, + 0xe0, 0x20, 0x70, 0x15, 0x70, 0x2b, 0xf0, 0x13, 0xe0, 0x57, 0xc0, 0xef, + 0x80, 0xbf, 0x02, 0xc6, 0x0a, 0xcc, 0x35, 0xe0, 0x03, 0xea, 0x80, 0x65, + 0xc0, 0x5a, 0xa0, 0x1f, 0xd8, 0x0e, 0x44, 0x81, 0xab, 0x81, 0x13, 0xc0, + 0x6f, 0x00, 0x7b, 0x3b, 0xd1, 0x99, 0x40, 0x3b, 0xb0, 0x1d, 0x38, 0x0c, + 0xdc, 0x05, 0xbc, 0x08, 0x7c, 0x04, 0x7c, 0x06, 0x38, 0x10, 0x94, 0x3d, + 0xc0, 0x44, 0xa0, 0x11, 0x18, 0x04, 0x0e, 0x02, 0x77, 0x00, 0xf7, 0x02, + 0x0f, 0x01, 0x8f, 0x03, 0x3f, 0x07, 0x5e, 0x07, 0x0a, 0x10, 0xa3, 0xdd, + 0x40, 0x09, 0x70, 0x06, 0x70, 0x26, 0x30, 0x07, 0x28, 0x07, 0x2a, 0x80, + 0x4a, 0xa0, 0x0a, 0xa8, 0x06, 0x6a, 0x00, 0x84, 0x4f, 0x42, 0x58, 0x24, + 0x84, 0x3c, 0x42, 0x58, 0x23, 0x84, 0x2f, 0x42, 0xb8, 0x22, 0x84, 0x27, + 0x42, 0x28, 0x22, 0x84, 0x19, 0x42, 0x38, 0x20, 0x2c, 0x47, 0xc2, 0x12, + 0x22, 0xb8, 0x34, 0xc1, 0x45, 0x09, 0xae, 0x46, 0x70, 0x19, 0xc2, 0x94, + 0x13, 0xa6, 0x8b, 0x30, 0xe4, 0x84, 0xa1, 0x23, 0x0c, 0x03, 0xa1, 0x6b, + 0xd4, 0xae, 0xf7, 0x93, 0x55, 0xc0, 0x59, 0x40, 0x07, 0xd0, 0x09, 0x60, + 0xbb, 0x21, 0x6c, 0x43, 0xb4, 0x06, 0x58, 0x0b, 0xac, 0x03, 0xba, 0x81, + 0xf5, 0xc0, 0x06, 0xa0, 0x07, 0x08, 0x00, 0x1b, 0x81, 0x5e, 0x60, 0x13, + 0x70, 0x36, 0xb0, 0x19, 0xe8, 0x03, 0xfa, 0x81, 0x2d, 0xc0, 0x57, 0x80, + 0x73, 0x80, 0x73, 0x81, 0xad, 0x40, 0x10, 0xd8, 0x46, 0x6a, 0xef, 0xfa, + 0x1a, 0xf0, 0x0d, 0xe0, 0x6a, 0xe0, 0x08, 0x70, 0x0d, 0xa9, 0x71, 0x49, + 0xff, 0x14, 0x6a, 0x7a, 0xa2, 0x4a, 0x8d, 0x95, 0xd0, 0x69, 0xaf, 0xe6, + 0x59, 0x5e, 0xa4, 0xf9, 0xc7, 0xc0, 0x17, 0x6b, 0xfe, 0x29, 0xf0, 0x13, + 0x34, 0xff, 0x02, 0xf8, 0x89, 0x9a, 0x7f, 0xc5, 0xc4, 0xbf, 0x6a, 0xe2, + 0xdf, 0xaa, 0x52, 0xf3, 0x60, 0xe8, 0xf2, 0x27, 0x69, 0x9e, 0xcb, 0x99, + 0xac, 0xf9, 0x77, 0xc1, 0x4f, 0x03, 0xb5, 0x6b, 0x9b, 0x52, 0xc0, 0x09, + 0x7c, 0xa8, 0xe5, 0x6e, 0x2d, 0x67, 0xde, 0x63, 0xe2, 0x27, 0x9b, 0xf8, + 0xe9, 0x26, 0xde, 0xa7, 0x79, 0x96, 0x95, 0xe9, 0xbe, 0x94, 0x69, 0xfe, + 0x53, 0x5d, 0xe6, 0x2c, 0x53, 0x5d, 0xec, 0x1f, 0xd6, 0x6a, 0x25, 0x9f, + 0xa3, 0xe5, 0x33, 0x49, 0xf9, 0x06, 0xb7, 0x93, 0x6d, 0xd8, 0x47, 0xf2, + 0x60, 0x33, 0x83, 0x94, 0x6f, 0x3c, 0xa6, 0xcb, 0x99, 0x6f, 0xaa, 0x6b, + 0x91, 0xae, 0x6b, 0xa6, 0xe6, 0x39, 0xef, 0x2c, 0xcd, 0x17, 0x23, 0xef, + 0x6c, 0x52, 0xfe, 0x33, 0xad, 0x5a, 0x95, 0xc9, 0xfc, 0x6c, 0x5d, 0x6f, + 0x93, 0x2e, 0x67, 0x86, 0xe6, 0xb9, 0x7c, 0x9f, 0xe6, 0xab, 0x75, 0x5e, + 0xf6, 0xb7, 0x06, 0x9d, 0x57, 0xfa, 0x5c, 0xb5, 0xea, 0x13, 0xf3, 0x67, + 0x55, 0xab, 0x79, 0x6f, 0xd1, 0xe5, 0x84, 0x35, 0xcf, 0xed, 0x39, 0x4f, + 0xf3, 0x5c, 0xe6, 0x4e, 0xcd, 0x77, 0xc3, 0x3e, 0xa2, 0xf9, 0x2d, 0xe0, + 0x77, 0x69, 0x9e, 0xdb, 0x1c, 0xd5, 0xfc, 0x10, 0xe4, 0x31, 0xcd, 0x73, + 0x1b, 0xe2, 0x9a, 0xdf, 0x0b, 0x7e, 0xb7, 0xe6, 0x0f, 0x82, 0x4f, 0x6a, + 0xfe, 0x4a, 0xf0, 0x09, 0xcd, 0x1f, 0x35, 0xf1, 0x37, 0x83, 0x4f, 0x69, + 0xfe, 0x4e, 0xf0, 0xc3, 0x9a, 0x3f, 0x0e, 0xfe, 0x7c, 0xcd, 0x3f, 0x6c, + 0x92, 0x3f, 0x61, 0xe2, 0x9f, 0x05, 0xff, 0x55, 0xcd, 0xbf, 0x64, 0x92, + 0xbf, 0x6a, 0xe2, 0xdf, 0x32, 0xf1, 0xef, 0x9a, 0xf8, 0x16, 0x53, 0xf9, + 0x1f, 0x82, 0xdf, 0xa3, 0xf9, 0x4f, 0xc1, 0x5f, 0xa0, 0x79, 0x27, 0x26, + 0xf9, 0x42, 0xcd, 0x17, 0xd7, 0x8c, 0xe6, 0x9d, 0x6d, 0xe2, 0xab, 0x4d, + 0xfc, 0x7c, 0xf0, 0x23, 0xe9, 0x72, 0x30, 0x56, 0x17, 0x6b, 0xbe, 0xd9, + 0x64, 0x73, 0x73, 0xd5, 0x28, 0xcf, 0x3e, 0xb3, 0x2f, 0x5d, 0x3e, 0xf8, + 0x8b, 0x34, 0xbf, 0xa2, 0x66, 0xb4, 0x6d, 0xdd, 0xe0, 0xf7, 0x6b, 0xfe, + 0x6c, 0x53, 0x39, 0xbc, 0x76, 0xf6, 0x6a, 0x7e, 0xd0, 0x24, 0x8f, 0xd7, + 0x8c, 0xca, 0xf7, 0x9a, 0xca, 0x39, 0x68, 0x6e, 0xbf, 0x69, 0x1c, 0xae, + 0x84, 0xfc, 0x12, 0xcd, 0x5f, 0x07, 0xfe, 0x80, 0xe6, 0x6f, 0x32, 0xd9, + 0xdf, 0x6d, 0xe2, 0x4f, 0xd4, 0xa8, 0xf8, 0xc1, 0xf1, 0x8c, 0x7f, 0x0e, + 0x6a, 0x9e, 0xfd, 0xe7, 0xd2, 0x34, 0x5f, 0x33, 0xca, 0x3f, 0x0b, 0xfe, + 0x32, 0xcd, 0xbf, 0x02, 0xfe, 0x90, 0xe6, 0xd9, 0x97, 0x0e, 0x6b, 0xfe, + 0x55, 0xc8, 0xbf, 0xae, 0xf9, 0xdf, 0x83, 0xbf, 0x42, 0xf3, 0x1f, 0x82, + 0xbf, 0x5c, 0xf3, 0x9f, 0x9a, 0xe4, 0x3c, 0xb6, 0x57, 0x6a, 0xde, 0x8a, + 0xc5, 0x77, 0x95, 0xe6, 0x8b, 0x6b, 0x47, 0xed, 0xe3, 0xa6, 0xbc, 0xdc, + 0xdf, 0x7c, 0x44, 0x9c, 0x7f, 0x22, 0x45, 0xfb, 0x04, 0xc7, 0x3b, 0x41, + 0x83, 0xc4, 0x7b, 0xc0, 0x3c, 0x3a, 0xa6, 0xe9, 0xdf, 0x24, 0x15, 0xf4, + 0x99, 0xa6, 0xfc, 0x8f, 0xa9, 0xd0, 0xd4, 0xd0, 0xd4, 0x22, 0x94, 0x7d, + 0xa1, 0xe0, 0x7d, 0xa3, 0x89, 0x1e, 0x21, 0xa6, 0x1e, 0x7a, 0x4c, 0xd2, + 0x1a, 0x5a, 0x2d, 0xe5, 0xb5, 0x14, 0x14, 0xbc, 0xa7, 0x78, 0xe8, 0x38, + 0x31, 0x2d, 0xa7, 0xfb, 0x25, 0x55, 0xfa, 0x0a, 0xad, 0xaf, 0x04, 0xdd, + 0xa4, 0x29, 0xa7, 0xab, 0xd0, 0xe2, 0x02, 0x49, 0xab, 0xe9, 0x6c, 0xc1, + 0xfb, 0x90, 0xd2, 0x57, 0x6b, 0x7d, 0x35, 0x34, 0x03, 0x82, 0xe3, 0x8f, + 0x41, 0xff, 0x4d, 0x1c, 0x7b, 0x4a, 0xe9, 0x4e, 0x49, 0x2b, 0xe8, 0x3e, + 0x49, 0xd3, 0xf2, 0x6a, 0xca, 0x17, 0x4c, 0x2b, 0xc9, 0x2b, 0x69, 0x2b, + 0x55, 0x49, 0x9a, 0x4b, 0xd5, 0x82, 0xe3, 0xce, 0x7c, 0x0a, 0xc1, 0xce, + 0x86, 0x9d, 0x6b, 0xae, 0xe0, 0xf8, 0x9a, 0x4f, 0x4f, 0x13, 0xd3, 0x52, + 0x7a, 0x13, 0x34, 0x07, 0xed, 0x75, 0x48, 0xba, 0x89, 0x16, 0x40, 0xef, + 0xc2, 0xae, 0xc6, 0xe9, 0x5c, 0x2d, 0xcf, 0xc5, 0x08, 0x2e, 0x14, 0x3c, + 0x9e, 0x2a, 0xed, 0x41, 0xbd, 0x6e, 0xc1, 0xb4, 0x9b, 0xe6, 0x49, 0xba, + 0x9e, 0x96, 0x08, 0xde, 0x33, 0x72, 0xe8, 0x0d, 0x52, 0xf4, 0x3f, 0x24, + 0x6d, 0xa1, 0x66, 0xc1, 0xfb, 0xc4, 0x5a, 0x99, 0xaf, 0x04, 0xbb, 0x1a, + 0xd3, 0xc9, 0xc8, 0xf1, 0x4b, 0x49, 0xdb, 0xa8, 0x0e, 0xfa, 0x29, 0x68, + 0x37, 0xcb, 0xa7, 0xa0, 0xdc, 0x9f, 0x4a, 0x5a, 0x46, 0xcf, 0xea, 0xf4, + 0xaf, 0x34, 0xfd, 0x1d, 0xe8, 0x54, 0xad, 0x67, 0xfa, 0x94, 0xa4, 0x2e, + 0x79, 0x1f, 0xe3, 0xf4, 0xab, 0x92, 0x5a, 0xe8, 0xd7, 0x92, 0xe2, 0x4c, + 0xa1, 0xe9, 0x6b, 0x92, 0x0a, 0x7a, 0x57, 0xd3, 0xff, 0x4d, 0x1c, 0xa3, + 0x0d, 0x7a, 0x59, 0xd2, 0x25, 0xf4, 0x47, 0xe2, 0x58, 0xdb, 0x28, 0xeb, + 0x9f, 0x81, 0x9d, 0xb4, 0x54, 0x30, 0xdd, 0x42, 0x65, 0x92, 0x56, 0xd3, + 0x19, 0x82, 0xe3, 0xef, 0x59, 0xf4, 0x8f, 0xa4, 0x68, 0xbd, 0xe0, 0xb8, + 0xbb, 0x99, 0x72, 0x05, 0xc7, 0xdc, 0x95, 0x32, 0x5f, 0x19, 0x7a, 0x58, + 0x24, 0xd3, 0xe5, 0xe4, 0x17, 0x1c, 0xeb, 0xd5, 0x38, 0xcd, 0xc6, 0x8e, + 0xaf, 0x68, 0x39, 0x9d, 0x90, 0xd4, 0x49, 0xff, 0xac, 0xe9, 0xf3, 0x92, + 0xba, 0xe9, 0x5f, 0x88, 0xf7, 0x9a, 0x20, 0x7d, 0x2a, 0x69, 0x3b, 0xcd, + 0x17, 0x4c, 0x07, 0x68, 0xa5, 0xf4, 0xab, 0xd5, 0x32, 0x7f, 0x39, 0x4e, + 0x17, 0x77, 0x4b, 0xba, 0x8e, 0xee, 0x95, 0xf4, 0x4c, 0xfa, 0xad, 0xa4, + 0xad, 0x74, 0xa6, 0xb4, 0x5b, 0x4e, 0x73, 0x84, 0x4a, 0x97, 0x0b, 0x65, + 0x57, 0x21, 0xe9, 0x32, 0xea, 0xd7, 0x74, 0x8b, 0xa6, 0x5f, 0xd1, 0xf4, + 0x1c, 0xe9, 0x97, 0x6b, 0x64, 0xf9, 0x15, 0xba, 0x7d, 0x15, 0xba, 0x3d, + 0x95, 0x38, 0x95, 0x38, 0x24, 0x2d, 0xa6, 0x47, 0x25, 0x9d, 0x43, 0x3f, + 0xd2, 0xe9, 0x1f, 0x4b, 0xda, 0x4f, 0x35, 0xd2, 0x6f, 0x3b, 0xa4, 0x5d, + 0x15, 0xf2, 0xcf, 0x94, 0xfe, 0xaa, 0xf2, 0x55, 0x43, 0xfe, 0x2d, 0x4d, + 0xbf, 0x2d, 0xe9, 0x14, 0xba, 0x5e, 0xd2, 0x72, 0x5a, 0x25, 0x14, 0x3d, + 0x4b, 0xfa, 0x75, 0x8d, 0xb4, 0x67, 0xff, 0x7e, 0x46, 0x52, 0x07, 0xfd, + 0x4c, 0xa7, 0xff, 0x55, 0xd3, 0x7f, 0xd3, 0xf4, 0xa4, 0xa4, 0xb3, 0xe8, + 0x2d, 0x9d, 0x7e, 0x5b, 0xd2, 0x1e, 0xb2, 0xc9, 0x72, 0x36, 0x93, 0x4b, + 0xd2, 0x4a, 0x6a, 0x94, 0x34, 0x40, 0x2d, 0xd2, 0xff, 0x17, 0xcb, 0xf2, + 0x6b, 0x71, 0x3a, 0xfa, 0xa6, 0xa4, 0x36, 0xba, 0x56, 0xd2, 0xf9, 0x74, + 0x9d, 0xa4, 0x79, 0x74, 0x54, 0xd2, 0x4e, 0xfa, 0x8e, 0xa4, 0x21, 0xba, + 0x41, 0xd2, 0x99, 0x74, 0xa3, 0xa6, 0x37, 0x49, 0x3a, 0x48, 0xdf, 0xd5, + 0xf9, 0xbf, 0x27, 0x69, 0x1d, 0xfd, 0x83, 0xa4, 0xb3, 0xe9, 0x66, 0x49, + 0xe7, 0xd1, 0xf7, 0xb5, 0xfe, 0x16, 0x4d, 0xff, 0x87, 0xa4, 0x76, 0xba, + 0x55, 0xa7, 0x6f, 0x93, 0xb4, 0x9c, 0xee, 0xd1, 0xf4, 0x01, 0x4d, 0x1f, + 0x94, 0xb4, 0x8f, 0x1e, 0x96, 0xb4, 0x86, 0x7e, 0x28, 0xe9, 0x02, 0x7a, + 0x42, 0xd2, 0x19, 0xf4, 0x13, 0x49, 0x27, 0xd2, 0x93, 0x92, 0xe6, 0xd3, + 0x0b, 0x92, 0x4e, 0xa6, 0x17, 0x49, 0xad, 0xef, 0x97, 0x74, 0x1c, 0x78, + 0x59, 0xdb, 0xbf, 0x22, 0xe9, 0x24, 0xfa, 0x85, 0xa4, 0x16, 0xfa, 0x9f, + 0x92, 0x9e, 0x4d, 0xff, 0x4b, 0x52, 0x2f, 0xbd, 0x2e, 0x69, 0x11, 0xfd, + 0x5e, 0xe7, 0x7b, 0x47, 0xd2, 0x42, 0xfa, 0x83, 0xa4, 0x6a, 0x3d, 0xd4, + 0xe2, 0xf7, 0x3d, 0xdd, 0x9e, 0xf7, 0x35, 0xfd, 0x40, 0xd3, 0x3f, 0x49, + 0x3a, 0x97, 0xfe, 0x53, 0x52, 0x3f, 0xfd, 0x59, 0x8f, 0xc7, 0x87, 0x5a, + 0xff, 0x17, 0x9d, 0xff, 0xaf, 0x9a, 0x7e, 0xa4, 0xe9, 0xc7, 0x92, 0xd6, + 0xd3, 0x27, 0x92, 0x9e, 0x4b, 0xff, 0x47, 0xf7, 0xff, 0xbf, 0x24, 0xdd, + 0x4c, 0x39, 0x42, 0xd1, 0x3c, 0x49, 0x17, 0xd1, 0x04, 0x49, 0x17, 0xd2, + 0x44, 0x4d, 0x4b, 0x34, 0x9d, 0xa4, 0xf5, 0x93, 0x75, 0x7a, 0x8a, 0xa6, + 0x53, 0x25, 0x2d, 0xa1, 0x69, 0x92, 0x36, 0xd1, 0x74, 0x49, 0x57, 0xd1, + 0x0c, 0x49, 0xb7, 0x91, 0x4f, 0x52, 0xb5, 0xbe, 0x6b, 0xf5, 0xfa, 0xe6, + 0xf4, 0x2c, 0x49, 0x7b, 0x69, 0xb6, 0x50, 0x71, 0xf4, 0x0c, 0x6d, 0x5f, + 0x29, 0xe9, 0x56, 0xaa, 0x95, 0x74, 0x23, 0x2d, 0xd2, 0xb4, 0x41, 0xd2, + 0x15, 0xd4, 0x24, 0x54, 0x1c, 0x5e, 0x26, 0x69, 0x0f, 0xb5, 0xea, 0xf4, + 0x72, 0x6d, 0xd7, 0xa6, 0xe9, 0x0a, 0x49, 0xab, 0xa8, 0x5d, 0x28, 0x3f, + 0xe8, 0x12, 0xca, 0x2f, 0xd6, 0xe8, 0xf4, 0x5a, 0x4d, 0xd7, 0x69, 0xda, + 0x2d, 0x94, 0x5f, 0xad, 0xd7, 0xe9, 0x0d, 0x42, 0xf9, 0x57, 0x8f, 0x50, + 0x7e, 0x1c, 0x10, 0x6a, 0xbc, 0x37, 0x0a, 0xe5, 0xc7, 0xbd, 0x42, 0x8d, + 0xfb, 0x36, 0xc1, 0xe7, 0xd1, 0xa9, 0xd4, 0x21, 0x69, 0x19, 0x6d, 0x16, + 0x7c, 0x26, 0x3d, 0x83, 0xfe, 0x9d, 0x98, 0x6e, 0x27, 0xa7, 0xdc, 0x07, + 0x0c, 0xb2, 0x4b, 0x3a, 0x9d, 0xb6, 0x0a, 0x3e, 0x77, 0xaa, 0x38, 0xd5, + 0x88, 0x93, 0xe7, 0x73, 0x92, 0xaa, 0x7c, 0x4d, 0xf0, 0x9b, 0x1f, 0x10, + 0x53, 0x2b, 0x3d, 0x24, 0xe9, 0x0e, 0x7a, 0x5c, 0x52, 0x15, 0xf7, 0x59, + 0x5e, 0x2c, 0xe9, 0x2c, 0xea, 0x14, 0x7c, 0x1e, 0xf5, 0x91, 0x43, 0xf0, + 0x1d, 0x48, 0x95, 0xb7, 0x14, 0xf5, 0xdd, 0x45, 0xea, 0x9e, 0xe5, 0x26, + 0x75, 0xbe, 0x3d, 0x8a, 0x7d, 0x3c, 0x0f, 0xf4, 0x55, 0x5c, 0x7c, 0x0a, + 0xf8, 0x12, 0x44, 0xea, 0x0e, 0xe6, 0x26, 0x75, 0xa6, 0xe5, 0x1f, 0xd6, + 0x7f, 0x08, 0x7d, 0x97, 0xd6, 0x57, 0x6a, 0xfd, 0x2c, 0x93, 0xde, 0x8a, + 0x4b, 0xd3, 0x76, 0xad, 0xaf, 0xd2, 0x72, 0x2e, 0xff, 0x66, 0x5d, 0xfe, + 0x34, 0xe8, 0x2f, 0xd5, 0xfa, 0x6a, 0x53, 0xfd, 0xe9, 0xfc, 0xd5, 0xd0, + 0x1f, 0xd5, 0x7a, 0x3e, 0xd7, 0x8b, 0x53, 0xf4, 0xcd, 0xd0, 0x3f, 0xa1, + 0xf5, 0x7c, 0xd6, 0xe7, 0x7b, 0x06, 0x9f, 0xc5, 0xef, 0xd4, 0xe5, 0x07, + 0xa0, 0xff, 0x58, 0xeb, 0xed, 0x7c, 0x3e, 0x00, 0x2d, 0xae, 0x50, 0x77, + 0xc5, 0xdd, 0xee, 0xb9, 0x98, 0x31, 0x17, 0xa8, 0x9f, 0xa9, 0x58, 0xcc, + 0x27, 0x06, 0x61, 0xa1, 0xf2, 0xd9, 0x51, 0xf7, 0x53, 0x90, 0xe4, 0xd9, + 0xca, 0x8c, 0xa5, 0x14, 0x77, 0xbf, 0x80, 0x71, 0x2c, 0xb3, 0x94, 0x90, + 0xd7, 0x1a, 0xf5, 0x3f, 0x83, 0x98, 0xcf, 0x39, 0x7e, 0x22, 0xeb, 0x97, + 0x69, 0xe1, 0xb2, 0x71, 0x9a, 0xed, 0xe3, 0x7e, 0x37, 0x59, 0x6c, 0x51, + 0xdf, 0xbf, 0xa0, 0x7c, 0x8f, 0xe1, 0xb5, 0x79, 0x6c, 0x56, 0x8c, 0x3d, + 0xdf, 0x95, 0x66, 0x54, 0xf0, 0x7e, 0x8c, 0xb3, 0x8f, 0x9b, 0x23, 0x43, + 0xbf, 0x28, 0xa0, 0x7e, 0x23, 0x8f, 0xfa, 0x2d, 0xf9, 0xb4, 0xdb, 0xb7, + 0x14, 0xd6, 0x7c, 0xc7, 0x33, 0x32, 0xb7, 0x2d, 0xd5, 0x4f, 0x96, 0xd9, + 0xf0, 0xcb, 0x7c, 0x65, 0x85, 0x7a, 0x87, 0x99, 0x70, 0x3f, 0x8e, 0x74, + 0x9e, 0xe8, 0x17, 0xb9, 0x19, 0x3d, 0xe7, 0x9a, 0x57, 0xa1, 0xee, 0x5e, + 0x01, 0x91, 0x47, 0x01, 0x83, 0x4b, 0x6d, 0xc1, 0xbe, 0x57, 0x80, 0x3c, + 0x0e, 0xa9, 0x6f, 0x3e, 0x8d, 0x3e, 0x9d, 0x7f, 0xd5, 0x69, 0xf4, 0x39, + 0xd0, 0xf3, 0x98, 0x75, 0x57, 0xa8, 0x7b, 0x47, 0xa0, 0x25, 0x8f, 0xe6, + 0x75, 0x87, 0x41, 0x73, 0x31, 0x0f, 0x18, 0xab, 0x81, 0xe3, 0x43, 0x09, + 0xff, 0x63, 0x14, 0x72, 0xe6, 0xd9, 0xb8, 0x6d, 0x3c, 0x0a, 0x53, 0x9c, + 0x06, 0x45, 0x7d, 0x3f, 0xc3, 0x39, 0xd3, 0xe5, 0xf4, 0x52, 0xa3, 0x33, + 0x9f, 0xa6, 0x38, 0x2d, 0x19, 0x49, 0x03, 0xf8, 0x72, 0x8b, 0xd7, 0x59, + 0x6e, 0x29, 0x72, 0x2e, 0x47, 0x3c, 0x10, 0x52, 0x33, 0x01, 0xe3, 0xdf, + 0x20, 0xac, 0x54, 0xe4, 0x5c, 0x42, 0x81, 0xd6, 0x7c, 0x0a, 0x2c, 0xcf, + 0x95, 0xa3, 0x6b, 0xd8, 0x5d, 0x46, 0xa0, 0x2d, 0x97, 0x8e, 0x8f, 0x70, + 0xca, 0x62, 0x77, 0xd9, 0xa3, 0xfe, 0x2d, 0x54, 0x6a, 0x0f, 0xac, 0xcc, + 0xa7, 0x06, 0x27, 0x66, 0xc0, 0xfd, 0x2c, 0xcf, 0x9d, 0xe3, 0xa4, 0xc3, + 0xf1, 0x59, 0xd4, 0xff, 0xcf, 0x64, 0x73, 0xe4, 0x61, 0xfc, 0xfb, 0x10, + 0x21, 0x58, 0x1b, 0x68, 0x2f, 0xa0, 0x32, 0xfb, 0x14, 0x8a, 0xfb, 0x8b, + 0xc8, 0xee, 0x8c, 0xfa, 0x6f, 0xa6, 0x4b, 0xed, 0x81, 0x76, 0xc8, 0x57, + 0xaa, 0x1e, 0x86, 0xc8, 0x6b, 0xeb, 0x6f, 0xcf, 0x95, 0xe3, 0x60, 0xc8, + 0x7e, 0xee, 0xa8, 0x50, 0xfe, 0x13, 0x75, 0x6f, 0xc4, 0xcc, 0xb9, 0x40, + 0x7b, 0x99, 0x5a, 0x17, 0xa3, 0x85, 0x4d, 0x56, 0xb4, 0xdc, 0xc3, 0xbe, + 0x61, 0xc1, 0x0c, 0x78, 0x8d, 0xa8, 0xff, 0x39, 0x8c, 0x11, 0x6c, 0x98, + 0x5a, 0x5d, 0xd6, 0xdd, 0xfe, 0x02, 0xb2, 0x58, 0x0b, 0xe4, 0x3c, 0xf2, + 0x98, 0x26, 0xf5, 0x98, 0xee, 0x76, 0x37, 0x2a, 0x6f, 0xf1, 0x7d, 0x05, + 0x73, 0x37, 0xaa, 0x3f, 0x5f, 0xcf, 0xe9, 0x6e, 0x5f, 0x2b, 0xfc, 0x7e, + 0xb7, 0x6f, 0x19, 0x9e, 0x6a, 0x4e, 0x55, 0x5b, 0x0e, 0xe8, 0xb6, 0xec, + 0x76, 0xe7, 0x23, 0xcd, 0x5e, 0x97, 0xc7, 0x54, 0xc8, 0xb6, 0x08, 0x53, + 0x5b, 0x2c, 0xdc, 0x96, 0x67, 0xb0, 0xee, 0x5c, 0x72, 0xcc, 0x66, 0x09, + 0x97, 0x85, 0x47, 0xc9, 0x6a, 0x29, 0x90, 0x3e, 0x6f, 0x43, 0x19, 0xdf, + 0xa8, 0x50, 0x77, 0xd2, 0x40, 0x77, 0x21, 0x4e, 0x95, 0x16, 0xac, 0x93, + 0x40, 0xb7, 0x07, 0x33, 0x98, 0x43, 0x31, 0x77, 0x3d, 0xcf, 0x1a, 0xf5, + 0x43, 0xe3, 0x41, 0x7f, 0xf9, 0x6d, 0x85, 0x8b, 0x02, 0xeb, 0x3d, 0xc4, + 0xa5, 0x9e, 0x8d, 0x1e, 0xe6, 0x21, 0xfa, 0x4e, 0xa0, 0xb8, 0xaf, 0x10, + 0x65, 0xf5, 0xaf, 0x2f, 0x94, 0xe7, 0xa6, 0x40, 0x8f, 0x97, 0x02, 0x01, + 0x0f, 0xc5, 0x5b, 0x16, 0x92, 0xbf, 0xb5, 0xbf, 0xdb, 0x8d, 0x1c, 0x85, + 0xf0, 0xce, 0x1c, 0xd8, 0xb8, 0x2c, 0x45, 0x56, 0x2f, 0x25, 0x02, 0xb9, + 0x24, 0xea, 0x03, 0xb2, 0x54, 0xc4, 0x01, 0xfc, 0x72, 0x9f, 0x6e, 0xd4, + 0x63, 0x12, 0xf7, 0xd7, 0x92, 0xdb, 0xe8, 0x17, 0x5e, 0xac, 0x01, 0x0f, + 0x7a, 0x6d, 0xe1, 0x33, 0x3c, 0xe4, 0xb7, 0x55, 0xa8, 0x77, 0x16, 0x01, + 0x1f, 0xb7, 0x33, 0x87, 0x02, 0xa5, 0x6e, 0xc4, 0x70, 0x1b, 0x25, 0x7c, + 0x2e, 0x8c, 0x0e, 0xac, 0x21, 0xef, 0xf7, 0x79, 0xd0, 0xea, 0x3a, 0xd8, + 0x17, 0xa0, 0x2c, 0x43, 0xf6, 0xef, 0xde, 0x0a, 0x75, 0x5f, 0x0f, 0x6c, + 0x2d, 0xc2, 0x38, 0xf1, 0xdb, 0x94, 0x5c, 0xb4, 0x7f, 0x22, 0xaa, 0x9c, + 0x0b, 0x07, 0x6e, 0xb4, 0xa1, 0xc7, 0xc6, 0x56, 0xd8, 0x16, 0x89, 0x19, + 0x34, 0xdf, 0xed, 0x42, 0x1f, 0xca, 0x28, 0x30, 0x50, 0x8c, 0x76, 0x54, + 0x92, 0xdf, 0x51, 0xee, 0x08, 0x6c, 0x2d, 0xc6, 0x0c, 0x54, 0xe1, 0xae, + 0x0c, 0xef, 0x18, 0x50, 0x65, 0x58, 0x28, 0xd7, 0xba, 0xbb, 0x7b, 0x90, + 0xda, 0x86, 0x5d, 0x8e, 0x46, 0x87, 0x8b, 0xb6, 0x3a, 0x0c, 0x5a, 0x50, + 0x62, 0xc3, 0x18, 0x71, 0xa4, 0xf2, 0x18, 0xdc, 0x2f, 0xa7, 0x9e, 0xab, + 0x47, 0x75, 0x4c, 0xf9, 0xbc, 0xfa, 0xbd, 0xee, 0x79, 0x0e, 0x78, 0xf6, + 0x0e, 0x65, 0xe1, 0x80, 0xc5, 0x6e, 0x7f, 0x08, 0x91, 0x38, 0xcf, 0x51, + 0x9e, 0x9b, 0x2d, 0xdd, 0x2e, 0xa5, 0x0d, 0x0e, 0xac, 0x01, 0xf7, 0x13, + 0x90, 0xb9, 0x1c, 0x51, 0xdf, 0x4a, 0xdc, 0x5f, 0xf3, 0x1c, 0x1e, 0x87, + 0xc7, 0x70, 0x61, 0x2c, 0xf9, 0x9d, 0xcb, 0xd3, 0x15, 0xea, 0x1d, 0x84, + 0xb9, 0xce, 0x89, 0x18, 0xc4, 0xb9, 0x08, 0x39, 0x8d, 0x56, 0x2b, 0x79, + 0x1d, 0x85, 0x0e, 0x93, 0x4e, 0x88, 0xa4, 0x38, 0xe8, 0xf8, 0xd6, 0x1e, + 0xfb, 0x0e, 0x9e, 0x61, 0xe8, 0x2c, 0x72, 0xd4, 0x89, 0x7e, 0x5e, 0xa1, + 0xde, 0xe1, 0x94, 0x09, 0x15, 0xed, 0x04, 0x79, 0x44, 0x5a, 0xf7, 0x0b, + 0x3d, 0x5f, 0xfd, 0xa2, 0x08, 0x3a, 0x8e, 0xc0, 0xfd, 0x46, 0xb1, 0xf6, + 0x61, 0xd6, 0xff, 0xba, 0x82, 0xef, 0x21, 0xac, 0x9f, 0xa8, 0x63, 0x9b, + 0x57, 0x6c, 0x81, 0xb7, 0x14, 0x98, 0xe2, 0xed, 0x5b, 0x15, 0xea, 0x7d, + 0x58, 0x19, 0x22, 0x60, 0xdc, 0x2d, 0xa3, 0xcc, 0xfa, 0x89, 0x14, 0xf0, + 0x94, 0xa0, 0x77, 0xfb, 0x65, 0x34, 0x6b, 0x44, 0xee, 0x8c, 0xcc, 0x77, + 0x10, 0xb2, 0x51, 0x8b, 0x0b, 0xd8, 0xa3, 0xc4, 0x06, 0x83, 0xdf, 0xb1, + 0x09, 0x2a, 0xcf, 0x8b, 0xfa, 0xca, 0x40, 0xa3, 0xee, 0xd2, 0x2c, 0xf9, + 0x7d, 0xc6, 0x7d, 0xa5, 0x45, 0xf0, 0x9c, 0x05, 0x62, 0x0a, 0x6d, 0xdc, + 0x30, 0x81, 0x1a, 0x8c, 0x89, 0x18, 0xff, 0x2d, 0xe0, 0x02, 0x1b, 0x50, + 0x52, 0x59, 0x09, 0x3c, 0x76, 0x22, 0x46, 0x62, 0x9d, 0x5c, 0x2f, 0x7a, + 0x76, 0x2d, 0xbb, 0xfd, 0x03, 0x54, 0x6f, 0x65, 0xfb, 0x46, 0xc3, 0x81, + 0x33, 0x83, 0x8d, 0xbc, 0xee, 0x2d, 0xdd, 0x13, 0xe4, 0x0d, 0x54, 0xc8, + 0x38, 0xfc, 0x17, 0xb4, 0x9d, 0xfb, 0x10, 0xc0, 0x19, 0x8d, 0xe7, 0x9b, + 0xc7, 0x85, 0xfd, 0xf4, 0xbf, 0x2a, 0xd4, 0xbb, 0xb8, 0x7e, 0x51, 0xa2, + 0xfb, 0x5d, 0x26, 0xe0, 0x3d, 0xbe, 0x4e, 0x5e, 0x23, 0x62, 0x32, 0x46, + 0x69, 0x92, 0x1c, 0x03, 0xa1, 0x4b, 0xe2, 0x72, 0xac, 0x32, 0xfe, 0x77, + 0x13, 0xe9, 0xf2, 0xb3, 0xe5, 0xeb, 0xa5, 0x3c, 0xbd, 0x0e, 0x9c, 0x95, + 0x7a, 0xff, 0xf2, 0x4d, 0x42, 0x5f, 0x2f, 0x91, 0xf1, 0x23, 0x50, 0x3a, + 0x19, 0xa3, 0x33, 0x47, 0x46, 0x89, 0xb4, 0x5d, 0xfe, 0x69, 0xed, 0xca, + 0xb3, 0xec, 0xbc, 0x95, 0x2a, 0xd6, 0xf4, 0xf8, 0xa6, 0xc0, 0xcf, 0xcf, + 0x85, 0xce, 0x25, 0xdb, 0x9f, 0xd6, 0x97, 0x64, 0xe9, 0x23, 0x19, 0xbd, + 0x55, 0xfb, 0xf7, 0x34, 0xb3, 0xde, 0x1f, 0x25, 0xb7, 0xc5, 0x65, 0x29, + 0xb4, 0x8c, 0xe6, 0x2f, 0xcb, 0xca, 0xbf, 0x75, 0x4c, 0xf9, 0x73, 0xb2, + 0xf4, 0x43, 0x63, 0xf4, 0xd5, 0x59, 0xfa, 0xd8, 0x18, 0xfd, 0xdc, 0x2c, + 0xfd, 0xae, 0x8c, 0x9e, 0x77, 0x27, 0x1e, 0xbf, 0x85, 0x66, 0x7d, 0xcb, + 0x79, 0xe4, 0x6e, 0xcb, 0xb3, 0x78, 0x2c, 0x6a, 0xbe, 0x78, 0x9c, 0x97, + 0x54, 0x2a, 0x1f, 0x57, 0x73, 0xd5, 0x07, 0x2f, 0x29, 0xc8, 0xf4, 0xad, + 0x4d, 0xeb, 0x54, 0xdf, 0x76, 0xa2, 0x6f, 0x05, 0x99, 0x72, 0x3b, 0xcc, + 0xba, 0x96, 0x30, 0xca, 0x1d, 0xcd, 0xd7, 0x9d, 0x95, 0x2f, 0x28, 0xf3, + 0x19, 0xda, 0x6f, 0x7a, 0x2b, 0xb5, 0xdf, 0xb8, 0x67, 0x4a, 0xbf, 0xe1, + 0x5d, 0x98, 0xcb, 0xeb, 0xaf, 0x54, 0xef, 0x03, 0x7b, 0xba, 0xa7, 0x23, + 0xf6, 0xec, 0xc3, 0x7d, 0x28, 0x4f, 0x9e, 0x89, 0xfb, 0x83, 0x16, 0x00, + 0x6b, 0xd6, 0xd8, 0xbc, 0xcd, 0x4e, 0xde, 0x3f, 0x37, 0x20, 0x07, 0xef, + 0x41, 0x58, 0xa9, 0xd6, 0x72, 0xc3, 0xfb, 0xe1, 0xe6, 0x41, 0x27, 0xe2, + 0xa1, 0x5d, 0xee, 0x47, 0x90, 0x59, 0x36, 0x0f, 0x38, 0x60, 0xef, 0xe2, + 0x73, 0x77, 0xf7, 0xe6, 0x20, 0xbf, 0x29, 0xe0, 0xbd, 0x8a, 0xdf, 0x38, + 0xbb, 0xc4, 0x6e, 0xf7, 0xc5, 0xbc, 0x36, 0x50, 0x52, 0x0e, 0x76, 0xbf, + 0x0a, 0xf2, 0x7a, 0xe2, 0x2d, 0xcb, 0x71, 0xf2, 0xec, 0xef, 0x9d, 0x46, + 0x1e, 0xfb, 0xe8, 0x98, 0xee, 0xac, 0x54, 0x67, 0x92, 0xa8, 0x7b, 0x2f, + 0xd2, 0xdc, 0x0e, 0xab, 0x88, 0xfa, 0x70, 0x66, 0x04, 0x3f, 0x13, 0x77, + 0x48, 0x8f, 0x3e, 0x93, 0xb0, 0x6d, 0xbc, 0x92, 0x64, 0x9c, 0xdd, 0xed, + 0x7b, 0xd8, 0x34, 0xf6, 0x36, 0x29, 0x1b, 0xd6, 0xba, 0x78, 0xe0, 0x76, + 0x72, 0xd7, 0x2b, 0x9d, 0x5d, 0xfe, 0x12, 0x5d, 0xa4, 0x75, 0x23, 0xf6, + 0x6b, 0xe4, 0xbe, 0x52, 0xa8, 0xd7, 0x50, 0xfa, 0x47, 0xfa, 0xa6, 0xa7, + 0x50, 0xa4, 0xc7, 0xed, 0x32, 0x3d, 0x6e, 0x1b, 0xdd, 0x3e, 0x69, 0x6b, + 0xe8, 0x75, 0x72, 0x45, 0x25, 0xe7, 0xe6, 0xb6, 0x1e, 0xe0, 0xbe, 0x61, + 0xe7, 0xc2, 0x58, 0xb9, 0x31, 0x32, 0xb0, 0xca, 0x85, 0x15, 0x47, 0x95, + 0x23, 0x95, 0xea, 0xbd, 0x6a, 0xe0, 0xc8, 0x54, 0xd8, 0x55, 0xc8, 0xfa, + 0x1a, 0x70, 0x97, 0xed, 0xf9, 0xe6, 0x74, 0xa4, 0x27, 0x23, 0xe5, 0xb2, + 0x46, 0xdd, 0xd3, 0x99, 0xda, 0xa2, 0xee, 0x19, 0x4c, 0xed, 0x51, 0xf7, + 0x14, 0xd0, 0x5c, 0x87, 0xe3, 0x9a, 0x11, 0xe7, 0xa5, 0x28, 0xd9, 0x3b, + 0xa5, 0xd0, 0xe5, 0x75, 0x15, 0xba, 0x72, 0xd1, 0x0a, 0x6e, 0xff, 0xf5, + 0x95, 0x2a, 0xae, 0xf7, 0xec, 0x9f, 0x9e, 0x1d, 0x5b, 0x73, 0x0a, 0x73, + 0xa2, 0xee, 0x04, 0xea, 0xf5, 0xb6, 0x78, 0x3d, 0xf5, 0x39, 0x33, 0x71, + 0x47, 0x9b, 0x44, 0xf5, 0x39, 0x13, 0x41, 0x27, 0x83, 0x7a, 0xa9, 0xe7, + 0x6b, 0x5c, 0x6b, 0x89, 0xae, 0x65, 0x22, 0x53, 0x87, 0xe3, 0x80, 0xf8, + 0xd6, 0x88, 0xfd, 0x72, 0xb4, 0xb7, 0x50, 0xc4, 0xfc, 0xb3, 0xe9, 0xa8, + 0xcb, 0x25, 0xcb, 0x89, 0xa3, 0x9c, 0x42, 0x91, 0xaf, 0xe3, 0xfa, 0xb1, + 0x4a, 0xf5, 0x6e, 0xb8, 0xe7, 0xc8, 0xf4, 0x53, 0xf6, 0x90, 0x42, 0xa3, + 0xd1, 0xe5, 0x27, 0xb5, 0x8f, 0x4d, 0xa7, 0x05, 0x6e, 0x9e, 0xf3, 0x62, + 0xcc, 0x96, 0x8b, 0xbc, 0xb3, 0xea, 0xfd, 0x38, 0x11, 0x94, 0x6e, 0xcd, + 0xc5, 0x1e, 0x35, 0x95, 0x6b, 0x9e, 0x00, 0x79, 0x5e, 0x6e, 0x43, 0x6e, + 0x49, 0x86, 0x8f, 0xfa, 0x9e, 0xc6, 0x19, 0xdc, 0xe5, 0xe8, 0xb9, 0x8e, + 0xf5, 0x13, 0x39, 0x9f, 0xd3, 0x71, 0xad, 0xb8, 0x9d, 0x5b, 0x64, 0x91, + 0x3d, 0x2f, 0x34, 0x62, 0x2d, 0x67, 0xd0, 0xb1, 0xe7, 0x5d, 0x18, 0x01, + 0x8e, 0xfb, 0x16, 0x39, 0x77, 0x8f, 0x56, 0xaa, 0xcf, 0x14, 0xd8, 0x67, + 0xb3, 0xc6, 0xc0, 0x5e, 0x68, 0xe7, 0x1e, 0xf2, 0xfe, 0x14, 0xdf, 0x74, + 0x05, 0xd9, 0x82, 0xde, 0x89, 0x85, 0x76, 0xb6, 0x55, 0xf3, 0xf1, 0x24, + 0xf2, 0xf1, 0xbd, 0xce, 0xe9, 0xf4, 0x90, 0x93, 0x47, 0x04, 0x63, 0xe8, + 0x75, 0x8d, 0x96, 0x80, 0xfe, 0xb8, 0x52, 0x62, 0x12, 0x76, 0x75, 0x17, + 0xa5, 0xb0, 0x22, 0xbd, 0x94, 0x9b, 0xfb, 0x0b, 0xf1, 0x19, 0x79, 0xa7, + 0x37, 0x88, 0xf7, 0xa9, 0xfe, 0xe5, 0x93, 0xe4, 0xad, 0xad, 0x7f, 0xe3, + 0x1a, 0xf2, 0xd6, 0xd7, 0x97, 0xfe, 0x2b, 0x79, 0x37, 0x14, 0x5b, 0xf8, + 0xf5, 0x5f, 0x7d, 0xe9, 0x2a, 0xf2, 0x6e, 0xab, 0x2f, 0xe5, 0xdc, 0x0f, + 0xfa, 0xdf, 0x40, 0xf1, 0x8d, 0xb8, 0x47, 0xf6, 0x5c, 0x82, 0x3e, 0xf9, + 0xa6, 0xd1, 0x31, 0xac, 0x8d, 0x14, 0xc6, 0x06, 0x65, 0x5a, 0x53, 0xd8, + 0xeb, 0x41, 0x6d, 0x4e, 0x78, 0xb2, 0xf5, 0x07, 0x23, 0x4e, 0xfe, 0x4c, + 0xa5, 0x7c, 0xce, 0xac, 0x37, 0xda, 0x60, 0xf9, 0x55, 0xcc, 0x56, 0xcf, + 0x01, 0x95, 0x27, 0x87, 0xfd, 0xc2, 0x37, 0x93, 0xa9, 0x6d, 0x85, 0x5d, + 0xb8, 0x0e, 0x6c, 0x7f, 0x26, 0x14, 0xf5, 0xf9, 0x38, 0x8d, 0xfb, 0xa0, + 0xc8, 0x3f, 0xe0, 0xb9, 0x1d, 0x5b, 0x99, 0x2c, 0xa5, 0x54, 0xb4, 0x89, + 0x80, 0x08, 0xa5, 0x4b, 0x2b, 0xcc, 0xff, 0xfb, 0x5a, 0x70, 0xd5, 0xff, + 0xd7, 0x16, 0x5c, 0x25, 0x5b, 0xf0, 0x65, 0xea, 0xe5, 0x4f, 0x94, 0x52, + 0x62, 0x2a, 0xcb, 0x0a, 0x17, 0xbd, 0x56, 0x45, 0xb3, 0xde, 0x53, 0x2d, + 0xf8, 0x3d, 0x79, 0x27, 0x2e, 0xf8, 0xeb, 0xac, 0x4c, 0xdb, 0xc3, 0x28, + 0x83, 0xdb, 0x11, 0xe6, 0x7a, 0xad, 0x05, 0xae, 0x03, 0x2b, 0x9e, 0xb1, + 0x72, 0x3b, 0x64, 0xda, 0x56, 0x90, 0x7f, 0x60, 0xe3, 0x33, 0xb2, 0x4c, + 0xc3, 0x6d, 0xcf, 0x94, 0x7b, 0xd2, 0xee, 0x16, 0xe5, 0xbf, 0xf9, 0x72, + 0xed, 0xb8, 0xfa, 0x4b, 0xb7, 0x58, 0xf5, 0x8d, 0xe3, 0x88, 0x8a, 0x16, + 0x1f, 0x54, 0xaa, 0xcf, 0xb8, 0xe2, 0xfe, 0xf3, 0xa9, 0xcd, 0x96, 0x6b, + 0xe5, 0xcf, 0xa9, 0xe6, 0x1a, 0x56, 0xec, 0xf3, 0x4e, 0xac, 0xf9, 0x1a, + 0xc8, 0x37, 0x50, 0x8b, 0x8d, 0xe3, 0x81, 0x67, 0x9c, 0x98, 0x75, 0x7f, + 0x26, 0x66, 0x8d, 0xd5, 0x3d, 0xf0, 0x39, 0xba, 0xe3, 0x9f, 0xa3, 0xfb, + 0x81, 0x69, 0x8f, 0x52, 0x6d, 0xfc, 0x28, 0xad, 0xf3, 0xdf, 0x87, 0xb3, + 0xed, 0xe9, 0xf2, 0x9d, 0xc8, 0xe4, 0x4b, 0x9f, 0x31, 0xf8, 0x87, 0xef, + 0xae, 0x55, 0xf2, 0x34, 0xc7, 0x11, 0xad, 0x98, 0x2e, 0xe1, 0x88, 0x40, + 0x5e, 0x3f, 0xf3, 0xa5, 0x92, 0x2f, 0x46, 0xcf, 0x98, 0x62, 0x75, 0xe1, + 0x0c, 0xec, 0xf5, 0xb1, 0x44, 0xa8, 0x92, 0x84, 0x43, 0x96, 0xc1, 0x9f, + 0xd1, 0xf1, 0xb8, 0xf0, 0x5a, 0xe5, 0xf2, 0x73, 0x49, 0x9d, 0xcd, 0x6c, + 0xe3, 0xb4, 0x31, 0xee, 0xbf, 0x10, 0x6d, 0xcc, 0xcb, 0x9c, 0x69, 0xb2, + 0x75, 0x23, 0x19, 0x9d, 0x55, 0xfe, 0x12, 0xfd, 0x2d, 0xdd, 0xfe, 0x96, + 0x07, 0x11, 0xe3, 0xd3, 0xf9, 0x54, 0xfb, 0xe3, 0x3a, 0x66, 0xf7, 0xf8, + 0xa6, 0xcb, 0xfb, 0xbb, 0xba, 0x33, 0x62, 0xbf, 0xc3, 0x1d, 0x9c, 0x77, + 0xdb, 0xb8, 0x6f, 0x16, 0xce, 0x4f, 0x65, 0x68, 0x4f, 0xdc, 0xcd, 0xf1, + 0xad, 0xbf, 0xa5, 0x14, 0xa7, 0xa5, 0x6a, 0xd4, 0xd3, 0x45, 0xad, 0xd6, + 0xfe, 0xd6, 0x19, 0x48, 0x55, 0x22, 0xd5, 0x2e, 0x53, 0x33, 0xe5, 0x7e, + 0x64, 0xc5, 0xa9, 0x70, 0x8a, 0x71, 0x07, 0xf1, 0x7e, 0x84, 0x1b, 0x88, + 0x98, 0x29, 0x4a, 0xa9, 0xbf, 0x75, 0x2a, 0x4d, 0xc3, 0x19, 0x2d, 0xea, + 0xfb, 0x31, 0xad, 0x97, 0xf7, 0x45, 0x27, 0xcd, 0xb4, 0x71, 0x9a, 0x3f, + 0xb3, 0x2d, 0x77, 0x45, 0xdd, 0x42, 0xde, 0x3f, 0x47, 0x65, 0x7d, 0xab, + 0xe0, 0x5d, 0xb8, 0x0f, 0xde, 0x8b, 0xfa, 0xb7, 0xac, 0xf4, 0xc1, 0xdb, + 0xa3, 0xbe, 0x3b, 0x68, 0x10, 0xda, 0x3b, 0xe5, 0xf3, 0x18, 0xad, 0xa0, + 0x32, 0x47, 0x0e, 0xda, 0x65, 0x41, 0x14, 0x2b, 0x72, 0x16, 0xd3, 0xac, + 0xc3, 0xcb, 0xe9, 0x4c, 0x27, 0x7f, 0x3a, 0x1c, 0xf5, 0x59, 0xe9, 0x10, + 0x95, 0x39, 0x5d, 0x68, 0xbf, 0x8d, 0xf6, 0x22, 0xed, 0xa0, 0xfd, 0xe4, + 0x9d, 0xe3, 0x75, 0x46, 0xdd, 0x3f, 0xe5, 0xf6, 0x61, 0xbf, 0x5c, 0x2c, + 0x66, 0x25, 0x56, 0xd0, 0x36, 0x4b, 0x19, 0xad, 0xb1, 0x18, 0xb6, 0x69, + 0x96, 0x5c, 0xa6, 0xb8, 0xa1, 0xfe, 0x48, 0x8e, 0x5f, 0xb9, 0xe1, 0xd8, + 0xdf, 0x80, 0x99, 0x98, 0xb5, 0xa7, 0x9d, 0xf4, 0x1b, 0x02, 0xb1, 0x46, + 0x38, 0x6c, 0x6b, 0x9c, 0x0e, 0xd8, 0x3c, 0x4f, 0x2d, 0x8e, 0xdd, 0x72, + 0x1c, 0xf9, 0xc6, 0xea, 0x45, 0x6b, 0xe5, 0xe7, 0xbc, 0x16, 0xab, 0xbc, + 0xff, 0x8c, 0xfe, 0xec, 0x5f, 0x46, 0x7f, 0x57, 0xfa, 0xd4, 0x1f, 0xa5, + 0xe7, 0xcf, 0x18, 0xd9, 0x5f, 0xf6, 0x13, 0xef, 0xf9, 0x76, 0x32, 0x8c, + 0xc5, 0x17, 0x35, 0x5c, 0x64, 0x59, 0x78, 0x95, 0x58, 0x70, 0x95, 0x68, + 0xbe, 0x4a, 0x98, 0x7d, 0xc0, 0x2a, 0x7d, 0xf8, 0x51, 0xf4, 0xa1, 0x80, + 0x4e, 0x95, 0xc7, 0xfd, 0x57, 0x4a, 0xb9, 0xd9, 0x2f, 0xa4, 0x7d, 0xcb, + 0x23, 0xf0, 0x8b, 0xb1, 0xf6, 0xbb, 0xfd, 0x0f, 0x49, 0xfb, 0xf4, 0x5d, + 0x60, 0x6e, 0x95, 0x3a, 0x73, 0x64, 0xef, 0x25, 0x16, 0xf4, 0x3d, 0xee, + 0x3f, 0x8c, 0xd3, 0x50, 0x81, 0xc9, 0xaf, 0x16, 0x55, 0x29, 0x9f, 0x63, + 0x9f, 0xee, 0x83, 0x6f, 0xa5, 0x75, 0xf2, 0x7d, 0x46, 0x95, 0x8a, 0x07, + 0x51, 0xf7, 0x45, 0xf2, 0xec, 0xc2, 0xef, 0x22, 0x0a, 0x70, 0xf2, 0x9d, + 0x26, 0x6f, 0x8b, 0x51, 0x77, 0x1b, 0xdf, 0x11, 0x7c, 0xf3, 0xc9, 0x27, + 0xef, 0x88, 0x6a, 0x1f, 0x5b, 0xa1, 0x3f, 0x0f, 0x1f, 0xa7, 0xee, 0x4d, + 0x5f, 0xc7, 0xee, 0xa5, 0x67, 0xc3, 0xce, 0xb3, 0xd1, 0x2b, 0xcf, 0x87, + 0xaa, 0xcd, 0x5d, 0xfa, 0xb3, 0x73, 0xae, 0xcb, 0x92, 0xa9, 0x2b, 0xea, + 0xfe, 0x5a, 0xe6, 0x3d, 0xc0, 0x3c, 0xf4, 0x31, 0xe0, 0x9f, 0x81, 0x59, + 0xe6, 0xbf, 0x0b, 0x28, 0xa0, 0xec, 0x33, 0x4e, 0xfa, 0x5d, 0xce, 0x78, + 0xef, 0x77, 0xec, 0xfa, 0x2c, 0xd9, 0x93, 0x1e, 0x97, 0x16, 0xdd, 0x36, + 0x1b, 0xda, 0x66, 0x53, 0xe3, 0x72, 0x19, 0x59, 0x85, 0xd9, 0xb6, 0xef, + 0x73, 0x6c, 0x0f, 0x69, 0xdb, 0x2f, 0x5b, 0xff, 0x78, 0x32, 0x87, 0xbe, + 0x53, 0x07, 0xab, 0x54, 0x1c, 0x19, 0x3b, 0x5e, 0x81, 0x0d, 0xa5, 0x14, + 0xdf, 0x70, 0x04, 0x63, 0xc6, 0xf6, 0x4e, 0x7d, 0x56, 0x1e, 0x3a, 0xad, + 0xfd, 0xbc, 0x5e, 0x1b, 0xc5, 0x5b, 0x86, 0xc9, 0xb6, 0x5b, 0xf5, 0xc3, + 0x3e, 0xa6, 0x4e, 0xbb, 0x3e, 0x4b, 0xc6, 0x75, 0x19, 0xb1, 0x8d, 0x67, + 0x52, 0x69, 0x5b, 0x8f, 0x17, 0x25, 0x59, 0xf9, 0xaf, 0x3b, 0x0c, 0x6b, + 0x03, 0xf4, 0x71, 0xff, 0x0f, 0xa9, 0xd4, 0xa2, 0xea, 0x34, 0x64, 0x8c, + 0xb9, 0x40, 0x7f, 0xce, 0xcf, 0x6b, 0xd2, 0x2e, 0xd7, 0xe4, 0x52, 0xe1, + 0xf5, 0xce, 0x9a, 0x85, 0x55, 0x69, 0x2d, 0xc3, 0xda, 0x5f, 0x63, 0xb5, + 0xd8, 0xe4, 0x7a, 0xb4, 0xa4, 0xe7, 0x6d, 0x56, 0xa9, 0x5a, 0x8d, 0x0e, + 0xdc, 0xa6, 0xd7, 0x38, 0x84, 0x8d, 0x57, 0xe2, 0x56, 0x91, 0xfe, 0x1b, + 0x0b, 0x2f, 0x5a, 0xc4, 0x73, 0x9d, 0xab, 0xd6, 0x88, 0xaf, 0xc1, 0x67, + 0x59, 0xe8, 0x5b, 0xe0, 0x6b, 0xf6, 0x7d, 0xce, 0xf8, 0xb1, 0xf4, 0xb2, + 0x2a, 0x15, 0x6b, 0xf9, 0x1d, 0x96, 0x57, 0x60, 0x1f, 0x6a, 0x8d, 0xfa, + 0xee, 0xd6, 0xef, 0x73, 0xd2, 0xef, 0x3e, 0xae, 0xd4, 0xfe, 0xc7, 0x7e, + 0x44, 0xf2, 0xd6, 0x2b, 0xfd, 0x08, 0x5e, 0x2a, 0xe4, 0xbb, 0x96, 0x05, + 0x24, 0x8c, 0x80, 0x60, 0x2f, 0x5a, 0x23, 0xdf, 0x13, 0xed, 0xb7, 0xe1, + 0xb9, 0xfa, 0x86, 0xae, 0x3e, 0xba, 0xd9, 0xca, 0xf9, 0x0b, 0x9a, 0x6b, + 0x6a, 0x6a, 0xe9, 0x49, 0x2b, 0x8f, 0x35, 0xd4, 0xff, 0x98, 0x66, 0x1e, + 0xb2, 0xea, 0xf1, 0x2c, 0xa0, 0xfb, 0xd2, 0xb2, 0x67, 0x35, 0x73, 0xc7, + 0x9d, 0x62, 0xa2, 0xe7, 0xeb, 0x27, 0x3a, 0x96, 0x88, 0xa2, 0xe2, 0xdb, + 0x0f, 0xd1, 0xdb, 0x56, 0x34, 0x16, 0x65, 0xf6, 0xaf, 0x3e, 0x8b, 0xae, + 0xb6, 0x31, 0x4f, 0xd7, 0x49, 0xd2, 0x4c, 0x7f, 0xd6, 0xaa, 0xbe, 0xd5, + 0x1d, 0x74, 0x97, 0x8d, 0x0a, 0xb6, 0xac, 0xde, 0xb7, 0x7a, 0xef, 0x05, + 0x27, 0x4e, 0xd0, 0x2d, 0x36, 0x5d, 0x39, 0x3d, 0x0d, 0xf1, 0xa1, 0x2e, + 0xb4, 0x61, 0xbf, 0x03, 0x2d, 0x7b, 0xfb, 0xbc, 0xcb, 0x77, 0x3e, 0xb5, + 0x9a, 0x6e, 0x61, 0x5e, 0x78, 0x3c, 0x27, 0x9e, 0xa6, 0xfb, 0x1c, 0xd2, + 0xf2, 0x4d, 0xba, 0xc9, 0x21, 0x8b, 0xfe, 0xc4, 0xce, 0xa4, 0x8f, 0x3e, + 0xb0, 0xc0, 0x24, 0x4c, 0x1f, 0xa1, 0xbb, 0xfd, 0xc7, 0xf6, 0xfe, 0xa2, + 0xf9, 0xad, 0xfe, 0x1a, 0x64, 0xd8, 0x4b, 0xaf, 0xb2, 0x9c, 0x5e, 0xb3, + 0xb0, 0x95, 0xb1, 0x68, 0xb3, 0xd1, 0xb9, 0x87, 0xde, 0xe6, 0x21, 0xf9, + 0x03, 0x3f, 0x8e, 0xf2, 0xeb, 0x9d, 0xef, 0xf1, 0xe3, 0x66, 0x83, 0xcd, + 0xbe, 0xc3, 0xec, 0x0d, 0xfc, 0xf8, 0x3e, 0x3f, 0xfe, 0x81, 0x1f, 0x37, + 0x19, 0xb2, 0x9e, 0x6f, 0x4b, 0x83, 0xef, 0xca, 0xe7, 0x8d, 0x4a, 0x74, + 0x8b, 0x4c, 0x3c, 0xe1, 0xc0, 0xe3, 0x97, 0x3c, 0x8c, 0x87, 0x6b, 0x9a, + 0xfb, 0x6e, 0x0b, 0xaf, 0x5e, 0x73, 0xa8, 0x96, 0x7e, 0xc7, 0x39, 0xdb, + 0x58, 0xdd, 0xa6, 0x07, 0xab, 0xcd, 0xa6, 0x87, 0xef, 0x18, 0x4b, 0xef, + 0xb5, 0xe3, 0x71, 0x39, 0xe7, 0x3f, 0x4c, 0x37, 0xca, 0xb6, 0xdd, 0x65, + 0x78, 0xde, 0xaf, 0x5d, 0x1d, 0x32, 0x86, 0x3b, 0xb7, 0xd0, 0xcf, 0x2c, + 0xb2, 0x8f, 0x4f, 0xbf, 0x79, 0xfb, 0xe1, 0xba, 0x90, 0x71, 0xfe, 0x10, + 0x3d, 0x2e, 0x4d, 0xee, 0xa0, 0x47, 0x84, 0xa0, 0xce, 0x3b, 0x56, 0x1b, + 0x67, 0x08, 0x5f, 0x81, 0x28, 0x29, 0x5a, 0x62, 0xe4, 0x8a, 0x39, 0x8a, + 0x59, 0x2f, 0xca, 0x0a, 0x44, 0xb1, 0xfb, 0x8a, 0x9d, 0xc6, 0x6e, 0x70, + 0xc6, 0x05, 0x62, 0x42, 0x01, 0x3d, 0xcc, 0xe5, 0xdf, 0x46, 0x6d, 0xb2, + 0xb1, 0x6d, 0xb2, 0x48, 0x3a, 0x4b, 0x12, 0xe3, 0xb7, 0xd4, 0x64, 0xfc, + 0xd1, 0xd8, 0x63, 0x7c, 0xdf, 0xb2, 0x67, 0xaf, 0x71, 0xf5, 0xbe, 0xd7, + 0x0f, 0x47, 0x8e, 0x36, 0x37, 0x2f, 0x69, 0x6e, 0x5e, 0x7a, 0x7d, 0x4b, + 0xf3, 0x5d, 0x46, 0x81, 0x98, 0x52, 0x60, 0xe4, 0x3f, 0x40, 0xdf, 0xc4, + 0x18, 0x1d, 0xa5, 0xcb, 0x05, 0x55, 0xd3, 0xbb, 0xe8, 0xd0, 0x85, 0xab, + 0x97, 0xd0, 0xf7, 0xd0, 0x82, 0x82, 0xa3, 0x4b, 0xe8, 0x10, 0x54, 0x17, + 0x1e, 0xa2, 0x27, 0xed, 0x9c, 0xa4, 0x77, 0x98, 0x7c, 0x87, 0xae, 0x95, + 0x4a, 0xfa, 0x4c, 0xce, 0xf6, 0x43, 0xf4, 0xbe, 0x4d, 0xf5, 0x7d, 0xc9, + 0x21, 0xba, 0x86, 0x0d, 0x50, 0x6e, 0x49, 0x01, 0x3d, 0x00, 0x76, 0x33, + 0x7d, 0x62, 0xc8, 0x86, 0x5c, 0xbc, 0xba, 0x59, 0xdd, 0xcf, 0x8a, 0x10, + 0x81, 0xd9, 0xdf, 0x67, 0x92, 0xda, 0xe7, 0xa7, 0xc1, 0x9f, 0x27, 0xe9, + 0x35, 0x20, 0x48, 0xd9, 0xa4, 0xdf, 0x67, 0x18, 0x19, 0xe4, 0xc9, 0x74, + 0x9e, 0xb6, 0x49, 0xff, 0x1d, 0xd2, 0x3c, 0x4d, 0x6b, 0x35, 0x75, 0x6a, + 0xfb, 0xe9, 0x3a, 0xff, 0x19, 0x5a, 0x5e, 0xad, 0xe5, 0xb5, 0x7a, 0x7d, + 0x35, 0x62, 0x7f, 0x64, 0x79, 0x93, 0x6e, 0x83, 0x61, 0xaa, 0xaf, 0x09, + 0xbb, 0x38, 0xf3, 0x9e, 0x4c, 0x5a, 0xc5, 0xed, 0x74, 0x9b, 0xac, 0x19, + 0x5e, 0xbd, 0x0b, 0x4d, 0xdf, 0x35, 0x0d, 0xad, 0x33, 0xb4, 0xce, 0xd0, + 0xeb, 0x59, 0x95, 0xef, 0x90, 0xe7, 0x27, 0x25, 0x6b, 0xd2, 0x74, 0x99, + 0xa6, 0xad, 0xb2, 0x04, 0x8b, 0xd6, 0xe3, 0x26, 0x62, 0xaa, 0x47, 0xbd, + 0x13, 0xb0, 0x48, 0xda, 0xaa, 0xc7, 0x46, 0xbd, 0x9b, 0x60, 0x9a, 0xa3, + 0x69, 0xbe, 0xce, 0xeb, 0xc1, 0xd9, 0x55, 0x7e, 0x26, 0x61, 0x6a, 0x6b, + 0x31, 0x7a, 0xcb, 0x29, 0xbb, 0x89, 0x4f, 0xf7, 0x25, 0x3d, 0xee, 0xd3, + 0x34, 0x9d, 0x9e, 0x19, 0xbf, 0x56, 0x59, 0x4e, 0xad, 0x2c, 0x31, 0x3d, + 0x76, 0xb5, 0x5a, 0xd6, 0x2a, 0x65, 0x56, 0x39, 0xfe, 0xa3, 0x65, 0x35, + 0x6a, 0x59, 0xa3, 0xa9, 0xff, 0x8d, 0x32, 0xa5, 0xee, 0x9f, 0x4c, 0x5b, + 0x49, 0xed, 0xc1, 0xad, 0xa6, 0x7c, 0x8c, 0xe5, 0x9a, 0xb6, 0xe9, 0xbe, + 0xb2, 0xa6, 0xd0, 0xc4, 0x4f, 0xc9, 0xf8, 0xc5, 0x14, 0xd3, 0x18, 0x17, + 0x66, 0xe6, 0xae, 0x4c, 0xeb, 0xdd, 0xba, 0xcc, 0xa9, 0xba, 0x9e, 0xda, + 0x8c, 0xa5, 0x6a, 0x5b, 0x6d, 0xc6, 0x5a, 0xe4, 0x90, 0x70, 0x11, 0x2e, + 0xc9, 0xa2, 0x9c, 0x8c, 0xf2, 0x4e, 0x12, 0x15, 0x64, 0x6f, 0x0e, 0x47, + 0xc3, 0xa9, 0xa5, 0x64, 0x2c, 0x6d, 0x22, 0xeb, 0xd2, 0x26, 0x3c, 0xed, + 0xfc, 0xac, 0xe8, 0xa5, 0xfc, 0xb6, 0xa1, 0x60, 0x74, 0x47, 0x68, 0x53, + 0x30, 0x35, 0x30, 0x14, 0x4a, 0xd0, 0xc4, 0xb6, 0xd8, 0xae, 0x78, 0x2c, + 0x1a, 0x8a, 0xa6, 0xba, 0x43, 0xa1, 0x44, 0x6f, 0x38, 0xb4, 0xa7, 0xf6, + 0xbc, 0xe0, 0x48, 0x90, 0x5c, 0x6d, 0xb1, 0x68, 0x34, 0x34, 0x90, 0x0a, + 0xc7, 0xa2, 0x24, 0x56, 0x92, 0xb1, 0xb2, 0x83, 0x44, 0x07, 0x19, 0x1d, + 0x15, 0x40, 0x07, 0x59, 0x3a, 0x3a, 0x38, 0xd1, 0x09, 0xa6, 0xb3, 0x0b, + 0x4c, 0x17, 0x89, 0x4e, 0x32, 0x3a, 0x19, 0x5d, 0x34, 0xbd, 0x73, 0x78, + 0x20, 0xd4, 0x3a, 0x30, 0x10, 0x4a, 0x26, 0xc3, 0xdb, 0xc2, 0x91, 0x70, + 0x6a, 0xdf, 0xda, 0xd8, 0x60, 0xa8, 0x3b, 0x11, 0x1b, 0x09, 0x0f, 0xa2, + 0xc6, 0x92, 0xd5, 0xa1, 0x7d, 0xdb, 0x62, 0xc1, 0xc4, 0xe0, 0x8a, 0x70, + 0x72, 0x57, 0x38, 0x99, 0xec, 0x0a, 0x27, 0x53, 0xa1, 0x28, 0x14, 0x02, + 0x25, 0x75, 0xa1, 0xec, 0x2e, 0x2e, 0xbb, 0xab, 0x93, 0xac, 0x5d, 0x9d, + 0x92, 0xeb, 0x82, 0x48, 0xca, 0x21, 0xc3, 0xa3, 0x8b, 0x26, 0x76, 0x05, + 0xa3, 0x83, 0x89, 0x58, 0x78, 0xb0, 0x2e, 0x18, 0x8f, 0xd7, 0xb5, 0xa2, + 0x91, 0x23, 0xa8, 0xa4, 0x89, 0xe6, 0x67, 0xcb, 0xe3, 0xf1, 0x48, 0x78, + 0x20, 0xc8, 0x3d, 0x98, 0x9d, 0xb6, 0xe9, 0x0a, 0x6f, 0x0f, 0x0d, 0xec, + 0x1b, 0x88, 0x84, 0xda, 0x82, 0x91, 0xc8, 0xb6, 0xe0, 0xc0, 0xce, 0x64, + 0x13, 0x4d, 0x3e, 0x5d, 0x2e, 0xb3, 0x6a, 0x20, 0x16, 0x45, 0x23, 0x53, + 0x75, 0x6d, 0x4c, 0xf7, 0xa6, 0xcc, 0xaa, 0x1d, 0x89, 0x60, 0x7c, 0x28, + 0x3c, 0x90, 0xac, 0x6b, 0x0b, 0x46, 0x47, 0x82, 0x28, 0x70, 0xc6, 0x38, + 0xaa, 0x58, 0x24, 0x96, 0x58, 0x19, 0x8e, 0xa4, 0x42, 0x89, 0xd3, 0xeb, + 0xd7, 0x04, 0x53, 0x89, 0xf0, 0xde, 0x26, 0xaa, 0xf8, 0x5c, 0x7d, 0x56, + 0x51, 0x93, 0xc6, 0x9a, 0x76, 0x07, 0xc3, 0xd1, 0xd4, 0xf8, 0x9a, 0x98, + 0xd4, 0x94, 0x8c, 0xd5, 0x6c, 0xc0, 0x44, 0x37, 0xd1, 0x94, 0x8c, 0x22, + 0x96, 0xac, 0x5b, 0x3e, 0x1c, 0x8e, 0x0c, 0xce, 0xee, 0x6d, 0xdf, 0xd0, + 0xd3, 0xb1, 0x6e, 0x6d, 0x13, 0x15, 0x65, 0xeb, 0xa2, 0x83, 0x91, 0x50, + 0x13, 0x15, 0x9b, 0x85, 0x1d, 0xcb, 0xc3, 0xd1, 0x41, 0x6e, 0xd3, 0x68, + 0xf9, 0x3c, 0x52, 0x75, 0xed, 0x83, 0xe1, 0x54, 0x70, 0x1b, 0x9b, 0x4f, + 0xca, 0x56, 0xf4, 0x84, 0x22, 0xca, 0xbf, 0xcc, 0x35, 0x2b, 0x4d, 0x3c, + 0x18, 0xd5, 0xfe, 0x39, 0x36, 0x17, 0x74, 0x51, 0x55, 0xde, 0x19, 0xa7, + 0xd1, 0xf4, 0x60, 0x98, 0xa2, 0x3b, 0x64, 0x07, 0xb8, 0x80, 0x53, 0x0a, + 0x0f, 0xe0, 0x91, 0x29, 0x7c, 0xb4, 0x5b, 0xc3, 0xa9, 0x70, 0x84, 0xc7, + 0x6e, 0x7c, 0x61, 0x33, 0x55, 0x66, 0x84, 0x23, 0x58, 0x23, 0x75, 0x6d, + 0x43, 0xb1, 0x44, 0x28, 0x26, 0x07, 0x30, 0x94, 0x98, 0xbd, 0x32, 0x11, + 0xdc, 0x95, 0x71, 0xa9, 0x26, 0x9a, 0xf6, 0x39, 0xb6, 0xe6, 0xf1, 0x91, + 0x5a, 0xac, 0x86, 0xf6, 0x91, 0x50, 0x34, 0x6b, 0xfc, 0xa5, 0x62, 0x4d, + 0x8c, 0x07, 0x47, 0xeb, 0x2a, 0xb2, 0x75, 0xbc, 0x4e, 0x67, 0xaf, 0x8b, + 0xae, 0x8c, 0x0d, 0x0c, 0x27, 0xd5, 0x7a, 0x4e, 0xaf, 0x22, 0x73, 0xf3, + 0x33, 0xa6, 0xe6, 0x51, 0xcc, 0x08, 0x57, 0x25, 0x62, 0xc3, 0xf1, 0x26, + 0x5a, 0x38, 0x56, 0x13, 0x48, 0x84, 0x42, 0xeb, 0xb6, 0x25, 0x43, 0x89, + 0x11, 0xf4, 0x6d, 0x5d, 0x74, 0x55, 0x24, 0xb6, 0x2d, 0x18, 0xe9, 0x0a, + 0xee, 0x8b, 0x0d, 0xa7, 0x46, 0xab, 0x99, 0xf9, 0xf9, 0xf9, 0x9a, 0x68, + 0x6e, 0xb6, 0x41, 0xd0, 0x1c, 0x10, 0xea, 0xb2, 0xc2, 0xc3, 0x9a, 0x60, + 0x34, 0xb8, 0x83, 0xb3, 0xd4, 0x7f, 0xe9, 0x2c, 0x1c, 0x51, 0x3a, 0xa2, + 0xdb, 0x63, 0x63, 0xda, 0xff, 0x05, 0x79, 0xd2, 0x51, 0xa8, 0x89, 0x6a, + 0xb3, 0xf3, 0x85, 0xa3, 0xf1, 0xe1, 0xd4, 0xae, 0x50, 0x6a, 0x28, 0x36, + 0x58, 0xb7, 0x3c, 0x98, 0x44, 0xe1, 0x48, 0x8f, 0xc6, 0x40, 0xb3, 0xb7, + 0x8d, 0xb1, 0x67, 0x17, 0x8f, 0x25, 0x54, 0x73, 0x2a, 0x4f, 0x6f, 0x36, + 0xa6, 0xc8, 0x9a, 0x2f, 0xb0, 0x5d, 0x23, 0xf9, 0xcc, 0xe8, 0xd4, 0x75, + 0x0d, 0xc4, 0x76, 0xd5, 0x25, 0x76, 0x25, 0x23, 0x75, 0xe7, 0x21, 0xc2, + 0xd6, 0x8d, 0x89, 0xdc, 0xb3, 0xb3, 0x42, 0x7b, 0x13, 0x55, 0x7f, 0x71, + 0x06, 0x53, 0x6b, 0x96, 0x7d, 0xa1, 0xf5, 0xe7, 0xc6, 0xf5, 0x26, 0x5a, + 0xf9, 0x85, 0x05, 0x9c, 0x26, 0xf2, 0xcf, 0xce, 0x76, 0x9c, 0xc6, 0xff, + 0xd7, 0x72, 0xd8, 0xe7, 0xbe, 0x28, 0x2b, 0x2f, 0x7f, 0x39, 0xb8, 0x81, + 0x60, 0x62, 0x47, 0x08, 0x2b, 0xab, 0xf4, 0x8b, 0xb2, 0x34, 0x51, 0x59, + 0xd7, 0x60, 0x30, 0x32, 0x12, 0xde, 0x59, 0x87, 0x00, 0x13, 0x4b, 0xc9, + 0xbd, 0xa1, 0xae, 0x3d, 0x3a, 0x10, 0x89, 0x25, 0x11, 0x67, 0xda, 0x22, + 0xc1, 0xa4, 0x0c, 0xfa, 0x63, 0x6d, 0x3a, 0x30, 0xb8, 0x09, 0xad, 0x2f, + 0x1d, 0x47, 0xbf, 0x26, 0xb4, 0x6b, 0x9b, 0x36, 0x08, 0xc1, 0x64, 0xfa, + 0x38, 0x26, 0x3d, 0xe1, 0x1d, 0xd1, 0x60, 0x6a, 0x38, 0x21, 0xc3, 0x27, + 0x6f, 0xcc, 0x75, 0x11, 0x4c, 0x31, 0x42, 0x4a, 0x30, 0xd1, 0x13, 0xda, + 0x3d, 0x1c, 0x8a, 0x0e, 0x40, 0xe3, 0x31, 0x6b, 0x54, 0x75, 0x65, 0x26, + 0x51, 0x47, 0x24, 0x12, 0xda, 0x11, 0x8c, 0xa8, 0x99, 0x6b, 0xdf, 0x3b, + 0x10, 0x8a, 0xab, 0x09, 0x9f, 0x3d, 0x8e, 0x4d, 0x62, 0xc7, 0xf0, 0x2e, + 0xf4, 0xdd, 0x64, 0x55, 0x64, 0xb6, 0xc2, 0xe6, 0x27, 0x5d, 0xb1, 0xd4, + 0x24, 0x5c, 0x1b, 0xeb, 0x19, 0x1e, 0x18, 0x52, 0xbe, 0x6a, 0xca, 0xe7, + 0x35, 0x99, 0xac, 0xdb, 0x76, 0x9e, 0xdc, 0x61, 0xa6, 0x9b, 0x64, 0x3d, + 0xa1, 0x81, 0xe1, 0x04, 0x7c, 0xe8, 0x34, 0x59, 0x54, 0x10, 0xe7, 0x35, + 0x32, 0x2a, 0x4b, 0x84, 0xb6, 0xf3, 0x96, 0x81, 0x66, 0x8c, 0xc4, 0xd4, + 0x16, 0xad, 0x26, 0xd1, 0x54, 0xc4, 0x94, 0x71, 0xcc, 0x55, 0xd3, 0x9a, + 0x68, 0x82, 0xd2, 0xc9, 0xa0, 0xde, 0x9a, 0x48, 0x04, 0xf7, 0xb1, 0xdf, + 0x34, 0x91, 0xdb, 0x24, 0x1e, 0x5f, 0xd2, 0x4c, 0x8e, 0x9e, 0x15, 0xab, + 0xcf, 0xed, 0x58, 0x1b, 0x20, 0x6b, 0x60, 0x73, 0x77, 0x3b, 0x15, 0x9e, + 0xe2, 0x45, 0x94, 0x67, 0xf6, 0x60, 0x12, 0xbd, 0x64, 0xf4, 0xe2, 0xc0, + 0xd2, 0x8b, 0xe3, 0x8b, 0xb5, 0x97, 0x8f, 0x4a, 0x36, 0x7e, 0xe2, 0x2c, + 0xd3, 0xdb, 0x49, 0xf6, 0xde, 0xce, 0x8e, 0x95, 0x2b, 0x71, 0xba, 0xe9, + 0xed, 0x94, 0x8a, 0x4e, 0x56, 0x58, 0x7a, 0x71, 0x76, 0xc2, 0xa3, 0x8b, + 0xc5, 0x7c, 0xe0, 0xe9, 0xed, 0xec, 0x83, 0x35, 0x33, 0x5d, 0x5c, 0x46, + 0x97, 0x34, 0xed, 0x52, 0xa6, 0x7c, 0x0c, 0xea, 0x85, 0x11, 0x04, 0x2c, + 0x77, 0x48, 0x22, 0xab, 0xea, 0x92, 0x59, 0x71, 0x2b, 0x06, 0xdb, 0xd7, + 0x29, 0x9f, 0x38, 0x53, 0xf5, 0xf6, 0xa1, 0xd2, 0x3e, 0x69, 0x22, 0xfa, + 0xc8, 0xd2, 0xc7, 0xa6, 0x78, 0x74, 0x31, 0x0b, 0x35, 0x0c, 0x6d, 0x7d, + 0x9d, 0x9c, 0xb6, 0x82, 0xb0, 0x80, 0x35, 0xa8, 0xd6, 0xde, 0xd7, 0x25, + 0xc5, 0x36, 0xa6, 0x90, 0xf7, 0xe3, 0x18, 0xd8, 0xdf, 0x41, 0xde, 0xfe, + 0xb1, 0xee, 0x56, 0xd4, 0x3f, 0xce, 0x6c, 0xbb, 0x54, 0x2c, 0x9e, 0xed, + 0xf7, 0xfb, 0x33, 0xfc, 0x5c, 0xf0, 0xb9, 0xa3, 0xbc, 0x29, 0x91, 0xa5, + 0xa9, 0x37, 0x27, 0xe6, 0x99, 0x13, 0xf3, 0xcd, 0x89, 0x05, 0xe6, 0xc4, + 0x42, 0x73, 0x62, 0x91, 0x39, 0xd1, 0x60, 0x4e, 0x34, 0x9a, 0x5a, 0x53, + 0x6f, 0xe2, 0xe7, 0x99, 0xf8, 0xf9, 0x26, 0x7e, 0x81, 0x89, 0x5f, 0x68, + 0xe2, 0x17, 0x99, 0xf8, 0x06, 0x13, 0xdf, 0x38, 0x5a, 0xd9, 0xca, 0x48, + 0x70, 0x47, 0x92, 0xf2, 0xb3, 0xb6, 0x24, 0x2a, 0x0e, 0x8e, 0xb3, 0xf5, + 0x71, 0x0e, 0x76, 0xe0, 0xae, 0xe0, 0xb6, 0x50, 0x84, 0x2c, 0xc1, 0xc1, + 0x41, 0x9a, 0x8c, 0xc7, 0xf8, 0x7b, 0x2f, 0xb9, 0x83, 0xdb, 0x71, 0xfa, + 0x63, 0x1f, 0x54, 0x01, 0x7f, 0x90, 0x3c, 0x7c, 0xf0, 0x58, 0x3e, 0x9c, + 0x4a, 0xc5, 0xa2, 0xdd, 0x09, 0x94, 0x2e, 0x45, 0xa1, 0xed, 0x38, 0x77, + 0x98, 0xad, 0xec, 0xdb, 0x62, 0xb0, 0xd8, 0x45, 0xf6, 0x81, 0x20, 0x36, + 0x88, 0x41, 0x72, 0x2b, 0x6a, 0x3a, 0xe9, 0xe7, 0x0f, 0x64, 0x5d, 0x0e, + 0x6c, 0x38, 0x29, 0x07, 0x13, 0x54, 0xc8, 0xa1, 0x2e, 0x64, 0x32, 0x2b, + 0x91, 0x02, 0xd3, 0x1e, 0xa5, 0x8f, 0xc5, 0x94, 0x3b, 0xc0, 0x3b, 0x02, + 0x9f, 0x33, 0x5b, 0x53, 0x54, 0x90, 0x49, 0xb4, 0xc5, 0x86, 0xa3, 0x29, + 0x14, 0x0e, 0x2b, 0x9c, 0x4e, 0x93, 0x52, 0x46, 0xc5, 0xfa, 0x4c, 0x9d, + 0x5c, 0x2e, 0x1b, 0xaa, 0x1a, 0x49, 0x53, 0x07, 0x12, 0xa1, 0x60, 0x6a, + 0xec, 0x36, 0xc3, 0xbb, 0x2b, 0x39, 0x06, 0x63, 0xf2, 0xa8, 0x45, 0xce, + 0x90, 0x3e, 0x55, 0x82, 0x8b, 0x0e, 0x26, 0x37, 0x85, 0x53, 0x43, 0xe4, + 0xdb, 0x8e, 0x03, 0xe8, 0xb8, 0xf9, 0x92, 0xcb, 0xf7, 0xf1, 0x30, 0x50, + 0x0e, 0x5b, 0xc8, 0x33, 0x13, 0xe5, 0x6d, 0x1f, 0x3d, 0x3a, 0x0d, 0xd2, + 0x54, 0xac, 0xe1, 0xac, 0x9c, 0xd2, 0x88, 0x83, 0x7f, 0xc7, 0x20, 0x4d, + 0x3b, 0x55, 0x99, 0x75, 0x9b, 0xc9, 0x91, 0x5a, 0x39, 0x2a, 0x85, 0x19, + 0x76, 0x4d, 0x30, 0xb9, 0x13, 0xc5, 0x4e, 0x60, 0xc1, 0xe8, 0x7d, 0x22, + 0x3d, 0x48, 0x6e, 0x88, 0xdb, 0x82, 0x89, 0x50, 0xaa, 0x1b, 0x1b, 0x88, + 0xcc, 0x59, 0xcc, 0x12, 0x84, 0xf4, 0x0e, 0x9c, 0xa0, 0xf7, 0xae, 0x8c, + 0x25, 0xd4, 0x00, 0xe5, 0x6b, 0x29, 0x5c, 0x23, 0x94, 0x48, 0x92, 0x93, + 0x93, 0xbc, 0xdc, 0xa8, 0x88, 0x39, 0xde, 0xa6, 0x78, 0xff, 0xe1, 0x63, + 0x6f, 0x7b, 0x54, 0x55, 0x96, 0x25, 0xec, 0x49, 0x05, 0x13, 0x29, 0x72, + 0x49, 0xb1, 0x9e, 0x1d, 0x8e, 0x95, 0xe9, 0x81, 0xcb, 0xe3, 0x04, 0x1f, + 0x2e, 0x03, 0x61, 0x0c, 0xe8, 0x64, 0xa4, 0x64, 0xa7, 0x43, 0x83, 0xa7, + 0xc6, 0x36, 0xdf, 0x69, 0x55, 0xb2, 0x99, 0x7a, 0x0c, 0xce, 0x0a, 0x85, + 0x77, 0x0c, 0xa5, 0x64, 0x39, 0x67, 0x81, 0x8b, 0x70, 0x2a, 0x34, 0xb8, + 0x21, 0xb4, 0x03, 0xfd, 0x5b, 0x8e, 0x27, 0x9c, 0x66, 0x3c, 0x15, 0xb7, + 0x9c, 0xbb, 0x23, 0x4b, 0x35, 0x8f, 0xfa, 0x84, 0xb4, 0x30, 0xeb, 0x10, + 0x44, 0x67, 0xa6, 0xc5, 0x81, 0x7d, 0xf1, 0x10, 0x46, 0x8a, 0x8f, 0x24, + 0xbd, 0xe1, 0x44, 0x6a, 0x38, 0x18, 0x49, 0x1f, 0x0a, 0x58, 0x23, 0xbb, + 0xda, 0x11, 0x4d, 0xa6, 0x82, 0xd8, 0x20, 0xe5, 0xc4, 0x64, 0x69, 0xb9, + 0xc6, 0x2e, 0xbd, 0x85, 0xac, 0x8b, 0xf6, 0xc0, 0xe5, 0x42, 0x51, 0x39, + 0x20, 0xa8, 0x2c, 0x88, 0x71, 0x4b, 0x85, 0x64, 0x9f, 0x54, 0xd5, 0x32, + 0xbb, 0xee, 0xaa, 0x72, 0xe4, 0xbc, 0x51, 0x01, 0x5a, 0xea, 0x40, 0x6a, + 0x43, 0x70, 0xcf, 0xd9, 0x69, 0x66, 0xb3, 0xac, 0x7c, 0x43, 0x2c, 0x96, + 0xe2, 0xae, 0xc8, 0xdc, 0x99, 0xab, 0x0e, 0x77, 0xd7, 0x63, 0x16, 0xa8, + 0x49, 0x62, 0x8f, 0xe8, 0xd9, 0x87, 0xd5, 0xbd, 0xab, 0x07, 0x3b, 0x48, + 0x18, 0x4d, 0x2e, 0x80, 0x44, 0x8d, 0xf6, 0x06, 0xb9, 0x2c, 0xd8, 0x22, + 0x80, 0x43, 0x41, 0x64, 0xed, 0xf0, 0x2e, 0xf6, 0x09, 0xe5, 0x04, 0x1b, + 0xf9, 0xc6, 0x15, 0x09, 0x47, 0x31, 0x9a, 0x6c, 0x95, 0x94, 0xd9, 0x36, + 0x46, 0xc3, 0xbc, 0xf0, 0xd8, 0x4a, 0x1a, 0x9d, 0x7a, 0x32, 0x97, 0x7e, + 0xd5, 0x1b, 0xce, 0x04, 0x24, 0xce, 0xb3, 0x09, 0x0b, 0x23, 0xb6, 0x27, + 0x10, 0xdb, 0x89, 0x71, 0x98, 0x96, 0x49, 0x4b, 0xa3, 0x48, 0x08, 0xa7, + 0xac, 0x78, 0x24, 0xb8, 0x4f, 0xad, 0x3c, 0x2b, 0xb4, 0x67, 0xcb, 0xe7, + 0x66, 0x9a, 0x84, 0xe5, 0x83, 0x8b, 0x60, 0xd6, 0xe2, 0x38, 0x2b, 0xc6, + 0x55, 0x14, 0x6a, 0x4d, 0x3c, 0xde, 0x1d, 0x64, 0xc7, 0x21, 0x77, 0x46, + 0xb0, 0x21, 0x94, 0xc4, 0x11, 0x23, 0x23, 0x59, 0x9e, 0x09, 0x5c, 0x94, + 0xaf, 0x24, 0x2b, 0xf4, 0x1a, 0xd7, 0x49, 0x4c, 0xdc, 0x8a, 0xd8, 0x9e, + 0x28, 0xe5, 0x66, 0x92, 0x1b, 0xe3, 0x54, 0x9c, 0x49, 0xc8, 0x49, 0x3d, + 0x2b, 0x3c, 0x38, 0x88, 0x96, 0xeb, 0x5a, 0xd7, 0xc4, 0x50, 0xa5, 0xcc, + 0x93, 0x25, 0x48, 0x04, 0x77, 0xa4, 0xcb, 0x94, 0x02, 0x14, 0xa3, 0xcb, + 0x94, 0x57, 0x66, 0x2a, 0xd2, 0x89, 0x50, 0x02, 0xe1, 0x68, 0x97, 0x5e, + 0xd3, 0x79, 0x43, 0x58, 0xe5, 0xe9, 0x6a, 0xa8, 0x84, 0x53, 0x3d, 0xb1, + 0xed, 0xda, 0x5d, 0x13, 0xb1, 0x5d, 0x6a, 0xa0, 0xc8, 0x39, 0x84, 0x12, + 0x64, 0x8c, 0xb1, 0x0e, 0xc5, 0x92, 0x58, 0x75, 0x58, 0x53, 0xeb, 0xe4, + 0x91, 0x24, 0x49, 0x85, 0xfc, 0x26, 0x26, 0x1c, 0x8c, 0xb4, 0x05, 0xe3, + 0xc9, 0x35, 0x98, 0x18, 0xca, 0xd7, 0x02, 0x38, 0x01, 0xfb, 0x43, 0xe1, + 0x68, 0x52, 0x79, 0x43, 0x4e, 0x38, 0xed, 0xe0, 0x94, 0x27, 0xd9, 0x73, + 0xd5, 0xa5, 0x80, 0x3c, 0x88, 0x9d, 0xa1, 0x84, 0xac, 0xa7, 0x55, 0x45, + 0x10, 0x72, 0xa2, 0xde, 0xde, 0x60, 0x64, 0x38, 0x44, 0xf6, 0x30, 0x4e, + 0x45, 0x3b, 0x43, 0xa8, 0x3a, 0x99, 0x71, 0x7c, 0x67, 0x38, 0xb9, 0x2e, + 0x1e, 0xc4, 0x31, 0x11, 0x59, 0x93, 0x99, 0xc5, 0x2b, 0x5f, 0x86, 0x60, + 0xc9, 0x43, 0x14, 0xc3, 0xc9, 0xad, 0x7d, 0x6f, 0x3c, 0x12, 0x4b, 0x04, + 0x95, 0x7b, 0x72, 0x68, 0x18, 0x44, 0x0b, 0x92, 0x7a, 0xee, 0xa9, 0x64, + 0xe7, 0x69, 0xde, 0xd6, 0xe4, 0xa7, 0x15, 0x3d, 0x43, 0x3c, 0xd4, 0xb6, + 0x88, 0xdc, 0xba, 0xec, 0x91, 0x50, 0x74, 0x07, 0x82, 0xb1, 0x35, 0xca, + 0x53, 0x98, 0x17, 0x35, 0x87, 0x4a, 0x7b, 0x6c, 0x1b, 0x87, 0x7f, 0xf2, + 0xc6, 0xb6, 0x6f, 0x4f, 0x86, 0x52, 0xcb, 0xf7, 0xb5, 0xa5, 0xf7, 0x87, + 0x24, 0x79, 0x62, 0xd1, 0xf4, 0x3b, 0x9a, 0x36, 0xb9, 0x01, 0x20, 0x2c, + 0x8c, 0x8a, 0x56, 0x84, 0x92, 0xa9, 0x44, 0x6c, 0x1f, 0x7b, 0xcd, 0xa8, + 0x50, 0x7b, 0x96, 0x29, 0x67, 0xda, 0xb5, 0xa6, 0x8e, 0x8a, 0x7a, 0x82, + 0x23, 0xa1, 0xf4, 0x70, 0xa8, 0x85, 0x6d, 0xb2, 0x97, 0xc3, 0x9d, 0x5d, + 0x44, 0x4f, 0x2a, 0x16, 0x8f, 0x43, 0x54, 0x82, 0x70, 0x2d, 0xdb, 0x71, + 0xca, 0xa5, 0x0d, 0x9d, 0x88, 0xc2, 0x93, 0xf6, 0x50, 0x7e, 0xcc, 0x7c, + 0xfb, 0xa6, 0x82, 0x58, 0xd6, 0x56, 0x4d, 0x79, 0xb1, 0xa8, 0x5c, 0x09, + 0x32, 0xc2, 0x52, 0x4e, 0x2c, 0x9a, 0x76, 0xe3, 0x7c, 0xc9, 0xae, 0x19, + 0x8e, 0xa4, 0xc2, 0x71, 0x0c, 0xaf, 0x43, 0x26, 0xe1, 0x8a, 0x4e, 0xde, + 0xfc, 0x65, 0x56, 0x58, 0xf4, 0x84, 0xcf, 0x0f, 0xa5, 0xf7, 0xa6, 0x5c, + 0x24, 0x11, 0xcd, 0x5b, 0xe1, 0xe1, 0x83, 0x52, 0x87, 0x44, 0x5a, 0xa7, + 0x93, 0x1b, 0x42, 0xbb, 0x50, 0x97, 0x4c, 0x9a, 0xb7, 0x7b, 0xb4, 0x41, + 0x4d, 0xb0, 0x6c, 0x83, 0x3d, 0xa6, 0x3c, 0xc1, 0x16, 0x97, 0xde, 0x9e, + 0x1f, 0xcf, 0xf2, 0xf3, 0xe9, 0xf1, 0x58, 0x7c, 0x38, 0x72, 0xda, 0x8d, + 0xd7, 0x83, 0x6d, 0x25, 0x95, 0xf5, 0x96, 0x83, 0x1c, 0x09, 0xf5, 0x26, + 0x8d, 0xca, 0x12, 0x88, 0xe4, 0x70, 0x8a, 0xc4, 0xe9, 0x5f, 0xb2, 0xd1, + 0xb4, 0x84, 0x6c, 0xe2, 0x69, 0xce, 0x33, 0x2e, 0xa5, 0xe5, 0xae, 0x50, + 0x1e, 0x8e, 0x2f, 0x3c, 0x2d, 0x72, 0xdc, 0xc9, 0x02, 0x3f, 0xa1, 0x82, + 0x24, 0x6f, 0x61, 0x99, 0xb7, 0x5e, 0x94, 0x97, 0xd4, 0x1b, 0x92, 0xdc, + 0xc7, 0x4a, 0xcc, 0xa9, 0x0e, 0xd5, 0x63, 0xb9, 0xcc, 0x8a, 0x93, 0xe3, + 0xec, 0x37, 0x32, 0x33, 0xaa, 0xc7, 0xf1, 0x89, 0xd7, 0xd7, 0x24, 0xa4, + 0xc6, 0x7d, 0x8d, 0x22, 0xed, 0x32, 0x51, 0x9a, 0x1c, 0x9c, 0xe2, 0xe6, + 0x4d, 0x48, 0xa6, 0x23, 0xf5, 0xc6, 0xb0, 0x29, 0x86, 0x4e, 0x1d, 0x57, + 0xcc, 0xdb, 0x71, 0x30, 0x25, 0x5b, 0x18, 0x08, 0x61, 0x67, 0x4e, 0x04, + 0x13, 0xfb, 0xd2, 0x21, 0x1b, 0x9b, 0x34, 0xe5, 0x26, 0x55, 0x74, 0x5e, + 0x2b, 0xc3, 0x5d, 0x32, 0x2b, 0x2a, 0xbb, 0xd2, 0x49, 0x74, 0x91, 0x07, + 0x60, 0x53, 0x38, 0x12, 0x59, 0x1b, 0x4b, 0x49, 0xdf, 0xcb, 0x4b, 0x62, + 0xc9, 0x65, 0x82, 0x52, 0x3e, 0xa7, 0x32, 0x41, 0x09, 0xc6, 0x3c, 0x7c, + 0xaa, 0x1f, 0x5c, 0x49, 0x7e, 0x12, 0x2e, 0x3d, 0x9a, 0xcc, 0x4d, 0x0e, + 0x6f, 0x4b, 0xdf, 0x1c, 0x29, 0x07, 0x89, 0xa4, 0xbc, 0x68, 0x91, 0x3d, + 0xa5, 0x76, 0xfb, 0x99, 0xa9, 0xec, 0x3d, 0x7e, 0xd5, 0xa9, 0x67, 0x95, + 0x59, 0xe3, 0x18, 0x8c, 0x39, 0xba, 0x94, 0x8f, 0x35, 0x3a, 0xcd, 0xa9, + 0xe0, 0xcc, 0x2f, 0x61, 0xc9, 0x51, 0x72, 0xc6, 0x58, 0xbb, 0xac, 0x2d, + 0x7d, 0xfa, 0x58, 0xbd, 0x79, 0xff, 0x1c, 0xa7, 0x5b, 0xd9, 0xdb, 0xa9, + 0xef, 0x14, 0x83, 0x8e, 0x31, 0xa1, 0x76, 0x8c, 0xc5, 0x98, 0x88, 0x7a, + 0xea, 0xd0, 0xf4, 0x8c, 0xe7, 0x80, 0xa7, 0x76, 0xb8, 0xe7, 0x34, 0xce, + 0x61, 0x4f, 0x0d, 0x85, 0x71, 0x77, 0xd2, 0x74, 0x2e, 0x39, 0x53, 0x31, + 0x75, 0x27, 0x26, 0x0b, 0x26, 0x94, 0x4a, 0x87, 0xe3, 0x83, 0x58, 0xae, + 0xe9, 0xe3, 0x5c, 0xc6, 0x55, 0x79, 0x53, 0xd2, 0x07, 0xb7, 0x0a, 0x65, + 0xa2, 0x52, 0xfa, 0x68, 0xc8, 0x26, 0xea, 0xac, 0xc0, 0x86, 0x99, 0xc3, + 0xe0, 0x0c, 0xb3, 0xe9, 0x38, 0xfa, 0x52, 0xb3, 0x3e, 0xab, 0xae, 0x8c, + 0x89, 0x6d, 0x44, 0x6e, 0x43, 0x0e, 0x49, 0xd6, 0x6d, 0x27, 0xeb, 0x88, + 0x3c, 0xfd, 0xf0, 0xd3, 0x1c, 0xce, 0xdc, 0x23, 0xa7, 0x1e, 0x47, 0x12, + 0x17, 0x5f, 0xbc, 0xa2, 0xe1, 0x82, 0x32, 0x0e, 0x14, 0x38, 0xcb, 0x97, + 0x2d, 0x2e, 0x83, 0x23, 0x95, 0x55, 0x97, 0x0d, 0xa0, 0xc1, 0xe1, 0x88, + 0xdc, 0x96, 0x6a, 0x76, 0x61, 0x3d, 0x43, 0x91, 0x40, 0xc5, 0xc1, 0x64, + 0x08, 0xca, 0xa1, 0x60, 0xb2, 0x06, 0x37, 0x14, 0x84, 0x96, 0xe1, 0x5d, + 0xc9, 0xb2, 0xc5, 0xdb, 0x83, 0x91, 0x64, 0xa8, 0xba, 0x6c, 0x57, 0x38, + 0x5a, 0x13, 0x8c, 0x87, 0xcb, 0x16, 0xcf, 0x5d, 0x58, 0x5d, 0x86, 0xa2, + 0x93, 0xc8, 0x8b, 0x6c, 0xf3, 0x6a, 0xe7, 0xd5, 0xd6, 0xfb, 0x6b, 0x06, + 0x43, 0x23, 0x55, 0xc1, 0x58, 0x32, 0xbe, 0xa0, 0xec, 0x22, 0x32, 0xea, + 0xc5, 0x6b, 0xc6, 0x34, 0x67, 0x89, 0xb5, 0x64, 0x5e, 0x89, 0xbd, 0x64, + 0xa0, 0x64, 0x71, 0x49, 0x1f, 0x7e, 0x73, 0x8c, 0x3a, 0x88, 0x27, 0xd5, + 0x1a, 0x7e, 0xe3, 0x76, 0x61, 0x9d, 0x72, 0x8d, 0x51, 0x92, 0x3b, 0xca, + 0xe6, 0xab, 0x3c, 0x76, 0xe4, 0x39, 0xa7, 0xc4, 0x83, 0x3c, 0xed, 0x25, + 0x4e, 0xa5, 0xf5, 0x42, 0x3b, 0x45, 0x65, 0xad, 0x56, 0x12, 0x03, 0x92, + 0x1d, 0xa3, 0xca, 0xa9, 0xc6, 0x5c, 0xce, 0x2a, 0x26, 0x55, 0x8d, 0x96, + 0x91, 0xae, 0xd3, 0xa5, 0xcc, 0x72, 0x60, 0xb6, 0x3d, 0xad, 0xb5, 0x99, + 0xb4, 0x32, 0xa7, 0x6d, 0x52, 0xe5, 0xa4, 0x8a, 0x49, 0xe5, 0x93, 0xaa, + 0x27, 0xd5, 0x90, 0xd5, 0x6e, 0xcf, 0x35, 0x84, 0x97, 0x7f, 0x17, 0x5e, + 0xb2, 0xdf, 0x7a, 0xb2, 0xc2, 0xe2, 0x7a, 0xab, 0xdc, 0xe6, 0xda, 0x5f, + 0x23, 0x5c, 0x2f, 0x00, 0xef, 0x02, 0x57, 0xd6, 0x2e, 0x12, 0x07, 0x2b, + 0x85, 0x38, 0x5a, 0x69, 0x88, 0x87, 0x41, 0x4f, 0x02, 0x1f, 0x73, 0xba, + 0x8a, 0xac, 0xc2, 0x28, 0x34, 0x84, 0xfc, 0x5d, 0xbe, 0x7f, 0xbf, 0xf5, + 0xf5, 0xba, 0x36, 0xb1, 0xdf, 0x0f, 0x8b, 0x5a, 0x32, 0x84, 0xb5, 0xe8, + 0x88, 0x4f, 0x78, 0xdb, 0x51, 0xe8, 0x91, 0x79, 0x2b, 0xc5, 0xc3, 0x10, + 0x7f, 0x58, 0x2f, 0xc4, 0xc3, 0x73, 0x85, 0xb8, 0xbb, 0x1e, 0x6a, 0x31, + 0xc1, 0x10, 0x47, 0x7c, 0x9d, 0xc8, 0x75, 0x7c, 0xde, 0x6a, 0xf1, 0xca, + 0x3c, 0xb2, 0xd8, 0xa9, 0x84, 0x73, 0x08, 0x6f, 0x17, 0xf2, 0xdc, 0xb9, + 0x40, 0x1c, 0xf6, 0x9d, 0xe4, 0xc7, 0x07, 0xfc, 0x38, 0xb2, 0x40, 0x18, + 0x87, 0x17, 0x0a, 0xe3, 0xf8, 0x42, 0x12, 0x22, 0x77, 0x8a, 0x77, 0x03, + 0xb7, 0xb5, 0xa1, 0x47, 0x7c, 0xbc, 0x10, 0xed, 0x58, 0x84, 0x62, 0x81, + 0x93, 0xc0, 0xc7, 0xcc, 0x37, 0x40, 0x06, 0x7c, 0x08, 0x9c, 0x84, 0xfe, + 0x48, 0x23, 0xaa, 0x6c, 0x24, 0x47, 0xfd, 0xcc, 0xa9, 0x5e, 0xd9, 0x56, + 0xaf, 0xfa, 0x3d, 0x07, 0x65, 0xbc, 0xb0, 0x0a, 0x85, 0x1f, 0x6d, 0xc2, + 0xe3, 0x85, 0x15, 0x78, 0xec, 0x5f, 0x8d, 0xc7, 0x09, 0x29, 0x93, 0x1c, + 0x2b, 0x5e, 0x5f, 0x89, 0xc7, 0xa7, 0xfc, 0x78, 0x89, 0x93, 0xbf, 0x67, + 0xbb, 0xe3, 0xac, 0x3d, 0xca, 0x76, 0xcf, 0x32, 0x77, 0xb0, 0x1d, 0x8f, + 0x9b, 0xf9, 0xf1, 0x18, 0x3f, 0x4e, 0xb6, 0xdb, 0x0f, 0x18, 0x24, 0x00, + 0x8b, 0x71, 0x74, 0x05, 0x53, 0x83, 0xe1, 0xfa, 0xb0, 0xdd, 0xa1, 0xe5, + 0x7f, 0x0f, 0x26, 0x00, 0xae, 0xcb, 0xc1, 0x7f, 0x59, 0xc0, 0x3e, 0x2e, + 0x5e, 0x5f, 0x2d, 0xc4, 0x95, 0x5d, 0x42, 0xdc, 0x09, 0xbc, 0xdb, 0x24, + 0xc4, 0xab, 0x5d, 0x16, 0xf1, 0x6c, 0xa3, 0x9d, 0xde, 0x5d, 0x3c, 0x41, + 0x5c, 0xb7, 0x46, 0x88, 0xfd, 0xcd, 0x18, 0x24, 0xe0, 0x25, 0xf0, 0x6f, + 0x01, 0x1f, 0x03, 0xb7, 0xae, 0x45, 0x1a, 0x78, 0x0b, 0xf8, 0x18, 0x78, + 0x1d, 0x03, 0x77, 0xe5, 0x3a, 0x21, 0x1e, 0x63, 0xc0, 0xf6, 0xc8, 0x12, + 0x21, 0x0e, 0x2e, 0x15, 0xe2, 0xba, 0x65, 0xc2, 0xfa, 0xee, 0x3a, 0x61, + 0xdd, 0xdf, 0x2d, 0xc4, 0x0b, 0xcb, 0x6c, 0xe2, 0x38, 0xe8, 0xad, 0xeb, + 0xe1, 0x1c, 0xc0, 0xab, 0xeb, 0x49, 0xfd, 0xf0, 0x67, 0x8d, 0x81, 0x55, + 0xea, 0xb3, 0xc7, 0x9d, 0xa0, 0x09, 0x13, 0x7f, 0xd1, 0x2a, 0xa5, 0x3f, + 0x6c, 0x92, 0xdd, 0xa8, 0xf9, 0xdb, 0x41, 0xef, 0x59, 0xa5, 0x3e, 0xdf, + 0x64, 0xf9, 0xc3, 0xc0, 0x4f, 0xb5, 0xfd, 0x0b, 0x26, 0xfb, 0xd7, 0xb4, + 0xec, 0x0f, 0x9a, 0xfe, 0x0d, 0x34, 0xde, 0x39, 0x5a, 0x37, 0xe9, 0xcf, + 0x5d, 0x87, 0x20, 0xbb, 0x50, 0xcb, 0xd3, 0x3f, 0x47, 0x4e, 0xb1, 0xe3, + 0xef, 0x1f, 0x39, 0x0c, 0xd9, 0x4d, 0xa7, 0xd8, 0xdd, 0x79, 0x4a, 0xfa, + 0x89, 0x53, 0xf2, 0xf1, 0xf7, 0x8b, 0x3c, 0x0c, 0xd9, 0x2b, 0xa7, 0xc8, + 0xf9, 0xff, 0x06, 0xbf, 0xd0, 0x39, 0xfa, 0xbd, 0x1c, 0xc2, 0x44, 0xd3, + 0xdf, 0xa3, 0xc5, 0xfd, 0x48, 0x7f, 0x97, 0x16, 0xf7, 0x35, 0xfd, 0x7d, + 0x5a, 0xfc, 0x59, 0x6c, 0xfa, 0x3b, 0xb5, 0xf8, 0x73, 0xda, 0xf4, 0xf7, + 0x6a, 0xf1, 0x67, 0xd4, 0xe9, 0xef, 0xd6, 0x12, 0x3e, 0xf5, 0x1d, 0x27, + 0xfc, 0xfd, 0x5a, 0x16, 0x9f, 0xfa, 0x6c, 0x98, 0xff, 0xaf, 0x9d, 0x70, + 0xab, 0xef, 0x55, 0xe1, 0xff, 0x53, 0x68, 0xf8, 0x54, 0x5d, 0xbe, 0x5a, + 0x94, 0xe9, 0x53, 0x7f, 0x43, 0xc3, 0xf3, 0x41, 0x3e, 0x55, 0x0e, 0xff, + 0x5f, 0x43, 0x8b, 0x5b, 0xfd, 0xdd, 0xc0, 0x20, 0xda, 0x6a, 0xd7, 0x72, + 0xfe, 0x7f, 0x88, 0xdc, 0x70, 0x6e, 0x2b, 0x7f, 0xef, 0xd7, 0xff, 0x05, + 0xf3, 0x27, 0x9b, 0x95, 0x30, 0x4c, 0x00, 0x00 +}; //============================================================================== #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra @@ -213,6 +872,13 @@ DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowManagerLayoutParams28, "android/vie DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidWindowInsetsType, "android/view/WindowInsets$Type", 30) #undef JNI_CLASS_MEMBERS +#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + FIELD (first, "first", "Ljava/lang/Object;") \ + FIELD (second, "second", "Ljava/lang/Object;") \ + + DECLARE_JNI_CLASS (AndroidPair, "android/util/Pair") +#undef JNI_CLASS_MEMBERS + //============================================================================== namespace { @@ -856,30 +1522,29 @@ public: } } - void handleKeyDownCallback (int k, int kc, int kbFlags) + static void handleKeyDownCallback (JNIEnv*, AndroidComponentPeer& t, int k, int kc, int kbFlags) { ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons() .withFlags (translateAndroidKeyboardFlags (kbFlags)); - handleKeyPress (translateAndroidKeyCode (k), static_cast (kc)); + t.handleKeyPress (translateAndroidKeyCode (k), static_cast (kc)); } - void handleKeyUpCallback (int /*k*/, int /*kc*/) + static void handleKeyUpCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t, [[maybe_unused]] int k, [[maybe_unused]] int kc) { } - void handleBackButtonCallback() + static void handleBackButtonCallback (JNIEnv* env, AndroidComponentPeer& t) { bool handled = false; if (auto* app = JUCEApplicationBase::getInstance()) handled = app->backButtonPressed(); - if (isKioskModeComponent()) - setNavBarsHidden (navBarsHidden); + if (t.isKioskModeComponent()) + t.setNavBarsHidden (t.navBarsHidden); if (! handled) { - auto* env = getEnv(); LocalRef activity (getCurrentActivity()); if (activity != nullptr) @@ -890,17 +1555,27 @@ public: } } - void handleKeyboardHiddenCallback() + static void handleKeyboardHiddenCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t) { Component::unfocusAllComponents(); } - void handleAppPausedCallback() {} + static void handleAppPausedCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t) {} + + static void handleAppResumedCallback (JNIEnv*, AndroidComponentPeer& t) + { + if (t.isKioskModeComponent()) + t.setNavBarsHidden (t.navBarsHidden); + } + + static jlong handleGetFocusedTextInputTargetCallback (JNIEnv*, AndroidComponentPeer& t) + { + return reinterpret_cast (t.findCurrentTextInputTarget()); + } - void handleAppResumedCallback() + static void handleMovedOrResizedCallback (JNIEnv*, AndroidComponentPeer& t) { - if (isKioskModeComponent()) - setNavBarsHidden (navBarsHidden); + t.handleMovedOrResized(); } //============================================================================== @@ -916,9 +1591,9 @@ public: return nullptr; } - jboolean populateAccessibilityNodeInfoCallback (jint virtualViewId, jobject info) const + static jboolean populateAccessibilityNodeInfoCallback (JNIEnv*, const AndroidComponentPeer& t, jint virtualViewId, jobject info) { - if (auto* handle = getNativeHandleForViewId (virtualViewId)) + if (auto* handle = t.getNativeHandleForViewId (virtualViewId)) { handle->populateNodeInfo (info); return true; @@ -927,53 +1602,53 @@ public: return false; } - jboolean handlePerformActionCallback (jint virtualViewId, jint action, jobject arguments) const + static jboolean handlePerformActionCallback (JNIEnv*, const AndroidComponentPeer& t, jint virtualViewId, jint action, jobject arguments) { - if (auto* handle = getNativeHandleForViewId (virtualViewId)) + if (auto* handle = t.getNativeHandleForViewId (virtualViewId)) return handle->performAction (action, arguments); return false; } - static jobject getFocusViewIdForHandler (const AccessibilityHandler* handler) + static jobject getFocusViewIdForHandler (JNIEnv* env, const AccessibilityHandler* handler) { if (handler != nullptr) - return getEnv()->NewObject (JavaInteger, - JavaInteger.constructor, - handler->getNativeImplementation()->getVirtualViewId()); + return env->NewObject (JavaInteger, + JavaInteger.constructor, + handler->getNativeImplementation()->getVirtualViewId()); return nullptr; } - jobject getInputFocusViewIdCallback() + static jobject getInputFocusViewIdCallback (JNIEnv* env, AndroidComponentPeer& t) { - if (auto* comp = dynamic_cast (findCurrentTextInputTarget())) - return getFocusViewIdForHandler (comp->getAccessibilityHandler()); + if (auto* comp = dynamic_cast (t.findCurrentTextInputTarget())) + return getFocusViewIdForHandler (env, comp->getAccessibilityHandler()); return nullptr; } - jobject getAccessibilityFocusViewIdCallback() const + static jobject getAccessibilityFocusViewIdCallback (JNIEnv* env, const AndroidComponentPeer& t) { - if (auto* handler = component.getAccessibilityHandler()) + if (auto* handler = t.component.getAccessibilityHandler()) { if (auto* modal = Component::getCurrentlyModalComponent()) { - if (! component.isParentOf (modal) - && component.isCurrentlyBlockedByAnotherModalComponent()) + if (! t.component.isParentOf (modal) + && t.component.isCurrentlyBlockedByAnotherModalComponent()) { if (auto* modalHandler = modal->getAccessibilityHandler()) { if (auto* focusChild = modalHandler->getChildFocus()) - return getFocusViewIdForHandler (focusChild); + return getFocusViewIdForHandler (env, focusChild); - return getFocusViewIdForHandler (modalHandler); + return getFocusViewIdForHandler (env, modalHandler); } } } if (auto* focusChild = handler->getChildFocus()) - return getFocusViewIdForHandler (focusChild); + return getFocusViewIdForHandler (env, focusChild); } return nullptr; @@ -994,59 +1669,49 @@ public: view.callBooleanMethod (AndroidView.requestFocus); } - void handleFocusChangeCallback (bool hasFocus) + static void handleFocusChangeCallback (JNIEnv*, AndroidComponentPeer& t, bool hasFocus) { - if (isFullScreen()) - setFullScreen (true); + if (t.isFullScreen()) + t.setFullScreen (true); if (hasFocus) - handleFocusGain(); + t.handleFocusGain(); else - handleFocusLoss(); + t.handleFocusLoss(); } - static const char* getVirtualKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept + void textInputRequired (Point, TextInputTarget& target) override { - switch (type) - { - case TextInputTarget::textKeyboard: return "text"; - case TextInputTarget::numericKeyboard: return "number"; - case TextInputTarget::decimalKeyboard: return "numberDecimal"; - case TextInputTarget::urlKeyboard: return "textUri"; - case TextInputTarget::emailAddressKeyboard: return "textEmailAddress"; - case TextInputTarget::phoneNumberKeyboard: return "phone"; - default: jassertfalse; break; - } - - return "text"; + const auto region = target.getHighlightedRegion(); + view.callVoidMethod (ComponentPeerView.showKeyboard, + static_cast (target.getKeyboardType()), + static_cast (region.getStart()), + static_cast (region.getEnd())); } - void textInputRequired (Point, TextInputTarget& target) override + void closeInputMethodContext() override { - view.callVoidMethod (ComponentPeerView.showKeyboard, - javaString (getVirtualKeyboardType (target.getKeyboardType())).get()); + getEnv()->CallVoidMethod (view, ComponentPeerView.closeInputMethodContext); } void dismissPendingTextInput() override { closeInputMethodContext(); - view.callVoidMethod (ComponentPeerView.showKeyboard, javaString ("").get()); + view.callVoidMethod (ComponentPeerView.hideKeyboard); if (! isTimerRunning()) startTimer (500); } //============================================================================== - void handleDoFrameCallback ([[maybe_unused]] int64 frameTimeNanos) + static void handleDoFrameCallback (JNIEnv*, AndroidComponentPeer& t, [[maybe_unused]] int64 frameTimeNanos) { - vBlankListeners.call ([] (auto& l) { l.onVBlank(); }); + t.vBlankListeners.call ([] (auto& l) { l.onVBlank(); }); } - void handlePaintCallback (jobject canvas, jobject paint) + static void handlePaintCallback (JNIEnv* env, AndroidComponentPeer& t, jobject canvas, jobject paint) { - auto* env = getEnv(); - jobject rect = env->CallObjectMethod (canvas, AndroidCanvas.getClipBounds); auto left = env->GetIntField (rect, AndroidRect.left); auto top = env->GetIntField (rect, AndroidRect.top); @@ -1061,30 +1726,30 @@ public: auto sizeNeeded = clip.getWidth() * clip.getHeight(); - if (sizeAllocated < sizeNeeded) + if (t.sizeAllocated < sizeNeeded) { - buffer.clear(); - sizeAllocated = sizeNeeded; - buffer = GlobalRef (LocalRef ((jobject) env->NewIntArray (sizeNeeded))); + t.buffer.clear(); + t.sizeAllocated = sizeNeeded; + t.buffer = GlobalRef (LocalRef ((jobject) env->NewIntArray (sizeNeeded))); } - if (jint* dest = env->GetIntArrayElements ((jintArray) buffer.get(), nullptr)) + if (jint* dest = env->GetIntArrayElements ((jintArray) t.buffer.get(), nullptr)) { { Image temp (new PreallocatedImage (clip.getWidth(), clip.getHeight(), - dest, ! component.isOpaque())); + dest, ! t.component.isOpaque())); { LowLevelGraphicsSoftwareRenderer g (temp); g.setOrigin (-clip.getPosition()); - g.addTransform (AffineTransform::scale (scale)); - handlePaint (g); + g.addTransform (AffineTransform::scale (t.scale)); + t.handlePaint (g); } } - env->ReleaseIntArrayElements ((jintArray) buffer.get(), dest, 0); + env->ReleaseIntArrayElements ((jintArray) t.buffer.get(), dest, 0); - env->CallVoidMethod (canvas, AndroidCanvas.drawBitmap, (jintArray) buffer.get(), 0, clip.getWidth(), + env->CallVoidMethod (canvas, AndroidCanvas.drawBitmap, (jintArray) t.buffer.get(), 0, clip.getWidth(), (jfloat) clip.getX(), (jfloat) clip.getY(), clip.getWidth(), clip.getHeight(), true, paint); } @@ -1144,83 +1809,140 @@ public: }; private: + template + static void mouseCallbackWrapper (JNIEnv*, AndroidComponentPeer& t, jint i, jfloat x, jfloat y, jlong time) { return (t.*Member) (i, Point { x, y }, time); } + //============================================================================== - #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (create, "", "(Landroid/content/Context;ZJ)V") \ - METHOD (clear, "clear", "()V") \ - METHOD (setViewName, "setViewName", "(Ljava/lang/String;)V") \ - METHOD (setVisible, "setVisible", "(Z)V") \ - METHOD (isVisible, "isVisible", "()Z") \ - METHOD (containsPoint, "containsPoint", "(II)Z") \ - METHOD (showKeyboard, "showKeyboard", "(Ljava/lang/String;)V") \ - METHOD (setSystemUiVisibilityCompat, "setSystemUiVisibilityCompat", "(I)V") \ - CALLBACK (handleDoFrameJni, "handleDoFrame", "(JJ)V") \ - CALLBACK (handlePaintJni, "handlePaint", "(JLandroid/graphics/Canvas;Landroid/graphics/Paint;)V") \ - CALLBACK (handleMouseDownJni, "handleMouseDown", "(JIFFJ)V") \ - CALLBACK (handleMouseDragJni, "handleMouseDrag", "(JIFFJ)V") \ - CALLBACK (handleMouseUpJni, "handleMouseUp", "(JIFFJ)V") \ - CALLBACK (handleAccessibleHoverJni, "handleAccessibilityHover", "(JIFFJ)V") \ - CALLBACK (handleKeyDownJni, "handleKeyDown", "(JIII)V") \ - CALLBACK (handleKeyUpJni, "handleKeyUp", "(JII)V") \ - CALLBACK (handleBackButtonJni, "handleBackButton", "(J)V") \ - CALLBACK (handleKeyboardHiddenJni, "handleKeyboardHidden", "(J)V") \ - CALLBACK (viewSizeChangedJni, "viewSizeChanged", "(J)V") \ - CALLBACK (focusChangedJni, "focusChanged", "(JZ)V") \ - CALLBACK (handleAppPausedJni, "handleAppPaused", "(J)V") \ - CALLBACK (handleAppResumedJni, "handleAppResumed", "(J)V") \ - CALLBACK (populateAccessibilityNodeInfoJni, "populateAccessibilityNodeInfo", "(JILandroid/view/accessibility/AccessibilityNodeInfo;)Z") \ - CALLBACK (handlePerformActionJni, "handlePerformAction", "(JIILandroid/os/Bundle;)Z") \ - CALLBACK (getInputFocusViewIdJni, "getInputFocusViewId", "(J)Ljava/lang/Integer;") \ - CALLBACK (getAccessibilityFocusViewIdJni, "getAccessibilityFocusViewId", "(J)Ljava/lang/Integer;") \ - - DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/rmsl/juce/ComponentPeerView", 16, javaComponentPeerView, sizeof (javaComponentPeerView)) - #undef JNI_CLASS_MEMBERS - - static void JNICALL handleDoFrameJni (JNIEnv*, jobject /*view*/, jlong host, jlong frameTimeNanos) { if (auto* myself = reinterpret_cast (host)) myself->handleDoFrameCallback (frameTimeNanos); } - static void JNICALL handlePaintJni (JNIEnv*, jobject /*view*/, jlong host, jobject canvas, jobject paint) { if (auto* myself = reinterpret_cast (host)) myself->handlePaintCallback (canvas, paint); } - static void JNICALL handleMouseDownJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast (host)) myself->handleMouseDownCallback (i, Point ((float) x, (float) y), (int64) time); } - static void JNICALL handleMouseDragJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast (host)) myself->handleMouseDragCallback (i, Point ((float) x, (float) y), (int64) time); } - static void JNICALL handleMouseUpJni (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast (host)) myself->handleMouseUpCallback (i, Point ((float) x, (float) y), (int64) time); } - static void JNICALL handleAccessibleHoverJni(JNIEnv*, jobject /*view*/, jlong host, jint c, jfloat x, jfloat y, jlong time) { if (auto* myself = reinterpret_cast (host)) myself->handleAccessibilityHoverCallback ((int) c, Point ((float) x, (float) y), (int64) time); } - static void JNICALL viewSizeChangedJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast (host)) myself->handleMovedOrResized(); } - static void JNICALL focusChangedJni (JNIEnv*, jobject /*view*/, jlong host, jboolean hasFocus) { if (auto* myself = reinterpret_cast (host)) myself->handleFocusChangeCallback (hasFocus); } - static void JNICALL handleKeyDownJni (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc, jint kbFlags) { if (auto* myself = reinterpret_cast (host)) myself->handleKeyDownCallback ((int) k, (int) kc, (int) kbFlags); } - static void JNICALL handleKeyUpJni (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc) { if (auto* myself = reinterpret_cast (host)) myself->handleKeyUpCallback ((int) k, (int) kc); } - static void JNICALL handleBackButtonJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast (host)) myself->handleBackButtonCallback(); } - static void JNICALL handleKeyboardHiddenJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast (host)) myself->handleKeyboardHiddenCallback(); } - static void JNICALL handleAppPausedJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast (host)) myself->handleAppPausedCallback(); } - static void JNICALL handleAppResumedJni (JNIEnv*, jobject /*view*/, jlong host) { if (auto* myself = reinterpret_cast (host)) myself->handleAppResumedCallback(); } - - static jboolean JNICALL populateAccessibilityNodeInfoJni (JNIEnv*, jobject /*view*/, jlong host, jint virtualViewId, jobject info) - { - if (auto* myself = reinterpret_cast (host)) - return myself->populateAccessibilityNodeInfoCallback (virtualViewId, info); + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (create, "", "(Landroid/content/Context;ZJ)V") \ + METHOD (clear, "clear", "()V") \ + METHOD (setViewName, "setViewName", "(Ljava/lang/String;)V") \ + METHOD (setVisible, "setVisible", "(Z)V") \ + METHOD (isVisible, "isVisible", "()Z") \ + METHOD (containsPoint, "containsPoint", "(II)Z") \ + METHOD (showKeyboard, "showKeyboard", "(III)V") \ + METHOD (hideKeyboard, "hideKeyboard", "()V") \ + METHOD (closeInputMethodContext, "closeInputMethodContext", "()V") \ + METHOD (setSystemUiVisibilityCompat, "setSystemUiVisibilityCompat", "(I)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleDoFrameCallback>, "handleDoFrame", "(JJ)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handlePaintCallback>, "handlePaint", "(JLandroid/graphics/Canvas;Landroid/graphics/Paint;)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyDownCallback>, "handleKeyDown", "(JIII)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyUpCallback>, "handleKeyUp", "(JII)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleBackButtonCallback>, "handleBackButton", "(J)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyboardHiddenCallback>, "handleKeyboardHidden", "(J)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleGetFocusedTextInputTargetCallback>, "getFocusedTextInputTargetPointer", "(J)J") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleMovedOrResizedCallback>, "viewSizeChanged", "(J)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleFocusChangeCallback>, "focusChanged", "(JZ)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleAppPausedCallback>, "handleAppPaused", "(J)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handleAppResumedCallback>, "handleAppResumed", "(J)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::populateAccessibilityNodeInfoCallback>, "populateAccessibilityNodeInfo", "(JILandroid/view/accessibility/AccessibilityNodeInfo;)Z") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::handlePerformActionCallback>, "handlePerformAction", "(JIILandroid/os/Bundle;)Z") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::getInputFocusViewIdCallback>, "getInputFocusViewId", "(J)Ljava/lang/Integer;") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::getAccessibilityFocusViewIdCallback>, "getAccessibilityFocusViewId", "(J)Ljava/lang/Integer;") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetIsTextInputActive>, "textInputTargetIsTextInputActive", "(J)Z") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetHighlightedRegionBegin>, "textInputTargetGetHighlightedRegionBegin", "(J)I") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetHighlightedRegionEnd>, "textInputTargetGetHighlightedRegionEnd", "(J)I") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetSetHighlightedRegion>, "textInputTargetSetHighlightedRegion", "(JII)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetTextInRange>, "textInputTargetGetTextInRange", "(JII)Ljava/lang/String;") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetInsertTextAtCaret>, "textInputTargetInsertTextAtCaret", "(JLjava/lang/String;)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetCaretPosition>, "textInputTargetGetCaretPosition", "(J)I") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetTotalNumChars>, "textInputTargetGetTotalNumChars", "(J)I") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetCharIndexForPoint>, "textInputTargetGetCharIndexForPoint", "(JLandroid/graphics/Point;)I") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetKeyboardType>, "textInputTargetGetKeyboardType", "(J)I") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetSetTemporaryUnderlining>, "textInputTargetSetTemporaryUnderlining", "(JLjava/util/List;)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseDownCallback>>, "handleMouseDown", "(JIFFJ)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseDragCallback>>, "handleMouseDrag", "(JIFFJ)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseUpCallback>>, "handleMouseUp", "(JIFFJ)V") \ + CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleAccessibilityHoverCallback>>, "handleAccessibilityHover", "(JIFFJ)V") \ - return false; + DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/rmsl/juce/ComponentPeerView", 16, javaComponentPeerView) + #undef JNI_CLASS_MEMBERS + + static jboolean textInputTargetIsTextInputActive (JNIEnv*, const TextInputTarget& t) + { + return t.isTextInputActive(); } - static jboolean JNICALL handlePerformActionJni (JNIEnv*, jobject /*view*/, jlong host, jint virtualViewId, jint action, jobject arguments) + static jint textInputTargetGetHighlightedRegionBegin (JNIEnv*, const TextInputTarget& t) { - if (auto* myself = reinterpret_cast (host)) - return myself->handlePerformActionCallback (virtualViewId, action, arguments); + return t.getHighlightedRegion().getStart(); + } - return false; + static jint textInputTargetGetHighlightedRegionEnd (JNIEnv*, const TextInputTarget& t) + { + return t.getHighlightedRegion().getEnd(); } - static jobject JNICALL getInputFocusViewIdJni (JNIEnv*, jobject /*view*/, jlong host) + static void textInputTargetSetHighlightedRegion (JNIEnv*, TextInputTarget& t, jint b, jint e) { - if (auto* myself = reinterpret_cast (host)) - return myself->getInputFocusViewIdCallback(); + t.setHighlightedRegion ({ b, e }); + } - return nullptr; + static jstring textInputTargetGetTextInRange (JNIEnv* env, const TextInputTarget& t, jint b, jint e) + { + return env->NewStringUTF (t.getTextInRange ({ b, e }).toUTF8()); } - static jobject JNICALL getAccessibilityFocusViewIdJni (JNIEnv*, jobject /*view*/, jlong host) + static void textInputTargetInsertTextAtCaret (JNIEnv*, TextInputTarget& t, jstring text) { - if (auto* myself = reinterpret_cast (host)) - return myself->getAccessibilityFocusViewIdCallback(); + t.insertTextAtCaret (juceString (text)); + } - return nullptr; + static jint textInputTargetGetCaretPosition (JNIEnv*, const TextInputTarget& t) + { + return t.getCaretPosition(); + } + + static jint textInputTargetGetTotalNumChars (JNIEnv*, const TextInputTarget& t) + { + return t.getTotalNumChars(); + } + + static jint textInputTargetGetCharIndexForPoint (JNIEnv* env, const TextInputTarget& t, jobject point) + { + return t.getCharIndexForPoint ({ env->GetIntField (point, AndroidPoint.x), + env->GetIntField (point, AndroidPoint.y) }); + } + + static jint textInputTargetGetKeyboardType (JNIEnv*, TextInputTarget& t) + { + return t.getKeyboardType(); + } + + static std::optional> getRangeFromPair (JNIEnv* env, jobject pair) + { + if (pair == nullptr) + return {}; + + const auto first = env->GetObjectField (pair, AndroidPair.first); + const auto second = env->GetObjectField (pair, AndroidPair.second); + + if (first == nullptr || second == nullptr) + return {}; + + const auto begin = env->CallIntMethod (first, JavaInteger.intValue); + const auto end = env->CallIntMethod (second, JavaInteger.intValue); + + return Range { begin, end }; + } + + static Array> javaListOfPairToArrayOfRange (JNIEnv* env, jobject list) + { + if (list == nullptr) + return {}; + + Array> result; + + for (jint i = 0; i < env->CallIntMethod (list, JavaList.size); ++i) + if (const auto range = getRangeFromPair (env, env->CallObjectMethod (list, JavaList.get, i))) + result.add (*range); + + return result; + } + + static void textInputTargetSetTemporaryUnderlining (JNIEnv* env, TextInputTarget& t, jobject list) + { + t.setTemporaryUnderlining (javaListOfPairToArrayOfRange (env, list)); } //============================================================================== @@ -1390,7 +2112,6 @@ Point AndroidComponentPeer::lastMousePos; int64 AndroidComponentPeer::touchesDown = 0; AndroidComponentPeer* AndroidComponentPeer::frontWindow = nullptr; GlobalRef AndroidComponentPeer::activityCallbackListener; -AndroidComponentPeer::ComponentPeerView_Class AndroidComponentPeer::ComponentPeerView; //============================================================================== ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindow) @@ -1799,10 +2520,8 @@ bool Desktop::isScreenSaverEnabled() } //============================================================================== -void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, bool allowMenusAndBars) +void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, [[maybe_unused]] bool allowMenusAndBars) { - ignoreUnused (allowMenusAndBars); - if (AndroidComponentPeer* peer = dynamic_cast (kioskComp->getPeer())) peer->setFullScreen (enableOrDisable); else @@ -1930,7 +2649,7 @@ void Displays::findDisplays (float masterScale) { auto* env = getEnv(); - LocalRef usableSize (env->NewObject (AndroidPoint, AndroidPoint.create, 0, 0)); + LocalRef usableSize (makeAndroidPoint ({})); LocalRef windowServiceString (javaString ("window")); LocalRef displayMetrics (env->NewObject (AndroidDisplayMetrics, AndroidDisplayMetrics.create)); LocalRef windowManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get())); @@ -2181,8 +2900,6 @@ const int KeyPress::rewindKey = extendedKeyModifier + 72; juce_handleOnResume(); } }; - - JuceActivityNewIntentListener::JavaActivity_Class JuceActivityNewIntentListener::JavaActivity; #endif } // namespace juce diff --git a/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp b/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp index 8aea9448..04203b55 100644 --- a/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp +++ b/modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp @@ -104,12 +104,9 @@ private: controller.get().excludedActivityTypes = nil; - controller.get().completionWithItemsHandler = ^ (UIActivityType type, BOOL completed, - NSArray* returnedItems, NSError* error) + controller.get().completionWithItemsHandler = ^([[maybe_unused]] UIActivityType type, BOOL completed, + [[maybe_unused]] NSArray* returnedItems, NSError* error) { - ignoreUnused (type); - ignoreUnused (returnedItems); - succeeded = completed; if (error != nil) diff --git a/modules/juce_gui_basics/native/juce_ios_FileChooser.mm b/modules/juce_gui_basics/native/juce_ios_FileChooser.mm index 3f33a8b7..47b5690e 100644 --- a/modules/juce_gui_basics/native/juce_ios_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_ios_FileChooser.mm @@ -137,8 +137,7 @@ public: { if (err != nil) { - auto desc = [err localizedDescription]; - ignoreUnused (desc); + [[maybe_unused]] auto desc = [err localizedDescription]; jassertfalse; return; } @@ -168,8 +167,7 @@ public: } else { - auto desc = [error localizedDescription]; - ignoreUnused (desc); + [[maybe_unused]] auto desc = [error localizedDescription]; jassertfalse; } diff --git a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm index aad028da..3d40104a 100644 --- a/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm @@ -36,6 +36,12 @@ #define JUCE_HAS_IOS_POINTER_SUPPORT 0 #endif +#if defined (__IPHONE_13_4) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_4 + #define JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT 1 +#else + #define JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT 0 +#endif + namespace juce { @@ -69,6 +75,30 @@ static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler class UIViewComponentPeer; +namespace iOSGlobals +{ +#if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT +class KeysCurrentlyDown +{ +public: + bool isDown (int x) const { return down.find (x) != down.cend(); } + + void setDown (int x, bool b) + { + if (b) + down.insert (x); + else + down.erase (x); + } + +private: + std::set down; +}; +static KeysCurrentlyDown keysCurrentlyDown; +#endif +static UIViewComponentPeer* currentlyFocusedPeer = nullptr; +} // namespace iOSGlobals + static UIInterfaceOrientation getWindowOrientation() { UIApplication* sharedApplication = [UIApplication sharedApplication]; @@ -403,8 +433,6 @@ public: void dismissPendingTextInput() override; void closeInputMethodContext() override; - BOOL textViewReplaceCharacters (Range, const String&); - void updateScreenBounds(); void handleTouches (UIEvent*, MouseEventFlags); @@ -414,6 +442,23 @@ public: void onScroll (UIPanGestureRecognizer*); #endif + Range getMarkedTextRange() const + { + return Range::withStartAndLength (startOfMarkedTextInTextInputTarget, + stringBeingComposed.length()); + } + + void replaceMarkedRangeWithText (TextInputTarget* target, const String& text) + { + if (stringBeingComposed.isNotEmpty()) + target->setHighlightedRegion (getMarkedTextRange()); + + target->insertTextAtCaret (text); + target->setTemporaryUnderlining ({ Range::withStartAndLength (startOfMarkedTextInTextInputTarget, + text.length()) }); + stringBeingComposed = text; + } + //============================================================================== void repaint (const Rectangle& area) override; void performAnyPendingRepaintsNow() override; @@ -424,6 +469,7 @@ public: UIViewController* controller = nil; const bool isSharedWindow, isAppex; String stringBeingComposed; + int startOfMarkedTextInTextInputTarget = 0; bool fullScreen = false, insideDrawRect = false; NSUniquePtr hiddenTextInput { [[JuceTextView alloc] initWithOwner: this] }; NSUniquePtr tokenizer { [[JuceTextInputTokenizer alloc] initWithPeer: this] }; @@ -456,9 +502,10 @@ public: case TextInputTarget::urlKeyboard: return UIKeyboardTypeURL; case TextInputTarget::emailAddressKeyboard: return UIKeyboardTypeEmailAddress; case TextInputTarget::phoneNumberKeyboard: return UIKeyboardTypePhonePad; - default: jassertfalse; break; + case TextInputTarget::passwordKeyboard: return UIKeyboardTypeASCIICapable; } + jassertfalse; return UIKeyboardTypeDefault; } @@ -746,6 +793,172 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; } #endif +static std::optional getKeyCodeForSpecialCharacterString (StringRef characters) +{ + static const auto map = [&] + { + std::map result { { nsStringToJuce (UIKeyInputUpArrow), KeyPress::upKey }, + { nsStringToJuce (UIKeyInputDownArrow), KeyPress::downKey }, + { nsStringToJuce (UIKeyInputLeftArrow), KeyPress::leftKey }, + { nsStringToJuce (UIKeyInputRightArrow), KeyPress::rightKey }, + { nsStringToJuce (UIKeyInputEscape), KeyPress::escapeKey }, + { nsStringToJuce (UIKeyInputPageUp), KeyPress::pageUpKey }, + { nsStringToJuce (UIKeyInputPageDown), KeyPress::pageDownKey } }; + + #if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT + if (@available (iOS 13.4, *)) + { + result.insert ({ { nsStringToJuce (UIKeyInputHome), KeyPress::homeKey }, + { nsStringToJuce (UIKeyInputEnd), KeyPress::endKey }, + { nsStringToJuce (UIKeyInputF1), KeyPress::F1Key }, + { nsStringToJuce (UIKeyInputF2), KeyPress::F2Key }, + { nsStringToJuce (UIKeyInputF3), KeyPress::F3Key }, + { nsStringToJuce (UIKeyInputF4), KeyPress::F4Key }, + { nsStringToJuce (UIKeyInputF5), KeyPress::F5Key }, + { nsStringToJuce (UIKeyInputF6), KeyPress::F6Key }, + { nsStringToJuce (UIKeyInputF7), KeyPress::F7Key }, + { nsStringToJuce (UIKeyInputF8), KeyPress::F8Key }, + { nsStringToJuce (UIKeyInputF9), KeyPress::F9Key }, + { nsStringToJuce (UIKeyInputF10), KeyPress::F10Key }, + { nsStringToJuce (UIKeyInputF11), KeyPress::F11Key }, + { nsStringToJuce (UIKeyInputF12), KeyPress::F12Key } }); + } + #endif + + #if defined (__IPHONE_15_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0 + if (@available (iOS 15.0, *)) + { + result.insert ({ { nsStringToJuce (UIKeyInputDelete), KeyPress::deleteKey } }); + } + #endif + + return result; + }(); + + const auto iter = map.find (characters); + return iter != map.cend() ? std::make_optional (iter->second) : std::nullopt; +} + +#if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT +static int getKeyCodeForCharacters (StringRef unmodified) +{ + return getKeyCodeForSpecialCharacterString (unmodified).value_or (unmodified[0]); +} + +static int getKeyCodeForCharacters (NSString* characters) +{ + return getKeyCodeForCharacters (nsStringToJuce (characters)); +} + +static void updateModifiers (const UIKeyModifierFlags flags) +{ + const auto convert = [&flags] (UIKeyModifierFlags f, int result) { return (flags & f) != 0 ? result : 0; }; + const auto juceFlags = convert (UIKeyModifierAlphaShift, 0) // capslock modifier currently not implemented + | convert (UIKeyModifierShift, ModifierKeys::shiftModifier) + | convert (UIKeyModifierControl, ModifierKeys::ctrlModifier) + | convert (UIKeyModifierAlternate, ModifierKeys::altModifier) + | convert (UIKeyModifierCommand, ModifierKeys::commandModifier) + | convert (UIKeyModifierNumericPad, 0); // numpad modifier currently not implemented + + ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons().withFlags (juceFlags); +} + +API_AVAILABLE (ios(13.4)) +static int getKeyCodeForKey (UIKey* key) +{ + return getKeyCodeForCharacters ([key charactersIgnoringModifiers]); +} + +API_AVAILABLE (ios(13.4)) +static bool attemptToConsumeKeys (JuceUIView* view, NSSet* presses) +{ + auto used = false; + + for (UIPress* press in presses) + { + if (auto* key = [press key]) + { + const auto code = getKeyCodeForKey (key); + const auto handleCodepoint = [view, &used, code] (juce_wchar codepoint) + { + // These both need to fire; no short-circuiting! + used |= view->owner->handleKeyUpOrDown (true); + used |= view->owner->handleKeyPress (code, codepoint); + }; + + if (getKeyCodeForSpecialCharacterString (nsStringToJuce ([key charactersIgnoringModifiers])).has_value()) + handleCodepoint (0); + else + for (const auto codepoint : nsStringToJuce ([key characters])) + handleCodepoint (codepoint); + } + } + + return used; +} + +- (void) pressesBegan:(NSSet*) presses withEvent:(UIPressesEvent*) event +{ + const auto handledEvent = [&] + { + if (@available (iOS 13.4, *)) + { + auto isEscape = false; + + updateModifiers ([event modifierFlags]); + + for (UIPress* press in presses) + { + if (auto* key = [press key]) + { + const auto code = getKeyCodeForKey (key); + isEscape |= code == KeyPress::escapeKey; + iOSGlobals::keysCurrentlyDown.setDown (code, true); + } + } + + return ((isEscape && owner->stringBeingComposed.isEmpty()) + || owner->findCurrentTextInputTarget() == nullptr) + && attemptToConsumeKeys (self, presses); + } + + return false; + }(); + + if (! handledEvent) + [super pressesBegan: presses withEvent: event]; +} + +/* Returns true if we handled the event. */ +static bool doKeysUp (UIViewComponentPeer* owner, NSSet* presses, UIPressesEvent* event) +{ + if (@available (iOS 13.4, *)) + { + updateModifiers ([event modifierFlags]); + + for (UIPress* press in presses) + if (auto* key = [press key]) + iOSGlobals::keysCurrentlyDown.setDown (getKeyCodeForKey (key), false); + + return owner->findCurrentTextInputTarget() == nullptr && owner->handleKeyUpOrDown (false); + } + + return false; +} + +- (void) pressesEnded:(NSSet*) presses withEvent:(UIPressesEvent*) event +{ + if (! doKeysUp (owner, presses, event)) + [super pressesEnded: presses withEvent: event]; +} + +- (void) pressesCancelled:(NSSet*) presses withEvent:(UIPressesEvent*) event +{ + if (! doKeysUp (owner, presses, event)) + [super pressesCancelled: presses withEvent: event]; +} +#endif + //============================================================================== - (BOOL) becomeFirstResponder { @@ -932,10 +1145,48 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; if (owner == nullptr) return; - owner->stringBeingComposed.clear(); - if (auto* target = owner->findCurrentTextInputTarget()) - target->insertTextAtCaret (nsStringToJuce (text)); + { + // If we're in insertText, it's because there's a focused TextInputTarget, + // and key presses from pressesBegan and pressesEnded have been composed + // into a string that is now ready for insertion. + // Because JUCE has been passing key events to the system for composition, it + // won't have been processing those key presses itself, so it may not have had + // a chance to process keys like return/tab/etc. + // It's not possible to filter out these keys during pressesBegan, because they + // may form part of a longer composition sequence. + // e.g. when entering Japanese text, the return key may be used to select an option + // from the IME menu, and in this situation the return key should not be propagated + // to the JUCE view. + // If we receive a special character (return/tab/etc.) in insertText, it can + // only be because the composition has finished, so we can turn the event into + // a KeyPress and trust the current TextInputTarget to process it correctly. + const auto redirectKeyPresses = [&] (juce_wchar codepoint) + { + // Simulate a key down + const auto code = getKeyCodeForCharacters (String::charToString (codepoint)); + iOSGlobals::keysCurrentlyDown.setDown (code, true); + owner->handleKeyUpOrDown (true); + + owner->handleKeyPress (code, codepoint); + + // Simulate a key up + iOSGlobals::keysCurrentlyDown.setDown (code, false); + owner->handleKeyUpOrDown (false); + }; + + if ([text isEqual: @"\n"] || [text isEqual: @"\r"]) + redirectKeyPresses ('\r'); + else if ([text isEqual: @"\t"]) + redirectKeyPresses ('\t'); + else + owner->replaceMarkedRangeWithText (target, nsStringToJuce (text)); + + target->setTemporaryUnderlining ({}); + } + + owner->stringBeingComposed.clear(); + owner->startOfMarkedTextInTextInputTarget = 0; } - (BOOL) hasText @@ -974,7 +1225,7 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; { if (owner != nullptr && owner->stringBeingComposed.isNotEmpty()) if (auto* target = owner->findCurrentTextInputTarget()) - return [JuceUITextRange withRange: target->getHighlightedRegion()]; + return [JuceUITextRange withRange: owner->getMarkedTextRange()]; return nil; } @@ -982,22 +1233,24 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; - (void) setMarkedText: (NSString*) markedText selectedRange: (NSRange) selectedRange { - ignoreUnused (selectedRange); - if (owner == nullptr) return; - owner->stringBeingComposed = nsStringToJuce (markedText); + const auto newMarkedText = nsStringToJuce (markedText); + const ScopeGuard scope { [&] { owner->stringBeingComposed = newMarkedText; } }; auto* target = owner->findCurrentTextInputTarget(); if (target == nullptr) return; - const auto currentHighlight = target->getHighlightedRegion(); - target->insertTextAtCaret (owner->stringBeingComposed); - target->setHighlightedRegion (currentHighlight.withLength (0)); - target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length())); + if (owner->stringBeingComposed.isEmpty()) + owner->startOfMarkedTextInTextInputTarget = target->getHighlightedRegion().getStart(); + + owner->replaceMarkedRangeWithText (target, newMarkedText); + + const auto newSelection = nsRangeToJuce (selectedRange) + owner->startOfMarkedTextInTextInputTarget; + target->setHighlightedRegion (newSelection); } - (void) unmarkText @@ -1010,8 +1263,10 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; if (target == nullptr) return; - target->insertTextAtCaret (owner->stringBeingComposed); + owner->replaceMarkedRangeWithText (target, owner->stringBeingComposed); + target->setTemporaryUnderlining ({}); owner->stringBeingComposed.clear(); + owner->startOfMarkedTextInTextInputTarget = 0; } - (NSDictionary*) markedTextStyle @@ -1374,9 +1629,15 @@ MultiTouchMapper UIViewComponentPeer::currentTouches; namespace juce { -bool KeyPress::isKeyCurrentlyDown (int) +bool KeyPress::isKeyCurrentlyDown (int keyCode) { + #if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT + return iOSGlobals::keysCurrentlyDown.isDown (keyCode) + || ('A' <= keyCode && keyCode <= 'Z' && iOSGlobals::keysCurrentlyDown.isDown ((int) CharacterFunctions::toLowerCase ((juce_wchar) keyCode))) + || ('a' <= keyCode && keyCode <= 'z' && iOSGlobals::keysCurrentlyDown.isDown ((int) CharacterFunctions::toUpperCase ((juce_wchar) keyCode))); + #else return false; + #endif } Point juce_lastMousePos; @@ -1398,7 +1659,10 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags, #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS if (@available (iOS 13, *)) - metalRenderer = std::make_unique> (view, comp.isOpaque()); + { + metalRenderer = CoreGraphicsMetalLayerRenderer::create (view, comp.isOpaque()); + jassert (metalRenderer != nullptr); + } #endif if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) @@ -1435,12 +1699,10 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags, setVisible (component.isVisible()); } -static UIViewComponentPeer* currentlyFocusedPeer = nullptr; - UIViewComponentPeer::~UIViewComponentPeer() { - if (currentlyFocusedPeer == this) - currentlyFocusedPeer = nullptr; + if (iOSGlobals::currentlyFocusedPeer == this) + iOSGlobals::currentlyFocusedPeer = nullptr; currentTouches.deleteAllTouchesForPeer (this); @@ -1658,6 +1920,11 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEv if (event == nullptr) return; + if (@available (iOS 13.4, *)) + { + updateModifiers ([event modifierFlags]); + } + NSArray* touches = [[event touchesForView: view] allObjects]; for (unsigned int i = 0; i < [touches count]; ++i) @@ -1773,12 +2040,12 @@ void UIViewComponentPeer::onScroll (UIPanGestureRecognizer* gesture) //============================================================================== void UIViewComponentPeer::viewFocusGain() { - if (currentlyFocusedPeer != this) + if (iOSGlobals::currentlyFocusedPeer != this) { - if (ComponentPeer::isValidPeer (currentlyFocusedPeer)) - currentlyFocusedPeer->handleFocusLoss(); + if (ComponentPeer::isValidPeer (iOSGlobals::currentlyFocusedPeer)) + iOSGlobals::currentlyFocusedPeer->handleFocusLoss(); - currentlyFocusedPeer = this; + iOSGlobals::currentlyFocusedPeer = this; handleFocusGain(); } @@ -1786,9 +2053,9 @@ void UIViewComponentPeer::viewFocusGain() void UIViewComponentPeer::viewFocusLoss() { - if (currentlyFocusedPeer == this) + if (iOSGlobals::currentlyFocusedPeer == this) { - currentlyFocusedPeer = nullptr; + iOSGlobals::currentlyFocusedPeer = nullptr; handleFocusLoss(); } } @@ -1798,7 +2065,7 @@ bool UIViewComponentPeer::isFocused() const if (isAppex) return true; - return isSharedWindow ? this == currentlyFocusedPeer + return isSharedWindow ? this == iOSGlobals::currentlyFocusedPeer : (window != nil && [window isKeyWindow]); } @@ -1813,6 +2080,10 @@ void UIViewComponentPeer::grabFocus() void UIViewComponentPeer::textInputRequired (Point, TextInputTarget&) { + // We need to restart the text input session so that the keyboard can change types if necessary. + if ([hiddenTextInput.get() isFirstResponder]) + [hiddenTextInput.get() resignFirstResponder]; + [hiddenTextInput.get() becomeFirstResponder]; } @@ -1834,27 +2105,6 @@ void UIViewComponentPeer::dismissPendingTextInput() [hiddenTextInput.get() resignFirstResponder]; } -BOOL UIViewComponentPeer::textViewReplaceCharacters (Range range, const String& text) -{ - if (auto* target = findCurrentTextInputTarget()) - { - auto currentSelection = target->getHighlightedRegion(); - - if (range.getLength() == 1 && text.isEmpty()) // (detect backspace) - if (currentSelection.isEmpty()) - target->setHighlightedRegion (currentSelection.withStart (currentSelection.getStart() - 1)); - - WeakReference deletionChecker (dynamic_cast (target)); - - if (text == "\r" || text == "\n" || text == "\r\n") - handleKeyPress (KeyPress::returnKey, text[0]); - else - target->insertTextAtCaret (text); - } - - return NO; -} - //============================================================================== void UIViewComponentPeer::displayLinkCallback() { diff --git a/modules/juce_gui_basics/native/juce_ios_Windowing.mm b/modules/juce_gui_basics/native/juce_ios_Windowing.mm index 4b254a46..6fffc44e 100644 --- a/modules/juce_gui_basics/native/juce_ios_Windowing.mm +++ b/modules/juce_gui_basics/native/juce_ios_Windowing.mm @@ -480,7 +480,7 @@ public: : callback (std::move (cb)), shouldDeleteThis (deleteOnCompletion) { - if (currentlyFocusedPeer != nullptr) + if (iOSGlobals::currentlyFocusedPeer != nullptr) { UIAlertController* alert = [UIAlertController alertControllerWithTitle: juceStringToNS (opts.getTitle()) message: juceStringToNS (opts.getMessage()) @@ -490,9 +490,9 @@ public: addButton (alert, opts.getButtonText (1)); addButton (alert, opts.getButtonText (2)); - [currentlyFocusedPeer->controller presentViewController: alert - animated: YES - completion: nil]; + [iOSGlobals::currentlyFocusedPeer->controller presentViewController: alert + animated: YES + completion: nil]; } else { diff --git a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp index 29d702f4..f1e71c00 100644 --- a/modules/juce_gui_basics/native/juce_linux_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_linux_Windowing.cpp @@ -61,6 +61,8 @@ public: xSettings->addListener (this); getNativeRealtimeModifiers = []() -> ModifierKeys { return XWindowSystem::getInstance()->getNativeRealtimeModifiers(); }; + + updateVBlankTimer(); } ~LinuxComponentPeer() override @@ -392,6 +394,15 @@ public: } } + bool setWindowAssociation (::Window windowIn) + { + clearWindowAssociation(); + association = { this, windowIn }; + return association.isValid(); + } + + void clearWindowAssociation() { association = {}; } + //============================================================================== static bool isActiveApplication; bool focused = false; @@ -571,13 +582,13 @@ private: { if (auto* display = Desktop::getInstance().getDisplays().getDisplayForRect (bounds)) { - if (display->verticalFrequencyHz) - { - const auto newIntFrequencyHz = roundToInt (*display->verticalFrequencyHz); + // Some systems fail to set an explicit refresh rate, or ask for a refresh rate of 0 + // (observed on Raspbian Bullseye over VNC). In these situations, use a fallback value. + const auto newIntFrequencyHz = roundToInt (display->verticalFrequencyHz.value_or (0.0)); + const auto frequencyToUse = newIntFrequencyHz != 0 ? newIntFrequencyHz : 100; - if (vBlankManager.getTimerInterval() != newIntFrequencyHz) - vBlankManager.startTimerHz (newIntFrequencyHz); - } + if (vBlankManager.getTimerInterval() != frequencyToUse) + vBlankManager.startTimerHz (frequencyToUse); } } @@ -591,6 +602,7 @@ private: bool fullScreen = false, isAlwaysOnTop = false; double currentScaleFactor = 1.0; Array glRepaintListeners; + ScopedWindowAssociation association; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LinuxComponentPeer) diff --git a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h index 791379c7..bfa8f0cb 100644 --- a/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h +++ b/modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h @@ -35,12 +35,11 @@ class CoreGraphicsMetalLayerRenderer { public: //============================================================================== - CoreGraphicsMetalLayerRenderer (ViewType* view, bool isOpaque) + static auto create (ViewType* view, bool isOpaque) { - device.reset (MTLCreateSystemDefaultDevice()); - commandQueue.reset ([device.get() newCommandQueue]); - - attach (view, isOpaque); + ObjCObjectHandle> device { MTLCreateSystemDefaultDevice() }; + return rawToUniquePtr (device != nullptr ? new CoreGraphicsMetalLayerRenderer (device, view, isOpaque) + : nullptr); } ~CoreGraphicsMetalLayerRenderer() @@ -223,6 +222,16 @@ public: } private: + //============================================================================== + CoreGraphicsMetalLayerRenderer (ObjCObjectHandle> mtlDevice, + ViewType* view, + bool isOpaque) + : device (mtlDevice), + commandQueue ([device.get() newCommandQueue]) + { + attach (view, isOpaque); + } + //============================================================================== static auto alignTo (size_t n, size_t alignment) { diff --git a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm index 81d8b6d7..9f6bc9dc 100644 --- a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm @@ -279,10 +279,9 @@ private: && ! [[NSWorkspace sharedWorkspace] isFilePackageAtPath: juceStringToNS (f.getFullPathName())]; } - void panelSelectionDidChange (id sender) + void panelSelectionDidChange ([[maybe_unused]] id sender) { jassert (sender == panel); - ignoreUnused (sender); // NB: would need to extend FilePreviewComponent to handle the full list rather than just the first one if (preview != nullptr) diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index c77a92a9..0e6ba3e3 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -453,16 +453,12 @@ private: { ValidatorClass() : ObjCClass ("JUCEMenuValidator_") { - addMethod (menuItemInvokedSelector, menuItemInvoked); - addMethod (@selector (validateMenuItem:), validateMenuItem); + addMethod (menuItemInvokedSelector, [] (id, SEL, NSMenuItem*) {}); + addMethod (@selector (validateMenuItem:), [] (id, SEL, NSMenuItem*) { return YES; }); addProtocol (@protocol (NSMenuItemValidation)); registerClass(); } - - private: - static BOOL validateMenuItem (id, SEL, NSMenuItem*) { return YES; } - static void menuItemInvoked (id, SEL, NSMenuItem*) {} }; static ValidatorClass validatorClass; @@ -504,7 +500,7 @@ private: return m; } - // Apple Bug: For some reason [NSMenu removeAllItems] seems to leak it's objects + // Apple Bug: For some reason [NSMenu removeAllItems] seems to leak its objects // on shutdown, so we need this method to release the items one-by-one manually static void removeItemRecursive (NSMenu* parentMenu, int menuItemIndex) { @@ -544,9 +540,24 @@ private: { addIvar ("owner"); - addMethod (menuItemInvokedSelector, menuItemInvoked); - addMethod (@selector (menuNeedsUpdate:), menuNeedsUpdate); - addMethod (@selector (validateMenuItem:), validateMenuItem); + addMethod (menuItemInvokedSelector, [] (id self, SEL, NSMenuItem* item) + { + if (auto* juceItem = getPopupMenuItem (item)) + getOwner (self)->invoke (*juceItem, static_cast ([item tag])); + }); + + addMethod (@selector (menuNeedsUpdate:), [] (id self, SEL, NSMenu* menu) + { + getOwner (self)->updateTopLevelMenu (menu); + }); + + addMethod (@selector (validateMenuItem:), [] (id, SEL, NSMenuItem* item) -> BOOL + { + if (auto* juceItem = getPopupMenuItem (item)) + return juceItem->isEnabled; + + return YES; + }); addProtocol (@protocol (NSMenuDelegate)); addProtocol (@protocol (NSMenuItemValidation)); @@ -560,34 +571,15 @@ private: } private: - static auto* getPopupMenuItem (NSMenuItem* item) + static PopupMenu::Item* getPopupMenuItem (NSMenuItem* item) { return getJuceClassFromNSObject ([item representedObject]); } - static auto* getOwner (id self) + static JuceMainMenuHandler* getOwner (id self) { return getIvar (self, "owner"); } - - static void menuItemInvoked (id self, SEL, NSMenuItem* item) - { - if (auto* juceItem = getPopupMenuItem (item)) - getOwner (self)->invoke (*juceItem, static_cast ([item tag])); - } - - static void menuNeedsUpdate (id self, SEL, NSMenu* menu) - { - getOwner (self)->updateTopLevelMenu (menu); - } - - static BOOL validateMenuItem (id, SEL, NSMenuItem* item) - { - if (auto* juceItem = getPopupMenuItem (item)) - return juceItem->isEnabled; - - return YES; - } }; }; diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 65b588f9..95321245 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -151,7 +151,7 @@ public: #if USE_COREGRAPHICS_RENDERING #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS if (@available (macOS 10.14, *)) - metalRenderer = std::make_unique> (view, getComponent().isOpaque()); + metalRenderer = CoreGraphicsMetalLayerRenderer::create (view, getComponent().isOpaque()); #endif if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0) { @@ -411,12 +411,12 @@ public: if (forceFullScreen) return NSWindowCollectionBehaviorFullScreenPrimary; - // Some SDK versions don't define NSWindowCollectionBehaviorFullScreenNone - constexpr auto fullScreenNone = (NSUInteger) (1 << 9); + // Some SDK versions don't define NSWindowCollectionBehaviorFullScreenAuxiliary + constexpr auto fullScreenAux = (NSUInteger) (1 << 8); return (getStyleFlags() & (windowHasMaximiseButton | windowIsResizable)) == (windowHasMaximiseButton | windowIsResizable) ? NSWindowCollectionBehaviorFullScreenPrimary - : fullScreenNone; + : fullScreenAux; } void setCollectionBehaviour (bool forceFullScreen) const @@ -641,7 +641,7 @@ public: return usingCoreGraphics ? 1 : 0; } - void setCurrentRenderingEngine (int index) override + void setCurrentRenderingEngine ([[maybe_unused]] int index) override { #if USE_COREGRAPHICS_RENDERING if (usingCoreGraphics != (index > 0)) @@ -649,8 +649,6 @@ public: usingCoreGraphics = index > 0; [view setNeedsDisplay: true]; } - #else - ignoreUnused (index); #endif } @@ -805,10 +803,8 @@ public: { bool used = false; - for (auto u = unicode.getCharPointer(); ! u.isEmpty();) + for (auto textCharacter : unicode) { - auto textCharacter = u.getAndAdvance(); - switch (keyCode) { case NSLeftArrowFunctionKey: @@ -830,8 +826,8 @@ public: break; } - used = handleKeyUpOrDown (true) || used; - used = handleKeyPress (keyCode, textCharacter) || used; + used |= handleKeyUpOrDown (true); + used |= handleKeyPress (keyCode, textCharacter); } return used; @@ -1557,9 +1553,8 @@ public: void closeInputMethodContext() override { stringBeingComposed.clear(); - const auto* inputContext = [NSTextInputContext currentInputContext]; - if (inputContext != nil) + if (const auto* inputContext = [view inputContext]) [inputContext discardMarkedText]; } @@ -1580,6 +1575,39 @@ public: [window setDocumentEdited: b]; } + bool sendEventToInputContextOrComponent (NSEvent* ev) + { + // We assume that the event will be handled by the IME. + // Occasionally, the inputContext may be sent key events like cmd+Q, which it will turn + // into a noop: call and forward to doCommandBySelector:. + // In this case, the event will be extracted from keyEventBeingHandled and passed to the + // focused component, and viewCannotHandleEvent will be set depending on whether the event + // was handled by the component. + // If the event was *not* handled by the component, and was also not consumed completely by + // the IME, it's important to return the event to the system for further handling, so that + // the main menu works as expected. + viewCannotHandleEvent = false; + keyEventBeingHandled.reset ([ev retain]); + const WeakReference ref { this }; + // redirectKeyDown may delete this peer! + const ScopeGuard scope { [&ref] { if (ref != nullptr) ref->keyEventBeingHandled = nullptr; } }; + + const auto handled = [&]() -> bool + { + if (auto* target = findCurrentTextInputTarget()) + if (const auto* inputContext = [view inputContext]) + return [inputContext handleEvent: ev] && ! viewCannotHandleEvent; + + return false; + }(); + + if (handled) + return true; + + stringBeingComposed.clear(); + return redirectKeyDown (ev); + } + //============================================================================== NSWindow* window = nil; NSView* view = nil; @@ -1590,11 +1618,13 @@ public: #else bool usingCoreGraphics = false; #endif - bool textWasInserted = false, isFirstLiveResize = false; + NSUniquePtr keyEventBeingHandled; + bool isFirstLiveResize = false, viewCannotHandleEvent = false; bool isStretchingTop = false, isStretchingLeft = false, isStretchingBottom = false, isStretchingRight = false; bool windowRepresentsFile = false; bool isAlwaysOnTop = false, wasAlwaysOnTop = false; String stringBeingComposed; + int startOfMarkedTextInTextInputTarget = 0; Rectangle lastSizeBeforeZoom; RectangleList deferredRepaints; @@ -2005,18 +2035,16 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> addMethod (@selector (keyDown:), [] (id self, SEL, NSEvent* ev) { - if (auto* owner = getOwner (self)) + const auto handled = [&] { - owner->textWasInserted = false; + if (auto* owner = getOwner (self)) + return owner->sendEventToInputContextOrComponent (ev); - if (auto* target = owner->findCurrentTextInputTarget()) - [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]]; - else - owner->stringBeingComposed.clear(); + return false; + }(); - if (! (owner->textWasInserted || owner->stringBeingComposed.isNotEmpty() || owner->redirectKeyDown (ev))) - sendSuperclassMessage (self, @selector (keyDown:), ev); - } + if (! handled) + sendSuperclassMessage (self, @selector (keyDown:), ev); }); addMethod (@selector (keyUp:), [] (id self, SEL, NSEvent* ev) @@ -2027,41 +2055,160 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> sendSuperclassMessage (self, @selector (keyUp:), ev); }); - addMethod (@selector (insertText:), [] (id self, SEL, id aString) + // See "The Path of Key Events" on this page: + // https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html + // Normally, 'special' key presses (cursor keys, shortcuts, return, delete etc.) will be + // sent down the view hierarchy to this function before any of the other keyboard handling + // functions. + // If any object returns YES from performKeyEquivalent, then the event is consumed. + // If no object handles the key equivalent, then the event will be sent to the main menu. + // If the menu is also unable to respond to the event, then the event will be sent + // to keyDown:/keyUp: via sendEvent:, but this time the event will be sent to the first + // responder and propagated back up the responder chain. + // This architecture presents some issues in JUCE apps, which always expect the focused + // Component to be sent all key presses *including* special keys. + // There are also some slightly pathological cases that JUCE needs to support, for example + // the situation where one of the cursor keys is bound to a main menu item. By default, + // macOS would send the cursor event to performKeyEquivalent on each NSResponder, then send + // the event to the main menu if no responder handled it. This would mean that the focused + // Component would never see the event, which would break widgets like the TextEditor, which + // expect to take precedence over menu items when they have focus. + // Another layer of subtlety is that some IMEs require cursor key input. When long-pressing + // the 'e' key to bring up the accent menu, the popup menu should receive cursor events + // before the focused component. + // To fulfil all of these requirements, we handle special keys ('key equivalents') like any + // other key event, and send these events firstly to the NSTextInputContext (if there's an + // active TextInputTarget), and then on to the focused Component in the case that the + // input handler is unable to use the keypress. If the event still hasn't been used, then + // it will be sent to the superclass's performKeyEquivalent: function, which will give the + // OS a chance to handle events like cmd+Q, cmd+`, cmd+H etc. + addMethod (@selector (performKeyEquivalent:), [] (id self, SEL s, NSEvent* ev) -> BOOL { - // This commits multi-byte text when return is pressed, or after every keypress for western keyboards if (auto* owner = getOwner (self)) - { - NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString; + return owner->sendEventToInputContextOrComponent (ev); - if ([newText length] > 0) + return sendSuperclassMessage (self, s, ev); + }); + + addMethod (@selector (insertText:replacementRange:), [] (id self, SEL, id aString, NSRange replacementRange) + { + // This commits multi-byte text when using an IME, or after every keypress for western keyboards + if (auto* owner = getOwner (self)) + { + if (auto* target = owner->findCurrentTextInputTarget()) { - if (auto* target = owner->findCurrentTextInputTarget()) + const auto newText = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString); + + if (newText.isNotEmpty()) { - target->insertTextAtCaret (nsStringToJuce (newText)); - owner->textWasInserted = true; + target->setHighlightedRegion ([&] + { + // To test this, try long-pressing 'e' to bring up the accent popup, + // then select one of the accented options. + if (replacementRange.location != NSNotFound) + return nsRangeToJuce (replacementRange); + + // To test this, try entering the characters 'a b ' with the 2-Set + // Korean IME. The input client should receive three calls to setMarkedText: + // followed by a call to insertText: + // The final call to insertText should overwrite the currently-marked + // text, and reset the composition string. + if (owner->stringBeingComposed.isNotEmpty()) + return Range::withStartAndLength (owner->startOfMarkedTextInTextInputTarget, + owner->stringBeingComposed.length()); + + return target->getHighlightedRegion(); + }()); + + target->insertTextAtCaret (newText); + target->setTemporaryUnderlining ({}); } } + else + jassertfalse; // The system should not attempt to insert text when there is no active TextInputTarget owner->stringBeingComposed.clear(); } }); - addMethod (@selector (doCommandBySelector:), [] (id, SEL, SEL) {}); + addMethod (@selector (doCommandBySelector:), [] (id self, SEL, SEL sel) + { + const auto handled = [&] + { + // 'Special' keys, like backspace, return, tab, and escape, are converted to commands by the system. + // Components still expect to receive these events as key presses, so we send the currently-processed + // key event (if any). + if (auto* owner = getOwner (self)) + { + owner->viewCannotHandleEvent = [&] + { + if (auto* e = owner->keyEventBeingHandled.get()) + { + if ([e type] != NSEventTypeKeyDown && [e type] != NSEventTypeKeyUp) + return true; + + return ! ([e type] == NSEventTypeKeyDown ? owner->redirectKeyDown (e) + : owner->redirectKeyUp (e)); + } + + return true; + }(); + + return ! owner->viewCannotHandleEvent; + } + + return false; + }(); + + if (! handled) + sendSuperclassMessage (self, @selector (doCommandBySelector:), sel); + }); - addMethod (@selector (setMarkedText:selectedRange:), [] (id self, SEL, id aString, NSRange) + addMethod (@selector (setMarkedText:selectedRange:replacementRange:), [] (id self, + SEL, + id aString, + const NSRange selectedRange, + const NSRange replacementRange) { if (auto* owner = getOwner (self)) { - owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]] - ? [aString string] : aString); - if (auto* target = owner->findCurrentTextInputTarget()) { - auto currentHighlight = target->getHighlightedRegion(); - target->insertTextAtCaret (owner->stringBeingComposed); - target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length())); - owner->textWasInserted = true; + const auto toInsert = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString); + const auto [initialHighlight, marked, finalHighlight] = [&] + { + if (owner->stringBeingComposed.isNotEmpty()) + { + const auto toReplace = Range::withStartAndLength (owner->startOfMarkedTextInTextInputTarget, + owner->stringBeingComposed.length()); + + return replacementRange.location != NSNotFound + // There's a composition underway, so replacementRange is relative to the marked text, + // and selectedRange is relative to the inserted string. + ? std::tuple (toReplace, + owner->stringBeingComposed.replaceSection (static_cast (replacementRange.location), + static_cast (replacementRange.length), + toInsert), + nsRangeToJuce (selectedRange) + static_cast (replacementRange.location)) + // The replacementRange is invalid, so replace all the marked text. + : std::tuple (toReplace, toInsert, nsRangeToJuce (selectedRange)); + } + + if (replacementRange.location != NSNotFound) + // There's no string composition in progress, so replacementRange is relative to the start + // of the document. + return std::tuple (nsRangeToJuce (replacementRange), toInsert, nsRangeToJuce (selectedRange)); + + return std::tuple (target->getHighlightedRegion(), toInsert, nsRangeToJuce (selectedRange)); + }(); + + owner->stringBeingComposed = marked; + owner->startOfMarkedTextInTextInputTarget = initialHighlight.getStart(); + + target->setHighlightedRegion (initialHighlight); + target->insertTextAtCaret (marked); + target->setTemporaryUnderlining ({ Range::withStartAndLength (initialHighlight.getStart(), marked.length()) }); + target->setHighlightedRegion (finalHighlight + owner->startOfMarkedTextInTextInputTarget); } } }); @@ -2075,7 +2222,7 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> if (auto* target = owner->findCurrentTextInputTarget()) { target->insertTextAtCaret (owner->stringBeingComposed); - owner->textWasInserted = true; + target->setTemporaryUnderlining ({}); } owner->stringBeingComposed.clear(); @@ -2089,21 +2236,20 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> return owner != nullptr && owner->stringBeingComposed.isNotEmpty(); }); - addMethod (@selector (conversationIdentifier), [] (id self, SEL) + addMethod (@selector (attributedSubstringForProposedRange:actualRange:), [] (id self, SEL, NSRange theRange, NSRangePointer actualRange) -> NSAttributedString* { - return (long) (pointer_sized_int) self; - }); + jassert (theRange.location != NSNotFound); - addMethod (@selector (attributedSubstringFromRange:), [] (id self, SEL, NSRange theRange) -> NSAttributedString* - { if (auto* owner = getOwner (self)) { if (auto* target = owner->findCurrentTextInputTarget()) { - Range r ((int) theRange.location, - (int) (theRange.location + theRange.length)); + const auto clamped = Range { 0, target->getTotalNumChars() }.constrainRange (nsRangeToJuce (theRange)); + + if (actualRange != nullptr) + *actualRange = juceRangeToNS (clamped); - return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease]; + return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (clamped))] autorelease]; } } @@ -2114,7 +2260,8 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> { if (auto* owner = getOwner (self)) if (owner->stringBeingComposed.isNotEmpty()) - return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length()); + return NSMakeRange (static_cast (owner->startOfMarkedTextInTextInputTarget), + static_cast (owner->stringBeingComposed.length())); return NSMakeRange (NSNotFound, 0); }); @@ -2125,22 +2272,40 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> { if (auto* target = owner->findCurrentTextInputTarget()) { - auto highlight = target->getHighlightedRegion(); + const auto highlight = target->getHighlightedRegion(); - if (! highlight.isEmpty()) - return NSMakeRange ((NSUInteger) highlight.getStart(), - (NSUInteger) highlight.getLength()); + // The accent-selector popup does not show if the selectedRange location is NSNotFound! + return NSMakeRange ((NSUInteger) highlight.getStart(), + (NSUInteger) highlight.getLength()); } } return NSMakeRange (NSNotFound, 0); }); - addMethod (@selector (firstRectForCharacterRange:), [] (id self, SEL, NSRange) + addMethod (@selector (firstRectForCharacterRange:actualRange:), [] (id self, SEL, NSRange range, NSRangePointer actualRange) { if (auto* owner = getOwner (self)) - if (auto* comp = dynamic_cast (owner->findCurrentTextInputTarget())) - return flippedScreenRect (makeNSRect (comp->getScreenBounds())); + { + if (auto* target = owner->findCurrentTextInputTarget()) + { + if (auto* comp = dynamic_cast (target)) + { + const auto codePointRange = range.location == NSNotFound ? Range::emptyRange (target->getCaretPosition()) + : nsRangeToJuce (range); + const auto clamped = Range { 0, target->getTotalNumChars() }.constrainRange (codePointRange); + + if (actualRange != nullptr) + *actualRange = juceRangeToNS (clamped); + + const auto rect = codePointRange.isEmpty() ? target->getCaretRectangleForCharIndex (codePointRange.getStart()) + : target->getTextBounds (codePointRange).getRectangle (0); + const auto areaOnDesktop = comp->localAreaToGlobal (rect); + + return flippedScreenRect (makeNSRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop))); + } + } + } return NSZeroRect; }); @@ -2192,47 +2357,12 @@ struct JuceNSViewClass : public NSViewComponentPeerWrapper> addMethod (@selector (isFlipped), [] (id, SEL) { return true; }); - addMethod (@selector (performKeyEquivalent:), [] (id self, SEL s, NSEvent* event) - { - // We try passing shortcut keys to the currently focused component first. - // If the component doesn't want the event, we'll fall back to the superclass - // implementation, which will pass the event to the main menu. - if (tryPassingKeyEventToPeer (event)) - return YES; - - return sendSuperclassMessage (self, s, event); - }); - - addProtocol (@protocol (NSTextInput)); + addProtocol (@protocol (NSTextInputClient)); registerClass(); } private: - static void updateTrackingAreas (id self, SEL) - { - sendSuperclassMessage (self, @selector (updateTrackingAreas)); - - resetTrackingArea (static_cast (self)); - } - - static bool tryPassingKeyEventToPeer (NSEvent* e) - { - if ([e type] != NSEventTypeKeyDown && [e type] != NSEventTypeKeyUp) - return false; - - if (auto* focused = Component::getCurrentlyFocusedComponent()) - { - if (auto* peer = dynamic_cast (focused->getPeer())) - { - return [e type] == NSEventTypeKeyDown ? peer->redirectKeyDown (e) - : peer->redirectKeyUp (e); - } - } - - return false; - } - template static void callOnOwner (id self, Func&& func, Args&&... args) { @@ -2477,29 +2607,6 @@ struct JuceNSWindowClass : public NSViewComponentPeerWrapper MouseInputSource::getCurrentRawMousePosition() } } +static ComponentPeer* findPeerContainingPoint (Point globalPos) +{ + for (int i = 0; i < juce::ComponentPeer::getNumPeers(); ++i) + { + auto* peer = juce::ComponentPeer::getPeer (i); + + if (peer->contains (peer->globalToLocal (globalPos).toInt(), false)) + return peer; + } + + return nullptr; +} + void MouseInputSource::setRawMousePosition (Point newPosition) { + const auto oldPosition = Desktop::getInstance().getMainMouseSource().getRawScreenPosition(); + // this rubbish needs to be done around the warp call, to avoid causing a // bizarre glitch.. CGAssociateMouseAndMouseCursorPosition (false); CGWarpMouseCursorPosition (convertToCGPoint (newPosition)); CGAssociateMouseAndMouseCursorPosition (true); + + // Mouse enter and exit events seem to be always generated as a consequence of programmatically + // moving the mouse. However, when the mouse stays within the same peer no mouse move event is + // generated, and we lose track of the correct Component under the mouse. Hence, we need to + // generate this missing event here. + if (auto* peer = findPeerContainingPoint (newPosition); peer != nullptr + && peer == findPeerContainingPoint (oldPosition)) + { + peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse, + peer->globalToLocal (newPosition), + ModifierKeys::currentModifiers, + 0.0f, + 0.0f, + Time::currentTimeMillis()); + } } double Desktop::getDefaultMasterScale() @@ -534,11 +564,11 @@ public: { PMAssertion() : assertionID (kIOPMNullAssertionID) { - IOReturn res = IOPMAssertionCreateWithName (kIOPMAssertionTypePreventUserIdleDisplaySleep, - kIOPMAssertionLevelOn, - CFSTR ("JUCE Playback"), - &assertionID); - jassert (res == kIOReturnSuccess); ignoreUnused (res); + [[maybe_unused]] IOReturn res = IOPMAssertionCreateWithName (kIOPMAssertionTypePreventUserIdleDisplaySleep, + kIOPMAssertionLevelOn, + CFSTR ("JUCE Playback"), + &assertionID); + jassert (res == kIOReturnSuccess); } ~PMAssertion() @@ -750,10 +780,9 @@ void Process::setDockIconVisible (bool isVisible) { ProcessSerialNumber psn { 0, kCurrentProcess }; - OSStatus err = TransformProcessType (&psn, isVisible ? kProcessTransformToForegroundApplication - : kProcessTransformToUIElementApplication); + [[maybe_unused]] OSStatus err = TransformProcessType (&psn, isVisible ? kProcessTransformToForegroundApplication + : kProcessTransformToUIElementApplication); jassert (err == 0); - ignoreUnused (err); } } // namespace juce diff --git a/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp b/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp index e64459fa..22432627 100644 --- a/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp +++ b/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp @@ -262,7 +262,7 @@ namespace DragAndDropHelpers JobStatus runJob() override { - ignoreUnused (OleInitialize (nullptr)); + [[maybe_unused]] const auto result = OleInitialize (nullptr); auto* source = new JuceDropSource(); auto* data = new JuceDataObject (&format, &medium); diff --git a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp index 4c3df9e4..31652605 100644 --- a/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp +++ b/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp @@ -515,7 +515,7 @@ private: struct ScopedCoInitialize { // IUnknown_GetWindow will only succeed when instantiated in a single-thread apartment - ScopedCoInitialize() { ignoreUnused (CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)); } + ScopedCoInitialize() { [[maybe_unused]] const auto result = CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); } ~ScopedCoInitialize() { CoUninitialize(); } }; diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 9f97d077..c7a78b54 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -453,10 +453,9 @@ static bool isPerMonitorDPIAwareProcess() #endif } -static bool isPerMonitorDPIAwareWindow (HWND nativeWindow) +static bool isPerMonitorDPIAwareWindow ([[maybe_unused]] HWND nativeWindow) { #if ! JUCE_WIN_PER_MONITOR_DPI_AWARE - ignoreUnused (nativeWindow); return false; #else setDPIAwareness(); @@ -500,13 +499,36 @@ static double getGlobalDPI() } //============================================================================== -class ScopedThreadDPIAwarenessSetter::NativeImpl +class ScopedSuspendResumeNotificationRegistration { public: - explicit NativeImpl (HWND nativeWindow) + ScopedSuspendResumeNotificationRegistration() = default; + + explicit ScopedSuspendResumeNotificationRegistration (HWND window) + : handle (SystemStats::getOperatingSystemType() >= SystemStats::Windows8_0 + ? RegisterSuspendResumeNotification (window, DEVICE_NOTIFY_WINDOW_HANDLE) + : nullptr) + {} + +private: + struct Destructor { - ignoreUnused (nativeWindow); + void operator() (HPOWERNOTIFY ptr) const + { + if (ptr != nullptr) + UnregisterSuspendResumeNotification (ptr); + } + }; + + std::unique_ptr, Destructor> handle; +}; +//============================================================================== +class ScopedThreadDPIAwarenessSetter::NativeImpl +{ +public: + explicit NativeImpl (HWND nativeWindow [[maybe_unused]]) + { #if JUCE_WIN_PER_MONITOR_DPI_AWARE if (auto* functionSingleton = FunctionSingleton::getInstance()) { @@ -1619,6 +1641,31 @@ private: JUCE_IMPLEMENT_SINGLETON (VBlankDispatcher) +//============================================================================== +class SimpleTimer : private Timer +{ +public: + SimpleTimer (int intervalMs, std::function callbackIn) + : callback (std::move (callbackIn)) + { + jassert (callback); + startTimer (intervalMs); + } + + ~SimpleTimer() override + { + stopTimer(); + } + +private: + void timerCallback() override + { + callback(); + } + + std::function callback; +}; + //============================================================================== class HWNDComponentPeer : public ComponentPeer, private VBlankListener, @@ -1660,12 +1707,18 @@ public: return ModifierKeys::currentModifiers; }; - if (updateCurrentMonitor()) - VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); + updateCurrentMonitorAndRefreshVBlankDispatcher(); + + if (parentToAddTo != nullptr) + monitorUpdateTimer.emplace (1000, [this] { updateCurrentMonitorAndRefreshVBlankDispatcher(); }); + + suspendResumeRegistration = ScopedSuspendResumeNotificationRegistration { hwnd }; } ~HWNDComponentPeer() override { + suspendResumeRegistration = {}; + VBlankDispatcher::getInstance()->removeListener (*this); // do this first to avoid messages arriving for this window before it's destroyed @@ -2225,8 +2278,7 @@ public: nameBuffer.clear(); nameBuffer.resize (bufferSize + 1, 0); // + 1 for the null terminator - const auto readCharacters = DragQueryFile (dropFiles, i, nameBuffer.data(), (UINT) nameBuffer.size()); - ignoreUnused (readCharacters); + [[maybe_unused]] const auto readCharacters = DragQueryFile (dropFiles, i, nameBuffer.data(), (UINT) nameBuffer.size()); jassert (readCharacters == bufferSize); dragInfo.files.add (String (nameBuffer.data())); @@ -2912,10 +2964,8 @@ private: } #endif - void setCurrentRenderingEngine (int index) override + void setCurrentRenderingEngine ([[maybe_unused]] int index) override { - ignoreUnused (index); - #if JUCE_DIRECT2D if (getAvailableRenderingEngines().size() > 1) { @@ -3484,7 +3534,7 @@ private: const UINT keyChar = MapVirtualKey ((UINT) key, 2); const UINT scanCode = MapVirtualKey ((UINT) key, 0); BYTE keyState[256]; - ignoreUnused (GetKeyboardState (keyState)); + [[maybe_unused]] const auto state = GetKeyboardState (keyState); WCHAR text[16] = { 0 }; if (ToUnicode ((UINT) key, scanCode, keyState, text, 8, 0) != 1) @@ -3652,10 +3702,18 @@ private: return 0; } - bool updateCurrentMonitor() + enum class ForceRefreshDispatcher + { + no, + yes + }; + + void updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher force = ForceRefreshDispatcher::no) { auto monitor = MonitorFromWindow (hwnd, MONITOR_DEFAULTTONULL); - return std::exchange (currentMonitor, monitor) != monitor; + + if (std::exchange (currentMonitor, monitor) != monitor || force == ForceRefreshDispatcher::yes) + VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); } bool handlePositionChanged() @@ -3674,9 +3732,7 @@ private: } handleMovedOrResized(); - - if (updateCurrentMonitor()) - VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor); + updateCurrentMonitorAndRefreshVBlankDispatcher(); return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly. } @@ -3834,8 +3890,7 @@ private: auto* dispatcher = VBlankDispatcher::getInstance(); dispatcher->reconfigureDisplays(); - updateCurrentMonitor(); - dispatcher->updateDisplay (*this, currentMonitor); + updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher::yes); } //============================================================================== @@ -4601,6 +4656,8 @@ private: bool shouldIgnoreModalDismiss = false; RectangleList deferredRepaints; + ScopedSuspendResumeNotificationRegistration suspendResumeRegistration; + std::optional monitorUpdateTimer; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer) diff --git a/modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h b/modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h new file mode 100644 index 00000000..82b90388 --- /dev/null +++ b/modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h @@ -0,0 +1,118 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +extern XContext windowHandleXContext; + +/* Attaches a pointer to a given window, so that it can be retrieved with XFindContext on + the windowHandleXContext. +*/ +class ScopedWindowAssociation +{ +public: + ScopedWindowAssociation() = default; + + ScopedWindowAssociation (void* associatedIn, Window windowIn) + : associatedPointer ([&]() -> void* + { + if (associatedIn == nullptr) + return nullptr; + + // If you hit this, there's already a pointer associated with this window. + const auto display = XWindowSystem::getInstance()->getDisplay(); + jassert (! getAssociatedPointer (display, windowIn).has_value()); + + if (X11Symbols::getInstance()->xSaveContext (display, + static_cast (windowIn), + windowHandleXContext, + unalignedPointerCast (associatedIn)) != 0) + { + jassertfalse; + return nullptr; + } + + return associatedIn; + }()), + window (static_cast (windowIn)) {} + + ScopedWindowAssociation (const ScopedWindowAssociation&) = delete; + ScopedWindowAssociation& operator= (const ScopedWindowAssociation&) = delete; + + ScopedWindowAssociation (ScopedWindowAssociation&& other) noexcept + : associatedPointer (std::exchange (other.associatedPointer, nullptr)), window (other.window) {} + + ScopedWindowAssociation& operator= (ScopedWindowAssociation&& other) noexcept + { + ScopedWindowAssociation { std::move (other) }.swap (*this); + return *this; + } + + ~ScopedWindowAssociation() noexcept + { + if (associatedPointer == nullptr) + return; + + const auto display = XWindowSystem::getInstance()->getDisplay(); + const auto ptr = getAssociatedPointer (display, window); + + if (! ptr.has_value()) + { + // If you hit this, something else has cleared this association before we were able to. + jassertfalse; + return; + } + + jassert (unalignedPointerCast (associatedPointer) == *ptr); + + if (X11Symbols::getInstance()->xDeleteContext (display, window, windowHandleXContext) != 0) + jassertfalse; + } + + bool isValid() const { return associatedPointer != nullptr; } + +private: + static std::optional getAssociatedPointer (Display* display, Window window) + { + XPointer ptr{}; + + if (X11Symbols::getInstance()->xFindContext (display, window, windowHandleXContext, &ptr) != 0) + return std::nullopt; + + return ptr; + } + + void swap (ScopedWindowAssociation& other) noexcept + { + std::swap (other.associatedPointer, associatedPointer); + std::swap (other.window, window); + } + + void* associatedPointer = nullptr; + XID window{}; +}; + +} // namespace juce diff --git a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp index ec79806e..6103b744 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp +++ b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp @@ -361,10 +361,8 @@ namespace X11ErrorHandling return 0; } - static int errorHandler (::Display* display, XErrorEvent* event) + static int errorHandler ([[maybe_unused]] ::Display* display, [[maybe_unused]] XErrorEvent* event) { - ignoreUnused (display, event); - #if JUCE_DEBUG_XERRORS char errorStr[64] = { 0 }; char requestStr[64] = { 0 }; @@ -1434,15 +1432,21 @@ ComponentPeer* getPeerFor (::Window windowH) if (windowH == 0) return nullptr; - XPointer peer = nullptr; - if (auto* display = XWindowSystem::getInstance()->getDisplay()) { XWindowSystemUtilities::ScopedXLock xLock; - X11Symbols::getInstance()->xFindContext (display, (XID) windowH, windowHandleXContext, &peer); + + if (XPointer peer = nullptr; + X11Symbols::getInstance()->xFindContext (display, + static_cast (windowH), + windowHandleXContext, + &peer) == 0) + { + return unalignedPointerCast (peer); + } } - return unalignedPointerCast (peer); + return nullptr; } //============================================================================== @@ -1545,7 +1549,7 @@ static int getAllEventsMask (bool ignoresMouseClicks) &swa); // Set the window context to identify the window handle object - if (X11Symbols::getInstance()->xSaveContext (display, (XID) windowH, windowHandleXContext, (XPointer) peer)) + if (! peer->setWindowAssociation (windowH)) { // Failed jassertfalse; @@ -1627,10 +1631,7 @@ void XWindowSystem::destroyWindow (::Window windowH) XWindowSystemUtilities::ScopedXLock xLock; - XPointer handlePointer; - - if (! X11Symbols::getInstance()->xFindContext (display, (XID) windowH, windowHandleXContext, &handlePointer)) - X11Symbols::getInstance()->xDeleteContext (display, (XID) windowH, windowHandleXContext); + peer->clearWindowAssociation(); X11Symbols::getInstance()->xDestroyWindow (display, windowH); @@ -2682,7 +2683,7 @@ Array XWindowSystem::findDisplays (float masterScale) const return displays; } -::Window XWindowSystem::createKeyProxy (::Window windowH) const +::Window XWindowSystem::createKeyProxy (::Window windowH) { jassert (windowH != 0); @@ -2696,7 +2697,6 @@ Array XWindowSystem::findDisplays (float masterScale) const &swa); X11Symbols::getInstance()->xMapWindow (display, keyProxy); - X11Symbols::getInstance()->xSaveContext (display, (XID) keyProxy, windowHandleXContext, (XPointer) this); return keyProxy; } @@ -2705,11 +2705,6 @@ void XWindowSystem::deleteKeyProxy (::Window keyProxy) const { jassert (keyProxy != 0); - XPointer handlePointer; - - if (! X11Symbols::getInstance()->xFindContext (display, (XID) keyProxy, windowHandleXContext, &handlePointer)) - X11Symbols::getInstance()->xDeleteContext (display, (XID) keyProxy, windowHandleXContext); - X11Symbols::getInstance()->xDestroyWindow (display, keyProxy); X11Symbols::getInstance()->xSync (display, false); diff --git a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h index 0659adbe..7fd30a84 100644 --- a/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h +++ b/modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h @@ -225,7 +225,7 @@ public: Array findDisplays (float masterScale) const; - ::Window createKeyProxy (::Window) const; + ::Window createKeyProxy (::Window); void deleteKeyProxy (::Window) const; bool externalDragFileInit (LinuxComponentPeer*, const StringArray& files, bool canMove, std::function&& callback) const; diff --git a/modules/juce_gui_basics/widgets/juce_ListBox.cpp b/modules/juce_gui_basics/widgets/juce_ListBox.cpp index 082cff66..43700aa3 100644 --- a/modules/juce_gui_basics/widgets/juce_ListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_ListBox.cpp @@ -1207,9 +1207,8 @@ std::unique_ptr ListBox::createAccessibilityHandler() } //============================================================================== -Component* ListBoxModel::refreshComponentForRow (int, bool, Component* existingComponentToUpdate) +Component* ListBoxModel::refreshComponentForRow (int, bool, [[maybe_unused]] Component* existingComponentToUpdate) { - ignoreUnused (existingComponentToUpdate); jassert (existingComponentToUpdate == nullptr); // indicates a failure in the code that recycles the components return nullptr; } diff --git a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp index 4dc53dc3..11075ace 100644 --- a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp +++ b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp @@ -500,6 +500,33 @@ void TableHeaderComponent::reactToMenuItem (const int menuReturnId, const int /* setColumnVisible (menuReturnId, ! isColumnVisible (menuReturnId)); } +void TableHeaderComponent::drawColumnHeader (Graphics& g, LookAndFeel& lf, const ColumnInfo& ci) +{ + // Only paint columns that are visible + if (! ci.isVisible()) + return; + + // If this column is being dragged, it shouldn't be drawn in the table header + if (ci.id == columnIdBeingDragged && dragOverlayComp != nullptr && dragOverlayComp->isVisible()) + return; + + // There's no point drawing this column header if no part of it is visible + if (! g.getClipBounds() + .getHorizontalRange() + .intersects (Range::withStartAndLength (ci.getX(), ci.width))) + return; + + Graphics::ScopedSaveState ss (g); + + g.setOrigin (ci.getX(), ci.getY()); + g.reduceClipRegion (0, 0, ci.width, ci.getHeight()); + + lf.drawTableHeaderColumn (g, *this, ci.getTitle(), ci.id, ci.width, getHeight(), + ci.id == columnIdUnderMouse, + ci.id == columnIdUnderMouse && isMouseButtonDown(), + ci.propertyFlags); +} + void TableHeaderComponent::paint (Graphics& g) { auto& lf = getLookAndFeel(); @@ -507,48 +534,18 @@ void TableHeaderComponent::paint (Graphics& g) lf.drawTableHeaderBackground (g, *this); for (auto* ci : columns) - { - if (ci->isVisible() && ci->getWidth() > 0) - { - Graphics::ScopedSaveState ss (g); - - g.setOrigin (ci->getX(), ci->getY()); - g.reduceClipRegion (0, 0, ci->getWidth(), ci->getHeight()); - - lf.drawTableHeaderColumn (g, *this, ci->getTitle(), ci->id, ci->width, getHeight(), - ci->id == columnIdUnderMouse, - ci->id == columnIdUnderMouse && isMouseButtonDown(), - ci->propertyFlags); - } - } + drawColumnHeader (g, lf, *ci); } void TableHeaderComponent::resized() { - auto clip = getBounds(); - int x = 0; - for (auto* ci : columns) - ci->setBounds (0, 0, 0, 0); - for (auto* ci : columns) { - if (ci->isVisible()) - { - if (x + ci->width > clip.getX() - && (ci->id != columnIdBeingDragged - || dragOverlayComp == nullptr - || ! dragOverlayComp->isVisible())) - { - ci->setBounds (x, 0, ci->width, getHeight()); - } - - x += ci->width; - - if (x >= clip.getRight()) - break; - } + const auto widthToUse = ci->isVisible() ? ci->width : 0; + ci->setBounds (x, 0, widthToUse, getHeight()); + x += widthToUse; } } diff --git a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h index 3d1b0173..5afa5a38 100644 --- a/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h +++ b/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h @@ -453,6 +453,7 @@ private: void updateColumnUnderMouse (const MouseEvent&); void setColumnUnderMouse (int columnId); void resizeColumnsToFit (int firstColumnIndex, int targetTotalWidth); + void drawColumnHeader (Graphics&, LookAndFeel&, const ColumnInfo&); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableHeaderComponent) }; diff --git a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp index b332e5dc..00cd8c79 100644 --- a/modules/juce_gui_basics/widgets/juce_TableListBox.cpp +++ b/modules/juce_gui_basics/widgets/juce_TableListBox.cpp @@ -725,9 +725,8 @@ void TableListBoxModel::listWasScrolled() {} String TableListBoxModel::getCellTooltip (int /*rowNumber*/, int /*columnId*/) { return {}; } var TableListBoxModel::getDragSourceDescription (const SparseSet&) { return {}; } -Component* TableListBoxModel::refreshComponentForCell (int, int, bool, Component* existingComponentToUpdate) +Component* TableListBoxModel::refreshComponentForCell (int, int, bool, [[maybe_unused]] Component* existingComponentToUpdate) { - ignoreUnused (existingComponentToUpdate); jassert (existingComponentToUpdate == nullptr); // indicates a failure in the code that recycles the components return nullptr; } diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp index 18b35fe0..79be3ecc 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp @@ -948,6 +948,11 @@ TextEditor::TextEditor (const String& name, juce_wchar passwordChar) TextEditor::~TextEditor() { + giveAwayKeyboardFocus(); + + if (auto* peer = getPeer()) + peer->refreshTextInputTarget(); + textValue.removeListener (textHolder); textValue.referTo (Value()); @@ -1240,7 +1245,7 @@ void TextEditor::setText (const String& newText, bool sendTextChangeMessage) textValue = newText; auto oldCursorPos = caretPosition; - bool cursorWasAtEnd = oldCursorPos >= getTotalNumChars(); + auto cursorWasAtEnd = oldCursorPos >= getTotalNumChars(); clearInternal (nullptr); insert (newText, 0, currentFont, findColour (textColourId), nullptr, caretPosition); @@ -1376,26 +1381,23 @@ void TextEditor::repaintText (Range range) } //============================================================================== -void TextEditor::moveCaret (int newCaretPos) +void TextEditor::moveCaret (const int newCaretPos) { - if (newCaretPos < 0) - newCaretPos = 0; - else - newCaretPos = jmin (newCaretPos, getTotalNumChars()); + const auto clamped = std::clamp (newCaretPos, 0, getTotalNumChars()); - if (newCaretPos != getCaretPosition()) - { - caretPosition = newCaretPos; + if (clamped == getCaretPosition()) + return; - if (hasKeyboardFocus (false)) - textHolder->restartTimer(); + caretPosition = clamped; - scrollToMakeSureCursorIsVisible(); - updateCaretPosition(); + if (hasKeyboardFocus (false)) + textHolder->restartTimer(); - if (auto* handler = getAccessibilityHandler()) - handler->notifyAccessibilityEvent (AccessibilityEvent::textChanged); - } + scrollToMakeSureCursorIsVisible(); + updateCaretPosition(); + + if (auto* handler = getAccessibilityHandler()) + handler->notifyAccessibilityEvent (AccessibilityEvent::textChanged); } int TextEditor::getCaretPosition() const @@ -2306,6 +2308,11 @@ void TextEditor::setTemporaryUnderlining (const Array>& newUnderlined repaint(); } +TextInputTarget::VirtualKeyboardType TextEditor::getKeyboardType() +{ + return passwordCharacter != 0 ? passwordKeyboard : keyboardType; +} + //============================================================================== UndoManager* TextEditor::getUndoManager() noexcept { diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.h b/modules/juce_gui_basics/widgets/juce_TextEditor.h index c48425d4..748bdcf9 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.h +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.h @@ -742,7 +742,7 @@ public: /** @internal */ void setTemporaryUnderlining (const Array>&) override; /** @internal */ - VirtualKeyboardType getKeyboardType() override { return keyboardType; } + VirtualKeyboardType getKeyboardType() override; protected: //============================================================================== diff --git a/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp b/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp index 3ab01734..fdb36953 100644 --- a/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp +++ b/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp @@ -182,7 +182,6 @@ bool ComponentPeer::handleKeyPress (const int keyCode, const juce_wchar textChar textCharacter)); } - bool ComponentPeer::handleKeyPress (const KeyPress& keyInfo) { bool keyWasUsed = false; @@ -587,8 +586,8 @@ void ComponentPeer::setRepresentedFile (const File&) } //============================================================================== -int ComponentPeer::getCurrentRenderingEngine() const { return 0; } -void ComponentPeer::setCurrentRenderingEngine (int index) { jassert (index == 0); ignoreUnused (index); } +int ComponentPeer::getCurrentRenderingEngine() const { return 0; } +void ComponentPeer::setCurrentRenderingEngine ([[maybe_unused]] int index) { jassert (index == 0); } //============================================================================== std::function ComponentPeer::getNativeRealtimeModifiers = nullptr; @@ -607,7 +606,7 @@ void ComponentPeer::forceDisplayUpdate() Desktop::getInstance().displays->refresh(); } -void ComponentPeer::globalFocusChanged (Component*) +void ComponentPeer::globalFocusChanged ([[maybe_unused]] Component* comp) { refreshTextInputTarget(); } diff --git a/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h b/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h index b0d6ed05..87bf0ef4 100644 --- a/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h +++ b/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h @@ -125,7 +125,7 @@ public: Thread::Priority for values @returns true if the thread finished normally; false if the user pressed cancel */ - bool runThread (Priority Priority = Priority::normal); + bool runThread (Priority priority = Priority::normal); #endif /** Starts the thread and returns. diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp index da5b4a9a..dd434529 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp @@ -476,6 +476,11 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& doc, CodeTokeniser* cons CodeEditorComponent::~CodeEditorComponent() { + giveAwayKeyboardFocus(); + + if (auto* peer = getPeer()) + peer->refreshTextInputTarget(); + document.removeListener (pimpl.get()); } @@ -670,10 +675,9 @@ void CodeEditorComponent::codeDocumentChanged (const int startIndex, const int e updateScrollBars(); } -void CodeEditorComponent::retokenise (int startIndex, int endIndex) +void CodeEditorComponent::retokenise (int startIndex, [[maybe_unused]] int endIndex) { const CodeDocument::Position affectedTextStart (document, startIndex); - juce::ignoreUnused (endIndex); // Leave room for more efficient impl in future. clearCachedIterators (affectedTextStart.getLineNumber()); diff --git a/modules/juce_gui_extra/juce_gui_extra.cpp b/modules/juce_gui_extra/juce_gui_extra.cpp index 173cd09b..9a50b88b 100644 --- a/modules/juce_gui_extra/juce_gui_extra.cpp +++ b/modules/juce_gui_extra/juce_gui_extra.cpp @@ -135,6 +135,7 @@ #include "misc/juce_SystemTrayIconComponent.cpp" #include "misc/juce_LiveConstantEditor.cpp" #include "misc/juce_AnimatedAppComponent.cpp" +#include "misc/juce_WebBrowserComponent.cpp" //============================================================================== #if JUCE_MAC || JUCE_IOS @@ -167,6 +168,7 @@ #elif JUCE_LINUX || JUCE_BSD JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wzero-as-null-pointer-constant") + #include #include "native/juce_linux_XEmbedComponent.cpp" #if JUCE_WEB_BROWSER diff --git a/modules/juce_gui_extra/juce_gui_extra.h b/modules/juce_gui_extra/juce_gui_extra.h index 9402907e..952b7798 100644 --- a/modules/juce_gui_extra/juce_gui_extra.h +++ b/modules/juce_gui_extra/juce_gui_extra.h @@ -35,7 +35,7 @@ ID: juce_gui_extra vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE extended GUI classes description: Miscellaneous GUI classes for specialised tasks. website: http://www.juce.com/juce diff --git a/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h b/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h index ef1e87fb..18d5db10 100644 --- a/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h +++ b/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h @@ -36,8 +36,8 @@ namespace juce @tags{GUI} */ -class AnimatedAppComponent : public Component, - private Timer +class JUCE_API AnimatedAppComponent : public Component, + private Timer { public: AnimatedAppComponent(); diff --git a/modules/juce_gui_extra/misc/juce_PushNotifications.cpp b/modules/juce_gui_extra/misc/juce_PushNotifications.cpp index 5642deb8..ece6c622 100644 --- a/modules/juce_gui_extra/misc/juce_PushNotifications.cpp +++ b/modules/juce_gui_extra/misc/juce_PushNotifications.cpp @@ -86,12 +86,11 @@ PushNotifications::~PushNotifications() { clearSingletonInstance(); } void PushNotifications::addListener (Listener* l) { listeners.add (l); } void PushNotifications::removeListener (Listener* l) { listeners.remove (l); } -void PushNotifications::requestPermissionsWithSettings (const PushNotifications::Settings& settings) +void PushNotifications::requestPermissionsWithSettings ([[maybe_unused]] const PushNotifications::Settings& settings) { #if JUCE_PUSH_NOTIFICATIONS && (JUCE_IOS || JUCE_MAC) pimpl->requestPermissionsWithSettings (settings); #else - ignoreUnused (settings); listeners.call ([] (Listener& l) { l.notificationSettingsReceived ({}); }); #endif } @@ -137,12 +136,10 @@ String PushNotifications::getDeviceToken() const #endif } -void PushNotifications::setupChannels (const Array& groups, const Array& channels) +void PushNotifications::setupChannels ([[maybe_unused]] const Array& groups, [[maybe_unused]] const Array& channels) { #if JUCE_PUSH_NOTIFICATIONS pimpl->setupChannels (groups, channels); - #else - ignoreUnused (groups, channels); #endif } @@ -160,58 +157,48 @@ void PushNotifications::removeAllPendingLocalNotifications() #endif } -void PushNotifications::subscribeToTopic (const String& topic) +void PushNotifications::subscribeToTopic ([[maybe_unused]] const String& topic) { #if JUCE_PUSH_NOTIFICATIONS pimpl->subscribeToTopic (topic); - #else - ignoreUnused (topic); #endif } -void PushNotifications::unsubscribeFromTopic (const String& topic) +void PushNotifications::unsubscribeFromTopic ([[maybe_unused]] const String& topic) { #if JUCE_PUSH_NOTIFICATIONS pimpl->unsubscribeFromTopic (topic); - #else - ignoreUnused (topic); #endif } -void PushNotifications::sendLocalNotification (const Notification& n) +void PushNotifications::sendLocalNotification ([[maybe_unused]] const Notification& n) { #if JUCE_PUSH_NOTIFICATIONS pimpl->sendLocalNotification (n); - #else - ignoreUnused (n); #endif } -void PushNotifications::removeDeliveredNotification (const String& identifier) +void PushNotifications::removeDeliveredNotification ([[maybe_unused]] const String& identifier) { #if JUCE_PUSH_NOTIFICATIONS pimpl->removeDeliveredNotification (identifier); - #else - ignoreUnused (identifier); #endif } -void PushNotifications::removePendingLocalNotification (const String& identifier) +void PushNotifications::removePendingLocalNotification ([[maybe_unused]] const String& identifier) { #if JUCE_PUSH_NOTIFICATIONS pimpl->removePendingLocalNotification (identifier); - #else - ignoreUnused (identifier); #endif } -void PushNotifications::sendUpstreamMessage (const String& serverSenderId, - const String& collapseKey, - const String& messageId, - const String& messageType, - int timeToLive, - const StringPairArray& additionalData) +void PushNotifications::sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId, + [[maybe_unused]] const String& collapseKey, + [[maybe_unused]] const String& messageId, + [[maybe_unused]] const String& messageType, + [[maybe_unused]] int timeToLive, + [[maybe_unused]] const StringPairArray& additionalData) { #if JUCE_PUSH_NOTIFICATIONS pimpl->sendUpstreamMessage (serverSenderId, @@ -220,10 +207,24 @@ void PushNotifications::sendUpstreamMessage (const String& serverSenderId, messageType, timeToLive, additionalData); - #else - ignoreUnused (serverSenderId, collapseKey, messageId, messageType); - ignoreUnused (timeToLive, additionalData); #endif } +//============================================================================== +void PushNotifications::Listener::notificationSettingsReceived ([[maybe_unused]] const Settings& settings) {} +void PushNotifications::Listener::pendingLocalNotificationsListReceived ([[maybe_unused]] const Array& notifications) {} +void PushNotifications::Listener::handleNotification ([[maybe_unused]] bool isLocalNotification, + [[maybe_unused]] const Notification& notification) {} +void PushNotifications::Listener::handleNotificationAction ([[maybe_unused]] bool isLocalNotification, + [[maybe_unused]] const Notification& notification, + [[maybe_unused]] const String& actionIdentifier, + [[maybe_unused]] const String& optionalResponse) {} +void PushNotifications::Listener::localNotificationDismissedByUser ([[maybe_unused]] const Notification& notification) {} +void PushNotifications::Listener::deliveredNotificationsListReceived ([[maybe_unused]] const Array& notifications) {} +void PushNotifications::Listener::deviceTokenRefreshed ([[maybe_unused]] const String& token) {} +void PushNotifications::Listener::remoteNotificationsDeleted() {} +void PushNotifications::Listener::upstreamMessageSent ([[maybe_unused]] const String& messageId) {} +void PushNotifications::Listener::upstreamMessageSendingError ([[maybe_unused]] const String& messageId, + [[maybe_unused]] const String& error) {} + } // namespace juce diff --git a/modules/juce_gui_extra/misc/juce_PushNotifications.h b/modules/juce_gui_extra/misc/juce_PushNotifications.h index 52cf1dbc..384b43ab 100644 --- a/modules/juce_gui_extra/misc/juce_PushNotifications.h +++ b/modules/juce_gui_extra/misc/juce_PushNotifications.h @@ -601,12 +601,12 @@ public: with no categories and all allow flags set to true will be received in Listener::notificationSettingsReceived(). */ - virtual void notificationSettingsReceived (const Settings& settings) { ignoreUnused (settings); } + virtual void notificationSettingsReceived (const Settings& settings); /** Called when the list of pending notifications, requested by calling getPendingLocalNotifications() is returned. iOS 10 or above only. */ - virtual void pendingLocalNotificationsListReceived (const Array& notifications) { ignoreUnused (notifications); } + virtual void pendingLocalNotificationsListReceived (const Array& notifications); /** This can be called in multiple different situations, depending on the OS and the situation. @@ -622,7 +622,7 @@ public: Note you can receive this callback on startup, if the application was launched from a notification. */ - virtual void handleNotification (bool isLocalNotification, const Notification& notification) { ignoreUnused (isLocalNotification); ignoreUnused (notification); } + virtual void handleNotification (bool isLocalNotification, const Notification& notification); /** This can be called when a user performs some action on the notification such as pressing on an action button or responding with a text input. @@ -641,18 +641,12 @@ public: virtual void handleNotificationAction (bool isLocalNotification, const Notification& notification, const String& actionIdentifier, - const String& optionalResponse) - { - ignoreUnused (isLocalNotification); - ignoreUnused (notification); - ignoreUnused (actionIdentifier); - ignoreUnused (optionalResponse); - } + const String& optionalResponse); /** For iOS10 and Android, this can be also called when a user dismissed the notification before responding to it. */ - virtual void localNotificationDismissedByUser (const Notification& notification) { ignoreUnused (notification); } + virtual void localNotificationDismissedByUser (const Notification& notification); /** Called after getDeliveredNotifications() request is fulfilled. Returns notifications that are visible in the notification area on the device and that are still waiting @@ -661,31 +655,31 @@ public: On iOS, iOS version 10 or higher is required. On Android, API level 18 or higher is required. For unsupported platforms, an empty array will be returned. */ - virtual void deliveredNotificationsListReceived (const Array& notifications) { ignoreUnused (notifications); } + virtual void deliveredNotificationsListReceived (const Array& notifications); /** Called whenever a token gets refreshed. You should monitor any token updates, because only the last token that is assigned to device is valid and can be used. */ - virtual void deviceTokenRefreshed (const String& token) { ignoreUnused (token); } + virtual void deviceTokenRefreshed (const String& token); /** Called when Firebase Cloud Messaging server deletes pending messages. This can happen when 1) too many messages were sent to the server (hint: use collapsible messages). 2) the devices hasn't been online in a long time (refer to Firebase documentation for the maximum time a message can be stored on FCM before expiring). */ - virtual void remoteNotificationsDeleted() {} + virtual void remoteNotificationsDeleted(); /** Called when an upstream message sent with PushNotifications::sendUpstreamMessage() has been sent successfully. Bear in mind that in may take several minutes or more to receive this callback. */ - virtual void upstreamMessageSent (const String& messageId) { ignoreUnused (messageId); } + virtual void upstreamMessageSent (const String& messageId); /** Called when there was an error sending an upstream message with PushNotifications::sendUpstreamMessage(). Bear in mind that in may take several minutes or more to receive this callback. */ - virtual void upstreamMessageSendingError (const String& messageId, const String& error) { ignoreUnused (messageId); ignoreUnused (error); } + virtual void upstreamMessageSendingError (const String& messageId, const String& error); }; void addListener (Listener* l); diff --git a/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp b/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp index 94fb3263..c5a4efb8 100644 --- a/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp +++ b/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp @@ -132,19 +132,17 @@ void RecentlyOpenedFilesList::restoreFromString (const String& stringifiedVersio //============================================================================== -void RecentlyOpenedFilesList::registerRecentFileNatively (const File& file) +void RecentlyOpenedFilesList::registerRecentFileNatively ([[maybe_unused]] const File& file) { #if JUCE_MAC JUCE_AUTORELEASEPOOL { [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL: createNSURLFromFile (file)]; } - #else - ignoreUnused (file); #endif } -void RecentlyOpenedFilesList::forgetRecentFileNatively (const File& file) +void RecentlyOpenedFilesList::forgetRecentFileNatively ([[maybe_unused]] const File& file) { #if JUCE_MAC JUCE_AUTORELEASEPOOL @@ -166,8 +164,6 @@ void RecentlyOpenedFilesList::forgetRecentFileNatively (const File& file) if (! [url isEqual:nsFile]) [sharedDocController noteNewRecentDocumentURL:url]; } - #else - ignoreUnused (file); #endif } diff --git a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp new file mode 100644 index 00000000..ce8af6ef --- /dev/null +++ b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp @@ -0,0 +1,39 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2022 - Raw Material Software Limited + + JUCE is an open source library subject to commercial or open-source + licensing. + + By using JUCE, you agree to the terms of both the JUCE 7 End-User License + Agreement and JUCE Privacy Policy. + + End User License Agreement: www.juce.com/juce-7-licence + Privacy Policy: www.juce.com/juce-privacy-policy + + Or: You may also use this code under the terms of the GPL v3 (see + www.gnu.org/licenses). + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +#if JUCE_WEB_BROWSER || DOXYGEN + +bool WebBrowserComponent::pageAboutToLoad ([[maybe_unused]] const String& newURL) { return true; } +void WebBrowserComponent::pageFinishedLoading ([[maybe_unused]] const String& url) {} +bool WebBrowserComponent::pageLoadHadNetworkError ([[maybe_unused]] const String& errorInfo) { return true; } +void WebBrowserComponent::windowCloseRequest() {} +void WebBrowserComponent::newWindowAttemptingToLoad ([[maybe_unused]] const String& newURL) {} + +#endif + +} // namespace juce diff --git a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h index e65fbea5..758d2587 100644 --- a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h +++ b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h @@ -63,7 +63,7 @@ public: of IE. To change this behaviour, you either need to add the following html element into your page's head section: - + or you need to change windows registry values for your application. More infromation on the latter can be found here: @@ -179,12 +179,6 @@ public: /** Creates a WebBrowserComponent. Once it's created and visible, send the browser to a URL using goToURL(). - - @param unloadPageWhenBrowserIsHidden if this is true, then when the browser - component is taken offscreen, it'll clear the current page - and replace it with a blank page - this can be handy to stop - the browser using resources in the background when it's not - actually being used. */ explicit WebBrowserComponent (const Options& options); @@ -232,10 +226,10 @@ public: tries to go to a particular URL. To allow the operation to carry on, return true, or return false to stop the navigation happening. */ - virtual bool pageAboutToLoad (const String& newURL) { ignoreUnused (newURL); return true; } + virtual bool pageAboutToLoad (const String& newURL); /** This callback happens when the browser has finished loading a page. */ - virtual void pageFinishedLoading (const String& url) { ignoreUnused (url); } + virtual void pageFinishedLoading (const String& url); /** This callback happens when a network error was encountered while trying to load a page. @@ -247,18 +241,18 @@ public: The errorInfo contains some platform dependent string describing the error. */ - virtual bool pageLoadHadNetworkError (const String& errorInfo) { ignoreUnused (errorInfo); return true; } + virtual bool pageLoadHadNetworkError (const String& errorInfo); /** This callback occurs when a script or other activity in the browser asks for the window to be closed. */ - virtual void windowCloseRequest() {} + virtual void windowCloseRequest(); /** This callback occurs when the browser attempts to load a URL in a new window. This won't actually load the window but gives you a chance to either launch a new window yourself or just load the URL into the current window with goToURL(). */ - virtual void newWindowAttemptingToLoad (const String& newURL) { ignoreUnused (newURL); } + virtual void newWindowAttemptingToLoad (const String& newURL); //============================================================================== /** @internal */ @@ -288,6 +282,7 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebBrowserComponent) }; + #endif } // namespace juce diff --git a/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp b/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp index 87b461c0..b382a3b9 100644 --- a/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp +++ b/modules/juce_gui_extra/native/juce_android_PushNotifications.cpp @@ -447,20 +447,18 @@ struct PushNotifications::Pimpl #endif } - void notifyListenersTokenRefreshed (const String& token) + void notifyListenersTokenRefreshed ([[maybe_unused]] const String& token) { #if defined(JUCE_FIREBASE_INSTANCE_ID_SERVICE_CLASSNAME) MessageManager::callAsync ([this, token] { owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (token); }); }); - #else - ignoreUnused (token); #endif } //============================================================================== - void subscribeToTopic (const String& topic) + void subscribeToTopic ([[maybe_unused]] const String& topic) { #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) auto* env = getEnv(); @@ -469,12 +467,10 @@ struct PushNotifications::Pimpl FirebaseMessaging.getInstance)); env->CallObjectMethod (firebaseMessaging, FirebaseMessaging.subscribeToTopic, javaString (topic).get()); - #else - ignoreUnused (topic); #endif } - void unsubscribeFromTopic (const String& topic) + void unsubscribeFromTopic ([[maybe_unused]] const String& topic) { #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) auto* env = getEnv(); @@ -483,17 +479,15 @@ struct PushNotifications::Pimpl FirebaseMessaging.getInstance)); env->CallObjectMethod (firebaseMessaging, FirebaseMessaging.unsubscribeFromTopic, javaString (topic).get()); - #else - ignoreUnused (topic); #endif } - void sendUpstreamMessage (const String& serverSenderId, - const String& collapseKey, - const String& messageId, - const String& messageType, - int timeToLive, - const StringPairArray& additionalData) + void sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId, + [[maybe_unused]] const String& collapseKey, + [[maybe_unused]] const String& messageId, + [[maybe_unused]] const String& messageType, + [[maybe_unused]] int timeToLive, + [[maybe_unused]] const StringPairArray& additionalData) { #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) auto* env = getEnv(); @@ -521,13 +515,10 @@ struct PushNotifications::Pimpl FirebaseMessaging.getInstance)); env->CallVoidMethod (firebaseMessaging, FirebaseMessaging.send, message.get()); - #else - ignoreUnused (serverSenderId, collapseKey, messageId, messageType); - ignoreUnused (timeToLive, additionalData); #endif } - void notifyListenersAboutRemoteNotificationFromSystemTray (const LocalRef& intent) + void notifyListenersAboutRemoteNotificationFromSystemTray ([[maybe_unused]] const LocalRef& intent) { #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) auto* env = getEnv(); @@ -536,12 +527,10 @@ struct PushNotifications::Pimpl auto notification = remoteNotificationBundleToJuceNotification (bundle); owner.listeners.call ([&] (Listener& l) { l.handleNotification (false, notification); }); - #else - ignoreUnused (intent); #endif } - void notifyListenersAboutRemoteNotificationFromService (const LocalRef& remoteNotification) + void notifyListenersAboutRemoteNotificationFromService ([[maybe_unused]] const LocalRef& remoteNotification) { #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) GlobalRef rn (remoteNotification); @@ -551,8 +540,6 @@ struct PushNotifications::Pimpl auto notification = firebaseRemoteNotificationToJuceNotification (rn.get()); owner.listeners.call ([&] (Listener& l) { l.handleNotification (false, notification); }); }); - #else - ignoreUnused (remoteNotification); #endif } @@ -566,7 +553,7 @@ struct PushNotifications::Pimpl #endif } - void notifyListenersAboutUpstreamMessageSent (const LocalRef& messageId) + void notifyListenersAboutUpstreamMessageSent ([[maybe_unused]] const LocalRef& messageId) { #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) GlobalRef mid (LocalRef(messageId.get())); @@ -576,13 +563,11 @@ struct PushNotifications::Pimpl auto midString = juceString ((jstring) mid.get()); owner.listeners.call ([&] (Listener& l) { l.upstreamMessageSent (midString); }); }); - #else - ignoreUnused (messageId); #endif } - void notifyListenersAboutUpstreamMessageSendingError (const LocalRef& messageId, - const LocalRef& error) + void notifyListenersAboutUpstreamMessageSendingError ([[maybe_unused]] const LocalRef& messageId, + [[maybe_unused]] const LocalRef& error) { #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) GlobalRef mid (LocalRef(messageId.get())), e (LocalRef(error.get())); @@ -594,8 +579,6 @@ struct PushNotifications::Pimpl owner.listeners.call ([&] (Listener& l) { l.upstreamMessageSendingError (midString, eString); }); }); - #else - ignoreUnused (messageId, error); #endif } @@ -1566,8 +1549,6 @@ struct JuceFirebaseInstanceIdService instance->pimpl->notifyListenersTokenRefreshed (juceString (static_cast (token))); } }; - -JuceFirebaseInstanceIdService::InstanceIdService_Class JuceFirebaseInstanceIdService::InstanceIdService; #endif #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME) @@ -1609,8 +1590,6 @@ struct JuceFirebaseMessagingService LocalRef (static_cast (error))); } }; - -JuceFirebaseMessagingService::MessagingService_Class JuceFirebaseMessagingService::MessagingService; #endif //============================================================================== diff --git a/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp index 462bc439..b4871cd9 100644 --- a/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp @@ -29,7 +29,7 @@ namespace juce //============================================================================== // This byte-code is generated from native/java/com/rmsl/juce/JuceWebView.java with min sdk version 16 // See juce_core/native/java/README.txt on how to generate this byte-code. -static const unsigned char JuceWebView16ByteCode[] = +static const uint8 JuceWebView16ByteCode[] = {31,139,8,8,150,114,161,94,0,3,74,117,99,101,87,101,98,86,105,101,119,49,54,66,121,116,101,67,111,100,101,46,100,101,120,0,125, 150,93,108,20,85,20,199,207,124,236,78,119,218,110,183,5,74,191,40,109,69,168,72,89,176,162,165,11,88,40,159,101,81,161,88,226, 106,34,211,221,107,59,101,118,102,153,153,109,27,67,16,161,137,134,240,96,4,222,72,140,9,18,35,62,18,195,131,15,4,53,250,226,155, @@ -81,7 +81,7 @@ static const unsigned char JuceWebView16ByteCode[] = //============================================================================== // This byte-code is generated from native/javacore/app/com/rmsl/juce/JuceWebView21.java with min sdk version 21 // See juce_core/native/java/README.txt on how to generate this byte-code. -static const unsigned char JuceWebView21ByteCode[] = +static const uint8 JuceWebView21ByteCode[] = {31,139,8,8,45,103,161,94,0,3,74,117,99,101,87,101,98,86,105,101,119,50,49,46,100,101,120,0,141,151,93,140,27,87,21,199,207, 204,216,30,219,99,59,182,55,251,145,143,221,110,210,173,178,105,154,186,155,164,52,169,211,106,241,38,219,221,48,41,52,155,108, 138,43,85,154,181,47,235,73,188,51,206,204,120,119,65,162,132,80,148,138,34,148,168,20,181,125,129,135,16,129,4,18,168,125,136, @@ -479,82 +479,62 @@ private: #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(J)V") \ METHOD (hostDeleted, "hostDeleted", "()V") \ - CALLBACK (webViewReceivedHttpError, "webViewReceivedHttpError", "(JLandroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceResponse;)V") \ - CALLBACK (webViewPageLoadStarted, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \ - CALLBACK (webViewPageLoadFinished, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \ - CALLBACK (webViewReceivedSslError, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \ + CALLBACK (generatedCallback<&Pimpl::webViewReceivedHttpError>, "webViewReceivedHttpError", "(JLandroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceResponse;)V") \ + CALLBACK (generatedCallback<&Pimpl::webViewPageLoadStarted>, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \ + CALLBACK (generatedCallback<&Pimpl::webViewPageLoadFinished>, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \ + CALLBACK (generatedCallback<&Pimpl::webViewReceivedSslError>, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \ - DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient21, "com/rmsl/juce/JuceWebView21$Client", 21, JuceWebView21ByteCode, sizeof (JuceWebView21ByteCode)) + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient21, "com/rmsl/juce/JuceWebView21$Client", 21, JuceWebView21ByteCode) #undef JNI_CLASS_MEMBERS #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(J)V") \ METHOD (hostDeleted, "hostDeleted", "()V") \ - CALLBACK (webViewPageLoadStarted, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \ - CALLBACK (webViewPageLoadFinished, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \ - CALLBACK (webViewReceivedSslError, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \ + CALLBACK (generatedCallback<&Pimpl::webViewPageLoadStarted>, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \ + CALLBACK (generatedCallback<&Pimpl::webViewPageLoadFinished>, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \ + CALLBACK (generatedCallback<&Pimpl::webViewReceivedSslError>, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \ - DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient16, "com/rmsl/juce/JuceWebView$Client", 16, JuceWebView16ByteCode, sizeof (JuceWebView16ByteCode)) + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient16, "com/rmsl/juce/JuceWebView$Client", 16, JuceWebView16ByteCode) #undef JNI_CLASS_MEMBERS - static jboolean JNICALL webViewPageLoadStarted (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jstring url) + static jboolean webViewPageLoadStarted (JNIEnv*, Pimpl& t, jstring url) { - if (auto* myself = reinterpret_cast (host)) - return myself->handlePageAboutToLoad (juceString (url)); - - return 0; + return t.handlePageAboutToLoad (juceString (url)); } - static void JNICALL webViewPageLoadFinished (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jstring url) + static void webViewPageLoadFinished (JNIEnv*, Pimpl& t, jstring url) { - if (auto* myself = reinterpret_cast (host)) - myself->owner.pageFinishedLoading (juceString (url)); + t.owner.pageFinishedLoading (juceString (url)); } - static void JNICALL webViewReceivedHttpError (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jobject /*request*/, jobject errorResponse) + static void webViewReceivedSslError (JNIEnv* env, Pimpl& t, jobject sslError) { - if (auto* myself = reinterpret_cast (host)) - myself->webReceivedHttpError (errorResponse); - } - - static void JNICALL webViewReceivedSslError (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jobject /*sslErrorHandler*/, jobject sslError) - { - auto* env = getEnv(); - - if (auto* myself = reinterpret_cast (host)) - { - auto errorString = LocalRef ((jstring) env->CallObjectMethod (sslError, SslError.toString)); - - myself->owner.pageLoadHadNetworkError (juceString (errorString)); - } + const auto errorString = LocalRef ((jstring) env->CallObjectMethod (sslError, SslError.toString)); + t.owner.pageLoadHadNetworkError (juceString (errorString)); } //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(J)V") \ - CALLBACK (webViewCloseWindowRequest, "webViewCloseWindowRequest", "(JLandroid/webkit/WebView;)V") \ - CALLBACK (webViewCreateWindowRequest, "webViewCreateWindowRequest", "(JLandroid/webkit/WebView;)V") \ + CALLBACK (generatedCallback<&Pimpl::webViewCloseWindowRequest>, "webViewCloseWindowRequest", "(JLandroid/webkit/WebView;)V") \ + CALLBACK (generatedCallback<&Pimpl::webViewCreateWindowRequest>, "webViewCreateWindowRequest", "(JLandroid/webkit/WebView;)V") \ DECLARE_JNI_CLASS (JuceWebChromeClient, "com/rmsl/juce/JuceWebView$ChromeClient") #undef JNI_CLASS_MEMBERS - static void JNICALL webViewCloseWindowRequest (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/) + static void webViewCloseWindowRequest (JNIEnv*, Pimpl& t, jobject) { - if (auto* myself = reinterpret_cast (host)) - myself->owner.windowCloseRequest(); + t.owner.windowCloseRequest(); } - static void JNICALL webViewCreateWindowRequest (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/) + static void webViewCreateWindowRequest (JNIEnv*, Pimpl& t, jobject) { - if (auto* myself = reinterpret_cast (host)) - myself->owner.newWindowAttemptingToLoad ({}); + t.owner.newWindowAttemptingToLoad ({}); } //============================================================================== - void webReceivedHttpError (jobject errorResponse) + static void webViewReceivedHttpError (JNIEnv* env, Pimpl& t, jobject errorResponse) { - auto* env = getEnv(); - LocalRef responseClass (env->FindClass ("android/webkit/WebResourceResponse")); if (responseClass != nullptr) @@ -565,14 +545,14 @@ private: { auto errorString = LocalRef ((jstring) env->CallObjectMethod (errorResponse, method)); - owner.pageLoadHadNetworkError (juceString (errorString)); + t.owner.pageLoadHadNetworkError (juceString (errorString)); return; } } // Should never get here! jassertfalse; - owner.pageLoadHadNetworkError ({}); + t.owner.pageLoadHadNetworkError ({}); } //============================================================================== @@ -596,9 +576,7 @@ WebBrowserComponent::WebBrowserComponent (const Options& options) addAndMakeVisible (browser.get()); } -WebBrowserComponent::~WebBrowserComponent() -{ -} +WebBrowserComponent::~WebBrowserComponent() = default; //============================================================================== void WebBrowserComponent::goToURL (const String& url, @@ -728,7 +706,4 @@ bool WebBrowserComponent::areOptionsSupported (const Options& options) return (options.getBackend() == Options::Backend::defaultBackend); } -WebBrowserComponent::Pimpl::JuceWebViewClient16_Class WebBrowserComponent::Pimpl::JuceWebViewClient16; -WebBrowserComponent::Pimpl::JuceWebViewClient21_Class WebBrowserComponent::Pimpl::JuceWebViewClient21; -WebBrowserComponent::Pimpl::JuceWebChromeClient_Class WebBrowserComponent::Pimpl::JuceWebChromeClient; } // namespace juce diff --git a/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp b/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp index ade2379d..d7c85d08 100644 --- a/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp +++ b/modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp @@ -587,7 +587,7 @@ struct PushNotifications::Pimpl } } - void removeDeliveredNotification (const String& identifier) + void removeDeliveredNotification ([[maybe_unused]] const String& identifier) { if (@available (iOS 10, *)) { @@ -598,15 +598,13 @@ struct PushNotifications::Pimpl } else { - ignoreUnused (identifier); // Not supported on this platform jassertfalse; } } - void setupChannels (const Array& groups, const Array& channels) + void setupChannels ([[maybe_unused]] const Array& groups, [[maybe_unused]] const Array& channels) { - ignoreUnused (groups, channels); } void getPendingLocalNotifications() const @@ -679,18 +677,16 @@ struct PushNotifications::Pimpl return deviceToken; } - void subscribeToTopic (const String& topic) { ignoreUnused (topic); } - void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); } + void subscribeToTopic ([[maybe_unused]] const String& topic) {} + void unsubscribeFromTopic ([[maybe_unused]] const String& topic) {} - void sendUpstreamMessage (const String& serverSenderId, - const String& collapseKey, - const String& messageId, - const String& messageType, - int timeToLive, - const StringPairArray& additionalData) + void sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId, + [[maybe_unused]] const String& collapseKey, + [[maybe_unused]] const String& messageId, + [[maybe_unused]] const String& messageType, + [[maybe_unused]] int timeToLive, + [[maybe_unused]] const StringPairArray& additionalData) { - ignoreUnused (serverSenderId, collapseKey, messageId, messageType); - ignoreUnused (timeToLive, additionalData); } private: @@ -719,10 +715,8 @@ private: owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (deviceToken); }); } - void failedToRegisterForRemoteNotifications (NSError* error) + void failedToRegisterForRemoteNotifications ([[maybe_unused]] NSError* error) { - ignoreUnused (error); - deviceToken.clear(); } @@ -794,15 +788,13 @@ private: JUCE_END_IGNORE_WARNINGS_GCC_LIKE - void willPresentNotificationWithCompletionHandler (UNNotification* notification, + void willPresentNotificationWithCompletionHandler ([[maybe_unused]] UNNotification* notification, void (^completionHandler)(UNNotificationPresentationOptions options)) { NSUInteger options = NSUInteger ((int)settings.allowBadge << 0 | (int)settings.allowSound << 1 | (int)settings.allowAlert << 2); - ignoreUnused (notification); - completionHandler (options); } diff --git a/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp index 287131b5..6acaada9 100644 --- a/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp @@ -555,10 +555,9 @@ public: break; case WEBKIT_POLICY_DECISION_TYPE_RESPONSE: { - auto* response = (WebKitNavigationPolicyDecision*) decision; + [[maybe_unused]] auto* response = (WebKitNavigationPolicyDecision*) decision; // for now just always allow response requests - ignoreUnused (response); WebKitSymbols::getInstance()->juce_webkit_policy_decision_use (decision); return true; } @@ -642,9 +641,8 @@ public: launchChild(); - auto ret = pipe (threadControl); + [[maybe_unused]] auto ret = pipe (threadControl); - ignoreUnused (ret); jassert (ret == 0); CommandReceiver::setBlocking (inChannel, true); @@ -772,11 +770,11 @@ private: { int inPipe[2], outPipe[2]; - auto ret = pipe (inPipe); - ignoreUnused (ret); jassert (ret == 0); + [[maybe_unused]] auto ret = pipe (inPipe); + jassert (ret == 0); ret = pipe (outPipe); - ignoreUnused (ret); jassert (ret == 0); + jassert (ret == 0); auto pid = fork(); if (pid == 0) diff --git a/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp b/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp index a56538de..76801527 100644 --- a/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp +++ b/modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp @@ -73,11 +73,13 @@ public: { SharedKeyWindow (ComponentPeer* peerToUse) : keyPeer (peerToUse), - keyProxy (juce_createKeyProxyWindow (keyPeer)) + keyProxy (juce_createKeyProxyWindow (keyPeer)), + association (peerToUse, keyProxy) {} ~SharedKeyWindow() { + association = {}; juce_deleteKeyProxyWindow (keyProxy); auto& keyWindows = getKeyWindows(); @@ -120,6 +122,7 @@ public: //============================================================================== ComponentPeer* keyPeer; Window keyProxy; + ScopedWindowAssociation association; static HashMap& getKeyWindows() { diff --git a/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm b/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm index 014fa7f0..9dddc12a 100644 --- a/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm +++ b/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm @@ -85,11 +85,9 @@ namespace &cfPlugInInterface, &score) == kIOReturnSuccess) { - HRESULT hr = (*cfPlugInInterface)->QueryInterface (cfPlugInInterface, - CFUUIDGetUUIDBytes (kIOHIDDeviceInterfaceID), - device); - - ignoreUnused (hr); + [[maybe_unused]] HRESULT hr = (*cfPlugInInterface)->QueryInterface (cfPlugInInterface, + CFUUIDGetUUIDBytes (kIOHIDDeviceInterfaceID), + device); (*cfPlugInInterface)->Release (cfPlugInInterface); } diff --git a/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp b/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp index 2043fbb1..4a06ebb1 100644 --- a/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp +++ b/modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp @@ -429,9 +429,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification: nsNotification]; } - void setupChannels (const Array& groups, const Array& channels) + void setupChannels ([[maybe_unused]] const Array& groups, [[maybe_unused]] const Array& channels) { - ignoreUnused (groups, channels); } void getPendingLocalNotifications() const @@ -494,9 +493,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (deviceToken); }); } - void failedToRegisterForRemoteNotifications (NSError* error) override + void failedToRegisterForRemoteNotifications ([[maybe_unused]] NSError* error) override { - ignoreUnused (error); deviceToken.clear(); } @@ -506,9 +504,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate owner.listeners.call ([&] (Listener& l) { l.handleNotification (true, n); }); } - void didDeliverNotification (NSUserNotification* notification) override + void didDeliverNotification ([[maybe_unused]] NSUserNotification* notification) override { - ignoreUnused (notification); } void didActivateNotification (NSUserNotification* notification) override @@ -540,18 +537,16 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate bool shouldPresentNotification (NSUserNotification*) override { return true; } - void subscribeToTopic (const String& topic) { ignoreUnused (topic); } - void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); } + void subscribeToTopic ([[maybe_unused]] const String& topic) {} + void unsubscribeFromTopic ([[maybe_unused]] const String& topic) {} - void sendUpstreamMessage (const String& serverSenderId, - const String& collapseKey, - const String& messageId, - const String& messageType, - int timeToLive, - const StringPairArray& additionalData) + void sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId, + [[maybe_unused]] const String& collapseKey, + [[maybe_unused]] const String& messageId, + [[maybe_unused]] const String& messageType, + [[maybe_unused]] int timeToLive, + [[maybe_unused]] const StringPairArray& additionalData) { - ignoreUnused (serverSenderId, collapseKey, messageId, messageType); - ignoreUnused (timeToLive, additionalData); } private: diff --git a/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp b/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp index d5f98f87..d4d9a45e 100644 --- a/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp @@ -459,7 +459,7 @@ bool ActiveXControlComponent::createControl (const void* controlIID) if (newControl->control->DoVerb (OLEIVERB_SHOW, nullptr, newControl->clientSite, 0, hwnd, &rect) == S_OK) { - control.reset (newControl.release()); + control = std::move (newControl); control->controlHWND = ActiveXHelpers::getHWND (this); if (control->controlHWND != nullptr) diff --git a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp index 7e4c168f..7d23c7f0 100644 --- a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp @@ -815,8 +815,9 @@ class WebBrowserComponent::Pimpl { public: Pimpl (WebBrowserComponent& owner, - const Options& preferences, - bool useWebView2, const String& userAgent) + [[maybe_unused]] const Options& preferences, + bool useWebView2, + const String& userAgent) { if (useWebView2) { @@ -829,8 +830,6 @@ public: #endif } - ignoreUnused (preferences); - if (internal == nullptr) internal.reset (new Win32WebView (owner, userAgent)); } diff --git a/modules/juce_opengl/juce_opengl.cpp b/modules/juce_opengl/juce_opengl.cpp index 3ffa2e31..66d7be3f 100644 --- a/modules/juce_opengl/juce_opengl.cpp +++ b/modules/juce_opengl/juce_opengl.cpp @@ -163,24 +163,22 @@ static bool checkPeerIsValid (OpenGLContext* context) { if (auto* comp = context->getTargetComponent()) { - if (auto* peer = comp->getPeer()) + if (auto* peer [[maybe_unused]] = comp->getPeer()) { #if JUCE_MAC || JUCE_IOS if (auto* nsView = (JUCE_IOS_MAC_VIEW*) peer->getNativeHandle()) { - if (auto nsWindow = [nsView window]) + if ([[maybe_unused]] auto nsWindow = [nsView window]) { #if JUCE_MAC return ([nsWindow isVisible] && (! [nsWindow hidesOnDeactivate] || [NSApp isActive])); #else - ignoreUnused (nsWindow); return true; #endif } } #else - ignoreUnused (peer); return true; #endif } @@ -293,6 +291,7 @@ JUCE_IMPL_WGL_EXTENSION_FUNCTION (wglCreateContextAttribsARB) #undef JUCE_IMPL_WGL_EXTENSION_FUNCTION #elif JUCE_LINUX || JUCE_BSD + #include #include "native/juce_OpenGL_linux_X11.h" #elif JUCE_ANDROID diff --git a/modules/juce_opengl/juce_opengl.h b/modules/juce_opengl/juce_opengl.h index 8bf45808..a65d203d 100644 --- a/modules/juce_opengl/juce_opengl.h +++ b/modules/juce_opengl/juce_opengl.h @@ -35,7 +35,7 @@ ID: juce_opengl vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE OpenGL classes description: Classes for rendering OpenGL in a JUCE window. website: http://www.juce.com/juce diff --git a/modules/juce_opengl/native/juce_OpenGL_android.h b/modules/juce_opengl/native/juce_OpenGL_android.h index 4358a6d7..dc1c2aa1 100644 --- a/modules/juce_opengl/native/juce_OpenGL_android.h +++ b/modules/juce_opengl/native/juce_OpenGL_android.h @@ -103,26 +103,6 @@ static const uint8 javaJuceOpenGLView[] = }; //============================================================================== -struct AndroidGLCallbacks -{ - static void attachedToWindow (JNIEnv*, jobject, jlong); - static void detachedFromWindow (JNIEnv*, jobject, jlong); - static void dispatchDraw (JNIEnv*, jobject, jlong, jobject); -}; - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ - METHOD (constructor, "", "(Landroid/content/Context;J)V") \ - METHOD (getParent, "getParent", "()Landroid/view/ViewParent;") \ - METHOD (getHolder, "getHolder", "()Landroid/view/SurfaceHolder;") \ - METHOD (layout, "layout", "(IIII)V" ) \ - CALLBACK (AndroidGLCallbacks::attachedToWindow, "onAttchedWindowNative", "(J)V") \ - CALLBACK (AndroidGLCallbacks::detachedFromWindow, "onDetachedFromWindowNative", "(J)V") \ - CALLBACK (AndroidGLCallbacks::dispatchDraw, "onDrawNative", "(JLandroid/graphics/Canvas;)V") - -DECLARE_JNI_CLASS_WITH_BYTECODE (JuceOpenGLViewSurface, "com/rmsl/juce/JuceOpenGLView", 16, javaJuceOpenGLView, sizeof(javaJuceOpenGLView)) -#undef JNI_CLASS_MEMBERS - //============================================================================== class OpenGLContext::NativeContext : private SurfaceHolderCallback { @@ -246,9 +226,11 @@ public: //============================================================================== // Android Surface Callbacks: - void surfaceChanged (LocalRef holder, int format, int width, int height) override + void surfaceChanged ([[maybe_unused]] LocalRef holder, + [[maybe_unused]] int format, + [[maybe_unused]] int width, + [[maybe_unused]] int height) override { - ignoreUnused (holder, format, width, height); } void surfaceCreated (LocalRef) override; @@ -264,40 +246,46 @@ public: Component& component; private: - //============================================================================== - friend struct AndroidGLCallbacks; + #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ + METHOD (constructor, "", "(Landroid/content/Context;J)V") \ + METHOD (getParent, "getParent", "()Landroid/view/ViewParent;") \ + METHOD (getHolder, "getHolder", "()Landroid/view/SurfaceHolder;") \ + METHOD (layout, "layout", "(IIII)V" ) \ + CALLBACK (generatedCallback<&NativeContext::attachedToWindow>, "onAttchedWindowNative", "(J)V") \ + CALLBACK (generatedCallback<&NativeContext::detachedFromWindow>, "onDetachedFromWindowNative", "(J)V") \ + CALLBACK (generatedCallback<&NativeContext::dispatchDraw>, "onDrawNative", "(JLandroid/graphics/Canvas;)V") + + DECLARE_JNI_CLASS_WITH_BYTECODE (JuceOpenGLViewSurface, "com/rmsl/juce/JuceOpenGLView", 16, javaJuceOpenGLView) + #undef JNI_CLASS_MEMBERS - void attachedToWindow() + //============================================================================== + static void attachedToWindow (JNIEnv* env, NativeContext& t) { - auto* env = getEnv(); - - LocalRef holder (env->CallObjectMethod (surfaceView.get(), JuceOpenGLViewSurface.getHolder)); + LocalRef holder (env->CallObjectMethod (t.surfaceView.get(), JuceOpenGLViewSurface.getHolder)); - if (surfaceHolderCallback == nullptr) - surfaceHolderCallback = GlobalRef (CreateJavaInterface (this, "android/view/SurfaceHolder$Callback")); + if (t.surfaceHolderCallback == nullptr) + t.surfaceHolderCallback = GlobalRef (CreateJavaInterface (&t, "android/view/SurfaceHolder$Callback")); - env->CallVoidMethod (holder, AndroidSurfaceHolder.addCallback, surfaceHolderCallback.get()); + env->CallVoidMethod (holder, AndroidSurfaceHolder.addCallback, t.surfaceHolderCallback.get()); } - void detachedFromWindow() + static void detachedFromWindow (JNIEnv* env, NativeContext& t) { - if (surfaceHolderCallback != nullptr) + if (t.surfaceHolderCallback != nullptr) { - auto* env = getEnv(); + LocalRef holder (env->CallObjectMethod (t.surfaceView.get(), JuceOpenGLViewSurface.getHolder)); - LocalRef holder (env->CallObjectMethod (surfaceView.get(), JuceOpenGLViewSurface.getHolder)); - - env->CallVoidMethod (holder.get(), AndroidSurfaceHolder.removeCallback, surfaceHolderCallback.get()); - surfaceHolderCallback.clear(); + env->CallVoidMethod (holder.get(), AndroidSurfaceHolder.removeCallback, t.surfaceHolderCallback.get()); + t.surfaceHolderCallback.clear(); } } - void dispatchDraw (jobject /*canvas*/) + static void dispatchDraw (JNIEnv*, NativeContext& t, jobject /*canvas*/) { - const std::lock_guard lock { nativeHandleMutex }; + const std::lock_guard lock { t.nativeHandleMutex }; - if (juceContext != nullptr) - juceContext->triggerRepaint(); + if (t.juceContext != nullptr) + t.juceContext->triggerRepaint(); } bool tryChooseConfig (const std::vector& optionalAttribs) @@ -412,25 +400,6 @@ private: EGLDisplay OpenGLContext::NativeContext::display = EGL_NO_DISPLAY; EGLDisplay OpenGLContext::NativeContext::config; -//============================================================================== -void AndroidGLCallbacks::attachedToWindow (JNIEnv*, jobject /*this*/, jlong host) -{ - if (auto* nativeContext = reinterpret_cast (host)) - nativeContext->attachedToWindow(); -} - -void AndroidGLCallbacks::detachedFromWindow (JNIEnv*, jobject /*this*/, jlong host) -{ - if (auto* nativeContext = reinterpret_cast (host)) - nativeContext->detachedFromWindow(); -} - -void AndroidGLCallbacks::dispatchDraw (JNIEnv*, jobject /*this*/, jlong host, jobject canvas) -{ - if (auto* nativeContext = reinterpret_cast (host)) - nativeContext->dispatchDraw (canvas); -} - //============================================================================== bool OpenGLHelpers::isContextActive() { diff --git a/modules/juce_opengl/native/juce_OpenGL_ios.h b/modules/juce_opengl/native/juce_OpenGL_ios.h index cf29a2a5..813aa7a6 100644 --- a/modules/juce_opengl/native/juce_OpenGL_ios.h +++ b/modules/juce_opengl/native/juce_OpenGL_ios.h @@ -244,8 +244,8 @@ private: glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBufferHandle); - bool ok = [context.get() renderbufferStorage: GL_RENDERBUFFER fromDrawable: glLayer]; - jassert (ok); ignoreUnused (ok); + [[maybe_unused]] bool ok = [context.get() renderbufferStorage: GL_RENDERBUFFER fromDrawable: glLayer]; + jassert (ok); GLint width, height; glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width); diff --git a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h index 987d3263..cd12b414 100644 --- a/modules/juce_opengl/native/juce_OpenGL_linux_X11.h +++ b/modules/juce_opengl/native/juce_OpenGL_linux_X11.h @@ -26,8 +26,6 @@ namespace juce { -extern XContext windowHandleXContext; - struct XFreeDeleter { void operator() (void* ptr) const @@ -45,6 +43,35 @@ std::unique_ptr makeXFreePtr (Data* raw) { return std::uniqu void juce_LinuxAddRepaintListener (ComponentPeer*, Component* dummy); void juce_LinuxRemoveRepaintListener (ComponentPeer*, Component* dummy); +class PeerListener : private ComponentMovementWatcher +{ +public: + PeerListener (Component& comp, Window embeddedWindow) + : ComponentMovementWatcher (&comp), + window (embeddedWindow), + association (comp.getPeer(), window) {} + +private: + using ComponentMovementWatcher::componentMovedOrResized, + ComponentMovementWatcher::componentVisibilityChanged; + + void componentMovedOrResized (bool, bool) override {} + void componentVisibilityChanged() override {} + + void componentPeerChanged() override + { + // This should not be rewritten as a ternary expression or similar. + // The old association must be destroyed before the new one is created. + association = {}; + + if (auto* comp = getComponent()) + association = ScopedWindowAssociation (comp->getPeer(), window); + } + + Window window{}; + ScopedWindowAssociation association; +}; + //============================================================================== class OpenGLContext::NativeContext { @@ -114,7 +141,7 @@ public: CWBorderPixel | CWColormap | CWEventMask, &swa); - X11Symbols::getInstance()->xSaveContext (display, (XID) embeddedWindow, windowHandleXContext, (XPointer) peer); + peerListener.emplace (component, embeddedWindow); X11Symbols::getInstance()->xMapWindow (display, embeddedWindow); X11Symbols::getInstance()->xFreeColormap (display, colourMap); @@ -322,6 +349,8 @@ private: GLXContext renderContext = {}; Window embeddedWindow = {}; + std::optional peerListener; + int swapFrames = 1; Rectangle bounds; std::unique_ptr bestConfig; diff --git a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp index 9dbe093d..af3a354f 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp @@ -148,6 +148,8 @@ public: context.nativeContext = nativeContext.get(); else nativeContext.reset(); + + refreshDisplayLinkConnection(); } ~CachedImage() override @@ -332,7 +334,15 @@ public: const auto stateToUse = state.fetch_and (StateFlags::persistent); - if (! isFlagSet (stateToUse, StateFlags::pendingRender) && ! context.continuousRepaint) + #if JUCE_MAC + // On macOS, we use a display link callback to trigger repaints, rather than + // letting them run at full throttle + const auto noAutomaticRepaint = true; + #else + const auto noAutomaticRepaint = ! context.continuousRepaint; + #endif + + if (! isFlagSet (stateToUse, StateFlags::pendingRender) && noAutomaticRepaint) return RenderStatus::noWork; const auto isUpdating = isFlagSet (stateToUse, StateFlags::paintComponents); @@ -916,6 +926,30 @@ public: } }; }; + void refreshDisplayLinkConnection() + { + #if JUCE_MAC + if (context.continuousRepaint) + { + connection.emplace (sharedDisplayLinks->registerFactory ([this] (CGDirectDisplayID display) + { + return [this, display] + { + if (auto* view = nativeContext->getNSView()) + if (auto* window = [view window]) + if (auto* screen = [window screen]) + if (display == ScopedDisplayLink::getDisplayIdForScreen (screen)) + triggerRepaint(); + }; + })); + } + else + { + connection.reset(); + } + #endif + } + //============================================================================== friend class NativeContext; std::unique_ptr nativeContext; @@ -1008,6 +1042,10 @@ public: // Note: the NSViewComponentPeer also has a SharedResourcePointer to // avoid unnecessarily duplicating display-link threads. SharedResourcePointer sharedDisplayLinks; + + // On macOS, rather than letting swapBuffers block as appropriate, we use a display link + // callback to mark the view as needing to repaint. + std::optional connection; #endif enum StateFlags @@ -1217,13 +1255,16 @@ void OpenGLContext::setContinuousRepainting (bool shouldContinuouslyRepaint) noe { continuousRepaint = shouldContinuouslyRepaint; - #if JUCE_MAC - if (auto* component = getTargetComponent()) - { - detach(); - attachment.reset (new Attachment (*this, *component)); - } - #endif + #if JUCE_MAC + if (auto* component = getTargetComponent()) + { + detach(); + attachment.reset (new Attachment (*this, *component)); + } + + if (auto* cachedImage = getCachedImage()) + cachedImage->refreshDisplayLinkConnection(); + #endif triggerRepaint(); } diff --git a/modules/juce_osc/juce_osc.h b/modules/juce_osc/juce_osc.h index 499accd6..f28b8110 100644 --- a/modules/juce_osc/juce_osc.h +++ b/modules/juce_osc/juce_osc.h @@ -35,7 +35,7 @@ ID: juce_osc vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE OSC classes description: Open Sound Control implementation. website: http://www.juce.com/juce diff --git a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp index 9ced7d1a..7030a49f 100644 --- a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp @@ -60,8 +60,8 @@ void InAppPurchases::getProductsInformation (const StringArray& productIdentifie } void InAppPurchases::purchaseProduct (const String& productIdentifier, - const String& upgradeProductIdentifier, - bool creditForUnusedSubscription) + [[maybe_unused]] const String& upgradeProductIdentifier, + [[maybe_unused]] bool creditForUnusedSubscription) { #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->purchaseProduct (productIdentifier, upgradeProductIdentifier, creditForUnusedSubscription); @@ -69,66 +69,55 @@ void InAppPurchases::purchaseProduct (const String& productIdentifier, Listener::PurchaseInfo purchaseInfo { Purchase { "", productIdentifier, {}, {}, {} }, {} }; listeners.call ([&] (Listener& l) { l.productPurchaseFinished (purchaseInfo, false, "In-app purchases unavailable"); }); - ignoreUnused (upgradeProductIdentifier, creditForUnusedSubscription); #endif } -void InAppPurchases::restoreProductsBoughtList (bool includeDownloadInfo, const String& subscriptionsSharedSecret) +void InAppPurchases::restoreProductsBoughtList ([[maybe_unused]] bool includeDownloadInfo, [[maybe_unused]] const String& subscriptionsSharedSecret) { #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->restoreProductsBoughtList (includeDownloadInfo, subscriptionsSharedSecret); #else listeners.call ([] (Listener& l) { l.purchasesListRestored ({}, false, "In-app purchases unavailable"); }); - ignoreUnused (includeDownloadInfo, subscriptionsSharedSecret); #endif } -void InAppPurchases::consumePurchase (const String& productIdentifier, const String& purchaseToken) +void InAppPurchases::consumePurchase (const String& productIdentifier, [[maybe_unused]] const String& purchaseToken) { #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->consumePurchase (productIdentifier, purchaseToken); #else listeners.call ([&] (Listener& l) { l.productConsumed (productIdentifier, false, "In-app purchases unavailable"); }); - ignoreUnused (purchaseToken); #endif } void InAppPurchases::addListener (Listener* l) { listeners.add (l); } void InAppPurchases::removeListener (Listener* l) { listeners.remove (l); } -void InAppPurchases::startDownloads (const Array& downloads) +void InAppPurchases::startDownloads ([[maybe_unused]] const Array& downloads) { #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->startDownloads (downloads); - #else - ignoreUnused (downloads); #endif } -void InAppPurchases::pauseDownloads (const Array& downloads) +void InAppPurchases::pauseDownloads ([[maybe_unused]] const Array& downloads) { #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->pauseDownloads (downloads); - #else - ignoreUnused (downloads); #endif } -void InAppPurchases::resumeDownloads (const Array& downloads) +void InAppPurchases::resumeDownloads ([[maybe_unused]] const Array& downloads) { #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->resumeDownloads (downloads); - #else - ignoreUnused (downloads); #endif } -void InAppPurchases::cancelDownloads (const Array& downloads) +void InAppPurchases::cancelDownloads ([[maybe_unused]] const Array& downloads) { #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC pimpl->cancelDownloads (downloads); - #else - ignoreUnused (downloads); #endif } diff --git a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h index 2f89af71..d67755b8 100644 --- a/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h +++ b/modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h @@ -261,12 +261,10 @@ public: "and only a single subscription can be upgraded/downgraded. Use the updated purchaseProduct method " "which takes a single String argument.")]] void purchaseProduct (const String& productIdentifier, - bool isSubscription, + [[maybe_unused]] bool isSubscription, const StringArray& upgradeOrDowngradeFromSubscriptionsWithProductIdentifiers = {}, bool creditForUnusedSubscription = true) { - - ignoreUnused (isSubscription); purchaseProduct (productIdentifier, upgradeOrDowngradeFromSubscriptionsWithProductIdentifiers[0], creditForUnusedSubscription); diff --git a/modules/juce_product_unlocking/juce_product_unlocking.h b/modules/juce_product_unlocking/juce_product_unlocking.h index 39de8d87..dd98ea66 100644 --- a/modules/juce_product_unlocking/juce_product_unlocking.h +++ b/modules/juce_product_unlocking/juce_product_unlocking.h @@ -35,7 +35,7 @@ ID: juce_product_unlocking vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE Online marketplace support description: Classes for online product authentication website: http://www.juce.com/juce diff --git a/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp b/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp index b382e5a1..bed2c811 100644 --- a/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp +++ b/modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp @@ -143,7 +143,7 @@ inline StringArray javaListOfStringToJuceStringArray (const LocalRef& j } //============================================================================== -constexpr unsigned char juceBillingClientCompiled[] +constexpr uint8 juceBillingClientCompiled[] { 0x1f, 0x8b, 0x08, 0x08, 0xa4, 0x53, 0xd0, 0x62, 0x04, 0x03, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x9d, 0x5a, @@ -685,31 +685,27 @@ struct InAppPurchases::Pimpl } //============================================================================== - void startDownloads (const Array& downloads) + void startDownloads ([[maybe_unused]] const Array& downloads) { // Not available on this platform. - ignoreUnused (downloads); jassertfalse; } - void pauseDownloads (const Array& downloads) + void pauseDownloads ([[maybe_unused]] const Array& downloads) { // Not available on this platform. - ignoreUnused (downloads); jassertfalse; } - void resumeDownloads (const Array& downloads) + void resumeDownloads ([[maybe_unused]] const Array& downloads) { // Not available on this platform. - ignoreUnused (downloads); jassertfalse; } - void cancelDownloads (const Array& downloads) + void cancelDownloads ([[maybe_unused]] const Array& downloads) { // Not available on this platform. - ignoreUnused (downloads); jassertfalse; } @@ -724,42 +720,17 @@ private: METHOD (queryPurchases, "queryPurchases", "()V") \ METHOD (consumePurchase, "consumePurchase", "(Ljava/lang/String;Ljava/lang/String;)V") \ \ - CALLBACK (productDetailsQueryCallback, "productDetailsQueryCallback", "(JLjava/util/List;)V") \ - CALLBACK (purchasesListQueryCallback, "purchasesListQueryCallback", "(JLjava/util/List;)V") \ - CALLBACK (purchaseCompletedCallback, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \ - CALLBACK (purchaseConsumedCallback, "purchaseConsumedCallback", "(JLjava/lang/String;I)V") + CALLBACK (generatedCallback<&Pimpl::updateProductDetails>, "productDetailsQueryCallback", "(JLjava/util/List;)V") \ + CALLBACK (generatedCallback<&Pimpl::updatePurchasesList>, "purchasesListQueryCallback", "(JLjava/util/List;)V") \ + CALLBACK (generatedCallback<&Pimpl::purchaseCompleted>, "purchaseCompletedCallback", "(JLcom/android/billingclient/api/Purchase;I)V") \ + CALLBACK (generatedCallback<&Pimpl::purchaseConsumed>, "purchaseConsumedCallback", "(JLjava/lang/String;I)V") DECLARE_JNI_CLASS_WITH_BYTECODE (JuceBillingClient, "com/rmsl/juce/JuceBillingClient", 16, - juceBillingClientCompiled, - numElementsInArray (juceBillingClientCompiled)) + juceBillingClientCompiled) #undef JNI_CLASS_MEMBERS - static void JNICALL productDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject productDetailsList) - { - if (auto* myself = reinterpret_cast (host)) - myself->updateProductDetails (productDetailsList); - } - - static void JNICALL purchasesListQueryCallback (JNIEnv*, jobject, jlong host, jobject purchasesList) - { - if (auto* myself = reinterpret_cast (host)) - myself->updatePurchasesList (purchasesList); - } - - static void JNICALL purchaseCompletedCallback (JNIEnv*, jobject, jlong host, jobject purchase, int responseCode) - { - if (auto* myself = reinterpret_cast (host)) - myself->purchaseCompleted (purchase, responseCode); - } - - static void JNICALL purchaseConsumedCallback (JNIEnv*, jobject, jlong host, jstring productIdentifier, int responseCode) - { - if (auto* myself = reinterpret_cast (host)) - myself->purchaseConsumed (productIdentifier, responseCode); - } - //============================================================================== bool isReady() const { @@ -1041,32 +1012,32 @@ private: return responseCode == 0; } - void purchaseCompleted (jobject purchase, int responseCode) + static void purchaseCompleted (JNIEnv*, Pimpl& t, jobject purchase, int responseCode) { - notifyListenersAboutPurchase (buildPurchase (LocalRef { purchase }), - wasSuccessful (responseCode), - getStatusDescriptionFromResponseCode (responseCode)); + t.notifyListenersAboutPurchase (buildPurchase (LocalRef { purchase }), + wasSuccessful (responseCode), + getStatusDescriptionFromResponseCode (responseCode)); } - void purchaseConsumed (jstring productIdentifier, int responseCode) + static void purchaseConsumed (JNIEnv*, Pimpl& t, jstring productIdentifier, int responseCode) { - notifyListenersAboutConsume (juceString (LocalRef { productIdentifier }), - wasSuccessful (responseCode), - getStatusDescriptionFromResponseCode (responseCode)); + t.notifyListenersAboutConsume (juceString (LocalRef { productIdentifier }), + wasSuccessful (responseCode), + getStatusDescriptionFromResponseCode (responseCode)); } - void updateProductDetails (jobject productDetailsList) + static void updateProductDetails (JNIEnv*, Pimpl& t, jobject productDetailsList) { - jassert (! productDetailsQueryCallbackQueue.empty()); - productDetailsQueryCallbackQueue.front() (LocalRef { productDetailsList }); - productDetailsQueryCallbackQueue.pop(); + jassert (! t.productDetailsQueryCallbackQueue.empty()); + t.productDetailsQueryCallbackQueue.front() (LocalRef { productDetailsList }); + t.productDetailsQueryCallbackQueue.pop(); } - void updatePurchasesList (jobject purchasesList) + static void updatePurchasesList (JNIEnv*, Pimpl& t, jobject purchasesList) { - jassert (! purchasesListQueryCallbackQueue.empty()); - purchasesListQueryCallbackQueue.front() (LocalRef { purchasesList }); - purchasesListQueryCallbackQueue.pop(); + jassert (! t.purchasesListQueryCallbackQueue.empty()); + t.purchasesListQueryCallbackQueue.front() (LocalRef { purchasesList }); + t.purchasesListQueryCallbackQueue.pop(); } //============================================================================== @@ -1099,7 +1070,4 @@ void juce_handleOnResume() }); } - -InAppPurchases::Pimpl::JuceBillingClient_Class InAppPurchases::Pimpl::JuceBillingClient; - } // namespace juce diff --git a/modules/juce_video/capture/juce_CameraDevice.cpp b/modules/juce_video/capture/juce_CameraDevice.cpp index da0f3a6d..5a317a72 100644 --- a/modules/juce_video/capture/juce_CameraDevice.cpp +++ b/modules/juce_video/capture/juce_CameraDevice.cpp @@ -191,10 +191,10 @@ StringArray CameraDevice::getAvailableDevices() } } -CameraDevice* CameraDevice::openDevice (int index, - int minWidth, int minHeight, - int maxWidth, int maxHeight, - bool useHighQuality) +CameraDevice* CameraDevice::openDevice ([[maybe_unused]] int index, + [[maybe_unused]] int minWidth, [[maybe_unused]] int minHeight, + [[maybe_unused]] int maxWidth, [[maybe_unused]] int maxHeight, + [[maybe_unused]] bool useHighQuality) { jassert (juce::MessageManager::getInstance()->currentThreadHasLockedMessageManager()); @@ -204,9 +204,6 @@ CameraDevice* CameraDevice::openDevice (int index, if (d != nullptr && d->pimpl->openedOk()) return d.release(); #else - ignoreUnused (index, minWidth, minHeight); - ignoreUnused (maxWidth, maxHeight, useHighQuality); - // Use openDeviceAsync to open a camera device on iOS or Android. jassertfalse; #endif diff --git a/modules/juce_video/juce_video.h b/modules/juce_video/juce_video.h index 80f5a36c..1af919d1 100644 --- a/modules/juce_video/juce_video.h +++ b/modules/juce_video/juce_video.h @@ -35,7 +35,7 @@ ID: juce_video vendor: juce - version: 7.0.3 + version: 7.0.4 name: JUCE video playback and capture classes description: Classes for playing video and capturing camera input. website: http://www.juce.com/juce diff --git a/modules/juce_video/native/juce_android_CameraDevice.h b/modules/juce_video/native/juce_android_CameraDevice.h index 45a731cc..fd29bfb7 100644 --- a/modules/juce_video/native/juce_android_CameraDevice.h +++ b/modules/juce_video/native/juce_android_CameraDevice.h @@ -400,7 +400,7 @@ class MediaRecorderOnInfoListener : public AndroidInterfaceImplementer public: struct Owner { - virtual ~Owner() {} + virtual ~Owner() = default; virtual void onInfo (LocalRef& mediaRecorder, int what, int extra) = 0; }; @@ -715,7 +715,7 @@ private: { auto key = LocalRef (env->CallObjectMethod (keysList, JavaList.get, i)); auto jKeyName = LocalRef ((jstring) env->CallObjectMethod (key, CameraCharacteristicsKey.getName)); - auto keyName = juceString (jKeyName); + [[maybe_unused]] auto keyName = juceString (jKeyName); auto keyValue = LocalRef (env->CallObjectMethod (characteristics, CameraCharacteristics.get, key.get())); auto jKeyValueString = LocalRef ((jstring) env->CallObjectMethod (keyValue, JavaObject.toString)); @@ -747,16 +747,12 @@ private: JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + keyValueString); } } - - ignoreUnused (keyName); } } - static void printPrimitiveArrayElements (const LocalRef& keyValue, const String& keyName, + static void printPrimitiveArrayElements (const LocalRef& keyValue, [[maybe_unused]] const String& keyName, const String& keyValueString) { - ignoreUnused (keyName); - String result = "["; auto* env = getEnv(); @@ -790,7 +786,7 @@ private: JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + result); } - static void printRangeArrayElements (const LocalRef& rangeArray, const String& keyName) + static void printRangeArrayElements (const LocalRef& rangeArray, [[maybe_unused]] const String& keyName) { auto* env = getEnv(); @@ -809,7 +805,6 @@ private: result << juceString (jRangeString) << " "; } - ignoreUnused (keyName); JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + result); } @@ -921,10 +916,8 @@ private: javaString (name).get())); } - static void printSizesLog (const Array>& sizes, const String& className) + static void printSizesLog ([[maybe_unused]] const Array>& sizes, [[maybe_unused]] const String& className) { - ignoreUnused (sizes, className); - JUCE_CAMERA_LOG ("Sizes for class " + className); #if JUCE_CAMERA_LOG_ENABLED @@ -1489,18 +1482,14 @@ private: Desktop::getInstance().setOrientationsEnabled (orientationsEnabled); } - void onInfo (LocalRef& recorder, int what, int extra) override + void onInfo ([[maybe_unused]] LocalRef& recorder, [[maybe_unused]] int what, [[maybe_unused]] int extra) override { - ignoreUnused (recorder, what, extra); - JUCE_CAMERA_LOG ("MediaRecorder::OnInfo: " + getInfoStringFromCode (what) + ", extra code = " + String (extra)); } - void onError (LocalRef& recorder, int what, int extra) override + void onError ([[maybe_unused]] LocalRef& recorder, [[maybe_unused]] int what, [[maybe_unused]] int extra) override { - ignoreUnused (recorder, what, extra); - JUCE_CAMERA_LOG ("MediaRecorder::onError: " + getErrorStringFromCode (what) + ", extra code = " + String (extra)); } @@ -1722,26 +1711,25 @@ private: //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(JZ)V") \ - CALLBACK (cameraCaptureSessionCaptureCompletedCallback, "cameraCaptureSessionCaptureCompleted", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/TotalCaptureResult;)V") \ - CALLBACK (cameraCaptureSessionCaptureFailedCallback, "cameraCaptureSessionCaptureFailed", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureFailure;)V") \ - CALLBACK (cameraCaptureSessionCaptureProgressedCallback, "cameraCaptureSessionCaptureProgressed", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureResult;)V") \ - CALLBACK (cameraCaptureSessionCaptureStartedCallback, "cameraCaptureSessionCaptureStarted", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;JJ)V") \ - CALLBACK (cameraCaptureSessionCaptureSequenceAbortedCallback, "cameraCaptureSessionCaptureSequenceAborted", "(JZLandroid/hardware/camera2/CameraCaptureSession;I)V") \ - CALLBACK (cameraCaptureSessionCaptureSequenceCompletedCallback, "cameraCaptureSessionCaptureSequenceCompleted", "(JZLandroid/hardware/camera2/CameraCaptureSession;IJ)V") - - DECLARE_JNI_CLASS_WITH_BYTECODE (CameraCaptureSessionCaptureCallback, "com/rmsl/juce/CameraCaptureSessionCaptureCallback", 21, CameraSupportByteCode, sizeof(CameraSupportByteCode)) + CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureCompletedCallback>, "cameraCaptureSessionCaptureCompleted", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/TotalCaptureResult;)V") \ + CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureFailedCallback>, "cameraCaptureSessionCaptureFailed", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureFailure;)V") \ + CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureProgressedCallback>, "cameraCaptureSessionCaptureProgressed", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureResult;)V") \ + CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureStartedCallback>, "cameraCaptureSessionCaptureStarted", "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;JJ)V") \ + CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureSequenceAbortedCallback>, "cameraCaptureSessionCaptureSequenceAborted", "(JZLandroid/hardware/camera2/CameraCaptureSession;I)V") \ + CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureSequenceCompletedCallback>, "cameraCaptureSessionCaptureSequenceCompleted", "(JZLandroid/hardware/camera2/CameraCaptureSession;IJ)V") + + DECLARE_JNI_CLASS_WITH_BYTECODE (CameraCaptureSessionCaptureCallback, "com/rmsl/juce/CameraCaptureSessionCaptureCallback", 21, CameraSupportByteCode) #undef JNI_CLASS_MEMBERS LocalRef createCaptureSessionCallback (bool createPreviewSession) { - return LocalRef(getEnv()->NewObject (CameraCaptureSessionCaptureCallback, - CameraCaptureSessionCaptureCallback.constructor, - reinterpret_cast (this), - createPreviewSession ? 1 : 0)); + return LocalRef (getEnv()->NewObject (CameraCaptureSessionCaptureCallback, + CameraCaptureSessionCaptureCallback.constructor, + reinterpret_cast (this), + createPreviewSession ? 1 : 0)); } //============================================================================== - enum class State { idle = 0, @@ -1976,122 +1964,110 @@ private: } //============================================================================== - void cameraCaptureSessionCaptureCompleted (bool isPreview, jobject session, jobject request, jobject result) + void cameraCaptureSessionCaptureCompleted (bool isPreview, + [[maybe_unused]] jobject session, + [[maybe_unused]] jobject request, + jobject result) { JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureCompleted()"); - ignoreUnused (session, request); - if (isPreview) updateState (result); else if (currentState != State::idle) unlockFocus(); } - void cameraCaptureSessionCaptureFailed (bool isPreview, jobject session, jobject request, jobject failure) + void cameraCaptureSessionCaptureFailed ([[maybe_unused]] bool isPreview, + [[maybe_unused]] jobject session, + [[maybe_unused]] jobject request, + [[maybe_unused]] jobject failure) { JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureFailed()"); - - ignoreUnused (isPreview, session, request, failure); } - void cameraCaptureSessionCaptureProgressed (bool isPreview, jobject session, jobject request, jobject partialResult) + void cameraCaptureSessionCaptureProgressed (bool isPreview, + [[maybe_unused]] jobject session, + [[maybe_unused]] jobject request, + jobject partialResult) { JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureProgressed()"); - ignoreUnused (session, request); - if (isPreview) updateState (partialResult); } - void cameraCaptureSessionCaptureSequenceAborted (bool isPreview, jobject session, int sequenceId) + void cameraCaptureSessionCaptureSequenceAborted ([[maybe_unused]] bool isPreview, + [[maybe_unused]] jobject session, + [[maybe_unused]] int sequenceId) { JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureSequenceAborted()"); - - ignoreUnused (isPreview, isPreview, session, sequenceId); } - void cameraCaptureSessionCaptureSequenceCompleted (bool isPreview, jobject session, int sequenceId, int64 frameNumber) + void cameraCaptureSessionCaptureSequenceCompleted ([[maybe_unused]] bool isPreview, + [[maybe_unused]] jobject session, + [[maybe_unused]] int sequenceId, + [[maybe_unused]] int64 frameNumber) { JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureSequenceCompleted()"); - - ignoreUnused (isPreview, session, sequenceId, frameNumber); } - void cameraCaptureSessionCaptureStarted (bool isPreview, jobject session, jobject request, int64 timestamp, int64 frameNumber) + void cameraCaptureSessionCaptureStarted ([[maybe_unused]] bool isPreview, + [[maybe_unused]] jobject session, + [[maybe_unused]] jobject request, + [[maybe_unused]] int64 timestamp, + [[maybe_unused]] int64 frameNumber) { JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureStarted()"); - - ignoreUnused (isPreview, session, request, timestamp, frameNumber); } //============================================================================== - static void cameraCaptureSessionCaptureCompletedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult) + static void cameraCaptureSessionCaptureCompletedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult) { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - LocalRef request (getEnv()->NewLocalRef(rawRequest)); - LocalRef result (getEnv()->NewLocalRef(rawResult)); + LocalRef session (env->NewLocalRef (rawSession)); + LocalRef request (env->NewLocalRef (rawRequest)); + LocalRef result (env->NewLocalRef (rawResult)); - myself->cameraCaptureSessionCaptureCompleted (isPreview != 0, session, request, result); - } + t.cameraCaptureSessionCaptureCompleted (isPreview != 0, session, request, result); } - static void cameraCaptureSessionCaptureFailedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult) + static void cameraCaptureSessionCaptureFailedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult) { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - LocalRef request (getEnv()->NewLocalRef(rawRequest)); - LocalRef result (getEnv()->NewLocalRef(rawResult)); + LocalRef session (env->NewLocalRef (rawSession)); + LocalRef request (env->NewLocalRef (rawRequest)); + LocalRef result (env->NewLocalRef (rawResult)); - myself->cameraCaptureSessionCaptureFailed (isPreview != 0, session, request, result); - } + t.cameraCaptureSessionCaptureFailed (isPreview != 0, session, request, result); } - static void cameraCaptureSessionCaptureProgressedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult) + static void cameraCaptureSessionCaptureProgressedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult) { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - LocalRef request (getEnv()->NewLocalRef(rawRequest)); - LocalRef result (getEnv()->NewLocalRef(rawResult)); + LocalRef session (env->NewLocalRef (rawSession)); + LocalRef request (env->NewLocalRef (rawRequest)); + LocalRef result (env->NewLocalRef (rawResult)); - myself->cameraCaptureSessionCaptureProgressed (isPreview != 0, session, request, result); - } + t.cameraCaptureSessionCaptureProgressed (isPreview != 0, session, request, result); } - static void cameraCaptureSessionCaptureSequenceAbortedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jint sequenceId) + static void cameraCaptureSessionCaptureSequenceAbortedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jint sequenceId) { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); + LocalRef session (env->NewLocalRef (rawSession)); - myself->cameraCaptureSessionCaptureSequenceAborted (isPreview != 0, session, sequenceId); - } + t.cameraCaptureSessionCaptureSequenceAborted (isPreview != 0, session, sequenceId); } - static void cameraCaptureSessionCaptureSequenceCompletedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jint sequenceId, jlong frameNumber) + static void cameraCaptureSessionCaptureSequenceCompletedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jint sequenceId, jlong frameNumber) { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); + LocalRef session (env->NewLocalRef (rawSession)); - myself->cameraCaptureSessionCaptureSequenceCompleted (isPreview != 0, session, sequenceId, frameNumber); - } + t.cameraCaptureSessionCaptureSequenceCompleted (isPreview != 0, session, sequenceId, frameNumber); } - static void cameraCaptureSessionCaptureStartedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jlong timestamp, jlong frameNumber) + static void cameraCaptureSessionCaptureStartedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jlong timestamp, jlong frameNumber) { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - LocalRef request (getEnv()->NewLocalRef(rawRequest)); + LocalRef session (env->NewLocalRef (rawSession)); + LocalRef request (env->NewLocalRef (rawRequest)); - myself->cameraCaptureSessionCaptureStarted (isPreview != 0, session, request, timestamp, frameNumber); - } + t.cameraCaptureSessionCaptureStarted (isPreview != 0, session, request, timestamp, frameNumber); } }; @@ -2120,11 +2096,11 @@ private: //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(J)V") \ - CALLBACK(cameraCaptureSessionActiveCallback, "cameraCaptureSessionActive", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ - CALLBACK(cameraCaptureSessionClosedCallback, "cameraCaptureSessionClosed", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ - CALLBACK(cameraCaptureSessionConfigureFailedCallback, "cameraCaptureSessionConfigureFailed", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ - CALLBACK(cameraCaptureSessionConfiguredCallback, "cameraCaptureSessionConfigured", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ - CALLBACK(cameraCaptureSessionReadyCallback, "cameraCaptureSessionReady", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") + CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionActiveCallback>, "cameraCaptureSessionActive", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ + CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionClosedCallback>, "cameraCaptureSessionClosed", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ + CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionConfigureFailedCallback>, "cameraCaptureSessionConfigureFailed", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ + CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionConfiguredCallback>, "cameraCaptureSessionConfigured", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \ + CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionReadyCallback>, "cameraCaptureSessionReady", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") DECLARE_JNI_CLASS_WITH_MIN_SDK (CameraCaptureSessionStateCallback, "com/rmsl/juce/CameraCaptureSessionStateCallback", 21) #undef JNI_CLASS_MEMBERS @@ -2166,126 +2142,81 @@ private: env->CallVoidMethod (captureRequestBuilder, CaptureRequestBuilder.set, jKey.get(), jValue.get()); } - void cameraCaptureSessionActive (jobject session) + //============================================================================== + static void cameraCaptureSessionActiveCallback ([[maybe_unused]] JNIEnv* env, + [[maybe_unused]] CaptureSession& t, + [[maybe_unused]] jobject rawSession) { JUCE_CAMERA_LOG ("cameraCaptureSessionActive()"); - ignoreUnused (session); } - void cameraCaptureSessionClosed (jobject session) + static void cameraCaptureSessionClosedCallback ([[maybe_unused]] JNIEnv* env, + CaptureSession& t, + [[maybe_unused]] jobject rawSession) { JUCE_CAMERA_LOG ("cameraCaptureSessionClosed()"); - ignoreUnused (session); - closedEvent.signal(); + t.closedEvent.signal(); } - void cameraCaptureSessionConfigureFailed (jobject session) + static void cameraCaptureSessionConfigureFailedCallback ([[maybe_unused]] JNIEnv* env, + CaptureSession& t, + [[maybe_unused]] jobject rawSession) { JUCE_CAMERA_LOG ("cameraCaptureSessionConfigureFailed()"); - ignoreUnused (session); - MessageManager::callAsync ([weakRef = WeakReference { this }] - { - if (weakRef != nullptr) - weakRef->configuredCallback.captureSessionConfigured (nullptr); - }); + MessageManager::callAsync ([weakRef = WeakReference { &t }] + { + if (weakRef != nullptr) + weakRef->configuredCallback.captureSessionConfigured (nullptr); + }); } - void cameraCaptureSessionConfigured (const LocalRef& session) + static void cameraCaptureSessionConfiguredCallback (JNIEnv* env, CaptureSession& t, jobject rawSession) { + LocalRef session (env->NewLocalRef (rawSession)); JUCE_CAMERA_LOG ("cameraCaptureSessionConfigured()"); - if (pendingClose.get() == 1) + if (t.pendingClose.get() == 1) { // Already closing, bailout. - closedEvent.signal(); + t.closedEvent.signal(); GlobalRef s (session); MessageManager::callAsync ([s]() - { - getEnv()->CallVoidMethod (s, CameraCaptureSession.close); - }); + { + getEnv()->CallVoidMethod (s, CameraCaptureSession.close); + }); return; } { - const ScopedLock lock (captureSessionLock); - captureSession = GlobalRef (session); + const ScopedLock lock (t.captureSessionLock); + t.captureSession = GlobalRef (session); } - MessageManager::callAsync ([weakRef = WeakReference { this }] - { - if (weakRef == nullptr) - return; + MessageManager::callAsync ([weakRef = WeakReference { &t }] + { + if (weakRef == nullptr) + return; - weakRef->stillPictureTaker.reset (new StillPictureTaker (weakRef->captureSession, - weakRef->captureRequestBuilder, - weakRef->previewCaptureRequest, - weakRef->handler, - weakRef->autoFocusMode)); + weakRef->stillPictureTaker.reset (new StillPictureTaker (weakRef->captureSession, + weakRef->captureRequestBuilder, + weakRef->previewCaptureRequest, + weakRef->handler, + weakRef->autoFocusMode)); - weakRef->configuredCallback.captureSessionConfigured (weakRef.get()); - }); + weakRef->configuredCallback.captureSessionConfigured (weakRef.get()); + }); } - void cameraCaptureSessionReady (const LocalRef& session) + static void cameraCaptureSessionReadyCallback ([[maybe_unused]] JNIEnv* env, + [[maybe_unused]] CaptureSession& t, + [[maybe_unused]] jobject rawSession) { JUCE_CAMERA_LOG ("cameraCaptureSessionReady()"); - ignoreUnused (session); - } - - //============================================================================== - static void cameraCaptureSessionActiveCallback (JNIEnv*, jobject, jlong host, jobject rawSession) - { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - - myself->cameraCaptureSessionActive (session); - } - } - - static void cameraCaptureSessionClosedCallback (JNIEnv*, jobject, jlong host, jobject rawSession) - { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - - myself->cameraCaptureSessionClosed (session); - } - } - - static void cameraCaptureSessionConfigureFailedCallback (JNIEnv*, jobject, jlong host, jobject rawSession) - { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - - myself->cameraCaptureSessionConfigureFailed (session); - } - } - - static void cameraCaptureSessionConfiguredCallback (JNIEnv*, jobject, jlong host, jobject rawSession) - { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - - myself->cameraCaptureSessionConfigured (session); - } - } - - static void cameraCaptureSessionReadyCallback (JNIEnv*, jobject, jlong host, jobject rawSession) - { - if (auto* myself = reinterpret_cast (host)) - { - LocalRef session (getEnv()->NewLocalRef(rawSession)); - - myself->cameraCaptureSessionReady (session); - } } //============================================================================== @@ -2383,10 +2314,10 @@ private: //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(J)V") \ - CALLBACK (cameraDeviceStateClosedCallback, "cameraDeviceStateClosed", "(JLandroid/hardware/camera2/CameraDevice;)V") \ - CALLBACK (cameraDeviceStateDisconnectedCallback, "cameraDeviceStateDisconnected", "(JLandroid/hardware/camera2/CameraDevice;)V") \ - CALLBACK (cameraDeviceStateErrorCallback, "cameraDeviceStateError", "(JLandroid/hardware/camera2/CameraDevice;I)V") \ - CALLBACK (cameraDeviceStateOpenedCallback, "cameraDeviceStateOpened", "(JLandroid/hardware/camera2/CameraDevice;)V") + CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateClosedCallback>, "cameraDeviceStateClosed", "(JLandroid/hardware/camera2/CameraDevice;)V") \ + CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateDisconnectedCallback>, "cameraDeviceStateDisconnected", "(JLandroid/hardware/camera2/CameraDevice;)V") \ + CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateErrorCallback>, "cameraDeviceStateError", "(JLandroid/hardware/camera2/CameraDevice;I)V") \ + CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateOpenedCallback>, "cameraDeviceStateOpened", "(JLandroid/hardware/camera2/CameraDevice;)V") DECLARE_JNI_CLASS_WITH_MIN_SDK (CameraDeviceStateCallback, "com/rmsl/juce/CameraDeviceStateCallback", 21) #undef JNI_CLASS_MEMBERS @@ -2399,92 +2330,66 @@ private: } //============================================================================== - void cameraDeviceStateClosed() + void notifyOpenResult() + { + MessageManager::callAsync ([this]() { owner.cameraOpenFinished (openError); }); + } + + //============================================================================== + static void cameraDeviceStateClosedCallback (JNIEnv*, ScopedCameraDevice& s, jobject) { JUCE_CAMERA_LOG ("cameraDeviceStateClosed()"); - closedEvent.signal(); + s.closedEvent.signal(); } - void cameraDeviceStateDisconnected() + static void cameraDeviceStateDisconnectedCallback (JNIEnv*, ScopedCameraDevice& s, jobject) { JUCE_CAMERA_LOG ("cameraDeviceStateDisconnected()"); - if (pendingOpen.compareAndSetBool (0, 1)) + if (s.pendingOpen.compareAndSetBool (0, 1)) { - openError = "Device disconnected"; + s.openError = "Device disconnected"; - notifyOpenResult(); + s.notifyOpenResult(); } - MessageManager::callAsync ([this]() { close(); }); + MessageManager::callAsync ([&s] { s.close(); }); } - void cameraDeviceStateError (int errorCode) + static void cameraDeviceStateErrorCallback (JNIEnv*, ScopedCameraDevice& s, jobject, jint errorCode) { - String error = cameraErrorCodeToString (errorCode); + auto error = cameraErrorCodeToString (errorCode); JUCE_CAMERA_LOG ("cameraDeviceStateError(), error: " + error); - if (pendingOpen.compareAndSetBool (0, 1)) + if (s.pendingOpen.compareAndSetBool (0, 1)) { - openError = error; + s.openError = error; - notifyOpenResult(); + s.notifyOpenResult(); } - fatalErrorOccurred.set (1); + s.fatalErrorOccurred.set (1); - MessageManager::callAsync ([this, error]() + MessageManager::callAsync ([&s, error]() { - owner.cameraDeviceError (error); - close(); + s.owner.cameraDeviceError (error); + s.close(); }); } - void cameraDeviceStateOpened (const LocalRef& cameraDeviceToUse) + static void cameraDeviceStateOpenedCallback (JNIEnv* env, ScopedCameraDevice& s, jobject cameraDeviceToUse) { JUCE_CAMERA_LOG ("cameraDeviceStateOpened()"); - pendingOpen.set (0); - - cameraDevice = GlobalRef (cameraDeviceToUse); - - notifyOpenResult(); - } - - void notifyOpenResult() - { - MessageManager::callAsync ([this]() { owner.cameraOpenFinished (openError); }); - } - - //============================================================================== - static void JNICALL cameraDeviceStateClosedCallback (JNIEnv*, jobject, jlong host, jobject) - { - if (auto* myself = reinterpret_cast(host)) - myself->cameraDeviceStateClosed(); - } + LocalRef camera (env->NewLocalRef (cameraDeviceToUse)); - static void JNICALL cameraDeviceStateDisconnectedCallback (JNIEnv*, jobject, jlong host, jobject) - { - if (auto* myself = reinterpret_cast(host)) - myself->cameraDeviceStateDisconnected(); - } - - static void JNICALL cameraDeviceStateErrorCallback (JNIEnv*, jobject, jlong host, jobject, jint error) - { - if (auto* myself = reinterpret_cast(host)) - myself->cameraDeviceStateError (error); - } + s.pendingOpen.set (0); - static void JNICALL cameraDeviceStateOpenedCallback (JNIEnv*, jobject, jlong host, jobject rawCamera) - { - if (auto* myself = reinterpret_cast(host)) - { - LocalRef camera(getEnv()->NewLocalRef(rawCamera)); + s.cameraDevice = GlobalRef (camera); - myself->cameraDeviceStateOpened (camera); - } + s.notifyOpenResult(); } }; @@ -2824,7 +2729,7 @@ private: METHOD (constructor, "", "(JLandroid/content/Context;I)V") \ METHOD (disable, "disable", "()V") \ METHOD (enable, "enable", "()V") \ - CALLBACK (deviceOrientationChanged, "deviceOrientationChanged", "(JI)V") + CALLBACK (generatedCallback<&DeviceOrientationChangeListener::orientationChanged>, "deviceOrientationChanged", "(JI)V") DECLARE_JNI_CLASS_WITH_MIN_SDK (OrientationEventListener, "com/rmsl/juce/JuceOrientationEventListener", 21) #undef JNI_CLASS_MEMBERS @@ -2839,7 +2744,7 @@ private: } //============================================================================== - void orientationChanged (int orientation) + static void orientationChanged (JNIEnv*, DeviceOrientationChangeListener& t, jint orientation) { jassert (orientation < 360); @@ -2847,25 +2752,31 @@ private: if (orientation < 0) return; - auto oldOrientation = deviceOrientation; + const auto oldOrientation = t.deviceOrientation; + + t.deviceOrientation = [orientation] + { + if (orientation > (360 - 45) || orientation < 45) + return Desktop::upright; + + if (orientation < 135) + return Desktop::rotatedClockwise; + + if (orientation < 225) + return Desktop::upsideDown; + + return Desktop::rotatedAntiClockwise; + }(); // NB: this assumes natural position to be portrait always, but some devices may be landscape... - if (orientation > (360 - 45) || orientation < 45) - deviceOrientation = Desktop::upright; - else if (orientation < 135) - deviceOrientation = Desktop::rotatedClockwise; - else if (orientation < 225) - deviceOrientation = Desktop::upsideDown; - else - deviceOrientation = Desktop::rotatedAntiClockwise; - if (oldOrientation != deviceOrientation) + if (oldOrientation != t.deviceOrientation) { - lastKnownScreenOrientation = Desktop::getInstance().getCurrentOrientation(); + t.lastKnownScreenOrientation = Desktop::getInstance().getCurrentOrientation(); // Need to update preview transform, but screen orientation will change slightly // later than sensor orientation. - startTimer (500); + t.startTimer (500); } } @@ -2890,12 +2801,6 @@ private: numChecksForOrientationChange = 10; } } - - static void deviceOrientationChanged (JNIEnv*, jobject /*obj*/, jlong host, jint orientation) - { - if (auto* myself = reinterpret_cast (host)) - myself->orientationChanged (orientation); - } }; //============================================================================== @@ -3189,7 +3094,7 @@ private: { auto* env = getEnv(); - auto quitSafelyMethod = env->GetMethodID(AndroidHandlerThread, "quitSafely", "()Z"); + auto quitSafelyMethod = env->GetMethodID (AndroidHandlerThread, "quitSafely", "()Z"); // this code will only run on SDK >= 21 jassert(quitSafelyMethod != nullptr); @@ -3277,9 +3182,3 @@ String CameraDevice::getFileExtension() { return ".mp4"; } - -//============================================================================== -CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::StillPictureTaker::CameraCaptureSessionCaptureCallback_Class CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::StillPictureTaker::CameraCaptureSessionCaptureCallback; -CameraDevice::Pimpl::ScopedCameraDevice::CameraDeviceStateCallback_Class CameraDevice::Pimpl::ScopedCameraDevice::CameraDeviceStateCallback; -CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::CameraCaptureSessionStateCallback_Class CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::CameraCaptureSessionStateCallback; -CameraDevice::Pimpl::DeviceOrientationChangeListener::OrientationEventListener_Class CameraDevice::Pimpl::DeviceOrientationChangeListener::OrientationEventListener; diff --git a/modules/juce_video/native/juce_android_Video.h b/modules/juce_video/native/juce_android_Video.h index 101bf958..56d94bbb 100644 --- a/modules/juce_video/native/juce_android_Video.h +++ b/modules/juce_video/native/juce_android_Video.h @@ -32,7 +32,7 @@ // // files with min sdk version 21 // See juce_core/native/java/README.txt on how to generate this byte-code. -static const unsigned char MediaSessionByteCode[] = +static const uint8 MediaSessionByteCode[] = { 31,139,8,8,247,108,161,94,0,3,77,101,100,105,97,83,101,115,115,105,111,110,66,121,116,101,67,111,100,101,46,100,101,120,0,149, 152,127,108,28,71,21,199,223,236,253,180,207,190,95,254,221,186,169,211,56,137,19,234,220,145,26,226,228,28,99,199,216,196,233, 249,71,125,182,107,76,168,187,246,109,236,77,238,118,143,221,189,171,45,132,168,170,32,21,209,63,144,74,165,170,82,81,144,64, @@ -757,12 +757,12 @@ private: //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(J)V") \ - CALLBACK (audioInfoChanged, "mediaControllerAudioInfoChanged", "(JLandroid/media/session/MediaController$PlaybackInfo;)V") \ - CALLBACK (metadataChanged, "mediaControllerMetadataChanged", "(JLandroid/media/MediaMetadata;)V") \ - CALLBACK (playbackStateChanged, "mediaControllerPlaybackStateChanged", "(JLandroid/media/session/PlaybackState;)V") \ - CALLBACK (sessionDestroyed, "mediaControllerSessionDestroyed", "(J)V") + CALLBACK (generatedCallback<&Controller::audioInfoChanged>, "mediaControllerAudioInfoChanged", "(JLandroid/media/session/MediaController$PlaybackInfo;)V") \ + CALLBACK (generatedCallback<&Controller::metadataChanged>, "mediaControllerMetadataChanged", "(JLandroid/media/MediaMetadata;)V") \ + CALLBACK (generatedCallback<&Controller::playbackStateChanged>, "mediaControllerPlaybackStateChanged", "(JLandroid/media/session/PlaybackState;)V") \ + CALLBACK (generatedCallback<&Controller::sessionDestroyed>, "mediaControllerSessionDestroyed", "(J)V") - DECLARE_JNI_CLASS_WITH_BYTECODE (AndroidMediaControllerCallback, "com/rmsl/juce/MediaControllerCallback", 21, MediaSessionByteCode, sizeof (MediaSessionByteCode)) + DECLARE_JNI_CLASS_WITH_BYTECODE (AndroidMediaControllerCallback, "com/rmsl/juce/MediaControllerCallback", 21, MediaSessionByteCode) #undef JNI_CLASS_MEMBERS LocalRef createControllerCallbacks() @@ -774,34 +774,24 @@ private: //============================================================================== // MediaSessionController callbacks - static void audioInfoChanged (JNIEnv*, jobject, jlong host, jobject playbackInfo) + static void audioInfoChanged (JNIEnv*, [[maybe_unused]] Controller& t, [[maybe_unused]] jobject playbackInfo) { - if (auto* myself = reinterpret_cast (host)) - { - ignoreUnused (playbackInfo); - JUCE_VIDEO_LOG ("MediaSessionController::audioInfoChanged()"); - } + JUCE_VIDEO_LOG ("MediaSessionController::audioInfoChanged()"); } - static void metadataChanged (JNIEnv*, jobject, jlong host, jobject metadata) + static void metadataChanged (JNIEnv*, [[maybe_unused]] Controller&, [[maybe_unused]] jobject metadata) { - if (auto* myself = reinterpret_cast (host)) - { - ignoreUnused (metadata); - JUCE_VIDEO_LOG ("MediaSessionController::metadataChanged()"); - } + JUCE_VIDEO_LOG ("MediaSessionController::metadataChanged()"); } - static void playbackStateChanged (JNIEnv*, jobject, jlong host, jobject state) + static void playbackStateChanged (JNIEnv*, Controller& t, [[maybe_unused]] jobject state) { - if (auto* myself = reinterpret_cast (host)) - myself->stateChanged (state); + t.stateChanged (state); } - static void sessionDestroyed (JNIEnv*, jobject, jlong host) + static void sessionDestroyed (JNIEnv*, [[maybe_unused]] Controller& t) { - if (auto* myself = reinterpret_cast (host)) - JUCE_VIDEO_LOG ("MediaSessionController::sessionDestroyed()"); + JUCE_VIDEO_LOG ("MediaSessionController::sessionDestroyed()"); } }; @@ -835,10 +825,8 @@ private: getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, videoSurfaceHolder.get()); } - void load (const LocalRef& mediaId, const LocalRef& extras) + void load (const LocalRef& mediaId, [[maybe_unused]] const LocalRef& extras) { - ignoreUnused (extras); - closeVideo(); auto* env = getEnv(); @@ -1114,39 +1102,31 @@ private: State currentState = State::idle; //============================================================================== - void onPrepared (LocalRef& mediaPlayer) override + void onPrepared ([[maybe_unused]] LocalRef& mediaPlayer) override { JUCE_VIDEO_LOG ("MediaPlayer::onPrepared()"); - ignoreUnused (mediaPlayer); - currentState = State::prepared; owner.playerPrepared(); } - void onBufferingUpdate (LocalRef& mediaPlayer, int progress) override + void onBufferingUpdate ([[maybe_unused]] LocalRef& mediaPlayer, int progress) override { - ignoreUnused (mediaPlayer); - owner.playerBufferingUpdated (progress); } - void onSeekComplete (LocalRef& mediaPlayer) override + void onSeekComplete ([[maybe_unused]] LocalRef& mediaPlayer) override { JUCE_VIDEO_LOG ("MediaPlayer::onSeekComplete()"); - ignoreUnused (mediaPlayer); - owner.playerSeekCompleted(); } - void onCompletion (LocalRef& mediaPlayer) override + void onCompletion ([[maybe_unused]] LocalRef& mediaPlayer) override { JUCE_VIDEO_LOG ("MediaPlayer::onCompletion()"); - ignoreUnused (mediaPlayer); - currentState = State::complete; owner.playerPlaybackCompleted(); @@ -1169,13 +1149,11 @@ private: MEDIA_INFO_SUBTITLE_TIMED_OUT = 902 }; - bool onInfo (LocalRef& mediaPlayer, int what, int extra) override + bool onInfo ([[maybe_unused]] LocalRef& mediaPlayer, int what, [[maybe_unused]] int extra) override { JUCE_VIDEO_LOG ("MediaPlayer::onInfo(), infoCode: " + String (what) + " (" + infoCodeToString (what) + ")" + ", extraCode: " + String (extra)); - ignoreUnused (mediaPlayer, extra); - if (what == MEDIA_INFO_BUFFERING_START) owner.playerBufferingStarted(); else if (what == MEDIA_INFO_BUFFERING_END) @@ -1205,7 +1183,7 @@ private: } } - bool onError (LocalRef& mediaPlayer, int what, int extra) override + bool onError ([[maybe_unused]] LocalRef& mediaPlayer, int what, int extra) override { auto errorMessage = errorCodeToString (what); auto extraMessage = errorCodeToString (extra); @@ -1216,8 +1194,6 @@ private: JUCE_VIDEO_LOG ("MediaPlayer::onError(), errorCode: " + String (what) + " (" + errorMessage + ")" + ", extraCode: " + String (extra) + " (" + extraMessage + ")"); - ignoreUnused (mediaPlayer); - currentState = State::error; owner.errorOccurred (errorMessage); @@ -1295,11 +1271,11 @@ private: //============================================================================== #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(J)V") \ - CALLBACK (pauseCallback, "mediaSessionPause", "(J)V") \ - CALLBACK (playCallback, "mediaSessionPlay", "(J)V") \ - CALLBACK (playFromMediaIdCallback, "mediaSessionPlayFromMediaId", "(JLjava/lang/String;Landroid/os/Bundle;)V") \ - CALLBACK (seekToCallback, "mediaSessionSeekTo", "(JJ)V") \ - CALLBACK (stopCallback, "mediaSessionStop", "(J)V") + CALLBACK (generatedCallback<&MediaSession::pauseCallback>, "mediaSessionPause", "(J)V") \ + CALLBACK (generatedCallback<&MediaSession::playCallback>, "mediaSessionPlay", "(J)V") \ + CALLBACK (generatedCallback<&MediaSession::playFromMediaIdCallback>, "mediaSessionPlayFromMediaId", "(JLjava/lang/String;Landroid/os/Bundle;)V") \ + CALLBACK (generatedCallback<&MediaSession::seekToCallback>, "mediaSessionSeekTo", "(JJ)V") \ + CALLBACK (generatedCallback<&MediaSession::stopCallback>, "mediaSessionStop", "(J)V") DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidMediaSessionCallback, "com/rmsl/juce/MediaSessionCallback", 21) #undef JNI_CLASS_MEMBERS @@ -1313,78 +1289,62 @@ private: //============================================================================== // MediaSession callbacks - static void pauseCallback (JNIEnv*, jobject, jlong host) + static void pauseCallback (JNIEnv*, MediaSession& t) { - if (auto* myself = reinterpret_cast (host)) - { - JUCE_VIDEO_LOG ("MediaSession::pauseCallback()"); - myself->player.pause(); - myself->updatePlaybackState(); - - myself->abandonAudioFocus(); - } + JUCE_VIDEO_LOG ("MediaSession::pauseCallback()"); + t.player.pause(); + t.updatePlaybackState(); + t.abandonAudioFocus(); } - static void playCallback (JNIEnv*, jobject, jlong host) + static void playCallback (JNIEnv* env, MediaSession& t) { - if (auto* myself = reinterpret_cast (host)) - { - JUCE_VIDEO_LOG ("MediaSession::playCallback()"); + JUCE_VIDEO_LOG ("MediaSession::playCallback()"); - myself->requestAudioFocus(); + t.requestAudioFocus(); - if (! myself->hasAudioFocus) - { - myself->errorOccurred ("Application has been denied audio focus. Try again later."); - return; - } + if (! t.hasAudioFocus) + { + t.errorOccurred ("Application has been denied audio focus. Try again later."); + return; + } - getEnv()->CallVoidMethod (myself->nativeMediaSession, AndroidMediaSession.setActive, true); + env->CallVoidMethod (t.nativeMediaSession, AndroidMediaSession.setActive, true); - myself->player.play(); - myself->setSpeed (myself->playSpeedMult); - myself->updatePlaybackState(); - } + t.player.play(); + t.setSpeed (t.playSpeedMult); + t.updatePlaybackState(); } - static void playFromMediaIdCallback (JNIEnv* env, jobject, jlong host, jstring mediaId, jobject extras) + static void playFromMediaIdCallback (JNIEnv* env, MediaSession& t, jstring mediaId, jobject extras) { - if (auto* myself = reinterpret_cast (host)) - { - JUCE_VIDEO_LOG ("MediaSession::playFromMediaIdCallback()"); + JUCE_VIDEO_LOG ("MediaSession::playFromMediaIdCallback()"); - myself->player.load (LocalRef ((jstring) env->NewLocalRef(mediaId)), LocalRef (env->NewLocalRef(extras))); - myself->updatePlaybackState(); - } + t.player.load (LocalRef ((jstring) env->NewLocalRef (mediaId)), LocalRef (env->NewLocalRef (extras))); + t.updatePlaybackState(); } - static void seekToCallback (JNIEnv* /*env*/, jobject, jlong host, jlong pos) + static void seekToCallback (JNIEnv*, MediaSession& t, jlong pos) { - if (auto* myself = reinterpret_cast (host)) - { - JUCE_VIDEO_LOG ("MediaSession::seekToCallback()"); + JUCE_VIDEO_LOG ("MediaSession::seekToCallback()"); - myself->pendingSeekRequest = true; - myself->player.setPlayPosition ((jint) pos); - myself->updatePlaybackState(); - } + t.pendingSeekRequest = true; + t.player.setPlayPosition ((jint) pos); + t.updatePlaybackState(); } - static void stopCallback(JNIEnv* env, jobject, jlong host) + static void stopCallback (JNIEnv* env, MediaSession& t) { - if (auto* myself = reinterpret_cast (host)) - { - JUCE_VIDEO_LOG ("MediaSession::stopCallback()"); + JUCE_VIDEO_LOG ("MediaSession::stopCallback()"); - env->CallVoidMethod (myself->nativeMediaSession, AndroidMediaSession.setActive, false); + env->CallVoidMethod (t.nativeMediaSession, AndroidMediaSession.setActive, false); - myself->player.closeVideo(); - myself->updatePlaybackState(); + t.player.closeVideo(); + t.updatePlaybackState(); - myself->abandonAudioFocus(); + t.abandonAudioFocus(); - myself->owner.closeVideoFinished(); - } + t.owner.closeVideoFinished(); } //============================================================================== @@ -1689,7 +1649,7 @@ private: #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \ METHOD (constructor, "", "(Landroid/app/Activity;J)V") \ METHOD (setEnabled, "setEnabled", "(Z)V") \ - CALLBACK (systemVolumeChangedCallback, "mediaSessionSystemVolumeChanged", "(J)V") + CALLBACK (generatedCallback<&SystemVolumeListener::systemVolumeChanged>, "mediaSessionSystemVolumeChanged", "(J)V") DECLARE_JNI_CLASS_WITH_MIN_SDK (SystemVolumeObserver, "com/rmsl/juce/SystemVolumeObserver", 21) #undef JNI_CLASS_MEMBERS @@ -1709,14 +1669,14 @@ private: // Send first notification instantly to ensure sync. if (shouldBeEnabled) - systemVolumeChanged(); + systemVolumeChanged (getEnv(), *this); } private: //============================================================================== - void systemVolumeChanged() + static void systemVolumeChanged (JNIEnv*, SystemVolumeListener& t) { - MessageManager::callAsync ([weakThis = WeakReference { this }]() mutable + MessageManager::callAsync ([weakThis = WeakReference { &t }] { if (weakThis == nullptr) return; @@ -1727,13 +1687,6 @@ private: } - //============================================================================== - static void systemVolumeChangedCallback (JNIEnv*, jobject, jlong host) - { - if (auto* myself = reinterpret_cast (host)) - myself->systemVolumeChanged(); - } - JUCE_DECLARE_WEAK_REFERENCEABLE (SystemVolumeListener) }; @@ -1845,8 +1798,3 @@ private: //============================================================================== constexpr VideoComponent::Pimpl::MediaSession::Player::StateInfo VideoComponent::Pimpl::MediaSession::Player::stateInfos[]; - -//============================================================================== -VideoComponent::Pimpl::MediaSession::AndroidMediaSessionCallback_Class VideoComponent::Pimpl::MediaSession::AndroidMediaSessionCallback; -VideoComponent::Pimpl::MediaSession::Controller::AndroidMediaControllerCallback_Class VideoComponent::Pimpl::MediaSession::Controller::AndroidMediaControllerCallback; -VideoComponent::Pimpl::SystemVolumeListener::SystemVolumeObserver_Class VideoComponent::Pimpl::SystemVolumeListener::SystemVolumeObserver; diff --git a/modules/juce_video/native/juce_ios_CameraDevice.h b/modules/juce_video/native/juce_ios_CameraDevice.h index 97a48c5a..d5b81872 100644 --- a/modules/juce_video/native/juce_ios_CameraDevice.h +++ b/modules/juce_video/native/juce_ios_CameraDevice.h @@ -524,23 +524,19 @@ private: private: //============================================================================== - static void started (id self, SEL, NSNotification* notification) + static void started (id self, SEL, [[maybe_unused]] NSNotification* notification) { JUCE_CAMERA_LOG (nsStringToJuce ([notification description])); - ignoreUnused (notification); - dispatch_async (dispatch_get_main_queue(), ^{ getOwner (self).cameraSessionStarted(); }); } - static void stopped (id, SEL, NSNotification* notification) + static void stopped (id, SEL, [[maybe_unused]] NSNotification* notification) { JUCE_CAMERA_LOG (nsStringToJuce ([notification description])); - - ignoreUnused (notification); } static void runtimeError (id self, SEL, NSNotification* notification) @@ -555,18 +551,14 @@ private: }); } - static void interrupted (id, SEL, NSNotification* notification) + static void interrupted (id, SEL, [[maybe_unused]] NSNotification* notification) { JUCE_CAMERA_LOG (nsStringToJuce ([notification description])); - - ignoreUnused (notification); } - static void interruptionEnded (id, SEL, NSNotification* notification) + static void interruptionEnded (id, SEL, [[maybe_unused]] NSNotification* notification) { JUCE_CAMERA_LOG (nsStringToJuce ([notification description])); - - ignoreUnused (notification); } }; @@ -788,8 +780,7 @@ private: static void didFinishCaptureForSettings (id, SEL, AVCapturePhotoOutput*, AVCaptureResolvedPhotoSettings*, NSError* error) { - String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); - ignoreUnused (errorString); + [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); JUCE_CAMERA_LOG ("didFinishCaptureForSettings(), error = " + errorString); } @@ -799,8 +790,7 @@ private: { getOwner (self).takingPicture = false; - String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); - ignoreUnused (errorString); + [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); JUCE_CAMERA_LOG ("didFinishProcessingPhoto(), error = " + errorString); @@ -904,8 +894,7 @@ private: { getOwner (self).takingPicture = false; - String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); - ignoreUnused (errorString); + [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); JUCE_CAMERA_LOG ("didFinishProcessingPhotoSampleBuffer(), error = " + errorString); @@ -1019,10 +1008,8 @@ private: } private: - static void printVideoOutputDebugInfo (AVCaptureMovieFileOutput* output) + static void printVideoOutputDebugInfo ([[maybe_unused]] AVCaptureMovieFileOutput* output) { - ignoreUnused (output); - JUCE_CAMERA_LOG ("Available video codec types:"); #if JUCE_CAMERA_LOG_ENABLED diff --git a/modules/juce_video/native/juce_mac_CameraDevice.h b/modules/juce_video/native/juce_mac_CameraDevice.h index 28748f8d..6280e56f 100644 --- a/modules/juce_video/native/juce_mac_CameraDevice.h +++ b/modules/juce_video/native/juce_mac_CameraDevice.h @@ -306,8 +306,7 @@ private: { if (error != nil) { - String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); - ignoreUnused (errorString); + [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String(); JUCE_CAMERA_LOG ("Still picture capture failed, error: " + errorString); jassertfalse; diff --git a/modules/juce_video/native/juce_win32_CameraDevice.h b/modules/juce_video/native/juce_win32_CameraDevice.h index 9ba11f4e..535c6a3d 100644 --- a/modules/juce_video/native/juce_win32_CameraDevice.h +++ b/modules/juce_video/native/juce_win32_CameraDevice.h @@ -479,7 +479,7 @@ struct CameraDevice::Pimpl : public ChangeBroadcaster auto context = [] { IBindCtx* ptr = nullptr; - ignoreUnused (CreateBindCtx (0, &ptr)); + [[maybe_unused]] const auto result = CreateBindCtx (0, &ptr); return ContextPtr (ptr); }(); diff --git a/modules/juce_video/native/juce_win32_Video.h b/modules/juce_video/native/juce_win32_Video.h index 6279cd18..263b47e1 100644 --- a/modules/juce_video/native/juce_win32_Video.h +++ b/modules/juce_video/native/juce_win32_Video.h @@ -395,7 +395,7 @@ private: { DirectShowContext (Pimpl& c) : component (c) { - ignoreUnused (CoInitialize (nullptr)); + [[maybe_unused]] const auto result = CoInitialize (nullptr); } ~DirectShowContext() override diff --git a/modules/juce_video/playback/juce_VideoComponent.cpp b/modules/juce_video/playback/juce_VideoComponent.cpp index 3eb62862..10c4138a 100644 --- a/modules/juce_video/playback/juce_VideoComponent.cpp +++ b/modules/juce_video/playback/juce_VideoComponent.cpp @@ -145,7 +145,6 @@ Result VideoComponent::loadInternal (const FileOrURL& fileOrUrl, bool loadAsync) { #if JUCE_ANDROID || JUCE_IOS ignoreUnused (fileOrUrl, loadAsync); - // You need to use loadAsync on Android & iOS. jassertfalse; return Result::fail ("load() is not supported on this platform. Use loadAsync() instead."); @@ -155,7 +154,7 @@ Result VideoComponent::loadInternal (const FileOrURL& fileOrUrl, bool loadAsync) if (loadAsync) startTimer (50); else - resized(); + resized(); return result; #endif