New upstream version 7.0.4+ds
authorIOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>
Wed, 11 Jan 2023 14:37:58 +0000 (15:37 +0100)
committerIOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>
Wed, 11 Jan 2023 14:37:58 +0000 (15:37 +0100)
317 files changed:
BREAKING-CHANGES.txt
CMakeLists.txt
ChangeList.txt
docs/doxygen/process_source_files.py
examples/Assets/DSPDemos_Common.h
examples/Assets/DemoUtilities.h
examples/Audio/AudioPlaybackDemo.h
examples/DemoRunner/Builds/Android/app/CMakeLists.txt
examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml
examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h
examples/DemoRunner/Builds/Android/app/src/main/assets/DemoUtilities.h
examples/DemoRunner/Builds/LinuxMakefile/Makefile
examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/MacOSX/Info-App.plist
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2017/resources.rc
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2019/resources.rc
examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2022/resources.rc
examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/iOS/Info-App.plist
examples/DemoRunner/DemoRunner.jucer
examples/DemoRunner/JuceLibraryCode/JuceHeader.h
examples/GUI/OpenGLAppDemo.h
examples/Plugins/ARAPluginDemo.h
extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
extras/AudioPerformanceTest/Builds/Android/app/src/main/AndroidManifest.xml
extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Source/Main.cpp
extras/AudioPerformanceTest/Source/MainComponent.h
extras/AudioPluginHost/AudioPluginHost.jucer
extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
extras/AudioPluginHost/Builds/Android/app/src/main/AndroidManifest.xml
extras/AudioPluginHost/Builds/Android/app/src/main/assets/DSPDemos_Common.h
extras/AudioPluginHost/Builds/Android/app/src/main/assets/DemoUtilities.h
extras/AudioPluginHost/Builds/LinuxMakefile/Makefile
extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj
extras/BinaryBuilder/Builds/LinuxMakefile/Makefile
extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj
extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
extras/Build/CMake/JUCEUtils.cmake
extras/Build/juce_build_tools/juce_build_tools.h
extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
extras/NetworkGraphicsDemo/Builds/Android/app/src/main/AndroidManifest.xml
extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Source/Demos.h
extras/Projucer/Builds/LinuxMakefile/Makefile
extras/Projucer/Builds/MacOSX/Info-App.plist
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2017/resources.rc
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2019/resources.rc
extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2022/resources.rc
extras/Projucer/JuceLibraryCode/JuceHeader.h
extras/Projucer/Projucer.jucer
extras/Projucer/Source/ComponentEditor/jucer_JucerDocument.cpp
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h
extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h
extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h
extras/Projucer/Source/Utility/PIPs/jucer_PIPGenerator.cpp
extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
modules/juce_analytics/juce_analytics.h
modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.cpp [new file with mode: 0644]
modules/juce_audio_basics/audio_play_head/juce_AudioPlayHead.h
modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h
modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp
modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h
modules/juce_audio_basics/juce_audio_basics.cpp
modules/juce_audio_basics/juce_audio_basics.h
modules/juce_audio_basics/midi/ump/juce_UMPIterator.cpp [new file with mode: 0644]
modules/juce_audio_basics/midi/ump/juce_UMPIterator.h
modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp
modules/juce_audio_basics/mpe/juce_MPEInstrument.h
modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp [new file with mode: 0644]
modules/juce_audio_basics/sources/juce_PositionableAudioSource.h
modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp
modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp
modules/juce_audio_devices/audio_io/juce_AudioIODevice.h
modules/juce_audio_devices/juce_audio_devices.cpp
modules/juce_audio_devices/juce_audio_devices.h
modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp
modules/juce_audio_devices/midi_io/juce_MidiDevices.h
modules/juce_audio_devices/native/juce_android_Midi.cpp
modules/juce_audio_devices/native/juce_android_Oboe.cpp
modules/juce_audio_devices/native/juce_android_OpenSL.cpp
modules/juce_audio_devices/native/juce_ios_Audio.cpp
modules/juce_audio_devices/native/juce_linux_JackAudio.cpp
modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp
modules/juce_audio_devices/native/juce_mac_CoreMidi.mm
modules/juce_audio_devices/native/juce_win32_DirectSound.cpp
modules/juce_audio_devices/native/juce_win32_WASAPI.cpp
modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp
modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp
modules/juce_audio_formats/format/juce_ARAAudioReaders.cpp
modules/juce_audio_formats/juce_audio_formats.h
modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp
modules/juce_audio_plugin_client/LV2/juce_LV2TurtleDumpProgram.cpp
modules/juce_audio_plugin_client/LV2/juce_LV2_Client.cpp
modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterApp.cpp
modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
modules/juce_audio_plugin_client/Unity/juce_Unity_Wrapper.cpp
modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp
modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm
modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
modules/juce_audio_plugin_client/juce_audio_plugin_client.h
modules/juce_audio_plugin_client/juce_audio_plugin_client_Standalone.cpp
modules/juce_audio_plugin_client/utility/juce_CreatePluginFilter.h
modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp
modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp
modules/juce_audio_processors/format_types/juce_LV2Common.h
modules/juce_audio_processors/format_types/juce_LV2PluginFormat.cpp
modules/juce_audio_processors/format_types/juce_VST3Headers.h
modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
modules/juce_audio_processors/juce_audio_processors.cpp
modules/juce_audio_processors/juce_audio_processors.h
modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
modules/juce_audio_processors/processors/juce_AudioProcessor.h
modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp
modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp
modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp
modules/juce_audio_processors/processors/juce_HostedAudioProcessorParameter.h
modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp
modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.cpp
modules/juce_audio_processors/utilities/ARA/juce_ARAModelObjects.h
modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.cpp
modules/juce_audio_processors/utilities/ARA/juce_ARAPlugInInstanceRoles.h
modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h
modules/juce_audio_processors/utilities/juce_PluginHostType.cpp
modules/juce_audio_processors/utilities/juce_PluginHostType.h
modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp [new file with mode: 0644]
modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.h
modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp
modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp
modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h
modules/juce_audio_utils/juce_audio_utils.h
modules/juce_audio_utils/native/juce_mac_AudioCDReader.mm
modules/juce_box2d/juce_box2d.h
modules/juce_core/containers/juce_Array.h
modules/juce_core/containers/juce_ArrayBase.h
modules/juce_core/containers/juce_ElementComparator.h
modules/juce_core/containers/juce_Optional.h
modules/juce_core/containers/juce_OwnedArray.h
modules/juce_core/containers/juce_ReferenceCountedArray.h
modules/juce_core/containers/juce_Variant.cpp
modules/juce_core/files/juce_File.cpp
modules/juce_core/javascript/juce_Javascript.cpp
modules/juce_core/juce_core.h
modules/juce_core/maths/juce_Expression.cpp
modules/juce_core/memory/juce_ContainerDeletePolicy.h
modules/juce_core/misc/juce_Functional.h
modules/juce_core/misc/juce_RuntimePermissions.h
modules/juce_core/native/juce_android_AndroidDocument.cpp
modules/juce_core/native/juce_android_JNIHelpers.cpp
modules/juce_core/native/juce_android_JNIHelpers.h
modules/juce_core/native/juce_android_Network.cpp
modules/juce_core/native/juce_android_RuntimePermissions.cpp
modules/juce_core/native/juce_android_Threads.cpp
modules/juce_core/native/juce_mac_Files.mm
modules/juce_core/native/juce_mac_Network.mm
modules/juce_core/native/juce_mac_ObjCHelpers.h
modules/juce_core/native/juce_mac_SystemStats.mm
modules/juce_core/native/juce_posix_NamedPipe.cpp
modules/juce_core/native/juce_posix_SharedCode.h
modules/juce_core/native/juce_win32_Files.cpp
modules/juce_core/native/juce_win32_SystemStats.cpp
modules/juce_core/native/juce_win32_Threads.cpp
modules/juce_core/network/juce_Socket.cpp
modules/juce_core/network/juce_URL.cpp
modules/juce_core/network/juce_WebInputStream.cpp
modules/juce_core/network/juce_WebInputStream.h
modules/juce_core/streams/juce_MemoryOutputStream.cpp
modules/juce_core/system/juce_StandardHeader.h
modules/juce_core/threads/juce_HighResolutionTimer.cpp
modules/juce_core/threads/juce_Thread.cpp
modules/juce_core/threads/juce_Thread.h
modules/juce_core/time/juce_RelativeTime.cpp
modules/juce_cryptography/encryption/juce_BlowFish.cpp
modules/juce_cryptography/juce_cryptography.h
modules/juce_data_structures/juce_data_structures.cpp
modules/juce_data_structures/juce_data_structures.h
modules/juce_data_structures/undomanager/juce_UndoableAction.cpp [new file with mode: 0644]
modules/juce_data_structures/undomanager/juce_UndoableAction.h
modules/juce_dsp/containers/juce_FixedSizeFunction.h
modules/juce_dsp/containers/juce_FixedSizeFunction_test.cpp
modules/juce_dsp/juce_dsp.h
modules/juce_events/juce_events.h
modules/juce_events/messages/juce_ApplicationBase.cpp
modules/juce_events/native/juce_linux_Messaging.cpp
modules/juce_events/native/juce_win32_Messaging.cpp
modules/juce_events/native/juce_win32_WinRTWrapper.h
modules/juce_graphics/geometry/juce_RectangleList.h
modules/juce_graphics/juce_graphics.h
modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp
modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp
modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp
modules/juce_graphics/native/juce_win32_Fonts.cpp
modules/juce_gui_basics/components/juce_Component.cpp
modules/juce_gui_basics/components/juce_Component.h
modules/juce_gui_basics/filebrowser/juce_ContentSharer.cpp
modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp
modules/juce_gui_basics/juce_gui_basics.cpp
modules/juce_gui_basics/juce_gui_basics.h
modules/juce_gui_basics/keyboard/juce_TextInputTarget.h
modules/juce_gui_basics/layout/juce_SidePanel.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp
modules/juce_gui_basics/menus/juce_PopupMenu.cpp
modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp
modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp
modules/juce_gui_basics/mouse/juce_TooltipClient.h
modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp
modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java
modules/juce_gui_basics/native/java/app/com/rmsl/juce/JuceContentProviderFileObserver.java
modules/juce_gui_basics/native/juce_android_ContentSharer.cpp
modules/juce_gui_basics/native/juce_android_Windowing.cpp
modules/juce_gui_basics/native/juce_ios_ContentSharer.cpp
modules/juce_gui_basics/native/juce_ios_FileChooser.mm
modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm
modules/juce_gui_basics/native/juce_ios_Windowing.mm
modules/juce_gui_basics/native/juce_linux_Windowing.cpp
modules/juce_gui_basics/native/juce_mac_CGMetalLayerRenderer.h
modules/juce_gui_basics/native/juce_mac_FileChooser.mm
modules/juce_gui_basics/native/juce_mac_MainMenu.mm
modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
modules/juce_gui_basics/native/juce_mac_Windowing.mm
modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp
modules/juce_gui_basics/native/juce_win32_FileChooser.cpp
modules/juce_gui_basics/native/juce_win32_Windowing.cpp
modules/juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h [new file with mode: 0644]
modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.cpp
modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h
modules/juce_gui_basics/widgets/juce_ListBox.cpp
modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp
modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h
modules/juce_gui_basics/widgets/juce_TableListBox.cpp
modules/juce_gui_basics/widgets/juce_TextEditor.cpp
modules/juce_gui_basics/widgets/juce_TextEditor.h
modules/juce_gui_basics/windows/juce_ComponentPeer.cpp
modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h
modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp
modules/juce_gui_extra/juce_gui_extra.cpp
modules/juce_gui_extra/juce_gui_extra.h
modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h
modules/juce_gui_extra/misc/juce_PushNotifications.cpp
modules/juce_gui_extra/misc/juce_PushNotifications.h
modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp
modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp [new file with mode: 0644]
modules/juce_gui_extra/misc/juce_WebBrowserComponent.h
modules/juce_gui_extra/native/juce_android_PushNotifications.cpp
modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp
modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp
modules/juce_gui_extra/native/juce_linux_X11_WebBrowserComponent.cpp
modules/juce_gui_extra/native/juce_linux_XEmbedComponent.cpp
modules/juce_gui_extra/native/juce_mac_AppleRemote.mm
modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp
modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp
modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp
modules/juce_opengl/juce_opengl.cpp
modules/juce_opengl/juce_opengl.h
modules/juce_opengl/native/juce_OpenGL_android.h
modules/juce_opengl/native/juce_OpenGL_ios.h
modules/juce_opengl/native/juce_OpenGL_linux_X11.h
modules/juce_opengl/opengl/juce_OpenGLContext.cpp
modules/juce_osc/juce_osc.h
modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.cpp
modules/juce_product_unlocking/in_app_purchases/juce_InAppPurchases.h
modules/juce_product_unlocking/juce_product_unlocking.h
modules/juce_product_unlocking/native/juce_android_InAppPurchases.cpp
modules/juce_video/capture/juce_CameraDevice.cpp
modules/juce_video/juce_video.h
modules/juce_video/native/juce_android_CameraDevice.h
modules/juce_video/native/juce_android_Video.h
modules/juce_video/native/juce_ios_CameraDevice.h
modules/juce_video/native/juce_mac_CameraDevice.h
modules/juce_video/native/juce_win32_CameraDevice.h
modules/juce_video/native/juce_win32_Video.h
modules/juce_video/playback/juce_VideoComponent.cpp

index 5d8cb45784dbf5a9fc497949acce52373751bfe9..973f3e074681b16a145d26b07c27dd809bc575bc 100644 (file)
@@ -1,7 +1,7 @@
 JUCE breaking changes
 =====================
 
-Version 7.0.2
+Version 7.0.3
 =============
 
 Change
index b10f454e3147569bda995e38b5aaf58b834b8764..cb7252c2995295b37c3bf27821e05988fdea42a9 100644 (file)
@@ -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)
 
index de903b0daf7d91ab178646674fec6966039848f1..ca5cc3c9edd2a414b51e0366f2f43845ef9df6b6 100644 (file)
@@ -3,12 +3,19 @@
 This file just lists the more notable headline features. For more detailed info\r
 about changes and bugfixes please see the git log and BREAKING-CHANGES.txt.\r
 \r
+Version 7.0.4\r
+  - Improved Metal device handling\r
+  - Adopted more C++17 features\r
+  - Improved input handling on macOS and iOS\r
+  - Fixed a GUI display issue on Linux\r
+  - Fixed some compiler warnings\r
+\r
 Version 7.0.3\r
   - Added a unique machine ID\r
   - Added new threading classes\r
   - Improved the performance of multiple OpenGL contexts\r
   - Refactored AudioProcessorGraph\r
-  - Improved AudioDeviceManager sample rate handling \r
+  - Improved AudioDeviceManager sample rate handling\r
   - Fixed Studio One drawing performance\r
   - Updated the FLAC library\r
 \r
index c38135dabef7122a7a31a7261b2ea1be94cea0b2..85ec8ee2f9e2afabf8d09110782c4561ee6cb91b 100644 (file)
@@ -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")
index 49ccc278720c9c2fa6dac9af64b2a64556b9c0df..9fa1d5c3a087fcfab074bd9da111855d56406f8a 100644 (file)
@@ -25,7 +25,7 @@ using namespace dsp;
 struct DSPDemoParameterBase    : public ChangeBroadcaster\r
 {\r
     DSPDemoParameterBase (const String& labelName) : name (labelName) {}\r
-    virtual ~DSPDemoParameterBase() {}\r
+    virtual ~DSPDemoParameterBase() = default;\r
 \r
     virtual Component* getComponent() = 0;\r
 \r
@@ -142,7 +142,7 @@ public:
         loadURL (u);\r
     }\r
 \r
-    URL getCurrentURL()    { return currentURL; }\r
+    URL getCurrentURL() const   { return currentURL; }\r
 \r
     void setTransportSource (AudioTransportSource* newSource)\r
     {\r
@@ -189,21 +189,7 @@ private:
 \r
         currentURL = u;\r
 \r
-        InputSource* inputSource = nullptr;\r
-\r
-       #if ! JUCE_IOS\r
-        if (u.isLocalFile())\r
-        {\r
-            inputSource = new FileInputSource (u.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (inputSource == nullptr)\r
-                inputSource = new URLInputSource (u);\r
-        }\r
-\r
-        thumbnail.setSource (inputSource);\r
+        thumbnail.setSource (makeInputSource (u).release());\r
 \r
         if (notify)\r
             sendChangeMessage();\r
@@ -407,33 +393,27 @@ public:
         transportSource.reset();\r
         readerSource.reset();\r
 \r
-        AudioFormatReader* newReader = nullptr;\r
+        auto source = makeInputSource (fileToPlay);\r
 \r
-       #if ! JUCE_IOS\r
-        if (fileToPlay.isLocalFile())\r
-        {\r
-            newReader = formatManager.createReaderFor (fileToPlay.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (newReader == nullptr)\r
-                newReader = formatManager.createReaderFor (fileToPlay.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress)));\r
-        }\r
+        if (source == nullptr)\r
+            return false;\r
 \r
-        reader.reset (newReader);\r
+        auto stream = rawToUniquePtr (source->createInputStream());\r
 \r
-        if (reader.get() != nullptr)\r
-        {\r
-            readerSource.reset (new AudioFormatReaderSource (reader.get(), false));\r
-            readerSource->setLooping (loopState.getValue());\r
+        if (stream == nullptr)\r
+            return false;\r
 \r
-            init();\r
+        reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream)));\r
 \r
-            return true;\r
-        }\r
+        if (reader == nullptr)\r
+            return false;\r
+\r
+        readerSource.reset (new AudioFormatReaderSource (reader.get(), false));\r
+        readerSource->setLooping (loopState.getValue());\r
+\r
+        init();\r
 \r
-        return false;\r
+        return true;\r
     }\r
 \r
     void togglePlay()\r
@@ -613,7 +593,7 @@ private:
                                       {\r
                                           if (fc.getURLResults().size() > 0)\r
                                           {\r
-                                              auto u = fc.getURLResult();\r
+                                              const auto u = fc.getURLResult();\r
 \r
                                               if (! audioFileReader.loadURL (u))\r
                                                   NativeMessageBox::showAsync (MessageBoxOptions()\r
index bfc1c5d2862ed6d65cd01cf1174df2d1c6173303..ffdfc3631c930a0500cf7f0ef82843cbe47e6316 100644 (file)
@@ -242,4 +242,19 @@ struct SlowerBouncingNumber  : public BouncingNumber
     }\r
 };\r
 \r
+inline std::unique_ptr<InputSource> makeInputSource (const URL& url)\r
+{\r
+   #if JUCE_ANDROID\r
+    if (auto doc = AndroidDocument::fromDocument (url))\r
+        return std::make_unique<AndroidDocumentInputSource> (doc);\r
+   #endif\r
+\r
+   #if ! JUCE_IOS\r
+    if (url.isLocalFile())\r
+        return std::make_unique<FileInputSource> (url.getLocalFile());\r
+   #endif\r
+\r
+    return std::make_unique<URLInputSource> (url);\r
+}\r
+\r
 #endif   // PIP_DEMO_UTILITIES_INCLUDED\r
index 54cbbcc42c90008b7d3c86b945e6ef818909bef5..6d317f446604ee34b3ddf51b3fe035aab80fee36 100644 (file)
 \r
 #include "../Assets/DemoUtilities.h"\r
 \r
-inline std::unique_ptr<InputSource> makeInputSource (const URL& url)\r
-{\r
-   #if JUCE_ANDROID\r
-    if (auto doc = AndroidDocument::fromDocument (url))\r
-        return std::make_unique<AndroidDocumentInputSource> (doc);\r
-   #endif\r
-\r
-   #if ! JUCE_IOS\r
-    if (url.isLocalFile())\r
-        return std::make_unique<FileInputSource> (url.getLocalFile());\r
-   #endif\r
-\r
-    return std::make_unique<URLInputSource> (url);\r
-}\r
-\r
-//==============================================================================\r
 class DemoThumbnailComp  : public Component,\r
                            public ChangeListener,\r
                            public FileDragAndDropTarget,\r
index 8f5395036ccde46bd4ab0559af021e259aba6d8f..24bafafc0b0a7a18898a9500461268235b2443d2 100644 (file)
@@ -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"
index 359f6b003c351baef25c100822a8140bf2ab7fd4..4ce8fe70bb43b9bfdadb390cc4a4f31efa903459 100644 (file)
@@ -1,21 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="7.0.3">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="7.0.4">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
                     android:xlargeScreens="true"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
-  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-  <uses-permission android:name="android.permission.BLUETOOTH"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>
+  <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
   <uses-permission android:name="android.permission.CAMERA"/>
   <uses-permission android:name="android.permission.RECORD_AUDIO"/>
   <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-feature android:glEsVersion="0x00030000" android:required="true"/>
   <application android:label="@string/app_name" android:name="com.rmsl.juce.JuceApp" android:icon="@drawable/icon" android:hardwareAccelerated="false">
-    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboardHidden|orientation|screenSize"
+    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation"
               android:screenOrientation="unspecified" android:launchMode="singleTask" android:hardwareAccelerated="true"
               android:exported="true">
       <intent-filter>
index 49ccc278720c9c2fa6dac9af64b2a64556b9c0df..9fa1d5c3a087fcfab074bd9da111855d56406f8a 100644 (file)
@@ -25,7 +25,7 @@ using namespace dsp;
 struct DSPDemoParameterBase    : public ChangeBroadcaster\r
 {\r
     DSPDemoParameterBase (const String& labelName) : name (labelName) {}\r
-    virtual ~DSPDemoParameterBase() {}\r
+    virtual ~DSPDemoParameterBase() = default;\r
 \r
     virtual Component* getComponent() = 0;\r
 \r
@@ -142,7 +142,7 @@ public:
         loadURL (u);\r
     }\r
 \r
-    URL getCurrentURL()    { return currentURL; }\r
+    URL getCurrentURL() const   { return currentURL; }\r
 \r
     void setTransportSource (AudioTransportSource* newSource)\r
     {\r
@@ -189,21 +189,7 @@ private:
 \r
         currentURL = u;\r
 \r
-        InputSource* inputSource = nullptr;\r
-\r
-       #if ! JUCE_IOS\r
-        if (u.isLocalFile())\r
-        {\r
-            inputSource = new FileInputSource (u.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (inputSource == nullptr)\r
-                inputSource = new URLInputSource (u);\r
-        }\r
-\r
-        thumbnail.setSource (inputSource);\r
+        thumbnail.setSource (makeInputSource (u).release());\r
 \r
         if (notify)\r
             sendChangeMessage();\r
@@ -407,33 +393,27 @@ public:
         transportSource.reset();\r
         readerSource.reset();\r
 \r
-        AudioFormatReader* newReader = nullptr;\r
+        auto source = makeInputSource (fileToPlay);\r
 \r
-       #if ! JUCE_IOS\r
-        if (fileToPlay.isLocalFile())\r
-        {\r
-            newReader = formatManager.createReaderFor (fileToPlay.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (newReader == nullptr)\r
-                newReader = formatManager.createReaderFor (fileToPlay.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress)));\r
-        }\r
+        if (source == nullptr)\r
+            return false;\r
 \r
-        reader.reset (newReader);\r
+        auto stream = rawToUniquePtr (source->createInputStream());\r
 \r
-        if (reader.get() != nullptr)\r
-        {\r
-            readerSource.reset (new AudioFormatReaderSource (reader.get(), false));\r
-            readerSource->setLooping (loopState.getValue());\r
+        if (stream == nullptr)\r
+            return false;\r
 \r
-            init();\r
+        reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream)));\r
 \r
-            return true;\r
-        }\r
+        if (reader == nullptr)\r
+            return false;\r
+\r
+        readerSource.reset (new AudioFormatReaderSource (reader.get(), false));\r
+        readerSource->setLooping (loopState.getValue());\r
+\r
+        init();\r
 \r
-        return false;\r
+        return true;\r
     }\r
 \r
     void togglePlay()\r
@@ -613,7 +593,7 @@ private:
                                       {\r
                                           if (fc.getURLResults().size() > 0)\r
                                           {\r
-                                              auto u = fc.getURLResult();\r
+                                              const auto u = fc.getURLResult();\r
 \r
                                               if (! audioFileReader.loadURL (u))\r
                                                   NativeMessageBox::showAsync (MessageBoxOptions()\r
index bfc1c5d2862ed6d65cd01cf1174df2d1c6173303..ffdfc3631c930a0500cf7f0ef82843cbe47e6316 100644 (file)
@@ -242,4 +242,19 @@ struct SlowerBouncingNumber  : public BouncingNumber
     }\r
 };\r
 \r
+inline std::unique_ptr<InputSource> makeInputSource (const URL& url)\r
+{\r
+   #if JUCE_ANDROID\r
+    if (auto doc = AndroidDocument::fromDocument (url))\r
+        return std::make_unique<AndroidDocumentInputSource> (doc);\r
+   #endif\r
+\r
+   #if ! JUCE_IOS\r
+    if (url.isLocalFile())\r
+        return std::make_unique<FileInputSource> (url.getLocalFile());\r
+   #endif\r
+\r
+    return std::make_unique<URLInputSource> (url);\r
+}\r
+\r
 #endif   // PIP_DEMO_UTILITIES_INCLUDED\r
index e9567f8137a952ec439e1372157b55d1d3c0c410..1ca83fed387db659a6aebab00c6f40d85ad12846 100644 (file)
@@ -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
 
index 470a7d822ee7bdc4daea3864195e5a795ab5cac5..dc8dee813be595099d1c86beb78602b119aaf9e4 100644 (file)
                                        "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",
                                        "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",
                                        "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",
                                        "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",
index 4fd55db1efa66ff781f2e7b396484c767e51d347..220f811d4086c7319707ceb8487944fc638276e8 100644 (file)
@@ -24,9 +24,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>7.0.3</string>\r
+    <string>7.0.4</string>\r
     <key>CFBundleVersion</key>\r
-    <string>7.0.3</string>\r
+    <string>7.0.4</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index 13aa9ac3974734a0a75a0bac25992c40a4adada9..fec6624d7106003e11914331cd859a5d6ca71d93 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 08bf3a8e2ba5d3487dfad1dcada339b582ba83c4..57a30d71d1867fef1d5d0a73721dfc7427b75847 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <Filter>JUCE Modules\juce_analytics</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index c612927c63a409f0092acf1ca967e59b50da2a95..c2627af5ab495ce6841fbf5099793677ed11e7ce 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,3,0\r
+FILEVERSION  7,0,4,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "7.0.3\0"\r
+      VALUE "FileVersion",  "7.0.4\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "7.0.3\0"\r
+      VALUE "ProductVersion",  "7.0.4\0"\r
     END\r
   END\r
 \r
index c52380d1d8a2d8e0af4fc971f925554ceb10f85f..4b4a13b118609168971ac614357728fcb74b619e 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 4f1ee8013461bb07f625317b31565079768de7a6..c91a76b8c83a6c6a1e3982b10bb829ead8b6f9f8 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <Filter>JUCE Modules\juce_analytics</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index c612927c63a409f0092acf1ca967e59b50da2a95..c2627af5ab495ce6841fbf5099793677ed11e7ce 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,3,0\r
+FILEVERSION  7,0,4,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "7.0.3\0"\r
+      VALUE "FileVersion",  "7.0.4\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "7.0.3\0"\r
+      VALUE "ProductVersion",  "7.0.4\0"\r
     END\r
   END\r
 \r
index 863f62839df93d0c1f552959e7ac41b4a39a9e8e..b308665825c164b709bdf08dfda84105e0d72a95 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\DemoRunner.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 03330a3d3ae2d2a1c5448c11b848e0ccd03c5421..c430519c950a000754af9b773edc5e1d2d9a32a6 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <Filter>JUCE Modules\juce_analytics</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index c612927c63a409f0092acf1ca967e59b50da2a95..c2627af5ab495ce6841fbf5099793677ed11e7ce 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,3,0\r
+FILEVERSION  7,0,4,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Copyright (c) 2020 - Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "DemoRunner\0"\r
-      VALUE "FileVersion",  "7.0.3\0"\r
+      VALUE "FileVersion",  "7.0.4\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "7.0.3\0"\r
+      VALUE "ProductVersion",  "7.0.4\0"\r
     END\r
   END\r
 \r
index e730f99c06138bcbd05c91ead9c31730705ef950..21513e1af149f70e7f00a5f33d75887e07f769c4 100644 (file)
                                        "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",
                                        "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",
                                        "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",
                                        "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",
index 7f7a3e2884a24d69282f2d64c990cd85ceb1aaf7..b53338e028cab3c243143c626a8ff5530d11a4f1 100644 (file)
@@ -30,9 +30,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>7.0.3</string>\r
+    <string>7.0.4</string>\r
     <key>CFBundleVersion</key>\r
-    <string>7.0.3</string>\r
+    <string>7.0.4</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index 3345ee058224beedaf4473afa62e981fe91c1a79..63a94a5f8527f8710fcf17ca6e021dfffa03cfd3 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT name="DemoRunner" projectType="guiapp" defines="JUCE_DEMO_RUNNER=1&#10;JUCE_UNIT_TESTS=1"\r
-              bundleIdentifier="com.rmsl.jucedemorunner" version="7.0.3" companyName="Raw Material Software Limited"\r
+              bundleIdentifier="com.rmsl.jucedemorunner" version="7.0.4" companyName="Raw Material Software Limited"\r
               companyCopyright="Copyright (c) 2020 - Raw Material Software Limited"\r
               companyWebsite="https://www.juce.com/" companyEmail="info@juce.com"\r
               id="yj7xMM" reportAppUsage="0" useAppConfig="0" addUsingNamespaceToJuceHeader="1"\r
       </MODULEPATHS>\r
     </LINUX_MAKE>\r
     <ANDROIDSTUDIO targetFolder="Builds/Android" androidMinimumSDK="23" microphonePermissionNeeded="1"\r
-                   androidBluetoothNeeded="1" androidExternalReadNeeded="1" androidExternalWriteNeeded="1"\r
-                   androidEnableContentSharing="1" androidExtraAssetsFolder="../Assets"\r
-                   smallIcon="YyqWd2" bigIcon="YyqWd2" cameraPermissionNeeded="1">\r
+                   androidExternalWriteNeeded="1" androidEnableContentSharing="1"\r
+                   androidExtraAssetsFolder="../Assets" smallIcon="YyqWd2" bigIcon="YyqWd2"\r
+                   cameraPermissionNeeded="1" androidReadMediaAudioPermission="1"\r
+                   androidReadMediaImagesPermission="1" androidReadMediaVideoPermission="1"\r
+                   androidBluetoothScanNeeded="1" androidBluetoothAdvertiseNeeded="1"\r
+                   androidBluetoothConnectNeeded="1">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION isDebug="1" name="Debug" recommendedWarnings="LLVM"/>\r
         <CONFIGURATION isDebug="0" name="Release" recommendedWarnings="LLVM"/>\r
index 678a2081f0050dc0345f229b46342b46499236f6..b771efe1385da0e444fee17b0678ef1762cdb8e3 100644 (file)
@@ -54,7 +54,7 @@ namespace ProjectInfo
 {\r
     const char* const  projectName    = "DemoRunner";\r
     const char* const  companyName    = "Raw Material Software Limited";\r
-    const char* const  versionString  = "7.0.3";\r
-    const int          versionNumber  = 0x70003;\r
+    const char* const  versionString  = "7.0.4";\r
+    const int          versionNumber  = 0x70004;\r
 }\r
 #endif\r
index ee5cbd65819cb78f8ec480d2f0060867c28ff560..2fbcc8b1fbddb4318f8a5b6798e3ab5bbca54f76 100644 (file)
@@ -205,7 +205,7 @@ public:
             attributes.reset();\r
             uniforms  .reset();\r
 \r
-            shader.reset (newShader.release());\r
+            shader = std::move (newShader);\r
             shader->use();\r
 \r
             shape     .reset (new Shape());\r
index 89f7d1bdb32770d0f32ca511d1b8288f48695ed1..17befd7bed2c0cd7c9e0aba1c7c0bf85ea6a91ea 100644 (file)
@@ -117,6 +117,18 @@ private:
     SpinLock processingFlag;\r
 };\r
 \r
+static void crossfade (const float* sourceA,\r
+                       const float* sourceB,\r
+                       float aProportionAtStart,\r
+                       float aProportionAtFinish,\r
+                       float* destinationBuffer,\r
+                       int numSamples)\r
+{\r
+    AudioBuffer<float> destination { &destinationBuffer, 1, numSamples };\r
+    destination.copyFromWithRamp (0, 0, sourceA, numSamples, aProportionAtStart, aProportionAtFinish);\r
+    destination.addFromWithRamp (0, 0, sourceB, numSamples, 1.0f - aProportionAtStart, 1.0f - aProportionAtFinish);\r
+}\r
+\r
 class Looper\r
 {\r
 public:\r
@@ -138,28 +150,60 @@ public:
         }\r
 \r
         const auto numChannelsToCopy = std::min (inputBuffer->getNumChannels(), buffer.getNumChannels());\r
+        const auto actualCrossfadeLengthSamples = std::min (loopRange.getLength() / 2, (int64) desiredCrossfadeLengthSamples);\r
 \r
         for (auto samplesCopied = 0; samplesCopied < buffer.getNumSamples();)\r
         {\r
-            const auto numSamplesToCopy =\r
-                std::min (buffer.getNumSamples() - samplesCopied, (int) (loopRange.getEnd() - pos));\r
+            const auto [needsCrossfade, samplePosOfNextCrossfadeTransition] = [&]() -> std::pair<bool, int64>\r
+            {\r
+                if (const auto endOfFadeIn = loopRange.getStart() + actualCrossfadeLengthSamples; pos < endOfFadeIn)\r
+                    return { true, endOfFadeIn };\r
+\r
+                return { false, loopRange.getEnd() - actualCrossfadeLengthSamples };\r
+            }();\r
+\r
+            const auto samplesToNextCrossfadeTransition = samplePosOfNextCrossfadeTransition - pos;\r
+            const auto numSamplesToCopy = std::min (buffer.getNumSamples() - samplesCopied,\r
+                                                    (int) samplesToNextCrossfadeTransition);\r
+\r
+            const auto getFadeInGainAtPos = [this, actualCrossfadeLengthSamples] (auto p)\r
+            {\r
+                return jmap ((float) p, (float) loopRange.getStart(), (float) loopRange.getStart() + (float) actualCrossfadeLengthSamples - 1.0f, 0.0f, 1.0f);\r
+            };\r
 \r
             for (int i = 0; i < numChannelsToCopy; ++i)\r
             {\r
-                buffer.copyFrom (i, samplesCopied, *inputBuffer, i, (int) pos, numSamplesToCopy);\r
+                if (needsCrossfade)\r
+                {\r
+                    const auto overlapStart = loopRange.getEnd() - actualCrossfadeLengthSamples\r
+                                              + (pos - loopRange.getStart());\r
+\r
+                    crossfade (inputBuffer->getReadPointer (i, (int) pos),\r
+                               inputBuffer->getReadPointer (i, (int) overlapStart),\r
+                               getFadeInGainAtPos (pos),\r
+                               getFadeInGainAtPos (pos + numSamplesToCopy),\r
+                               buffer.getWritePointer (i, samplesCopied),\r
+                               numSamplesToCopy);\r
+                }\r
+                else\r
+                {\r
+                    buffer.copyFrom (i, samplesCopied, *inputBuffer, i, (int) pos, numSamplesToCopy);\r
+                }\r
             }\r
 \r
             samplesCopied += numSamplesToCopy;\r
             pos += numSamplesToCopy;\r
 \r
-            jassert (pos <= loopRange.getEnd());\r
+            jassert (pos <= loopRange.getEnd() - actualCrossfadeLengthSamples);\r
 \r
-            if (pos == loopRange.getEnd())\r
+            if (pos == loopRange.getEnd() - actualCrossfadeLengthSamples)\r
                 pos = loopRange.getStart();\r
         }\r
     }\r
 \r
 private:\r
+    static constexpr int desiredCrossfadeLengthSamples = 50;\r
+\r
     const AudioBuffer<float>* inputBuffer;\r
     Range<int64> loopRange;\r
     int64 pos;\r
@@ -510,8 +554,21 @@ public:
             if (! locked)\r
                 return true;\r
 \r
+            const auto fadeOutIfNecessary = [this, &buffer]\r
+            {\r
+                if (std::exchange (wasPreviewing, false))\r
+                {\r
+                    previewLooper.writeInto (buffer);\r
+                    const auto fadeOutStart = std::max (0, buffer.getNumSamples() - 50);\r
+                    buffer.applyGainRamp (fadeOutStart, buffer.getNumSamples() - fadeOutStart, 1.0f, 0.0f);\r
+                }\r
+            };\r
+\r
             if (positionInfo.getIsPlaying())\r
+            {\r
+                fadeOutIfNecessary();\r
                 return true;\r
+            }\r
 \r
             if (const auto previewedRegion = previewState->previewedRegion.load())\r
             {\r
@@ -565,9 +622,19 @@ public:
                     else\r
                     {\r
                         previewLooper.writeInto (buffer);\r
+\r
+                        if (! std::exchange (wasPreviewing, true))\r
+                        {\r
+                            const auto fadeInLength = std::min (50, buffer.getNumSamples());\r
+                            buffer.applyGainRamp (0, fadeInLength, 0.0f, 1.0f);\r
+                        }\r
                     }\r
                 }\r
             }\r
+            else\r
+            {\r
+                fadeOutIfNecessary();\r
+            }\r
 \r
             return true;\r
         });\r
@@ -599,6 +666,7 @@ private:
     double lastPreviewTime = 0.0;\r
     ARAPlaybackRegion* lastPlaybackRegion = nullptr;\r
     bool lastPreviewDimmed = false;\r
+    bool wasPreviewing = false;\r
     std::unique_ptr<AudioBuffer<float>> previewBuffer;\r
     Looper previewLooper;\r
 \r
@@ -1624,7 +1692,7 @@ private:
                     const auto end = chordsReader.end();\r
                     auto it = begin;\r
 \r
-                    while (it->position <= quarterPosition && it != end)\r
+                    while (it != end && it->position <= quarterPosition)\r
                         ++it;\r
 \r
                     if (it != begin)\r
@@ -1930,9 +1998,10 @@ public:
             selectMusicalContext (musicalContext);\r
     }\r
 \r
-    void willDestroyMusicalContext (ARAMusicalContext*) override\r
+    void willDestroyMusicalContext (ARAMusicalContext* musicalContext) override\r
     {\r
-        selectMusicalContext (nullptr);\r
+        if (selectedMusicalContext == musicalContext)\r
+            selectMusicalContext (nullptr);\r
     }\r
 \r
     void didReorderRegionSequencesInDocument (ARADocument*) override\r
@@ -1980,9 +2049,6 @@ public:
             if (newSelectedMusicalContext != selectedMusicalContext)\r
                 selectMusicalContext (newSelectedMusicalContext);\r
 \r
-        // If no context is used yet and the selection does not yield a new one, the DocumentView\r
-        // uses the first musical context in the document.\r
-\r
         if (const auto timeRange = viewSelection.getTimeRange())\r
             overlay.setSelectedTimeRange (*timeRange);\r
         else\r
index e44d4969529c94c35e40b3a302992c6dd471cc1b..beca6d5f0e5bcc1e9ba267f9567cfae29183e229 100644 (file)
@@ -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"
index e11b635d7b59ecadea9c9cf4f37afb4faab26228..7ab456a921865197f0bce98d486801c98a2e7824 100644 (file)
@@ -4,15 +4,14 @@
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
                     android:xlargeScreens="true"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
-  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
-  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
-  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-  <uses-permission android:name="android.permission.BLUETOOTH"/>
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
   <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
   <uses-permission android:name="android.permission.INTERNET"/>
   <application android:label="@string/app_name" android:name="com.rmsl.juce.JuceApp" android:hardwareAccelerated="false">
-    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboardHidden|orientation|screenSize"
+    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation"
               android:screenOrientation="unspecified" android:launchMode="singleTask" android:hardwareAccelerated="true"
               android:exported="true">
       <intent-filter>
index d6737d55fa09c82b3548c5ddc9d248f29a691074..f3c3b91818d4db874588816dbcff3335bd094241 100644 (file)
@@ -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
 
index f8e50a10f76729cf2bfce6629fb183d1314feaac..add82c40e1def42f6a37af979dc4eca901c0ee20 100644 (file)
                                        "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",
                                        "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",
index 052ce4cf3013cc3fab1c19433fd7359a6c621440..431e244e3f02a8f00a95d9c2d5e7af1fa7ed9b34 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPerformanceTest.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPerformanceTest.exe</OutputFile>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
     <ClCompile Include="..\..\Source\Main.cpp"/>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 5fec3578028c2d2f636bafe60fd8ee59ec1d67e4..81bc0c6d38b2bfe11e83e10628f5ab72696aa3f1 100644 (file)
     <ClCompile Include="..\..\Source\Main.cpp">\r
       <Filter>AudioPerformanceTest\Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 3366c6d0ea2142b8f6b2c41f31ecc76ee4081748..bdcd7ccdda65bbb8d86a8e23e6535af47feab7ea 100644 (file)
                                        "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",
                                        "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",
index 292f9efe33090a3c34ff6e2bd0c7dd3ce515301d..c893b151f5e11a6bdc5583cc95318b25c900b916 100644 (file)
@@ -62,7 +62,7 @@ public:
             : DocumentWindow (name, Colours::lightgrey, DocumentWindow::allButtons)\r
         {\r
             setUsingNativeTitleBar (true);\r
-            setContentOwned (createMainContentComponent(), true);\r
+            setContentOwned (new MainContentComponent(), true);\r
             setResizable (false, false);\r
 \r
            #if JUCE_IOS || JUCE_ANDROID\r
index 8785b1cd6da3a0c47a5ec0ac8c9fb83f62fe2b9d..28dbcdbf96a330ce06302c6dbe0d63e980b6132b 100644 (file)
@@ -271,7 +271,3 @@ private:
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent)\r
 };\r
-\r
-\r
-// (This function is called by the app startup code to create our main component)\r
-Component* createMainContentComponent()     { return new MainContentComponent(); }\r
index 5e1d2c72f5bfe09e2057706b61e6c6cfd5e94500..5e56f67f018bba5c5449b90a97268dff1efb92b6 100644 (file)
       </MODULEPATHS>\r
     </XCODE_IPHONE>\r
     <ANDROIDSTUDIO targetFolder="Builds/Android" androidMinimumSDK="23" androidInternetNeeded="1"\r
-                   microphonePermissionNeeded="1" androidBluetoothNeeded="1" smallIcon="c97aUr"\r
-                   bigIcon="c97aUr" androidExtraAssetsFolder="../../examples/Assets">\r
+                   microphonePermissionNeeded="1" smallIcon="c97aUr" bigIcon="c97aUr"\r
+                   androidExtraAssetsFolder="../../examples/Assets" androidBluetoothScanNeeded="1"\r
+                   androidBluetoothAdvertiseNeeded="1" androidBluetoothConnectNeeded="1">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" optimisation="1" linkTimeOptimisation="0"\r
                        targetName="Plugin Host" recommendedWarnings="LLVM"/>\r
index 34879e65e884ad206d0e0441880c1b4fc52de1b1..ab1f8da5ba365d463c215faee60e732e635f16f1 100644 (file)
@@ -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"
index e623d1a8575f9aabf259a2eee4ba7bf24f891217..ed0fcf1b0cd09161392d894e8e499fa55acc816d 100644 (file)
@@ -4,17 +4,23 @@
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
                     android:xlargeScreens="true"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
-  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-  <uses-permission android:name="android.permission.BLUETOOTH"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30"/>
+  <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
+  <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
   <uses-permission android:name="android.permission.RECORD_AUDIO"/>
   <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-feature android:glEsVersion="0x00030000" android:required="true"/>
   <application android:label="@string/app_name" android:name="com.rmsl.juce.JuceApp" android:icon="@drawable/icon" android:hardwareAccelerated="false">
-    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboardHidden|orientation|screenSize"
+    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation"
               android:screenOrientation="unspecified" android:launchMode="singleTask" android:hardwareAccelerated="true"
               android:exported="true">
       <intent-filter>
index 49ccc278720c9c2fa6dac9af64b2a64556b9c0df..9fa1d5c3a087fcfab074bd9da111855d56406f8a 100644 (file)
@@ -25,7 +25,7 @@ using namespace dsp;
 struct DSPDemoParameterBase    : public ChangeBroadcaster\r
 {\r
     DSPDemoParameterBase (const String& labelName) : name (labelName) {}\r
-    virtual ~DSPDemoParameterBase() {}\r
+    virtual ~DSPDemoParameterBase() = default;\r
 \r
     virtual Component* getComponent() = 0;\r
 \r
@@ -142,7 +142,7 @@ public:
         loadURL (u);\r
     }\r
 \r
-    URL getCurrentURL()    { return currentURL; }\r
+    URL getCurrentURL() const   { return currentURL; }\r
 \r
     void setTransportSource (AudioTransportSource* newSource)\r
     {\r
@@ -189,21 +189,7 @@ private:
 \r
         currentURL = u;\r
 \r
-        InputSource* inputSource = nullptr;\r
-\r
-       #if ! JUCE_IOS\r
-        if (u.isLocalFile())\r
-        {\r
-            inputSource = new FileInputSource (u.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (inputSource == nullptr)\r
-                inputSource = new URLInputSource (u);\r
-        }\r
-\r
-        thumbnail.setSource (inputSource);\r
+        thumbnail.setSource (makeInputSource (u).release());\r
 \r
         if (notify)\r
             sendChangeMessage();\r
@@ -407,33 +393,27 @@ public:
         transportSource.reset();\r
         readerSource.reset();\r
 \r
-        AudioFormatReader* newReader = nullptr;\r
+        auto source = makeInputSource (fileToPlay);\r
 \r
-       #if ! JUCE_IOS\r
-        if (fileToPlay.isLocalFile())\r
-        {\r
-            newReader = formatManager.createReaderFor (fileToPlay.getLocalFile());\r
-        }\r
-        else\r
-       #endif\r
-        {\r
-            if (newReader == nullptr)\r
-                newReader = formatManager.createReaderFor (fileToPlay.createInputStream (URL::InputStreamOptions (URL::ParameterHandling::inAddress)));\r
-        }\r
+        if (source == nullptr)\r
+            return false;\r
 \r
-        reader.reset (newReader);\r
+        auto stream = rawToUniquePtr (source->createInputStream());\r
 \r
-        if (reader.get() != nullptr)\r
-        {\r
-            readerSource.reset (new AudioFormatReaderSource (reader.get(), false));\r
-            readerSource->setLooping (loopState.getValue());\r
+        if (stream == nullptr)\r
+            return false;\r
 \r
-            init();\r
+        reader = rawToUniquePtr (formatManager.createReaderFor (std::move (stream)));\r
 \r
-            return true;\r
-        }\r
+        if (reader == nullptr)\r
+            return false;\r
+\r
+        readerSource.reset (new AudioFormatReaderSource (reader.get(), false));\r
+        readerSource->setLooping (loopState.getValue());\r
+\r
+        init();\r
 \r
-        return false;\r
+        return true;\r
     }\r
 \r
     void togglePlay()\r
@@ -613,7 +593,7 @@ private:
                                       {\r
                                           if (fc.getURLResults().size() > 0)\r
                                           {\r
-                                              auto u = fc.getURLResult();\r
+                                              const auto u = fc.getURLResult();\r
 \r
                                               if (! audioFileReader.loadURL (u))\r
                                                   NativeMessageBox::showAsync (MessageBoxOptions()\r
index bfc1c5d2862ed6d65cd01cf1174df2d1c6173303..ffdfc3631c930a0500cf7f0ef82843cbe47e6316 100644 (file)
@@ -242,4 +242,19 @@ struct SlowerBouncingNumber  : public BouncingNumber
     }\r
 };\r
 \r
+inline std::unique_ptr<InputSource> makeInputSource (const URL& url)\r
+{\r
+   #if JUCE_ANDROID\r
+    if (auto doc = AndroidDocument::fromDocument (url))\r
+        return std::make_unique<AndroidDocumentInputSource> (doc);\r
+   #endif\r
+\r
+   #if ! JUCE_IOS\r
+    if (url.isLocalFile())\r
+        return std::make_unique<FileInputSource> (url.getLocalFile());\r
+   #endif\r
+\r
+    return std::make_unique<URLInputSource> (url);\r
+}\r
+\r
 #endif   // PIP_DEMO_UTILITIES_INCLUDED\r
index 0231f77be866e2d479244956e0b9a42809840339..62bd965851a9b358c74683dd196781fe55dfc8da 100644 (file)
@@ -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
 
index df72b0ffbfe88c3a8e49801b6396b1dc338a40e6..a69b047b91cfda3e8bf2ba11ca1fac42597811fc 100644 (file)
                                        "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",
                                        "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",
index 363bf73bcabe1e23a1ce389cab38c9f10322903c..cfdb7b071f1b9c6ddd541600ba1b8c1df9c1f225 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile Include="..\..\Source\UI\GraphEditorPanel.cpp"/>\r
     <ClCompile Include="..\..\Source\UI\MainHostWindow.cpp"/>\r
     <ClCompile Include="..\..\Source\HostStartup.cpp"/>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 3bd2b5f3efcce1fa26b051590f5cdb89c7f23799..644f19ed72edaa4d0841a94a74fcb754cf3b1688 100644 (file)
     <ClCompile Include="..\..\Source\HostStartup.cpp">\r
       <Filter>AudioPluginHost\Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index a4c96d59c76365d47501f32753273ea0e87bad90..e770966ad910e88cec8a5b3433be68b6bc7370a7 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile Include="..\..\Source\UI\GraphEditorPanel.cpp"/>\r
     <ClCompile Include="..\..\Source\UI\MainHostWindow.cpp"/>\r
     <ClCompile Include="..\..\Source\HostStartup.cpp"/>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index c3f40dbd8ca543021c9c93b132c1d9b011dde427..4cc5b50e3a77a18217aff2a5e914785d93fe3b2a 100644 (file)
     <ClCompile Include="..\..\Source\HostStartup.cpp">\r
       <Filter>AudioPluginHost\Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index cc0d648a6d072e2e818cb2ad66fab5d9399402a5..dfc0ff8e81dff4998414404d10ec4f3c90574a2b 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\AudioPluginHost.exe</OutputFile>\r
     <ClCompile Include="..\..\Source\UI\GraphEditorPanel.cpp"/>\r
     <ClCompile Include="..\..\Source\UI\MainHostWindow.cpp"/>\r
     <ClCompile Include="..\..\Source\HostStartup.cpp"/>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 6f2efc47e5eb3db9f153d9f088fdc0cfa8233195..1e37071622a4f5d6132ca20b8e9310529b489fee 100644 (file)
     <ClCompile Include="..\..\Source\HostStartup.cpp">\r
       <Filter>AudioPluginHost\Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 991397e250dff6ab553f3a0d5776d9a5e1c9ae04..e228fd1e3fbd7ffdf62a9c1238158fbdf4bfe4bc 100644 (file)
                                        "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",
                                        "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",
index 798fe97539280a78b60fcdf7013fc59714672563..2fc836ef0a3ad56cb54c72f8499b152cd2f05e84 100644 (file)
@@ -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
 
index 7e6a140471ae48131fc8b98980e954ff3fd91642..79a24dbd1ff44b0590f0409ea4bb23fc81685645 100644 (file)
                                        "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",
                                        "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",
index 6ede8280c7cff737a9010aef8d5a8d898d66a2a3..813c7e80d831898774e2c18a85cae59a8e706b6b 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\BinaryBuilder.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\BinaryBuilder.exe</OutputFile>\r
index d86ce8a997154a5dfa9fd3cc6b4c8d49247c1d59..954a435db59730c7059c76a31e77a16b1f2239de 100644 (file)
@@ -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()
index 54b4156e48cb6b1ff00db6a2f3abe05c6eacf168..764ff3ecb54bc6bbe6a071ad36614ea4b73f5c3d 100644 (file)
@@ -34,7 +34,7 @@
 \r
   ID:                 juce_build_tools\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE Build Tools\r
   description:        Classes for generating intermediate files for JUCE projects.\r
   website:            http://www.juce.com/juce\r
index dd9a16d9eb96da8b176f4742e37bdbaa2f3752ae..bad671c0e4ff185ea4d7a81e9912491b908ca18a 100644 (file)
@@ -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"
index f6b609a857a938df9c2f84911f673b5869d71762..e8e438e00a52d5cd0cca4f3b96192bb0c65ad226 100644 (file)
@@ -4,16 +4,15 @@
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
                     android:xlargeScreens="true"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
-  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
-  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
-  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-  <uses-permission android:name="android.permission.BLUETOOTH"/>
+  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
+  <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
   <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
   <uses-permission android:name="android.permission.INTERNET"/>
   <uses-feature android:glEsVersion="0x00020000" android:required="true"/>
   <application android:label="@string/app_name" android:name="com.rmsl.juce.JuceApp" android:icon="@drawable/icon" android:hardwareAccelerated="false">
-    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboardHidden|orientation|screenSize"
+    <activity android:name="com.rmsl.juce.JuceActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|navigation"
               android:screenOrientation="unspecified" android:launchMode="singleTask" android:hardwareAccelerated="true"
               android:exported="true">
       <intent-filter>
index 2222e3dba7ff4c0f92858879f3e35cf9e42c670b..3b31b1878442e9113a4562a803140627eafd3dbb 100644 (file)
@@ -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
 
index 4e036e8461e32f44fcf4cbf7e555f3b1c83f5b13..d2282923e02804fe37d179541277186789f84ed8 100644 (file)
                                        "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",
                                        "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",
index c3d567afe93c478981fb21e17467cce5f1148ebc..8dac97c8d572ff60fdea85f78eef6e35a30cda14 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\JUCE Network Graphics Demo.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\JUCE Network Graphics Demo.exe</OutputFile>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
     <ClCompile Include="..\..\Source\Main.cpp"/>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 4364fbae33eaf452cab5fb2ae1d1ba14c130d80a..0dc2f237dc784711d5ce48526bc8c22109bd71f5 100644 (file)
     <ClCompile Include="..\..\Source\Main.cpp">\r
       <Filter>NetworkGraphicsDemo\Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index ae653aec7b177fa83cbe1e7b01f5522f57376652..9ecfe1322eacd65fe9902f245abbc536d8b9ec1f 100644 (file)
                                        "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",
                                        "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",
index 3f683266195cccb954c81cd3edc2dbdc53238411..4a368ef6d517cba15e0e2c7e67971fd2df8b9907 100644 (file)
@@ -490,7 +490,7 @@ struct MultiLogo  : public BackgroundLogo
 };\r
 \r
 //==============================================================================\r
-void createAllDemos (OwnedArray<AnimatedContent>& demos)\r
+inline void createAllDemos (OwnedArray<AnimatedContent>& demos)\r
 {\r
     demos.add (new FlockDemo());\r
     demos.add (new FlockWithText());\r
index fc90aee17afea8ec74336ed58be7f3c0e201af74..3f3a33f4fbdb7ace03e2e8dd58a1011f9bba2a92 100644 (file)
@@ -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
 
index e33f997136112e84ee0b25a983949404e0a79ebe..8c250b2bd675c37c39181084dd40844afe47bead 100644 (file)
@@ -22,9 +22,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>7.0.3</string>\r
+    <string>7.0.4</string>\r
     <key>CFBundleVersion</key>\r
-    <string>7.0.3</string>\r
+    <string>7.0.4</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index ca542304c02a5ad19a1011886ed8afc34d4375a6..00c55074f08312146548c72c47aa4a6fe2463d42 100644 (file)
                                        "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",
                                        "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",
                                        "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",
                                        "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",
index 8537ed39802427dd7314bf65dd8787296056ad63..86b8b865080fe5d5e7f5867405dd4cde1054426d 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 696ac002b3bc29e4641533121c97f6d49c5556e9..c01b7709240e615673b2dad0df69e2954737fd45 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 789264c774fb949e0476da8bd5bb50dc2faa350a..2d7d3f43e9ca0491e7c5860c1f858cf3d1400005 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,3,0\r
+FILEVERSION  7,0,4,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "7.0.3\0"\r
+      VALUE "FileVersion",  "7.0.4\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "7.0.3\0"\r
+      VALUE "ProductVersion",  "7.0.4\0"\r
     END\r
   END\r
 \r
index c9891796d044c320b0f021c6b489198a29ba596b..0756e37e1d6a5bc513571744a02a8869509ab8fe 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 6dc8cae7d1ac27726731c16221ae730aaa6385a3..bf82efb3dc3b75426692fb98e4044fa822248a3c 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 789264c774fb949e0476da8bd5bb50dc2faa350a..2d7d3f43e9ca0491e7c5860c1f858cf3d1400005 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,3,0\r
+FILEVERSION  7,0,4,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "7.0.3\0"\r
+      VALUE "FileVersion",  "7.0.4\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "7.0.3\0"\r
+      VALUE "ProductVersion",  "7.0.4\0"\r
     END\r
   END\r
 \r
index 5b17c2ec6f837fbdf9e839dc227b8386683bc394..75190717853730ad43a1866485c03692999c469a 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -79,7 +79,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\Build;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\Projucer.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index db5808cb25da75e13ca7c7d11b14507f69153d97..3e3eb44572be13188419fc91afaefe1dea58553c 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 789264c774fb949e0476da8bd5bb50dc2faa350a..2d7d3f43e9ca0491e7c5860c1f858cf3d1400005 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  7,0,3,0\r
+FILEVERSION  7,0,4,0\r
 BEGIN\r
   BLOCK "StringFileInfo"\r
   BEGIN\r
@@ -18,9 +18,9 @@ BEGIN
       VALUE "CompanyName",  "Raw Material Software Limited\0"\r
       VALUE "LegalCopyright",  "Raw Material Software Limited\0"\r
       VALUE "FileDescription",  "Projucer\0"\r
-      VALUE "FileVersion",  "7.0.3\0"\r
+      VALUE "FileVersion",  "7.0.4\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "7.0.3\0"\r
+      VALUE "ProductVersion",  "7.0.4\0"\r
     END\r
   END\r
 \r
index 4ebb05cf719189c525886a77ab3da66147c7997f..29047f340c3a2fe1f79a4a459f7e611b207d6962 100644 (file)
@@ -44,7 +44,7 @@ namespace ProjectInfo
 {\r
     const char* const  projectName    = "Projucer";\r
     const char* const  companyName    = "Raw Material Software Limited";\r
-    const char* const  versionString  = "7.0.3";\r
-    const int          versionNumber  = 0x70003;\r
+    const char* const  versionString  = "7.0.4";\r
+    const int          versionNumber  = 0x70004;\r
 }\r
 #endif\r
index b268a4a1786c1a85a05815d10fdcf52e2a4a9de3..975920def39365f14a63a0ff099b59f994550081 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
-              version="7.0.3" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
+              version="7.0.4" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
               displaySplashScreen="0" reportAppUsage="0" companyName="Raw Material Software Limited"\r
               companyCopyright="Raw Material Software Limited" useAppConfig="0"\r
               addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
index 111c0f098c959e89809ed5d6a2cd2b308270de0e..9c4b1eec3cc7a6d3cde71b39ae08c90f49bda518 100644 (file)
@@ -573,7 +573,7 @@ bool JucerDocument::reloadFromDocument()
     if (currentXML != nullptr && currentXML->isEquivalentTo (newXML.get(), true))\r
         return true;\r
 \r
-    currentXML.reset (newXML.release());\r
+    currentXML = std::move (newXML);\r
     stopTimer();\r
 \r
     resources.loadFromCpp (getCppFile(), cppContent);\r
index d585bfe6fe675e5fe3e74e61239948f443a85332..a030a95940fd6244d7aefb518ffbcb1064619073 100644 (file)
@@ -71,6 +71,12 @@ public:
         createOtherExporterProperties (props);\r
     }\r
 \r
+    void updateDeprecatedSettings() override\r
+    {\r
+        updateExternalReadPermission();\r
+        updateBluetoothPermission();\r
+    }\r
+\r
     static String getDisplayName()        { return "Android"; }\r
     static String getValueTreeTypeName()  { return "ANDROIDSTUDIO"; }\r
     static String getTargetFolderName()   { return "Android"; }\r
@@ -94,7 +100,9 @@ public:
                                  androidCustomActivityClass, androidCustomApplicationClass, androidManifestCustomXmlElements,\r
                                  androidGradleSettingsContent, androidVersionCode, androidMinimumSDK, androidTargetSDK, androidTheme,\r
                                  androidExtraAssetsFolder, androidOboeRepositoryPath, androidInternetNeeded, androidMicNeeded, androidCameraNeeded,\r
-                                 androidBluetoothNeeded, androidExternalReadPermission, androidExternalWritePermission,\r
+                                 androidBluetoothScanNeeded, androidBluetoothAdvertiseNeeded, androidBluetoothConnectNeeded,\r
+                                 androidReadMediaAudioPermission, androidReadMediaImagesPermission,\r
+                                 androidReadMediaVideoPermission, androidExternalWritePermission,\r
                                  androidInAppBillingPermission, androidVibratePermission, androidOtherPermissions, androidPushNotifications,\r
                                  androidEnableRemoteNotifications, androidRemoteNotificationsConfigFile, androidEnableContentSharing, androidKeyStore,\r
                                  androidKeyStorePass, androidKeyAlias, androidKeyAliasPass, gradleVersion, gradleToolchain, androidPluginVersion;\r
@@ -123,8 +131,12 @@ public:
           androidInternetNeeded                (settings, Ids::androidInternetNeeded,                getUndoManager(), true),\r
           androidMicNeeded                     (settings, Ids::microphonePermissionNeeded,           getUndoManager(), false),\r
           androidCameraNeeded                  (settings, Ids::cameraPermissionNeeded,               getUndoManager(), false),\r
-          androidBluetoothNeeded               (settings, Ids::androidBluetoothNeeded,               getUndoManager(), true),\r
-          androidExternalReadPermission        (settings, Ids::androidExternalReadNeeded,            getUndoManager(), true),\r
+          androidBluetoothScanNeeded           (settings, Ids::androidBluetoothScanNeeded,           getUndoManager(), false),\r
+          androidBluetoothAdvertiseNeeded      (settings, Ids::androidBluetoothAdvertiseNeeded,      getUndoManager(), false),\r
+          androidBluetoothConnectNeeded        (settings, Ids::androidBluetoothConnectNeeded,        getUndoManager(), false),\r
+          androidReadMediaAudioPermission      (settings, Ids::androidReadMediaAudioPermission,      getUndoManager(), true),\r
+          androidReadMediaImagesPermission     (settings, Ids::androidReadMediaImagesPermission,     getUndoManager(), true),\r
+          androidReadMediaVideoPermission      (settings, Ids::androidReadMediaVideoPermission,      getUndoManager(), true),\r
           androidExternalWritePermission       (settings, Ids::androidExternalWriteNeeded,           getUndoManager(), true),\r
           androidInAppBillingPermission        (settings, Ids::androidInAppBilling,                  getUndoManager(), false),\r
           androidVibratePermission             (settings, Ids::androidVibratePermissionNeeded,       getUndoManager(), false),\r
@@ -342,6 +354,32 @@ protected:
     }\r
 \r
 private:\r
+    void updateExternalReadPermission()\r
+    {\r
+        const auto needsExternalRead = getSettingString (Ids::androidExternalReadNeeded);\r
+        settings.removeProperty (Ids::androidExternalReadNeeded, nullptr);\r
+\r
+        if (needsExternalRead.isEmpty())\r
+            return;\r
+\r
+        androidReadMediaAudioPermission .setValue (needsExternalRead, nullptr);\r
+        androidReadMediaImagesPermission.setValue (needsExternalRead, nullptr);\r
+        androidReadMediaVideoPermission .setValue (needsExternalRead, nullptr);\r
+    }\r
+\r
+    void updateBluetoothPermission()\r
+    {\r
+        const auto needsBluetooth = getSettingString (Ids::androidBluetoothNeeded);\r
+        settings.removeProperty (Ids::androidBluetoothNeeded, nullptr);\r
+\r
+        if (needsBluetooth.isEmpty())\r
+            return;\r
+\r
+        androidBluetoothScanNeeded     .setValue (needsBluetooth, nullptr);\r
+        androidBluetoothAdvertiseNeeded.setValue (needsBluetooth, nullptr);\r
+        androidBluetoothConnectNeeded  .setValue (needsBluetooth, nullptr);\r
+    }\r
+\r
     void writeCmakeFile (const File& file) const\r
     {\r
         build_tools::writeStreamToFile (file, [&] (MemoryOutputStream& mo)\r
@@ -1100,11 +1138,23 @@ private:
         props.add (new ChoicePropertyComponent (androidCameraNeeded, "Camera Required"),\r
                    "If enabled, this will set the android.permission.CAMERA flag in the manifest.");\r
 \r
-        props.add (new ChoicePropertyComponent (androidBluetoothNeeded, "Bluetooth Permissions Required"),\r
-                   "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.");\r
+        props.add (new ChoicePropertyComponent (androidBluetoothScanNeeded, "Bluetooth Scan Required"),\r
+                   "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.");\r
+\r
+        props.add (new ChoicePropertyComponent (androidBluetoothAdvertiseNeeded, "Bluetooth Advertise Required"),\r
+                   "If enabled, this will set the android.permission.BLUETOOTH_ADVERTISE, android.permission.BLUETOOTH and android.permission.BLUETOOTH_ADMIN flags in the manifest.");\r
 \r
-        props.add (new ChoicePropertyComponent (androidExternalReadPermission, "Read From External Storage"),\r
-                   "If enabled, this will set the android.permission.READ_EXTERNAL_STORAGE flag in the manifest.");\r
+        props.add (new ChoicePropertyComponent (androidBluetoothConnectNeeded, "Bluetooth Connect Required"),\r
+                   "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.");\r
+\r
+        props.add (new ChoicePropertyComponent (androidReadMediaAudioPermission, "Read Audio From External Storage"),\r
+                   "If enabled, this will set the android.permission.READ_MEDIA_AUDIO and android.permission.READ_EXTERNAL_STORAGE flags in the manifest.");\r
+\r
+        props.add (new ChoicePropertyComponent (androidReadMediaImagesPermission, "Read Images From External Storage"),\r
+                   "If enabled, this will set the android.permission.READ_MEDIA_IMAGES and android.permission.READ_EXTERNAL_STORAGE flags in the manifest.");\r
+\r
+        props.add (new ChoicePropertyComponent (androidReadMediaVideoPermission, "Read Video From External Storage"),\r
+                   "If enabled, this will set the android.permission.READ_MEDIA_VIDEO and android.permission.READ_EXTERNAL_STORAGE flags in the manifest.");\r
 \r
         props.add (new ChoicePropertyComponent (androidExternalWritePermission, "Write to External Storage"),\r
                    "If enabled, this will set the android.permission.WRITE_EXTERNAL_STORAGE flag in the manifest.");\r
@@ -1680,6 +1730,22 @@ private:
             // This permission only has an effect on SDK version 28 and lower\r
             if (permission == "android.permission.WRITE_EXTERNAL_STORAGE")\r
                 usesPermission->setAttribute ("android:maxSdkVersion", "28");\r
+\r
+            // https://developer.android.com/training/data-storage/shared/documents-files\r
+            // If the SDK version is <= 28, READ_EXTERNAL_STORAGE is required to access any\r
+            // media file, including files created by the current app.\r
+            // If the SDK version is <= 32, READ_EXTERNAL_STORAGE is required to access other\r
+            // apps' media files.\r
+            // This permission has no effect on later Android versions.\r
+            if (permission == "android.permission.READ_EXTERNAL_STORAGE")\r
+                usesPermission->setAttribute ("android:maxSdkVersion", "32");\r
+\r
+            // These permissions are obsoleted by new more fine-grained permissions in API level 31\r
+            if (permission == "android.permission.BLUETOOTH"\r
+                || permission == "android.permission.BLUETOOTH_ADMIN")\r
+            {\r
+                usesPermission->setAttribute ("android:maxSdkVersion", "30");\r
+            }\r
         }\r
     }\r
 \r
@@ -1736,7 +1802,7 @@ private:
         setAttributeIfNotPresent (*act, "android:name", getActivityClassString());\r
 \r
         if (! act->hasAttribute ("android:configChanges"))\r
-            act->setAttribute ("android:configChanges", "keyboardHidden|orientation|screenSize");\r
+            act->setAttribute ("android:configChanges", "keyboard|keyboardHidden|orientation|screenSize|navigation");\r
 \r
         if (androidScreenOrientation.get() == "landscape")\r
         {\r
@@ -1837,7 +1903,18 @@ private:
         if (androidCameraNeeded.get())\r
             s.add ("android.permission.CAMERA");\r
 \r
-        if (androidBluetoothNeeded.get())\r
+        if (androidBluetoothScanNeeded.get())\r
+            s.add ("android.permission.BLUETOOTH_SCAN");\r
+\r
+        if (androidBluetoothAdvertiseNeeded.get())\r
+            s.add ("android.permission.BLUETOOTH_ADVERTISE");\r
+\r
+        if (androidBluetoothConnectNeeded.get())\r
+            s.add ("android.permission.BLUETOOTH_CONNECT");\r
+\r
+        if (   androidBluetoothScanNeeded.get()\r
+            || androidBluetoothAdvertiseNeeded.get()\r
+            || androidBluetoothConnectNeeded.get())\r
         {\r
             s.add ("android.permission.BLUETOOTH");\r
             s.add ("android.permission.BLUETOOTH_ADMIN");\r
@@ -1845,8 +1922,21 @@ private:
             s.add ("android.permission.ACCESS_COARSE_LOCATION");\r
         }\r
 \r
-        if (androidExternalReadPermission.get())\r
+        if (androidReadMediaAudioPermission.get())\r
+            s.add ("android.permission.READ_MEDIA_AUDIO");\r
+\r
+        if (androidReadMediaImagesPermission.get())\r
+            s.add ("android.permission.READ_MEDIA_IMAGES");\r
+\r
+        if (androidReadMediaVideoPermission.get())\r
+            s.add ("android.permission.READ_MEDIA_VIDEO");\r
+\r
+        if (   androidReadMediaAudioPermission.get()\r
+            || androidReadMediaImagesPermission.get()\r
+            || androidReadMediaVideoPermission.get())\r
+        {\r
             s.add ("android.permission.READ_EXTERNAL_STORAGE");\r
+        }\r
 \r
         if (androidExternalWritePermission.get())\r
             s.add ("android.permission.WRITE_EXTERNAL_STORAGE");\r
index a84cdc9372cc81206ebf6a36cae16788af789ed8..d2f5f7085655a02a9e849bb63ad1a0db9f64568c 100644 (file)
@@ -218,7 +218,7 @@ public:
             }\r
             else if (type == LV2PlugIn)\r
             {\r
-                s.add ("JUCE_LV2DIR := " + targetName + ".lv2");\r
+                s.add ("JUCE_LV2DIR := " + escapeQuotesAndSpaces (targetName) + ".lv2");\r
                 targetName = "$(JUCE_LV2DIR)/" + targetName + ".so";\r
             }\r
             else if (type == LV2TurtleProgram)\r
@@ -399,7 +399,7 @@ public:
             }\r
             else if (type == LV2PlugIn)\r
             {\r
-                out << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER) $(abspath $(JUCE_LV2_FULL_PATH))" << newLine\r
+                out << "\t$(V_AT) $(JUCE_OUTDIR)/$(JUCE_TARGET_LV2_MANIFEST_HELPER) $(JUCE_LV2_FULL_PATH)" << newLine\r
                     << "\t-$(V_AT)[ ! \"$(JUCE_LV2DESTDIR)\" ] || (mkdir -p $(JUCE_LV2DESTDIR) && cp -R $(JUCE_COPYCMD_LV2_PLUGIN))" << newLine;\r
             }\r
 \r
index 350d7c4155a4dff20bff76b499a7929f2bbf2f38..88800347539f01230df5b7685604aac07050cb02 100644 (file)
@@ -234,7 +234,13 @@ namespace Ids
     DECLARE_ID (androidGradleSettingsContent);\r
     DECLARE_ID (androidCustomStringXmlElements);\r
     DECLARE_ID (androidBluetoothNeeded);\r
+    DECLARE_ID (androidBluetoothScanNeeded);\r
+    DECLARE_ID (androidBluetoothAdvertiseNeeded);\r
+    DECLARE_ID (androidBluetoothConnectNeeded);\r
     DECLARE_ID (androidExternalReadNeeded);\r
+    DECLARE_ID (androidReadMediaAudioPermission);\r
+    DECLARE_ID (androidReadMediaImagesPermission);\r
+    DECLARE_ID (androidReadMediaVideoPermission);\r
     DECLARE_ID (androidExternalWriteNeeded);\r
     DECLARE_ID (androidInAppBilling);\r
     DECLARE_ID (androidVibratePermissionNeeded);\r
index 37e4e89592978e23b0c1afe6ab6171e5ab9149bf..8795a09201d36933e34edd6dfcf9b10d45735966 100644 (file)
@@ -296,7 +296,6 @@ struct TranslationHelpers
 \r
             const StringArray& originalKeys (originalStrings.getAllKeys());\r
             const StringArray& originalValues (originalStrings.getAllValues());\r
-            int numRemoved = 0;\r
 \r
             for (int i = preStrings.size(); --i >= 0;)\r
             {\r
@@ -304,7 +303,6 @@ struct TranslationHelpers
                 {\r
                     preStrings.remove (i);\r
                     postStrings.remove (i);\r
-                    ++numRemoved;\r
                 }\r
             }\r
 \r
index 88aa018f7f24f6cd1a6d56f15cfabdf92fafe4a4..ea203361c5b3b72a0ea79e59d05ba17726e429aa 100644 (file)
@@ -265,6 +265,9 @@ ValueTree PIPGenerator::createExporterChild (const Identifier& exporterIdentifie
         }\r
     }\r
 \r
+    if (exporterIdentifier.toString() == AndroidProjectExporter::getValueTreeTypeName())\r
+        exporter.setProperty (Ids::androidBluetoothNeeded, true, nullptr);\r
+\r
     {\r
         ValueTree configs (Ids::CONFIGURATIONS);\r
 \r
index e044c6aa2c08d5953fc374edfab324d35c462307..1a17190b9a2a22cc3e91d0c0b684b1d9a907dffe 100644 (file)
@@ -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
 
index 299fd40906f0bf51cad20d8e7597b3a917249eec..5f94dd2b0139f3aa38c13765fd18564c3094716d 100644 (file)
                                        "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",
                                        "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",
index b3a2f0b687ad4a9285591c35c09be4d88daf8e77..c5b30150ea0e09b1cd846f0f6a9bca2fe6c3e0f4 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -80,7 +80,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index c3f821af1e6633031a89d9500d1eb4fcff94f81e..e0a95f8886b9d0c3810feca05654a060d2c1aac6 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <Filter>JUCE Modules\juce_analytics</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index f6788fdfd793614917ac2931c56b45b3dc6948cb..2e99de2aa0352717b6196eae5c761ea60d394fa3 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -80,7 +80,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index 15c6a1a4a673125170ade329687085d68154bcb2..2d93b6b183664b166644a16e57fcf5067cb235be 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <Filter>JUCE Modules\juce_analytics</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 7482b348ee18c3e7a62519bbaac97bb10d68e8ae..f1574576ae8770494c83daa5c40e0090dbaf57c3 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -80,7 +80,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lilv;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sratom;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord\src;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\sord;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\serd;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK\lv2;..\..\..\..\modules\juce_audio_processors\format_types\LV2_SDK;..\..\..\..\modules\juce_audio_processors\format_types\VST3_SDK;..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\UnitTestRunner.exe</OutputFile>\r
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index e7e3721e64c8ac20a91414d2070668057aa1c8ee..d785e613fb2f329bd19870f0d7daec650b57a521 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_analytics\juce_analytics.cpp">\r
       <Filter>JUCE Modules\juce_analytics</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 851c0fadbec0757e20a14115c526062905bf69c0..ccfd16c4dae561225ede84f061483dcefb3979d9 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
@@ -78,7 +78,7 @@
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\juce_dll.lib</OutputFile>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     </ClCompile>\r
     <ResourceCompile>\r
       <AdditionalIncludeDirectories>..\..\JuceLibraryCode;..\..\..\..\modules;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_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)</PreprocessorDefinitions>\r
+      <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)</PreprocessorDefinitions>\r
     </ResourceCompile>\r
     <Link>\r
       <OutputFile>$(OutDir)\juce_dll.lib</OutputFile>\r
     <Lib/>\r
   </ItemDefinitionGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAValueProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAWindowProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_XWindowSystem.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\juce_mac_CGMetalLayerRenderer.h"/>\r
index c7f9e9e053a010bc6a9a6067f57af07ab350cfd3..33d4edb9ef64220761c6eb04571199919b5768f0 100644 (file)
     </Filter>\r
   </ItemGroup>\r
   <ItemGroup>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\audio_play_head\juce_AudioPlayHead.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\audio_play_head</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\buffers\juce_AudioChannelSet.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\buffers</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMP_test.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPIterator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\midi\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\midi\ump</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_MixerAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_PositionableAudioSource.cpp">\r
+      <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_basics\sources\juce_ResamplingAudioSource.cpp">\r
       <Filter>JUCE Modules\juce_audio_basics\sources</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_RangedAudioParameter.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_processors\utilities\juce_VSTCallbackHandler.cpp">\r
+      <Filter>JUCE Modules\juce_audio_processors\utilities</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_processors\juce_audio_processors.cpp">\r
       <Filter>JUCE Modules\juce_audio_processors</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\app_properties\juce_PropertiesFile.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\app_properties</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoableAction.cpp">\r
+      <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_data_structures\undomanager\juce_UndoManager.cpp">\r
       <Filter>JUCE Modules\juce_data_structures\undomanager</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_SystemTrayIconComponent.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_extra\misc\juce_WebBrowserComponent.cpp">\r
+      <Filter>JUCE Modules\juce_gui_extra\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_extra\native\juce_android_PushNotifications.cpp">\r
       <Filter>JUCE Modules\juce_gui_extra\native</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_WindowsUIAWrapper.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_ScopedWindowAssociation.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\x11\juce_linux_X11_Symbols.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\x11</Filter>\r
     </ClInclude>\r
index 06a0b107e7a7a2ed429d78b0fb2d8dd7905abc8e..157a7cbbee565cbbd2d5f6c026033ac546ef43c9 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_analytics\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE analytics classes\r
   description:        Classes to collect analytics and send to destinations\r
   website:            http://www.juce.com/juce\r
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 (file)
index 0000000..72888e2
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+bool AudioPlayHead::canControlTransport()                                          { return false; }\r
+void AudioPlayHead::transportPlay ([[maybe_unused]] bool shouldStartPlaying)       {}\r
+void AudioPlayHead::transportRecord ([[maybe_unused]] bool shouldStartRecording)   {}\r
+void AudioPlayHead::transportRewind()                                              {}\r
+\r
+} // namespace juce\r
index 21222b7f3360a2eabb44fab70f99516aa21ba6ed..3c47f85cb1e026207582f10e4003d18158f19945 100644 (file)
@@ -578,16 +578,16 @@ public:
     virtual Optional<PositionInfo> getPosition() const = 0;\r
 \r
     /** Returns true if this object can control the transport. */\r
-    virtual bool canControlTransport()                         { return false; }\r
+    virtual bool canControlTransport();\r
 \r
     /** Starts or stops the audio. */\r
-    virtual void transportPlay (bool shouldStartPlaying)       { ignoreUnused (shouldStartPlaying); }\r
+    virtual void transportPlay (bool shouldStartPlaying);\r
 \r
     /** Starts or stops recording the audio. */\r
-    virtual void transportRecord (bool shouldStartRecording)   { ignoreUnused (shouldStartRecording); }\r
+    virtual void transportRecord (bool shouldStartRecording);\r
 \r
     /** Rewinds the audio. */\r
-    virtual void transportRewind()                             {}\r
+    virtual void transportRewind();\r
 };\r
 \r
 } // namespace juce\r
index 251a4a04c45d0a7d8a6e0462447d58c16f1f8a5f..d583a59399aff1831c248ea6c27512109e685c7b 100644 (file)
@@ -558,7 +558,11 @@ public:
         if (! isClear)\r
         {\r
             for (int i = 0; i < numChannels; ++i)\r
+            {\r
+                JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661)\r
                 FloatVectorOperations::clear (channels[i], size);\r
+                JUCE_END_IGNORE_WARNINGS_MSVC\r
+            }\r
 \r
             isClear = true;\r
         }\r
@@ -799,6 +803,8 @@ public:
             auto* d = channels[destChannel] + destStartSample;\r
             auto* s = source.channels[sourceChannel] + sourceStartSample;\r
 \r
+            JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661)\r
+\r
             if (isClear)\r
             {\r
                 isClear = false;\r
@@ -815,6 +821,8 @@ public:
                 else\r
                     FloatVectorOperations::add (d, s, numSamples);\r
             }\r
+\r
+            JUCE_END_IGNORE_WARNINGS_MSVC\r
         }\r
     }\r
 \r
@@ -877,7 +885,11 @@ public:
         @param numSamples           the number of samples to process\r
         @param startGain            the gain to apply to the first sample (this is multiplied with\r
                                     the source samples before they are added to this buffer)\r
-        @param endGain              the gain to apply to the final sample. The gain is linearly\r
+        @param endGain              The gain that would apply to the sample after the final sample.\r
+                                    The gain that applies to the final sample is\r
+                                    (numSamples - 1) / numSamples * (endGain - startGain). This\r
+                                    ensures a continuous ramp when supplying the same value in\r
+                                    endGain and startGain in subsequent blocks. The gain is linearly\r
                                     interpolated between the first and last samples.\r
     */\r
     void addFromWithRamp (int destChannel,\r
@@ -1043,7 +1055,11 @@ public:
         @param numSamples           the number of samples to process\r
         @param startGain            the gain to apply to the first sample (this is multiplied with\r
                                     the source samples before they are copied to this buffer)\r
-        @param endGain              the gain to apply to the final sample. The gain is linearly\r
+        @param endGain              The gain that would apply to the sample after the final sample.\r
+                                    The gain that applies to the final sample is\r
+                                    (numSamples - 1) / numSamples * (endGain - startGain). This\r
+                                    ensures a continuous ramp when supplying the same value in\r
+                                    endGain and startGain in subsequent blocks. The gain is linearly\r
                                     interpolated between the first and last samples.\r
 \r
         @see addFrom\r
index d65a8f257af8a438fd4b267f31f7921faa696c1b..2a576dc989b55fb45f28b17a83255431a2bb4d37 100644 (file)
@@ -938,15 +938,13 @@ namespace
        #if JUCE_USE_VDSP_FRAMEWORK\r
         vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
        #else\r
-        FloatVectorHelpers::signMask32 signMask;\r
+        [[maybe_unused]] FloatVectorHelpers::signMask32 signMask;\r
         signMask.i = 0x7fffffffUL;\r
         JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]),\r
                                       Mode::bit_and (s, mask),\r
                                       JUCE_LOAD_SRC,\r
                                       JUCE_INCREMENT_SRC_DEST,\r
                                       const Mode::ParallelType mask = Mode::load1 (signMask.f);)\r
-\r
-        ignoreUnused (signMask);\r
        #endif\r
     }\r
 \r
@@ -956,7 +954,7 @@ namespace
        #if JUCE_USE_VDSP_FRAMEWORK\r
         vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
        #else\r
-        FloatVectorHelpers::signMask64 signMask;\r
+        [[maybe_unused]] FloatVectorHelpers::signMask64 signMask;\r
         signMask.i = 0x7fffffffffffffffULL;\r
 \r
         JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]),\r
@@ -964,8 +962,6 @@ namespace
                                       JUCE_LOAD_SRC,\r
                                       JUCE_INCREMENT_SRC_DEST,\r
                                       const Mode::ParallelType mask = Mode::load1 (signMask.d);)\r
-\r
-        ignoreUnused (signMask);\r
        #endif\r
     }\r
 \r
@@ -1456,7 +1452,7 @@ intptr_t JUCE_CALLTYPE FloatVectorOperations::getFpStatusRegister() noexcept
     return fpsr;\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister (intptr_t fpsr) noexcept\r
+void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister ([[maybe_unused]] intptr_t fpsr) noexcept\r
 {\r
  #if JUCE_INTEL && JUCE_USE_SSE_INTRINSICS\r
     // the volatile keyword here is needed to workaround a bug in AppleClang 13.0\r
@@ -1481,11 +1477,10 @@ void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister (intptr_t fpsr) no
   #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
     jassertfalse; // No support for getting the floating point status register for your platform\r
   #endif\r
-    ignoreUnused (fpsr);\r
  #endif\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnable) noexcept\r
+void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode ([[maybe_unused]] bool shouldEnable) noexcept\r
 {\r
   #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || (JUCE_64BIT && JUCE_ARM))\r
    #if JUCE_USE_SSE_INTRINSICS\r
@@ -1498,11 +1493,10 @@ void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnab
    #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
     jassertfalse; // No support for flush to zero mode on your platform\r
    #endif\r
-    ignoreUnused (shouldEnable);\r
   #endif\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool shouldDisable) noexcept\r
+void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport ([[maybe_unused]] bool shouldDisable) noexcept\r
 {\r
   #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || (JUCE_64BIT && JUCE_ARM))\r
    #if JUCE_USE_SSE_INTRINSICS\r
@@ -1513,7 +1507,6 @@ void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool
 \r
     setFpStatusRegister ((getFpStatusRegister() & (~mask)) | (shouldDisable ? mask : 0));\r
   #else\r
-    ignoreUnused (shouldDisable);\r
 \r
    #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
     jassertfalse; // No support for disable denormals mode on your platform\r
index cf7ae84a3631e10f3b14839c89373df86812d90d..9c6ed4990936a6bac48f239a4d49cac8272f1951 100644 (file)
@@ -142,65 +142,26 @@ struct FloatVectorOperationsBase
 namespace detail\r
 {\r
 \r
-template <typename...>\r
-struct NameForwarder;\r
-\r
-template <typename Head>\r
-struct NameForwarder<Head> : Head {};\r
-\r
-template <typename Head, typename... Tail>\r
-struct NameForwarder<Head, Tail...> : Head, NameForwarder<Tail...>\r
+template <typename... Bases>\r
+struct NameForwarder : public Bases...\r
 {\r
-    using Head::clear;\r
-    using NameForwarder<Tail...>::clear;\r
-\r
-    using Head::fill;\r
-    using NameForwarder<Tail...>::fill;\r
-\r
-    using Head::copy;\r
-    using NameForwarder<Tail...>::copy;\r
-\r
-    using Head::copyWithMultiply;\r
-    using NameForwarder<Tail...>::copyWithMultiply;\r
-\r
-    using Head::add;\r
-    using NameForwarder<Tail...>::add;\r
-\r
-    using Head::subtract;\r
-    using NameForwarder<Tail...>::subtract;\r
-\r
-    using Head::addWithMultiply;\r
-    using NameForwarder<Tail...>::addWithMultiply;\r
-\r
-    using Head::subtractWithMultiply;\r
-    using NameForwarder<Tail...>::subtractWithMultiply;\r
-\r
-    using Head::multiply;\r
-    using NameForwarder<Tail...>::multiply;\r
-\r
-    using Head::negate;\r
-    using NameForwarder<Tail...>::negate;\r
-\r
-    using Head::abs;\r
-    using NameForwarder<Tail...>::abs;\r
-\r
-    using Head::min;\r
-    using NameForwarder<Tail...>::min;\r
-\r
-    using Head::max;\r
-    using NameForwarder<Tail...>::max;\r
-\r
-    using Head::clip;\r
-    using NameForwarder<Tail...>::clip;\r
-\r
-    using Head::findMinAndMax;\r
-    using NameForwarder<Tail...>::findMinAndMax;\r
-\r
-    using Head::findMinimum;\r
-    using NameForwarder<Tail...>::findMinimum;\r
-\r
-    using Head::findMaximum;\r
-    using NameForwarder<Tail...>::findMaximum;\r
+    using Bases::clear...,\r
+          Bases::fill...,\r
+          Bases::copy...,\r
+          Bases::copyWithMultiply...,\r
+          Bases::add...,\r
+          Bases::subtract...,\r
+          Bases::addWithMultiply...,\r
+          Bases::subtractWithMultiply...,\r
+          Bases::multiply...,\r
+          Bases::negate...,\r
+          Bases::abs...,\r
+          Bases::min...,\r
+          Bases::max...,\r
+          Bases::clip...,\r
+          Bases::findMinAndMax...,\r
+          Bases::findMinimum...,\r
+          Bases::findMaximum...;\r
 };\r
 \r
 } // namespace detail\r
index 10f3a9bbcaf128100ad08b00bd3d6349b077103d..570974762e595dd62b2a5d19169b830202690af6 100644 (file)
 #include "sources/juce_ResamplingAudioSource.cpp"\r
 #include "sources/juce_ReverbAudioSource.cpp"\r
 #include "sources/juce_ToneGeneratorAudioSource.cpp"\r
+#include "sources/juce_PositionableAudioSource.cpp"\r
 #include "synthesisers/juce_Synthesiser.cpp"\r
+#include "audio_play_head/juce_AudioPlayHead.cpp"\r
 \r
 #include "midi/ump/juce_UMP.h"\r
 #include "midi/ump/juce_UMPUtils.cpp"\r
 #include "midi/ump/juce_UMPView.cpp"\r
 #include "midi/ump/juce_UMPSysEx7.cpp"\r
 #include "midi/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp"\r
+#include "midi/ump/juce_UMPIterator.cpp"\r
 \r
 #if JUCE_UNIT_TESTS\r
  #include "utilities/juce_ADSR_test.cpp"\r
index 664d98e9081bbd87a8d0523ceee2eeda424be1d8..d23738257ed868fd05174c4234637e971b48d5bc 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_basics\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE audio and MIDI data classes\r
   description:        Classes for audio buffer manipulation, midi message handling, synthesis, etc.\r
   website:            http://www.juce.com/juce\r
@@ -83,7 +83,9 @@
 \r
 //==============================================================================\r
 #include "buffers/juce_AudioDataConverters.h"\r
+JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661)\r
 #include "buffers/juce_FloatVectorOperations.h"\r
+JUCE_END_IGNORE_WARNINGS_MSVC\r
 #include "buffers/juce_AudioSampleBuffer.h"\r
 #include "buffers/juce_AudioChannelSet.h"\r
 #include "buffers/juce_AudioProcessLoadMeasurer.h"\r
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 (file)
index 0000000..0ba7ce0
--- /dev/null
@@ -0,0 +1,37 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+Iterator::Iterator (const uint32_t* ptr, [[maybe_unused]] size_t bytes) noexcept\r
+    : view (ptr)\r
+   #if JUCE_DEBUG\r
+    , bytesRemaining (bytes)\r
+   #endif\r
+{\r
+}\r
+\r
+} // namespace universal_midi_packets\r
+} // namespace juce\r
index b4dcea9a3446470739bbde2153f93355a0a7bf93..eba6202956e2e4cc80db813a8a56557d0c7fc8f3 100644 (file)
@@ -43,14 +43,7 @@ public:
     Iterator() noexcept = default;\r
 \r
     /** Creates an iterator pointing at `ptr`. */\r
-    explicit Iterator (const uint32_t* ptr, size_t bytes) noexcept\r
-        : view (ptr)\r
-       #if JUCE_DEBUG\r
-        , bytesRemaining (bytes)\r
-       #endif\r
-    {\r
-        ignoreUnused (bytes);\r
-    }\r
+    explicit Iterator (const uint32_t* ptr, size_t bytes) noexcept;\r
 \r
     using difference_type    = std::iterator_traits<const uint32_t*>::difference_type;\r
     using value_type         = View;\r
@@ -124,7 +117,7 @@ private:
    #endif\r
 };\r
 \r
-}\r
-}\r
+} // namespace universal_midi_packets\r
+} // namespace juce\r
 \r
 #endif\r
index 576b8b38164cf337d8db2ce4ddcae23e8473b513..87f3df39f7241c23a052a58de8f182b1f724629a 100644 (file)
@@ -853,6 +853,14 @@ void MPEInstrument::releaseAllNotes()
     notes.clear();\r
 }\r
 \r
+//==============================================================================\r
+void MPEInstrument::Listener::noteAdded ([[maybe_unused]] MPENote newNote)                 {}\r
+void MPEInstrument::Listener::notePressureChanged  ([[maybe_unused]] MPENote changedNote)  {}\r
+void MPEInstrument::Listener::notePitchbendChanged ([[maybe_unused]] MPENote changedNote)  {}\r
+void MPEInstrument::Listener::noteTimbreChanged    ([[maybe_unused]] MPENote changedNote)  {}\r
+void MPEInstrument::Listener::noteKeyStateChanged  ([[maybe_unused]] MPENote changedNote)  {}\r
+void MPEInstrument::Listener::noteReleased ([[maybe_unused]] MPENote finishedNote)         {}\r
+void MPEInstrument::Listener::zoneLayoutChanged()                                          {}\r
 \r
 //==============================================================================\r
 //==============================================================================\r
index 291957413338b55b514f5a9c5909f20ef69a2579..e7993c1d12e0020ced4fe1b301aa27d49db728b2 100644 (file)
@@ -265,12 +265,12 @@ public:
         /** Implement this callback to be informed whenever a new expressive MIDI\r
             note is triggered.\r
         */\r
-        virtual void noteAdded (MPENote newNote)                 { ignoreUnused (newNote); }\r
+        virtual void noteAdded (MPENote newNote);\r
 \r
         /** Implement this callback to be informed whenever a currently playing\r
             MPE note's pressure value changes.\r
         */\r
-        virtual void notePressureChanged (MPENote changedNote)   { ignoreUnused (changedNote); }\r
+        virtual void notePressureChanged (MPENote changedNote);\r
 \r
         /** Implement this callback to be informed whenever a currently playing\r
             MPE note's pitchbend value changes.\r
@@ -279,12 +279,12 @@ public:
             master channel pitchbend event, or if both occur simultaneously.\r
             Call MPENote::getFrequencyInHertz to get the effective note frequency.\r
         */\r
-        virtual void notePitchbendChanged (MPENote changedNote)  { ignoreUnused (changedNote); }\r
+        virtual void notePitchbendChanged (MPENote changedNote);\r
 \r
         /** Implement this callback to be informed whenever a currently playing\r
             MPE note's timbre value changes.\r
         */\r
-        virtual void noteTimbreChanged (MPENote changedNote)     { ignoreUnused (changedNote); }\r
+        virtual void noteTimbreChanged (MPENote changedNote);\r
 \r
         /** Implement this callback to be informed whether a currently playing\r
             MPE note's key state (whether the key is down and/or the note is\r
@@ -293,19 +293,19 @@ public:
             Note: If the key state changes to MPENote::off, noteReleased is\r
             called instead.\r
         */\r
-        virtual void noteKeyStateChanged (MPENote changedNote)   { ignoreUnused (changedNote); }\r
+        virtual void noteKeyStateChanged (MPENote changedNote);\r
 \r
         /** Implement this callback to be informed whenever an MPE note\r
             is released (either by a note-off message, or by a sustain/sostenuto\r
             pedal release for a note that already received a note-off),\r
             and should therefore stop playing.\r
         */\r
-        virtual void noteReleased (MPENote finishedNote)         { ignoreUnused (finishedNote); }\r
+        virtual void noteReleased (MPENote finishedNote);\r
 \r
         /** Implement this callback to be informed whenever the MPE zone layout\r
             or legacy mode settings of this instrument have been changed.\r
         */\r
-        virtual void zoneLayoutChanged()                         {}\r
+        virtual void zoneLayoutChanged();\r
     };\r
 \r
     //==============================================================================\r
diff --git a/modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp b/modules/juce_audio_basics/sources/juce_PositionableAudioSource.cpp
new file mode 100644 (file)
index 0000000..d7fbe37
--- /dev/null
@@ -0,0 +1,28 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+void PositionableAudioSource::setLooping ([[maybe_unused]] bool shouldLoop) {}\r
+\r
+} // namespace juce\r
index 1898bbbcfdd8f06c2610b0086e4ef0aeb021de10..6fb6691eaf955b78d2fb5482ed1630c48ba50a88 100644 (file)
@@ -70,7 +70,7 @@ public:
     virtual bool isLooping() const = 0;\r
 \r
     /** Tells the source whether you'd like it to play in a loop. */\r
-    virtual void setLooping (bool shouldLoop)       { ignoreUnused (shouldLoop); }\r
+    virtual void setLooping (bool shouldLoop);\r
 };\r
 \r
 } // namespace juce\r
index cfeb6a0928137e9d1772254ce348b96eec36cdd2..f9aaff23f0d23e2273482b6514abd453d04b4b1f 100644 (file)
@@ -482,15 +482,14 @@ void Synthesiser::handleSostenutoPedal (int midiChannel, bool isDown)
     }\r
 }\r
 \r
-void Synthesiser::handleSoftPedal (int midiChannel, bool /*isDown*/)\r
+void Synthesiser::handleSoftPedal ([[maybe_unused]] int midiChannel, bool /*isDown*/)\r
 {\r
-    ignoreUnused (midiChannel);\r
     jassert (midiChannel > 0 && midiChannel <= 16);\r
 }\r
 \r
-void Synthesiser::handleProgramChange (int midiChannel, int programNumber)\r
+void Synthesiser::handleProgramChange ([[maybe_unused]] int midiChannel,\r
+                                       [[maybe_unused]] int programNumber)\r
 {\r
-    ignoreUnused (midiChannel, programNumber);\r
     jassert (midiChannel > 0 && midiChannel <= 16);\r
 }\r
 \r
index 45a83d2b40e1fab14f1095cde9c78ad59a6c0d87..638172860682817dd7530d2d2817a326e35ae750 100644 (file)
 namespace juce\r
 {\r
 \r
+void AudioIODeviceCallback::audioDeviceIOCallbackWithContext ([[maybe_unused]] const float* const* inputChannelData,\r
+                                                              [[maybe_unused]] int numInputChannels,\r
+                                                              [[maybe_unused]] float* const* outputChannelData,\r
+                                                              [[maybe_unused]] int numOutputChannels,\r
+                                                              [[maybe_unused]] int numSamples,\r
+                                                              [[maybe_unused]] const AudioIODeviceCallbackContext& context) {}\r
+\r
+//==============================================================================\r
 AudioIODevice::AudioIODevice (const String& deviceName, const String& deviceTypeName)\r
     : name (deviceName), typeName (deviceTypeName)\r
 {\r
index 086054f7883f79481b15584d5485c5cab8569cde..1405f7e29d72bc6021058334db0e1433888507ef 100644 (file)
@@ -98,10 +98,7 @@ public:
                                                    float* const* outputChannelData,\r
                                                    int numOutputChannels,\r
                                                    int numSamples,\r
-                                                   const AudioIODeviceCallbackContext& context)\r
-    {\r
-        ignoreUnused (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples, context);\r
-    }\r
+                                                   const AudioIODeviceCallbackContext& context);\r
 \r
     /** Called to indicate that the device is about to start calling back.\r
 \r
@@ -129,7 +126,6 @@ public:
     virtual void audioDeviceError (const String& errorMessage);\r
 };\r
 \r
-\r
 //==============================================================================\r
 /**\r
     Base class for an audio device with synchronised input and output channels.\r
index f4b4de0684f7e987faace2fcae7f7901e1ee8e4c..5449282bbc35cececaf77ca0f2772ae3d75c5008 100644 (file)
 //==============================================================================\r
 #elif JUCE_ANDROID\r
 \r
- #include "native/juce_android_Audio.cpp"\r
+namespace juce\r
+{\r
+    using RealtimeThreadFactory = pthread_t (*) (void* (*) (void*), void*);\r
+    RealtimeThreadFactory getAndroidRealtimeThreadFactory();\r
+} // namespace juce\r
+\r
+#include "native/juce_android_Audio.cpp"\r
 \r
  #include <juce_audio_basics/midi/juce_MidiDataConcatenator.h>\r
  #include "native/juce_android_Midi.cpp"\r
 \r
    #include "native/juce_android_Oboe.cpp"\r
   #endif\r
+ #else\r
+// No audio library, so no way to create realtime threads.\r
+  namespace juce\r
+  {\r
+      RealtimeThreadFactory getAndroidRealtimeThreadFactory() { return nullptr; }\r
+  }\r
  #endif\r
 \r
 #endif\r
index 7452a511717a0a14499ee0d80d6eb450e2bc0196..aa269e89e17a6d89029ba0027aded0bc209d4eb8 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_devices\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE audio and MIDI I/O device classes\r
   description:        Classes to play and record from audio and MIDI I/O devices\r
   website:            http://www.juce.com/juce\r
index 47b7fae7c0289baba51f0fe5c12c6cd21d51184d..b2baf8c1a1ebd663c5eeeeac637136bf9d0a98d9 100644 (file)
 namespace juce\r
 {\r
 \r
+void MidiInputCallback::handlePartialSysexMessage ([[maybe_unused]] MidiInput* source,\r
+                                                   [[maybe_unused]] const uint8* messageData,\r
+                                                   [[maybe_unused]] int numBytesSoFar,\r
+                                                   [[maybe_unused]] double timestamp) {}\r
+\r
+//==============================================================================\r
 MidiOutput::MidiOutput (const String& deviceName, const String& deviceIdentifier)\r
     : Thread ("midi out"), deviceInfo (deviceName, deviceIdentifier)\r
 {\r
index 814cb7d85d033bba780c630adea9b5a4de2633be..5dab3f9258debdeabd674c4c135e9df3ad81c080 100644 (file)
@@ -225,10 +225,7 @@ public:
     virtual void handlePartialSysexMessage (MidiInput* source,\r
                                             const uint8* messageData,\r
                                             int numBytesSoFar,\r
-                                            double timestamp)\r
-    {\r
-        ignoreUnused (source, messageData, numBytesSoFar, timestamp);\r
-    }\r
+                                            double timestamp);\r
 };\r
 \r
 //==============================================================================\r
index 371ac4c8e21ade7afb816f9023f965e24aab8b15..08825325c8e24607b314a801b866acaccc4a553f 100644 (file)
@@ -327,7 +327,7 @@ static const uint8 javaMidiByteCode[] =
  STATICMETHOD (getAndroidMidiDeviceManager, "getAndroidMidiDeviceManager", "(Landroid/content/Context;)Lcom/rmsl/juce/JuceMidiSupport$MidiDeviceManager;") \\r
  STATICMETHOD (getAndroidBluetoothManager,  "getAndroidBluetoothManager",  "(Landroid/content/Context;)Lcom/rmsl/juce/JuceMidiSupport$BluetoothManager;")\r
 \r
-DECLARE_JNI_CLASS_WITH_BYTECODE (JuceMidiSupport, "com/rmsl/juce/JuceMidiSupport", 23, javaMidiByteCode, sizeof (javaMidiByteCode))\r
+DECLARE_JNI_CLASS_WITH_BYTECODE (JuceMidiSupport, "com/rmsl/juce/JuceMidiSupport", 23, javaMidiByteCode)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
index 5bedb1791a9a5f2fefcf301919f82c1c446715d0..42a9efc9154e432ea7ba0e5717677ede7ad908d3 100644 (file)
@@ -596,8 +596,7 @@ private:
         {\r
             if (stream != nullptr)\r
             {\r
-                oboe::Result result = stream->close();\r
-                ignoreUnused (result);\r
+                [[maybe_unused]] oboe::Result result = stream->close();\r
                 JUCE_OBOE_LOG ("Requested Oboe stream close with result: " + getOboeString (result));\r
             }\r
         }\r
@@ -693,14 +692,15 @@ private:
         }\r
 \r
         // Not strictly required as these should not change, but recommended by Google anyway\r
-        void checkStreamSetup (OboeStream* stream, int deviceId, int numChannels, int expectedSampleRate,\r
-                               int expectedBufferSize, oboe::AudioFormat format)\r
+        void checkStreamSetup (OboeStream* stream,\r
+                               [[maybe_unused]] int deviceId,\r
+                               [[maybe_unused]] int numChannels,\r
+                               [[maybe_unused]] int expectedSampleRate,\r
+                               [[maybe_unused]] int expectedBufferSize,\r
+                               oboe::AudioFormat format)\r
         {\r
-            if (auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr)\r
+            if ([[maybe_unused]] auto* nativeStream = stream != nullptr ? stream->getNativeStream() : nullptr)\r
             {\r
-                ignoreUnused (deviceId, numChannels, sampleRate, expectedBufferSize);\r
-                ignoreUnused (streamFormat, bitDepth);\r
-\r
                 jassert (numChannels == 0 || numChannels == nativeStream->getChannelCount());\r
                 jassert (expectedSampleRate == 0 || expectedSampleRate == nativeStream->getSampleRate());\r
                 jassert (format == nativeStream->getFormat());\r
@@ -860,10 +860,8 @@ private:
             return oboe::DataCallbackResult::Continue;\r
         }\r
 \r
-        void printStreamDebugInfo (oboe::AudioStream* stream)\r
+        void printStreamDebugInfo ([[maybe_unused]] oboe::AudioStream* stream)\r
         {\r
-            ignoreUnused (stream);\r
-\r
             JUCE_OBOE_LOG ("\nUses AAudio = " + (stream != nullptr ? String ((int) stream->usesAAudio()) : String ("?"))\r
                  + "\nDirection = " + (stream != nullptr ? getOboeString (stream->getDirection()) : String ("?"))\r
                  + "\nSharingMode = " + (stream != nullptr ? getOboeString (stream->getSharingMode()) : String ("?"))\r
@@ -928,10 +926,8 @@ private:
             return time.tv_sec * oboe::kNanosPerSecond + time.tv_nsec;\r
         }\r
 \r
-        void onErrorBeforeClose (oboe::AudioStream* stream, oboe::Result error) override\r
+        void onErrorBeforeClose (oboe::AudioStream* stream, [[maybe_unused]] oboe::Result error) override\r
         {\r
-            ignoreUnused (error);\r
-\r
             // only output stream should be the master stream receiving callbacks\r
             jassert (stream->getDirection() == oboe::Direction::Output);\r
 \r
@@ -1167,10 +1163,8 @@ public:
 \r
         JUCE_OBOE_LOG ("-----InputDevices:");\r
 \r
-        for (auto& device : inputDevices)\r
+        for ([[maybe_unused]] auto& device : inputDevices)\r
         {\r
-            ignoreUnused (device);\r
-\r
             JUCE_OBOE_LOG ("name = " << device.name);\r
             JUCE_OBOE_LOG ("id = " << String (device.id));\r
             JUCE_OBOE_LOG ("sample rates size = " << String (device.sampleRates.size()));\r
@@ -1179,10 +1173,8 @@ public:
 \r
         JUCE_OBOE_LOG ("-----OutputDevices:");\r
 \r
-        for (auto& device : outputDevices)\r
+        for ([[maybe_unused]] auto& device : outputDevices)\r
         {\r
-            ignoreUnused (device);\r
-\r
             JUCE_OBOE_LOG ("name = " << device.name);\r
             JUCE_OBOE_LOG ("id = " << String (device.id));\r
             JUCE_OBOE_LOG ("sample rates size = " << String (device.sampleRates.size()));\r
@@ -1259,7 +1251,12 @@ public:
             case 22:  return "USB headset";\r
             case 23:  return "hearing aid";\r
             case 24:  return "built-in speaker safe";\r
-            case 25:  return {};\r
+            case 25:  return "remote submix";\r
+            case 26:  return "BLE headset";\r
+            case 27:  return "BLE speaker";\r
+            case 28:  return "echo reference";\r
+            case 29:  return "HDMI eARC";\r
+            case 30:  return "BLE broadcast";\r
             default:  jassertfalse; return {}; // type not supported yet, needs to be added!\r
         }\r
     }\r
@@ -1392,17 +1389,15 @@ public:
         return oboe::DataCallbackResult::Continue;\r
     }\r
 \r
-    void onErrorBeforeClose (oboe::AudioStream*, oboe::Result error) override\r
+    void onErrorBeforeClose (oboe::AudioStream*, [[maybe_unused]] oboe::Result error) override\r
     {\r
         JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorBeforeClose(): " + getOboeString (error));\r
-        ignoreUnused (error);\r
         jassertfalse;  // Should never get here!\r
     }\r
 \r
-    void onErrorAfterClose (oboe::AudioStream*, oboe::Result error) override\r
+    void onErrorAfterClose (oboe::AudioStream*, [[maybe_unused]] oboe::Result error) override\r
     {\r
         JUCE_OBOE_LOG ("OboeRealtimeThread: Oboe stream onErrorAfterClose(): " + getOboeString (error));\r
-        ignoreUnused (error);\r
         jassertfalse;  // Should never get here!\r
     }\r
 \r
@@ -1420,20 +1415,22 @@ private:
 };\r
 \r
 //==============================================================================\r
-pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr);\r
-pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr)\r
+RealtimeThreadFactory getAndroidRealtimeThreadFactory()\r
 {\r
-    auto thread = std::make_unique<OboeRealtimeThread>();\r
+    return [] (void* (*entry) (void*), void* userPtr) -> pthread_t\r
+    {\r
+        auto thread = std::make_unique<OboeRealtimeThread>();\r
 \r
-    if (! thread->isOk())\r
-        return {};\r
+        if (! thread->isOk())\r
+            return {};\r
 \r
-    auto threadID = thread->startThread (entry, userPtr);\r
+        auto threadID = thread->startThread (entry, userPtr);\r
 \r
-    // the thread will de-allocate itself\r
-    thread.release();\r
+        // the thread will de-allocate itself\r
+        thread.release();\r
 \r
-    return threadID;\r
+        return threadID;\r
+    };\r
 }\r
 \r
 } // namespace juce\r
index 674f827e70bf313085b8872bb0f688578e7e124d..f0e6d939ac5dee65dbbe8f03e2e86889ae7c67b7 100644 (file)
@@ -601,7 +601,7 @@ public:
             }\r
         }\r
 \r
-        void process (const float** inputChannelData, float** outputChannelData)\r
+        void process (const float* const* inputChannelData, float* const* outputChannelData)\r
         {\r
             if (auto* cb = callback.exchange (nullptr))\r
             {\r
@@ -750,8 +750,8 @@ public:
                     T* recorderBuffer = (inputChannels  > 0 ? recorder->getNextBuffer() : nullptr);\r
                     T* playerBuffer   = (outputChannels > 0 ? player->getNextBuffer()   : nullptr);\r
 \r
-                    const float** inputChannelData = nullptr;\r
-                    float** outputChannelData = nullptr;\r
+                    const float* const* inputChannelData = nullptr;\r
+                    float* const* outputChannelData = nullptr;\r
 \r
                     if (recorderBuffer != nullptr)\r
                     {\r
@@ -1273,20 +1273,22 @@ private:
 };\r
 \r
 //==============================================================================\r
-pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr);\r
-pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr)\r
+RealtimeThreadFactory getAndroidRealtimeThreadFactory()\r
 {\r
-    auto thread = std::make_unique<SLRealtimeThread>();\r
+    return [] (void* (*entry) (void*), void* userPtr) -> pthread_t\r
+    {\r
+        auto thread = std::make_unique<SLRealtimeThread>();\r
 \r
-    if (! thread->isOk())\r
-        return {};\r
+        if (! thread->isOk())\r
+            return {};\r
 \r
-    auto threadID = thread->startThread (entry, userPtr);\r
+        auto threadID = thread->startThread (entry, userPtr);\r
 \r
-    // the thread will de-allocate itself\r
-    thread.release();\r
+        // the thread will de-allocate itself\r
+        thread.release();\r
 \r
-    return threadID;\r
+        return threadID;\r
+    };\r
 }\r
 \r
 } // namespace juce\r
index 6fa620f29552d52741ab2ca40552e350e543b46a..edf1db75dd38e16e909b62d0cfcee3643429820c 100644 (file)
@@ -579,16 +579,15 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
             impl.fillHostCallbackInfo (callbackInfo);\r
 \r
             Boolean hostIsPlaying = NO;\r
-            OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData,\r
-                                                             &hostIsPlaying,\r
-                                                             nullptr,\r
-                                                             nullptr,\r
-                                                             nullptr,\r
-                                                             nullptr,\r
-                                                             nullptr,\r
-                                                             nullptr);\r
+            [[maybe_unused]] OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData,\r
+                                                                              &hostIsPlaying,\r
+                                                                              nullptr,\r
+                                                                              nullptr,\r
+                                                                              nullptr,\r
+                                                                              nullptr,\r
+                                                                              nullptr,\r
+                                                                              nullptr);\r
 \r
-            ignoreUnused (err);\r
             jassert (err == noErr);\r
 \r
             if (hostIsPlaying != shouldSartPlaying)\r
@@ -604,15 +603,14 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
             impl.fillHostCallbackInfo (callbackInfo);\r
 \r
             Boolean hostIsRecording = NO;\r
-            OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData,\r
-                                                             nullptr,\r
-                                                             &hostIsRecording,\r
-                                                             nullptr,\r
-                                                             nullptr,\r
-                                                             nullptr,\r
-                                                             nullptr,\r
-                                                             nullptr);\r
-            ignoreUnused (err);\r
+            [[maybe_unused]] OSStatus err = callbackInfo.transportStateProc2 (callbackInfo.hostUserData,\r
+                                                                              nullptr,\r
+                                                                              &hostIsRecording,\r
+                                                                              nullptr,\r
+                                                                              nullptr,\r
+                                                                              nullptr,\r
+                                                                              nullptr,\r
+                                                                              nullptr);\r
             jassert (err == noErr);\r
 \r
             if (hostIsRecording != shouldStartRecording)\r
@@ -808,11 +806,9 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
 \r
     void handleAudioUnitPropertyChange (AudioUnit,\r
                                         AudioUnitPropertyID propertyID,\r
-                                        AudioUnitScope scope,\r
-                                        AudioUnitElement element)\r
+                                        [[maybe_unused]] AudioUnitScope scope,\r
+                                        [[maybe_unused]] AudioUnitElement element)\r
     {\r
-        ignoreUnused (scope);\r
-        ignoreUnused (element);\r
         JUCE_IOS_AUDIO_LOG ("handleAudioUnitPropertyChange: propertyID: " << String (propertyID)\r
                                                             << " scope: " << String (scope)\r
                                                           << " element: " << String (element));\r
@@ -834,9 +830,8 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
     {\r
         UInt32 connected;\r
         UInt32 dataSize = sizeof (connected);\r
-        OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_IsInterAppConnected,\r
-                                             kAudioUnitScope_Global, 0, &connected, &dataSize);\r
-        ignoreUnused (err);\r
+        [[maybe_unused]] OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_IsInterAppConnected,\r
+                                                              kAudioUnitScope_Global, 0, &connected, &dataSize);\r
         jassert (err == noErr);\r
 \r
         JUCE_IOS_AUDIO_LOG ("handleInterAppAudioConnectionChange: " << (connected ? "connected"\r
@@ -1078,21 +1073,19 @@ struct iOSAudioIODevice::Pimpl      : public AsyncUpdater
     {\r
         zerostruct (callbackInfo);\r
         UInt32 dataSize = sizeof (HostCallbackInfo);\r
-        OSStatus err = AudioUnitGetProperty (audioUnit,\r
-                                             kAudioUnitProperty_HostCallbacks,\r
-                                             kAudioUnitScope_Global,\r
-                                             0,\r
-                                             &callbackInfo,\r
-                                             &dataSize);\r
-        ignoreUnused (err);\r
+        [[maybe_unused]] OSStatus err = AudioUnitGetProperty (audioUnit,\r
+                                                              kAudioUnitProperty_HostCallbacks,\r
+                                                              kAudioUnitScope_Global,\r
+                                                              0,\r
+                                                              &callbackInfo,\r
+                                                              &dataSize);\r
         jassert (err == noErr);\r
     }\r
 \r
     void handleAudioTransportEvent (AudioUnitRemoteControlEvent event)\r
     {\r
-        OSStatus err = AudioUnitSetProperty (audioUnit, kAudioOutputUnitProperty_RemoteControlToHost,\r
-                                             kAudioUnitScope_Global, 0, &event, sizeof (event));\r
-        ignoreUnused (err);\r
+        [[maybe_unused]] OSStatus err = AudioUnitSetProperty (audioUnit, kAudioOutputUnitProperty_RemoteControlToHost,\r
+                                                              kAudioUnitScope_Global, 0, &event, sizeof (event));\r
         jassert (err == noErr);\r
     }\r
 \r
index c1be61a3985de73f24d2dab2e319eb03a6ac9a14..4cce7016f9b460dd5a2487a28a2f803fc48f5816 100644 (file)
@@ -544,21 +544,19 @@ private:
         }\r
     }\r
 \r
-    static void infoShutdownCallback (jack_status_t code, const char* reason, void* arg)\r
+    static void infoShutdownCallback (jack_status_t code, [[maybe_unused]] const char* reason, void* arg)\r
     {\r
         jassertquiet (code == 0);\r
 \r
         JUCE_JACK_LOG ("Shutting down with message:");\r
         JUCE_JACK_LOG (reason);\r
-        ignoreUnused (reason);\r
 \r
         shutdownCallback (arg);\r
     }\r
 \r
-    static void errorCallback (const char* msg)\r
+    static void errorCallback ([[maybe_unused]] const char* msg)\r
     {\r
         JUCE_JACK_LOG ("JackAudioIODevice::errorCallback " + String (msg));\r
-        ignoreUnused (msg);\r
     }\r
 \r
     bool deviceIsOpen = false;\r
index 370874d3778150bcf7f5db6abde02a2ce35dde3c..90d54e382b9c439f1ba516b4a13fd505686b96a3 100644 (file)
@@ -1605,8 +1605,7 @@ public:
             }\r
         }\r
 \r
-        open (inputChannelsRequested, outputChannelsRequested,\r
-              newSampleRate, newBufferSize);\r
+        open (inputChannelsRequested, outputChannelsRequested, newSampleRate, newBufferSize);\r
 \r
         start (cb);\r
     }\r
@@ -1696,6 +1695,7 @@ private:
     CriticalSection closeLock;\r
     int targetLatency = 0;\r
     std::atomic<int> xruns { -1 };\r
+    std::atomic<uint64_t> lastValidReadPosition { invalidSampleTime };\r
 \r
     BigInteger inputChannelsRequested, outputChannelsRequested;\r
     double sampleRateRequested = 44100;\r
@@ -1793,8 +1793,9 @@ private:
         }\r
 \r
         auto currentWritePos = writePos.load();\r
+        const auto nextWritePos = currentWritePos + static_cast<std::uint64_t> (n);\r
 \r
-        writePos.compare_exchange_strong (currentWritePos, currentWritePos + static_cast<std::uint64_t> (n));\r
+        writePos.compare_exchange_strong (currentWritePos, nextWritePos);\r
 \r
         if (currentWritePos == invalidSampleTime)\r
             return;\r
@@ -1818,6 +1819,11 @@ private:
                                          scratchBuffer.getReadPointer (args.channel, args.inputPos),\r
                                          args.nItems);\r
         });\r
+\r
+        {\r
+            auto invalid = invalidSampleTime;\r
+            lastValidReadPosition.compare_exchange_strong (invalid, nextWritePos);\r
+        }\r
     }\r
 \r
     void outputAudioCallback (float* const* channels, int numChannels, int n) noexcept\r
@@ -1840,16 +1846,29 @@ private:
             }\r
         }\r
 \r
-        accessFifo (currentReadPos, numChannels, n, [&] (const auto& args)\r
+        // If there was an xrun, we want to output zeros until we're sure that there's some valid\r
+        // input for us to read.\r
+        const auto longN = static_cast<uint64_t> (n);\r
+        const auto nextReadPos = currentReadPos + longN;\r
+        const auto validReadPos = lastValidReadPosition.load();\r
+        const auto sanitisedValidReadPos = validReadPos != invalidSampleTime ? validReadPos : nextReadPos;\r
+        const auto numZerosToWrite = sanitisedValidReadPos <= currentReadPos\r
+                                   ? 0\r
+                                   : jmin (longN, sanitisedValidReadPos - currentReadPos);\r
+\r
+        for (auto i = 0; i < numChannels; ++i)\r
+            std::fill (channels[i], channels[i] + numZerosToWrite, 0.0f);\r
+\r
+        accessFifo (currentReadPos + numZerosToWrite, numChannels, static_cast<int> (longN - numZerosToWrite), [&] (const auto& args)\r
         {\r
-            FloatVectorOperations::copy (channels[args.channel] + args.inputPos,\r
+            FloatVectorOperations::copy (channels[args.channel] + args.inputPos + numZerosToWrite,\r
                                          fifo.getReadPointer (args.channel, args.fifoPos),\r
                                          args.nItems);\r
         });\r
 \r
         // use compare exchange here as we need to avoid the case\r
         // where we overwrite readPos being equal to invalidSampleTime\r
-        readPos.compare_exchange_strong (currentReadPos, currentReadPos + static_cast<std::uint64_t> (n));\r
+        readPos.compare_exchange_strong (currentReadPos, nextReadPos);\r
     }\r
 \r
     void xrun() noexcept\r
@@ -1914,7 +1933,8 @@ private:
     struct DeviceWrapper  : public AudioIODeviceCallback\r
     {\r
         DeviceWrapper (AudioIODeviceCombiner& cd, std::unique_ptr<CoreAudioIODevice> d, bool shouldBeInput)\r
-            : owner (cd), device (std::move (d)),\r
+            : owner (cd),\r
+              device (std::move (d)),\r
               input (shouldBeInput)\r
         {\r
             device->setAsyncRestarter (&owner);\r
@@ -1974,7 +1994,7 @@ private:
 \r
         std::uint64_t nsToSampleTime (std::uint64_t ns) const noexcept\r
         {\r
-            return static_cast<std::uint64_t> (std::round (static_cast<double> (ns) * owner.currentSampleRate * 1e-9));\r
+            return static_cast<std::uint64_t> (std::round (static_cast<double> (ns) * device->getCurrentSampleRate() * 1e-9));\r
         }\r
 \r
         void updateSampleTimeFromContext (const AudioIODeviceCallbackContext& context) noexcept\r
@@ -1987,7 +2007,7 @@ private:
             auto copy = invalidSampleTime;\r
 \r
             if (sampleTime.compare_exchange_strong (copy, callbackSampleTime) && (! input))\r
-                owner.fifo.clear();\r
+                owner.lastValidReadPosition = invalidSampleTime;\r
         }\r
 \r
         bool isInput() const { return input; }\r
index 7e1511de3f6dd2697d82a9925a298cfca0b5f9eb..fd61986e7a97d7ce4f2216c8dfb5d1856ebb4e3a 100644 (file)
@@ -29,7 +29,7 @@ namespace juce
 \r
 namespace CoreMidiHelpers\r
 {\r
-    static bool checkError (OSStatus err, int lineNum)\r
+    static bool checkError (OSStatus err, [[maybe_unused]] int lineNum)\r
     {\r
         if (err == noErr)\r
             return true;\r
@@ -38,7 +38,6 @@ namespace CoreMidiHelpers
         Logger::writeToLog ("CoreMIDI error: " + String (lineNum) + " - " + String::toHexString ((int) err));\r
        #endif\r
 \r
-        ignoreUnused (lineNum);\r
         return false;\r
     }\r
 \r
index 239804012cecd7765d8568d7e8be7fa08bd2c652..017bee61e893f8115a9e459ac24e857d3240fb8f 100644 (file)
@@ -251,8 +251,8 @@ public:
         if (pOutputBuffer != nullptr)\r
         {\r
             JUCE_DS_LOG ("closing output: " + name);\r
-            HRESULT hr = pOutputBuffer->Stop();\r
-            JUCE_DS_LOG_ERROR (hr); ignoreUnused (hr);\r
+            [[maybe_unused]] HRESULT hr = pOutputBuffer->Stop();\r
+            JUCE_DS_LOG_ERROR (hr);\r
 \r
             pOutputBuffer->Release();\r
             pOutputBuffer = nullptr;\r
@@ -555,8 +555,8 @@ public:
         if (pInputBuffer != nullptr)\r
         {\r
             JUCE_DS_LOG ("closing input: " + name);\r
-            HRESULT hr = pInputBuffer->Stop();\r
-            JUCE_DS_LOG_ERROR (hr); ignoreUnused (hr);\r
+            [[maybe_unused]] HRESULT hr = pInputBuffer->Stop();\r
+            JUCE_DS_LOG_ERROR (hr);\r
 \r
             pInputBuffer->Release();\r
             pInputBuffer = nullptr;\r
index d20b6e02c97f9a94490738b2a1aae095cec7f85d..b516cdbba9b060cf3a8e532d2d0b5f07da48cb6f 100644 (file)
@@ -33,9 +33,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")
 namespace WasapiClasses\r
 {\r
 \r
-static void logFailure (HRESULT hr)\r
+static void logFailure ([[maybe_unused]] HRESULT hr)\r
 {\r
-    ignoreUnused (hr);\r
     jassert (hr != (HRESULT) 0x800401f0); // If you hit this, it means you're trying to call from\r
                                           // a thread which hasn't been initialised with CoInitialize().\r
 \r
index 586f28497b06e83a899916da8369ce8306e6ee88..99eb16c13ec97fdf2ba9bb46ea327f96ebcd56f3 100644 (file)
@@ -61,10 +61,8 @@ void AudioSourcePlayer::audioDeviceIOCallbackWithContext (const float* const* in
                                                           float* const* outputChannelData,\r
                                                           int totalNumOutputChannels,\r
                                                           int numSamples,\r
-                                                          const AudioIODeviceCallbackContext& context)\r
+                                                          [[maybe_unused]] const AudioIODeviceCallbackContext& context)\r
 {\r
-    ignoreUnused (context);\r
-\r
     // these should have been prepared by audioDeviceAboutToStart()...\r
     jassert (sampleRate > 0 && bufferSize > 0);\r
 \r
index 2d1ed97028f836b26dd47a084d114b80861ce5bc..6974d048a9dc85f450d94c0856d5777347f6ea52 100644 (file)
@@ -721,8 +721,7 @@ private:
     {\r
         using namespace AiffFileHelpers;\r
 \r
-        const bool couldSeekOk = output->setPosition (headerPosition);\r
-        ignoreUnused (couldSeekOk);\r
+        [[maybe_unused]] const bool couldSeekOk = output->setPosition (headerPosition);\r
 \r
         // if this fails, you've given it an output stream that can't seek! It needs\r
         // to be able to seek back to write the header\r
index 66783df8fb091705a20f2b9086a36ae17490c5a6..e743ae66827adbadd238b745384086bacaceab4d 100644 (file)
@@ -496,8 +496,7 @@ public:
         packUint32 ((FLAC__uint32) info.total_samples, buffer + 14, 4);\r
         memcpy (buffer + 18, info.md5sum, 16);\r
 \r
-        const bool seekOk = output->setPosition (streamStartPos + 4);\r
-        ignoreUnused (seekOk);\r
+        [[maybe_unused]] const bool seekOk = output->setPosition (streamStartPos + 4);\r
 \r
         // if this fails, you've given it an output stream that can't seek! It needs\r
         // to be able to seek back to write the header\r
index 1120b0ffc8bae59539719857845e1d861c367366..00f31082dbc4e35361e52420a914d9bcbb10464a 100644 (file)
@@ -112,8 +112,8 @@ private:
 \r
         if (cp.start (processArgs))\r
         {\r
-            auto childOutput = cp.readAllProcessOutput();\r
-            DBG (childOutput); ignoreUnused (childOutput);\r
+            [[maybe_unused]] auto childOutput = cp.readAllProcessOutput();\r
+            DBG (childOutput);\r
 \r
             cp.waitForProcessToFinish (10000);\r
             return tempMP3.getFile().getSize() > 0;\r
index 8ce23321c699423780a5cf30f46ad6a0968ceb7f..cb7af04cc3b45c14a95f09b82b5e85d7684b9195 100644 (file)
@@ -262,7 +262,7 @@ private:
 \r
     void checkCoInitialiseCalled()\r
     {\r
-        ignoreUnused (CoInitialize (nullptr));\r
+        [[maybe_unused]] const auto result = CoInitialize (nullptr);\r
     }\r
 \r
     void scanFileForDetails()\r
index d3b0f2056d74842b1410af81d1419a89ac5eed44..a8c974d2873f8d392229a9de13d461a1c36fb4ea 100644 (file)
@@ -121,11 +121,11 @@ bool ARAAudioSourceReader::readSamples (int* const* destSamples, int numDestChan
     const auto destSize = (bitsPerSample / 8) * (size_t) numSamples;\r
     const auto bufferOffset = (int) (bitsPerSample / 8) * startOffsetInDestBuffer;\r
 \r
-    if (isValid() && hostReader != nullptr)\r
+    if (isValid())\r
     {\r
         const ScopedTryReadLock readLock (lock);\r
 \r
-        if (readLock.isLocked())\r
+        if (readLock.isLocked() && hostReader != nullptr)\r
         {\r
             for (size_t i = 0; i < tmpPtrs.size(); ++i)\r
             {\r
index ee4bcab3b207dcb66b0297b54121f12c7dfd6a52..b0aee51da62b0d7dbe6ea959e950ec94d9ad1851 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_formats\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE audio file format codecs\r
   description:        Classes for reading and writing various audio file formats.\r
   website:            http://www.juce.com/juce\r
index 9e2bc3f0f35ac3908238113a0350aca43043b046..f0c7228853dfe64e5f71fbf8f52b79836c7e5cfa 100644 (file)
@@ -71,11 +71,19 @@ static_assert (AAX_SDK_CURRENT_REVISION >= AAX_SDK_2p3p0_REVISION, "JUCE require
 #include <AAX_IFeatureInfo.h>\r
 #include <AAX_UIDs.h>\r
 \r
-#ifdef AAX_SDK_2p3p1_REVISION\r
- #if AAX_SDK_CURRENT_REVISION >= AAX_SDK_2p3p1_REVISION\r
-  #include <AAX_Exception.h>\r
-  #include <AAX_Assert.h>\r
- #endif\r
+#if defined (AAX_SDK_2p3p1_REVISION) && AAX_SDK_2p3p1_REVISION <= AAX_SDK_CURRENT_REVISION\r
+ #include <AAX_Exception.h>\r
+ #include <AAX_Assert.h>\r
+#endif\r
+\r
+#if defined (AAX_SDK_2p4p0_REVISION) && AAX_SDK_2p4p0_REVISION <= AAX_SDK_CURRENT_REVISION\r
+ #define JUCE_AAX_HAS_TRANSPORT_NOTIFICATION 1\r
+#else\r
+ #define JUCE_AAX_HAS_TRANSPORT_NOTIFICATION 0\r
+#endif\r
+\r
+#if JUCE_AAX_HAS_TRANSPORT_NOTIFICATION\r
+ #include <AAX_TransportTypes.h>\r
 #endif\r
 \r
 JUCE_END_IGNORE_WARNINGS_MSVC\r
@@ -739,8 +747,6 @@ namespace AAXClasses
 \r
         static AAX_CEffectParameters* AAX_CALLBACK Create()\r
         {\r
-            PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_AAX;\r
-\r
             if (PluginHostType::jucePlugInIsRunningInAudioSuiteFn == nullptr)\r
             {\r
                 PluginHostType::jucePlugInIsRunningInAudioSuiteFn = [] (AudioProcessor& processor)\r
@@ -880,7 +886,7 @@ namespace AAXClasses
 \r
                 case JUCEAlgorithmIDs::preparedFlag:\r
                 {\r
-                    const_cast<JuceAAX_Processor*>(this)->preparePlugin();\r
+                    const_cast<JuceAAX_Processor*> (this)->preparePlugin();\r
 \r
                     auto numObjects = dataSize / sizeof (uint32_t);\r
                     auto* objects = static_cast<uint32_t*> (data);\r
@@ -1049,14 +1055,16 @@ namespace AAXClasses
                 return transport.GetCurrentTempo (&bpm) == AAX_SUCCESS ? makeOptional (bpm) : nullopt;\r
             }());\r
 \r
-            info.setTimeSignature ([&]\r
+            const auto signature = [&]\r
             {\r
                 int32_t num = 4, den = 4;\r
 \r
                 return transport.GetCurrentMeter (&num, &den) == AAX_SUCCESS\r
-                       ? makeOptional (TimeSignature { (int) num, (int) den })\r
-                       : nullopt;\r
-            }());\r
+                     ? makeOptional (TimeSignature { (int) num, (int) den })\r
+                     : nullopt;\r
+            }();\r
+\r
+            info.setTimeSignature (signature);\r
 \r
             info.setIsPlaying ([&]\r
             {\r
@@ -1065,27 +1073,31 @@ namespace AAXClasses
                 return transport.IsTransportPlaying (&isPlaying) == AAX_SUCCESS && isPlaying;\r
             }());\r
 \r
-            info.setTimeInSamples ([&]\r
+            info.setIsRecording (recordingState.get().orFallback (false));\r
+\r
+            const auto optionalTimeInSamples = [&info, &transport]\r
             {\r
                 int64_t timeInSamples = 0;\r
-\r
                 return ((! info.getIsPlaying() && transport.GetTimelineSelectionStartPosition (&timeInSamples) == AAX_SUCCESS)\r
-                        || transport.GetCurrentNativeSampleLocation (&timeInSamples) == AAX_SUCCESS)\r
-                            ? makeOptional (timeInSamples)\r
-                            : nullopt;\r
-            }());\r
+                                                    || transport.GetCurrentNativeSampleLocation (&timeInSamples) == AAX_SUCCESS)\r
+                                                 ? makeOptional (timeInSamples)\r
+                                                 : nullopt;\r
+            }();\r
 \r
-            info.setTimeInSeconds ((float) info.getTimeInSamples().orFallback (0) / sampleRate);\r
+            info.setTimeInSamples (optionalTimeInSamples);\r
+            info.setTimeInSeconds ((float) optionalTimeInSamples.orFallback (0) / sampleRate);\r
 \r
-            info.setPpqPosition ([&]\r
+            const auto tickPosition = [&]\r
             {\r
                 int64_t ticks = 0;\r
 \r
-                return ((info.getIsPlaying() && transport.GetCustomTickPosition (&ticks, info.getTimeInSamples().orFallback (0))) == AAX_SUCCESS)\r
-                        || transport.GetCurrentTickPosition (&ticks) == AAX_SUCCESS\r
-                            ? makeOptional (ticks / 960000.0)\r
-                            : nullopt;\r
-            }());\r
+                return ((info.getIsPlaying() && transport.GetCustomTickPosition (&ticks, optionalTimeInSamples.orFallback (0))) == AAX_SUCCESS)\r
+                       || transport.GetCurrentTickPosition (&ticks) == AAX_SUCCESS\r
+                     ? makeOptional (ticks)\r
+                     : nullopt;\r
+            }();\r
+\r
+            info.setPpqPosition (tickPosition.hasValue() ? makeOptional (static_cast<double> (*tickPosition) / 960'000.0) : nullopt);\r
 \r
             bool isLooping = false;\r
             int64_t loopStartTick = 0, loopEndTick = 0;\r
@@ -1142,6 +1154,28 @@ namespace AAXClasses
             const auto effectiveRate = info.getFrameRate().hasValue() ? info.getFrameRate()->getEffectiveRate() : 0.0;\r
             info.setEditOriginTime (makeOptional (effectiveRate != 0.0 ? offset / effectiveRate : offset));\r
 \r
+            {\r
+                int32_t bars{}, beats{};\r
+                int64_t displayTicks{};\r
+\r
+                if (optionalTimeInSamples.hasValue()\r
+                    && transport.GetBarBeatPosition (&bars, &beats, &displayTicks, *optionalTimeInSamples) == AAX_SUCCESS)\r
+                {\r
+                    info.setBarCount (bars);\r
+\r
+                    if (signature.hasValue())\r
+                    {\r
+                        const auto ticksSinceBar = static_cast<int64_t> (((beats - 1) * 4 * 960'000) / signature->denominator) + displayTicks;\r
+\r
+                        if (tickPosition.hasValue() && ticksSinceBar <= tickPosition)\r
+                        {\r
+                            const auto barStartInTicks = static_cast<double> (*tickPosition - ticksSinceBar);\r
+                            info.setPpqPositionOfLastBarStart (barStartInTicks / 960'000.0);\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+\r
             return info;\r
         }\r
 \r
@@ -1225,6 +1259,16 @@ namespace AAXClasses
                     updateSidechainState();\r
                     break;\r
                 }\r
+\r
+               #if JUCE_AAX_HAS_TRANSPORT_NOTIFICATION\r
+                case AAX_eNotificationEvent_TransportStateChanged:\r
+                    if (data != nullptr)\r
+                    {\r
+                        const auto& info = *static_cast<const AAX_TransportStateInfo_V1*> (data);\r
+                        recordingState.set (info.mIsRecording);\r
+                    }\r
+                    break;\r
+               #endif\r
             }\r
 \r
             return AAX_CEffectParameters::NotificationReceived (type, data, size);\r
@@ -1237,7 +1281,7 @@ namespace AAXClasses
             if (idx < mainNumIns)\r
                 return inputs[inputLayoutMap[idx]];\r
 \r
-            return (sidechain != -1 ? inputs[sidechain] : sideChainBuffer.getData());\r
+            return (sidechain != -1 ? inputs[sidechain] : sideChainBuffer.data());\r
         }\r
 \r
         void process (const float* const* inputs, float* const* outputs, const int sideChainBufferIdx,\r
@@ -1499,11 +1543,10 @@ namespace AAXClasses
         friend void AAX_CALLBACK AAXClasses::algorithmProcessCallback (JUCEAlgorithmContext* const instancesBegin[], const void* const instancesEnd);\r
 \r
         void process (float* const* channels, const int numChans, const int bufferSize,\r
-                      const bool bypass, AAX_IMIDINode* midiNodeIn, AAX_IMIDINode* midiNodesOut)\r
+                      const bool bypass, [[maybe_unused]] AAX_IMIDINode* midiNodeIn, [[maybe_unused]] AAX_IMIDINode* midiNodesOut)\r
         {\r
             AudioBuffer<float> buffer (channels, numChans, bufferSize);\r
             midiBuffer.clear();\r
-            ignoreUnused (midiNodeIn, midiNodesOut);\r
 \r
            #if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect\r
             {\r
@@ -1525,19 +1568,15 @@ namespace AAXClasses
                 if (lastBufferSize != bufferSize)\r
                 {\r
                     lastBufferSize = bufferSize;\r
-                    pluginInstance->setRateAndBufferSizeDetails (sampleRate, bufferSize);\r
+                    pluginInstance->setRateAndBufferSizeDetails (sampleRate, lastBufferSize);\r
 \r
+                    // we only call prepareToPlay here if the new buffer size is larger than\r
+                    // the one used last time prepareToPlay was called.\r
+                    // currently, this should never actually happen, because as of Pro Tools 12,\r
+                    // the maximum possible value is 1024, and we call prepareToPlay with that\r
+                    // value during initialisation.\r
                     if (bufferSize > maxBufferSize)\r
-                    {\r
-                        // we only call prepareToPlay here if the new buffer size is larger than\r
-                        // the one used last time prepareToPlay was called.\r
-                        // currently, this should never actually happen, because as of Pro Tools 12,\r
-                        // the maximum possible value is 1024, and we call prepareToPlay with that\r
-                        // value during initialisation.\r
-                        pluginInstance->prepareToPlay (sampleRate, bufferSize);\r
-                        maxBufferSize = bufferSize;\r
-                        sideChainBuffer.calloc (static_cast<size_t> (maxBufferSize));\r
-                    }\r
+                        prepareProcessorWithSampleRateAndBufferSize (sampleRate, bufferSize);\r
                 }\r
 \r
                 if (bypass && pluginInstance->getBypassParameter() == nullptr)\r
@@ -1802,14 +1841,10 @@ namespace AAXClasses
                     audioProcessor.releaseResources();\r
                 }\r
 \r
-                audioProcessor.setRateAndBufferSizeDetails (sampleRate, lastBufferSize);\r
-                audioProcessor.prepareToPlay (sampleRate, lastBufferSize);\r
-                maxBufferSize = lastBufferSize;\r
+                prepareProcessorWithSampleRateAndBufferSize (sampleRate, lastBufferSize);\r
 \r
                 midiBuffer.ensureSize (2048);\r
                 midiBuffer.clear();\r
-\r
-                sideChainBuffer.calloc (static_cast<size_t> (maxBufferSize));\r
             }\r
 \r
             check (Controller()->SetSignalLatency (audioProcessor.getLatencySamples()));\r
@@ -1871,6 +1906,16 @@ namespace AAXClasses
             }\r
         }\r
 \r
+        void prepareProcessorWithSampleRateAndBufferSize (double sr, int bs)\r
+        {\r
+            maxBufferSize = jmax (maxBufferSize, bs);\r
+\r
+            auto& audioProcessor = getPluginInstance();\r
+            audioProcessor.setRateAndBufferSizeDetails (sr, maxBufferSize);\r
+            audioProcessor.prepareToPlay (sr, maxBufferSize);\r
+            sideChainBuffer.resize (static_cast<size_t> (maxBufferSize));\r
+        }\r
+\r
         //==============================================================================\r
         void updateSidechainState()\r
         {\r
@@ -1878,7 +1923,7 @@ namespace AAXClasses
                 return;\r
 \r
             auto& audioProcessor = getPluginInstance();\r
-            bool sidechainActual = audioProcessor.getChannelCountOfBus (true, 1) > 0;\r
+            const auto sidechainActual = audioProcessor.getChannelCountOfBus (true, 1) > 0;\r
 \r
             if (hasSidechain && canDisableSidechain && sidechainDesired != sidechainActual)\r
             {\r
@@ -1894,7 +1939,7 @@ namespace AAXClasses
                     bus->setCurrentLayout (lastSideChainState ? AudioChannelSet::mono()\r
                                                               : AudioChannelSet::disabled());\r
 \r
-                audioProcessor.prepareToPlay (audioProcessor.getSampleRate(), audioProcessor.getBlockSize());\r
+                prepareProcessorWithSampleRateAndBufferSize (audioProcessor.getSampleRate(), maxBufferSize);\r
                 isPrepared = true;\r
             }\r
 \r
@@ -2095,17 +2140,58 @@ namespace AAXClasses
 \r
         std::unique_ptr<AudioProcessor> pluginInstance;\r
 \r
+        static constexpr auto maxSamplesPerBlock = 1 << AAX_eAudioBufferLength_Max;\r
+\r
         bool isPrepared = false;\r
         MidiBuffer midiBuffer;\r
         Array<float*> channelList;\r
         int32_t juceChunkIndex = 0, numSetDirtyCalls = 0;\r
         AAX_CSampleRate sampleRate = 0;\r
-        int lastBufferSize = 1024, maxBufferSize = 1024;\r
+        int lastBufferSize = maxSamplesPerBlock, maxBufferSize = maxSamplesPerBlock;\r
         bool hasSidechain = false, canDisableSidechain = false, lastSideChainState = false;\r
 \r
+        /*  Pro Tools 2021 sends TransportStateChanged on the main thread, but we read\r
+            the recording state on the audio thread.\r
+            I'm not sure whether Pro Tools ensures that these calls are mutually\r
+            exclusive, so to ensure there are no data races, we store the recording\r
+            state in an atomic int and convert it to/from an Optional<bool> as necessary.\r
+        */\r
+        class RecordingState\r
+        {\r
+        public:\r
+            /*  This uses Optional rather than std::optional for consistency with get() */\r
+            void set (const Optional<bool> newState)\r
+            {\r
+                state.store (newState.hasValue() ? (flagValid | (*newState ? flagActive : 0))\r
+                                                 : 0,\r
+                             std::memory_order_relaxed);\r
+            }\r
+\r
+            /*  PositionInfo::setIsRecording takes an Optional<bool>, so we use that type rather\r
+                than std::optional to avoid having to convert.\r
+            */\r
+            Optional<bool> get() const\r
+            {\r
+                const auto loaded = state.load (std::memory_order_relaxed);\r
+                return ((loaded & flagValid) != 0) ? makeOptional ((loaded & flagActive) != 0)\r
+                                                   : nullopt;\r
+            }\r
+\r
+        private:\r
+            enum RecordingFlags\r
+            {\r
+                flagValid  = 1 << 0,\r
+                flagActive = 1 << 1\r
+            };\r
+\r
+            std::atomic<int> state { 0 };\r
+        };\r
+\r
+        RecordingState recordingState;\r
+\r
         std::atomic<bool> processingSidechainChange, sidechainDesired;\r
 \r
-        HeapBlock<float> sideChainBuffer;\r
+        std::vector<float> sideChainBuffer;\r
         Array<int> inputLayoutMap, outputLayoutMap;\r
 \r
         Array<String> aaxParamIDs;\r
@@ -2329,6 +2415,10 @@ namespace AAXClasses
         properties->AddProperty (AAX_eProperty_SupportsSaveRestore, false);\r
        #endif\r
 \r
+       #if JUCE_AAX_HAS_TRANSPORT_NOTIFICATION\r
+        properties->AddProperty (AAX_eProperty_ObservesTransportState, true);\r
+       #endif\r
+\r
         if (fullLayout.getChannelSet (true, 1) == AudioChannelSet::mono())\r
         {\r
             check (desc.AddSideChainIn (JUCEAlgorithmIDs::sideChainBuffers));\r
@@ -2391,10 +2481,9 @@ namespace AAXClasses
         return (AAX_STEM_FORMAT_INDEX (stemFormat) <= 12);\r
     }\r
 \r
-    static void getPlugInDescription (AAX_IEffectDescriptor& descriptor, const AAX_IFeatureInfo* featureInfo)\r
+    static void getPlugInDescription (AAX_IEffectDescriptor& descriptor, [[maybe_unused]] const AAX_IFeatureInfo* featureInfo)\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_AAX;\r
-        std::unique_ptr<AudioProcessor> plugin (createPluginFilterOfType (AudioProcessor::wrapperType_AAX));\r
+        auto plugin = createPluginFilterOfType (AudioProcessor::wrapperType_AAX);\r
         auto numInputBuses  = plugin->getBusCount (true);\r
         auto numOutputBuses = plugin->getBusCount (false);\r
 \r
@@ -2424,7 +2513,6 @@ namespace AAXClasses
        #if JucePlugin_IsMidiEffect\r
         // MIDI effect plug-ins do not support any audio channels\r
         jassert (numInputBuses == 0 && numOutputBuses == 0);\r
-        ignoreUnused (featureInfo);\r
 \r
         if (auto* desc = descriptor.NewComponentDescriptor())\r
         {\r
index 1e4a4bc15d928d4e4f6d0a09973d88f1a2ef8613..c4ca28b39c22822df114d3a91cfa38e056bc4703 100644 (file)
 \r
 #include <cstdint>\r
 #include <cstdio>\r
+#include <cstring>\r
+#include <vector>\r
 \r
 #ifdef _WIN32\r
+ #undef UNICODE\r
+ #undef _UNICODE\r
+\r
+ #define UNICODE 1\r
+ #define _UNICODE 1\r
+\r
  #include <windows.h>\r
  #include <tchar.h>\r
- HMODULE dlopen (const char* filename, int) { return LoadLibrary (filename); }\r
+ HMODULE dlopen (const TCHAR* filename, int) { return LoadLibrary (filename); }\r
  FARPROC dlsym (HMODULE handle, const char* name) { return GetProcAddress (handle, name); }\r
  void printError()\r
  {\r
                     numElements - 1,\r
                     nullptr);\r
 \r
-     _tprintf ("%s", messageBuffer);\r
+     _tprintf (_T ("%s"), messageBuffer);\r
  }\r
+\r
  enum { RTLD_LAZY = 0 };\r
+\r
+ class ArgList\r
+ {\r
+ public:\r
+     ArgList (int, const char**) {}\r
+     ArgList (const ArgList&) = delete;\r
+     ArgList (ArgList&&) = delete;\r
+     ArgList& operator= (const ArgList&) = delete;\r
+     ArgList& operator= (ArgList&&) = delete;\r
+     ~ArgList() { LocalFree (argv); }\r
+\r
+     LPWSTR get (int i) const { return argv[i]; }\r
+\r
+     int size() const { return argc; }\r
+\r
+ private:\r
+     int argc = 0;\r
+     LPWSTR* argv = CommandLineToArgvW (GetCommandLineW(), &argc);\r
+ };\r
+\r
+ std::vector<char> toUTF8 (const TCHAR* str)\r
+ {\r
+     const auto numBytes = WideCharToMultiByte (CP_UTF8, 0, str, -1, nullptr, 0, nullptr, nullptr);\r
+     std::vector<char> result (numBytes);\r
+     WideCharToMultiByte (CP_UTF8, 0, str, -1, result.data(), static_cast<int> (result.size()), nullptr, nullptr);\r
+     return result;\r
+ }\r
+\r
 #else\r
  #include <dlfcn.h>\r
  void printError() { printf ("%s\n", dlerror()); }\r
+ class ArgList\r
+ {\r
+ public:\r
+     ArgList (int argcIn, const char** argvIn) : argc (argcIn), argv (argvIn) {}\r
+     ArgList (const ArgList&) = delete;\r
+     ArgList (ArgList&&) = delete;\r
+     ArgList& operator= (const ArgList&) = delete;\r
+     ArgList& operator= (ArgList&&) = delete;\r
+     ~ArgList() = default;\r
+\r
+     const char* get (int i) const { return argv[i]; }\r
+\r
+     int size() const { return argc; }\r
+\r
+ private:\r
+     int argc = 0;\r
+     const char** argv = nullptr;\r
+ };\r
+\r
+ std::vector<char> toUTF8 (const char* str) { return std::vector<char> (str, str + std::strlen (str) + 1); }\r
 #endif\r
 \r
 // Replicating part of the LV2 header here so that we don't have to set up any\r
@@ -74,10 +131,12 @@ extern "C"
 \r
 int main (int argc, const char** argv)\r
 {\r
-    if (argc != 2)\r
+    const ArgList argList { argc, argv };\r
+\r
+    if (argList.size() != 2)\r
         return 1;\r
 \r
-    const auto* libraryPath = argv[1];\r
+    const auto* libraryPath = argList.get (1);\r
 \r
     struct RecallFeature\r
     {\r
@@ -87,11 +146,22 @@ int main (int argc, const char** argv)
     if (auto* handle = dlopen (libraryPath, RTLD_LAZY))\r
     {\r
         if (auto* getDescriptor = reinterpret_cast<const LV2_Descriptor* (*) (uint32_t)> (dlsym (handle, "lv2_descriptor")))\r
+        {\r
             if (auto* descriptor = getDescriptor (0))\r
+            {\r
                 if (auto* extensionData = descriptor->extension_data)\r
+                {\r
                     if (auto* recallFeature = reinterpret_cast<const RecallFeature*> (extensionData ("https://lv2-extensions.juce.com/turtle_recall")))\r
+                    {\r
                         if (auto* doRecall = recallFeature->doRecall)\r
-                            return doRecall (libraryPath);\r
+                        {\r
+                            const auto converted = toUTF8 (libraryPath);\r
+                            return doRecall (converted.data());\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+        }\r
     }\r
     else\r
     {\r
index c27d3a71bf99bff7b3455cd6470ca2b2e01d762b..2c1619b6288d3ee3c782d65f1ee264c24382e670 100644 (file)
@@ -124,7 +124,14 @@ public:
     */\r
     static String getIri (const AudioProcessorParameter& param)\r
     {\r
-        return URL::addEscapeChars (LegacyAudioParameter::getParamID (&param, false), true);\r
+        const auto urlSanitised = URL::addEscapeChars (LegacyAudioParameter::getParamID (&param, false), true);\r
+        const auto ttlSanitised = lv2_shared::sanitiseStringAsTtlName (urlSanitised);\r
+\r
+        // If this is hit, the parameter ID could not be represented directly in the plugin ttl.\r
+        // We'll replace offending characters with '_'.\r
+        jassert (urlSanitised == ttlSanitised);\r
+\r
+        return ttlSanitised;\r
     }\r
 \r
     void setValueFromHost (LV2_URID urid, float value) noexcept\r
@@ -217,6 +224,11 @@ private:
             result.push_back (urid);\r
         }\r
 \r
+        // If this is hit, some parameters have duplicate IDs.\r
+        // This may be because the IDs resolve to the same string when removing characters that\r
+        // are invalid in a TTL name.\r
+        jassert (std::set<LV2_URID> (result.begin(), result.end()).size() == result.size());\r
+\r
         return result;\r
     }();\r
     const std::map<LV2_URID, size_t> uridToIndexMap = [&]\r
@@ -505,8 +517,12 @@ public:
 \r
     void run (uint32_t numSteps)\r
     {\r
+        // If this is hit, the host is trying to process more samples than it told us to prepare\r
+        jassert (static_cast<int> (numSteps) <= processor->getBlockSize());\r
+\r
         midi.clear();\r
         playHead.invalidate();\r
+        audio.setSize (audio.getNumChannels(), static_cast<int> (numSteps), true, false, true);\r
 \r
         ports.forEachInputEvent ([&] (const LV2_Atom_Event* event)\r
         {\r
@@ -536,7 +552,7 @@ public:
         processor->setNonRealtime (ports.isFreeWheeling());\r
 \r
         for (auto i = 0, end = processor->getTotalNumInputChannels(); i < end; ++i)\r
-            audio.copyFrom (i, 0, ports.getBufferForAudioInput (i), (int) numSteps);\r
+            audio.copyFrom (i, 0, ports.getBufferForAudioInput (i), audio.getNumSamples());\r
 \r
         jassert (countNaNs (audio) == 0);\r
 \r
@@ -705,7 +721,7 @@ public:
 \r
     static std::unique_ptr<AudioProcessor> createProcessorInstance()\r
     {\r
-        std::unique_ptr<AudioProcessor> result { createPluginFilterOfType (AudioProcessor::wrapperType_LV2) };\r
+        auto result = createPluginFilterOfType (AudioProcessor::wrapperType_LV2);\r
 \r
        #if defined (JucePlugin_PreferredChannelConfigurations)\r
         constexpr short channelConfigurations[][2] { JucePlugin_PreferredChannelConfigurations };\r
@@ -797,7 +813,11 @@ struct RecallFeature
     {\r
         const ScopedJuceInitialiser_GUI scope;\r
         const auto processor = LV2PluginInstance::createProcessorInstance();\r
-        const File absolutePath { CharPointer_UTF8 { libraryPath } };\r
+\r
+        const String pathString { CharPointer_UTF8 { libraryPath } };\r
+\r
+        const auto absolutePath = File::isAbsolutePath (pathString) ? File (pathString)\r
+                                                                    : File::getCurrentWorkingDirectory().getChildFile (pathString);\r
 \r
         const auto writers = { writeManifestTtl, writeDspTtl, writeUiTtl };\r
 \r
@@ -820,15 +840,28 @@ private:
         return JucePlugin_LV2URI + String (uriSeparator) + "preset" + String (index + 1);\r
     }\r
 \r
-    static std::ofstream openStream (const File& libraryPath, StringRef name)\r
+    static FileOutputStream openStream (const File& libraryPath, StringRef name)\r
     {\r
-        return std::ofstream { libraryPath.getSiblingFile (name + ".ttl").getFullPathName().toRawUTF8() };\r
+        return FileOutputStream { libraryPath.getSiblingFile (name + ".ttl") };\r
+    }\r
+\r
+    static Result prepareStream (FileOutputStream& stream)\r
+    {\r
+        if (const auto result = stream.getStatus(); ! result)\r
+            return result;\r
+\r
+        stream.setPosition (0);\r
+        stream.truncate();\r
+        return Result::ok();\r
     }\r
 \r
     static Result writeManifestTtl (AudioProcessor& proc, const File& libraryPath)\r
     {\r
         auto os = openStream (libraryPath, "manifest");\r
 \r
+        if (const auto result = prepareStream (os); ! result)\r
+            return result;\r
+\r
         os << "@prefix lv2:   <http://lv2plug.in/ns/lv2core#> .\n"\r
               "@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .\n"\r
               "@prefix pset:  <http://lv2plug.in/ns/ext/presets#> .\n"\r
@@ -847,7 +880,7 @@ private:
             #define JUCE_LV2_UI_KIND "CocoaUI"\r
            #elif JUCE_WINDOWS\r
             #define JUCE_LV2_UI_KIND "WindowsUI"\r
-           #elif JUCE_LINUX\r
+           #elif JUCE_LINUX || JUCE_BSD\r
             #define JUCE_LV2_UI_KIND "X11UI"\r
            #else\r
             #error "LV2 UI is unsupported on this platform"\r
@@ -960,6 +993,9 @@ private:
     {\r
         auto os = openStream (libraryPath, "dsp");\r
 \r
+        if (const auto result = prepareStream (os); ! result)\r
+            return result;\r
+\r
         os << "@prefix atom:  <http://lv2plug.in/ns/ext/atom#> .\n"\r
               "@prefix bufs:  <http://lv2plug.in/ns/ext/buf-size#> .\n"\r
               "@prefix doap:  <http://usefulinc.com/ns/doap#> .\n"\r
@@ -1297,6 +1333,9 @@ private:
 \r
         auto os = openStream (libraryPath, "ui");\r
 \r
+        if (const auto result = prepareStream (os); ! result)\r
+            return result;\r
+\r
         const auto editorInstance = rawToUniquePtr (proc.createEditor());\r
         const auto resizeFeatureString = editorInstance->isResizable() ? "ui:resize" : "ui:noUserResize";\r
 \r
@@ -1340,8 +1379,6 @@ private:
 //==============================================================================\r
 LV2_SYMBOL_EXPORT const LV2_Descriptor* lv2_descriptor (uint32_t index)\r
 {\r
-    PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_LV2;\r
-\r
     if (index != 0)\r
         return nullptr;\r
 \r
index 009707ec6b7e399c7d6ad09abee1a98039a387e9..1f13a1d8a9ac760fd500aef8c37e7b042810d242 100644 (file)
@@ -50,8 +50,6 @@ class StandaloneFilterApp  : public JUCEApplication
 public:\r
     StandaloneFilterApp()\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_Standalone;\r
-\r
         PropertiesFile::Options options;\r
 \r
         options.applicationName     = getApplicationName();\r
index 884f7d40d618b2d4133d0700caf825c1098ca55e..6a96c9beba47571652e5347b3d392c566c911aef 100644 (file)
@@ -124,7 +124,7 @@ public:
     //==============================================================================\r
     virtual void createPlugin()\r
     {\r
-        processor.reset (createPluginFilterOfType (AudioProcessor::wrapperType_Standalone));\r
+        processor = createPluginFilterOfType (AudioProcessor::wrapperType_Standalone);\r
         processor->disableNonMainBuses();\r
         processor->setRateAndBufferSizeDetails (44100, 512);\r
 \r
@@ -386,13 +386,12 @@ public:
         return false;\r
     }\r
 \r
-    Image getIAAHostIcon (int size)\r
+    Image getIAAHostIcon ([[maybe_unused]] int size)\r
     {\r
        #if JUCE_IOS && JucePlugin_Enable_IAA\r
         if (auto device = dynamic_cast<iOSAudioIODevice*> (deviceManager.getCurrentAudioDevice()))\r
             return device->getIcon (size);\r
        #else\r
-        ignoreUnused (size);\r
        #endif\r
 \r
         return {};\r
index 74b5ec56a2ed24eb25c4417658531198a2cf168d..e2cc0f692f3e090f812d92884d39924d56ea6bda 100644 (file)
@@ -158,10 +158,8 @@ private:
             return std::make_unique<LowLevelGraphicsSoftwareRenderer> (Image (this));\r
         }\r
 \r
-        void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override\r
+        void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, [[maybe_unused]] Image::BitmapData::ReadWriteMode mode) override\r
         {\r
-            ignoreUnused (mode);\r
-\r
             const auto offset = (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride;\r
             bitmap.data = imageData + offset;\r
             bitmap.size = (size_t) (lineStride * height) - offset;\r
@@ -294,7 +292,7 @@ class AudioProcessorUnityWrapper
 public:\r
     AudioProcessorUnityWrapper (bool isTemporary)\r
     {\r
-        pluginInstance.reset (createPluginFilterOfType (AudioProcessor::wrapperType_Unity));\r
+        pluginInstance = createPluginFilterOfType (AudioProcessor::wrapperType_Unity);\r
 \r
         if (! isTemporary && pluginInstance->hasEditor())\r
         {\r
@@ -568,7 +566,6 @@ static UnityAudioEffectDefinition getEffectDefinition()
     result.setPosition = [] (UnityAudioEffectState* state, unsigned int pos)\r
     {\r
         ignoreUnused (state, pos);\r
-\r
         return 0;\r
     };\r
 \r
@@ -674,11 +671,7 @@ UNITY_INTERFACE_EXPORT int UNITY_INTERFACE_API UnityGetAudioEffectDefinitions (U
         juce::initialiseJuce_GUI();\r
 \r
     static std::once_flag flag;\r
-    std::call_once (flag, []\r
-    {\r
-        juce::PluginHostType::jucePlugInClientCurrentWrapperType = juce::AudioProcessor::wrapperType_Unity;\r
-        juce::juce_createUnityPeerFn = juce::createUnityPeer;\r
-    });\r
+    std::call_once (flag, [] { juce::juce_createUnityPeerFn = juce::createUnityPeer; });\r
 \r
     static auto definition = juce::getEffectDefinition();\r
     static UnityAudioEffectDefinition* definitions[] { &definition };\r
index 1cee5c001c97f26564d9739d16a3bb55d7714bc1..55226c66a64912e6eb395dba989d89b995c541c9 100644 (file)
@@ -962,14 +962,12 @@ public:
                               , public Timer\r
                              #endif\r
     {\r
-        EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor, float initialScale)\r
+        EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor& editor, [[maybe_unused]] float initialScale)\r
             : wrapper (w)\r
         {\r
             editor.setOpaque (true);\r
            #if ! JUCE_MAC\r
             editor.setScaleFactor (initialScale);\r
-           #else\r
-            ignoreUnused (initialScale);\r
            #endif\r
             addAndMakeVisible (editor);\r
 \r
@@ -1714,13 +1712,12 @@ private:
         return 0;\r
     }\r
 \r
-    pointer_sized_int handlePreAudioProcessingEvents (VstOpCodeArguments args)\r
+    pointer_sized_int handlePreAudioProcessingEvents ([[maybe_unused]] VstOpCodeArguments args)\r
     {\r
        #if JucePlugin_WantsMidiInput || JucePlugin_IsMidiEffect\r
         VSTMidiEventList::addEventsToMidiBuffer ((Vst2::VstEvents*) args.ptr, midiEvents);\r
         return 1;\r
        #else\r
-        ignoreUnused (args);\r
         return 0;\r
        #endif\r
     }\r
@@ -1973,13 +1970,13 @@ private:
         if (pluginHasSidechainsOrAuxs() || processor->isMidiEffect())\r
             return false;\r
 \r
-        auto inputLayout  = processor->getChannelLayoutOfBus (true,  0);\r
-        auto outputLayout = processor->getChannelLayoutOfBus (false,  0);\r
+        auto inputLayout  = processor->getChannelLayoutOfBus (true, 0);\r
+        auto outputLayout = processor->getChannelLayoutOfBus (false, 0);\r
 \r
-        auto speakerBaseSize = sizeof (Vst2::VstSpeakerArrangement) - (sizeof (Vst2::VstSpeakerProperties) * 8);\r
+        const auto speakerBaseSize = offsetof (Vst2::VstSpeakerArrangement, speakers);\r
 \r
-        cachedInArrangement .malloc (speakerBaseSize + (static_cast<std::size_t> (inputLayout. size()) * sizeof (Vst2::VstSpeakerArrangement)), 1);\r
-        cachedOutArrangement.malloc (speakerBaseSize + (static_cast<std::size_t> (outputLayout.size()) * sizeof (Vst2::VstSpeakerArrangement)), 1);\r
+        cachedInArrangement .malloc (speakerBaseSize + (static_cast<std::size_t> (inputLayout. size()) * sizeof (Vst2::VstSpeakerProperties)), 1);\r
+        cachedOutArrangement.malloc (speakerBaseSize + (static_cast<std::size_t> (outputLayout.size()) * sizeof (Vst2::VstSpeakerProperties)), 1);\r
 \r
         *pluginInput  = cachedInArrangement. getData();\r
         *pluginOutput = cachedOutArrangement.getData();\r
@@ -2013,7 +2010,7 @@ private:
         return 0;\r
     }\r
 \r
-    pointer_sized_int handleSetContentScaleFactor (float scale, bool force = false)\r
+    pointer_sized_int handleSetContentScaleFactor ([[maybe_unused]] float scale, [[maybe_unused]] bool force = false)\r
     {\r
         checkWhetherMessageThreadIsCorrect();\r
        #if JUCE_LINUX || JUCE_BSD\r
@@ -2030,9 +2027,6 @@ private:
             if (editorComp != nullptr)\r
                 editorComp->setContentScaleFactor (editorScaleFactor);\r
         }\r
-\r
-       #else\r
-        ignoreUnused (scale, force);\r
        #endif\r
 \r
         return 1;\r
@@ -2199,8 +2193,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes")
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster);\r
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
-\r
         initialiseMacVST();\r
         return pluginEntryPoint (audioMaster);\r
     }\r
@@ -2208,8 +2200,6 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes")
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster);\r
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_macho (Vst2::audioMasterCallback audioMaster)\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
-\r
         initialiseMacVST();\r
         return pluginEntryPoint (audioMaster);\r
     }\r
@@ -2221,16 +2211,12 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes")
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster);\r
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
-\r
         return pluginEntryPoint (audioMaster);\r
     }\r
 \r
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster) asm ("main");\r
     JUCE_EXPORTED_FUNCTION Vst2::AEffect* main_plugin (Vst2::audioMasterCallback audioMaster)\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
-\r
         return VSTPluginMain (audioMaster);\r
     }\r
 \r
@@ -2244,16 +2230,12 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes")
 \r
     extern "C" __declspec (dllexport) Vst2::AEffect* VSTPluginMain (Vst2::audioMasterCallback audioMaster)\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
-\r
         return pluginEntryPoint (audioMaster);\r
     }\r
 \r
    #if ! defined (JUCE_64BIT) && JUCE_MSVC // (can't compile this on win64, but it's not needed anyway with VST2.4)\r
     extern "C" __declspec (dllexport) int main (Vst2::audioMasterCallback audioMaster)\r
     {\r
-        PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST;\r
-\r
         return (int) pluginEntryPoint (audioMaster);\r
     }\r
    #endif\r
index 8e3fab41244299644865be5394bc5ff4802ed14f..2c13881a5aff706625ebb1ac4d9315621167238e 100644 (file)
@@ -80,7 +80,7 @@ void initialiseMacVST()
 }\r
 \r
 JUCE_API void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, bool isNSView);\r
-void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, bool isNSView)\r
+void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView, [[maybe_unused]] bool isNSView)\r
 {\r
     JUCE_AUTORELEASEPOOL\r
     {\r
@@ -161,7 +161,6 @@ void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView,
         }\r
        #endif\r
 \r
-        ignoreUnused (isNSView);\r
         NSView* parentView = [(NSView*) parentWindowOrView retain];\r
 \r
        #if JucePlugin_EditorRequiresKeyboardFocus\r
@@ -183,7 +182,7 @@ void* attachComponentToWindowRefVST (Component* comp, void* parentWindowOrView,
 }\r
 \r
 JUCE_API void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSView);\r
-void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSView)\r
+void detachComponentFromWindowRefVST (Component* comp, void* window, [[maybe_unused]] bool isNSView)\r
 {\r
     JUCE_AUTORELEASEPOOL\r
     {\r
@@ -232,14 +231,13 @@ void detachComponentFromWindowRefVST (Component* comp, void* window, bool isNSVi
         }\r
        #endif\r
 \r
-        ignoreUnused (isNSView);\r
         comp->removeFromDesktop();\r
         [(id) window release];\r
     }\r
 }\r
 \r
 JUCE_API void setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, int newHeight, bool isNSView);\r
-void setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, int newHeight, bool isNSView)\r
+void setNativeHostWindowSizeVST (void* window, Component* component, int newWidth, int newHeight, [[maybe_unused]] bool isNSView)\r
 {\r
     JUCE_AUTORELEASEPOOL\r
     {\r
@@ -260,8 +258,6 @@ void setNativeHostWindowSizeVST (void* window, Component* component, int newWidt
         }\r
        #endif\r
 \r
-        ignoreUnused (isNSView);\r
-\r
         if (NSView* hostView = (NSView*) window)\r
         {\r
             const int dx = newWidth  - component->getWidth();\r
@@ -277,10 +273,10 @@ void setNativeHostWindowSizeVST (void* window, Component* component, int newWidt
 }\r
 \r
 JUCE_API void checkWindowVisibilityVST (void* window, Component* comp, bool isNSView);\r
-void checkWindowVisibilityVST (void* window, Component* comp, bool isNSView)\r
+void checkWindowVisibilityVST ([[maybe_unused]] void* window,\r
+                               [[maybe_unused]] Component* comp,\r
+                               [[maybe_unused]] bool isNSView)\r
 {\r
-    ignoreUnused (window, comp, isNSView);\r
-\r
    #if ! JUCE_64BIT\r
     if (! isNSView)\r
         comp->setVisible ([((NSWindow*) window) isVisible]);\r
@@ -288,7 +284,7 @@ void checkWindowVisibilityVST (void* window, Component* comp, bool isNSView)
 }\r
 \r
 JUCE_API bool forwardCurrentKeyEventToHostVST (Component* comp, bool isNSView);\r
-bool forwardCurrentKeyEventToHostVST (Component* comp, bool isNSView)\r
+bool forwardCurrentKeyEventToHostVST ([[maybe_unused]] Component* comp, [[maybe_unused]] bool isNSView)\r
 {\r
    #if ! JUCE_64BIT\r
     if (! isNSView)\r
@@ -300,7 +296,6 @@ bool forwardCurrentKeyEventToHostVST (Component* comp, bool isNSView)
     }\r
    #endif\r
 \r
-    ignoreUnused (comp, isNSView);\r
     return false;\r
 }\r
 \r
index 5e2c97497300071f2a6197d38aca153c3fe82875..da79dcc63ff8b069ac4462a26ea0abe4c69c02c4 100644 (file)
@@ -1075,14 +1075,15 @@ public:
     }\r
 \r
     //==============================================================================\r
-    tresult PLUGIN_API getMidiControllerAssignment (Steinberg::int32 /*busIndex*/, Steinberg::int16 channel,\r
-                                                    Vst::CtrlNumber midiControllerNumber, Vst::ParamID& resultID) override\r
+    tresult PLUGIN_API getMidiControllerAssignment ([[maybe_unused]] Steinberg::int32 busIndex,\r
+                                                    [[maybe_unused]] Steinberg::int16 channel,\r
+                                                    [[maybe_unused]] Vst::CtrlNumber midiControllerNumber,\r
+                                                    [[maybe_unused]] Vst::ParamID& resultID) override\r
     {\r
        #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS\r
         resultID = midiControllerToParameter[channel][midiControllerNumber];\r
         return kResultTrue; // Returning false makes some hosts stop asking for further MIDI Controller Assignments\r
        #else\r
-        ignoreUnused (channel, midiControllerNumber, resultID);\r
         return kResultFalse;\r
        #endif\r
     }\r
@@ -1991,7 +1992,7 @@ private:
             return kResultFalse;\r
         }\r
 \r
-        tresult PLUGIN_API setContentScaleFactor (const Steinberg::IPlugViewContentScaleSupport::ScaleFactor factor) override\r
+        tresult PLUGIN_API setContentScaleFactor ([[maybe_unused]] const Steinberg::IPlugViewContentScaleSupport::ScaleFactor factor) override\r
         {\r
            #if ! JUCE_MAC\r
             const auto scaleToApply = [&]\r
@@ -2016,7 +2017,6 @@ private:
 \r
             return kResultTrue;\r
            #else\r
-            ignoreUnused (factor);\r
             return kResultFalse;\r
            #endif\r
         }\r
@@ -2420,16 +2420,15 @@ class JuceVST3Component : public Vst::IComponent,
 {\r
 public:\r
     JuceVST3Component (Vst::IHostApplication* h)\r
-        : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3)),\r
+        : pluginInstance (createPluginFilterOfType (AudioProcessor::wrapperType_VST3).release()),\r
           host (h)\r
     {\r
         inParameterChangedCallback = false;\r
 \r
        #ifdef JucePlugin_PreferredChannelConfigurations\r
         short configs[][2] = { JucePlugin_PreferredChannelConfigurations };\r
-        const int numConfigs = numElementsInArray (configs);\r
+        [[maybe_unused]] const int numConfigs = numElementsInArray (configs);\r
 \r
-        ignoreUnused (numConfigs);\r
         jassert (numConfigs > 0 && (configs[0][0] > 0 || configs[0][1] > 0));\r
 \r
         pluginInstance->setPlayConfigDetails (configs[0][0], configs[0][1], 44100.0, 1024);\r
@@ -2552,27 +2551,32 @@ public:
     //==============================================================================\r
     tresult PLUGIN_API setActive (TBool state) override\r
     {\r
-        active = (state != 0);\r
+        const auto willBeActive = (state != 0);\r
 \r
-        if (! state)\r
-        {\r
-            getPluginInstance().releaseResources();\r
-        }\r
-        else\r
-        {\r
-            auto sampleRate = getPluginInstance().getSampleRate();\r
-            auto bufferSize = getPluginInstance().getBlockSize();\r
+        active = false;\r
+        // Some hosts may call setBusArrangements in response to calls made during prepareToPlay\r
+        // or releaseResources. Specifically, Wavelab 11.1 calls setBusArrangements in the same\r
+        // call stack when the AudioProcessor calls setLatencySamples inside prepareToPlay.\r
+        // In order for setBusArrangements to return successfully, the plugin must not be activated\r
+        // until after prepareToPlay has completely finished.\r
+        const ScopeGuard scope { [&] { active = willBeActive; } };\r
 \r
-            sampleRate = processSetup.sampleRate > 0.0\r
-                            ? processSetup.sampleRate\r
-                            : sampleRate;\r
+        if (willBeActive)\r
+        {\r
+            const auto sampleRate = processSetup.sampleRate > 0.0\r
+                                  ? processSetup.sampleRate\r
+                                  : getPluginInstance().getSampleRate();\r
 \r
-            bufferSize = processSetup.maxSamplesPerBlock > 0\r
-                            ? (int) processSetup.maxSamplesPerBlock\r
-                            : bufferSize;\r
+            const auto bufferSize = processSetup.maxSamplesPerBlock > 0\r
+                                  ? (int) processSetup.maxSamplesPerBlock\r
+                                  : getPluginInstance().getBlockSize();\r
 \r
             preparePlugin (sampleRate, bufferSize, CallPrepareToPlay::yes);\r
         }\r
+        else\r
+        {\r
+            getPluginInstance().releaseResources();\r
+        }\r
 \r
         return kResultOk;\r
     }\r
@@ -4164,8 +4168,6 @@ using namespace juce;
 // The VST3 plugin entry point.\r
 extern "C" SMTG_EXPORT_SYMBOL IPluginFactory* PLUGIN_API GetPluginFactory()\r
 {\r
-    PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_VST3;\r
-\r
    #if (JUCE_MSVC || (JUCE_WINDOWS && JUCE_CLANG)) && JUCE_32BIT\r
     // Cunning trick to force this function to be exported. Life's too short to\r
     // faff around creating .def files for this kind of thing.\r
index c355cade8b6d31e6586558f9d22dae5e64969311..bb055d073bf68ee7854317647d705ac05d975297 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_plugin_client\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE audio plugin wrapper classes\r
   description:        Classes for building VST, VST3, AU, AUv3 and AAX plugins.\r
   website:            http://www.juce.com/juce\r
index 0eaf46850173c5440faf40378b2e41a886397cb2..e4c5c25bb0181bfd9dad5ed33fdfd4a0fa7e6e3c 100644 (file)
@@ -44,6 +44,8 @@
  JUCE_CREATE_APPLICATION_DEFINE(juce::StandaloneFilterApp)\r
 #endif\r
 \r
-JUCE_MAIN_FUNCTION_DEFINITION\r
+#if ! JUCE_USE_CUSTOM_PLUGIN_STANDALONE_ENTRYPOINT\r
+ JUCE_MAIN_FUNCTION_DEFINITION\r
+#endif\r
 \r
 #endif\r
index a5b7a1f5fe8ce101be3b63e971091449892c9b04..50dfd51fa5c2acc4b84cfcb167434623a1357cc1 100644 (file)
 namespace juce\r
 {\r
 \r
-inline AudioProcessor* JUCE_API JUCE_CALLTYPE createPluginFilterOfType (AudioProcessor::WrapperType type)\r
+inline std::unique_ptr<AudioProcessor> createPluginFilterOfType (AudioProcessor::WrapperType type)\r
 {\r
+    PluginHostType::jucePlugInClientCurrentWrapperType = type;\r
     AudioProcessor::setTypeOfNextNewPlugin (type);\r
-    AudioProcessor* const pluginInstance = ::createPluginFilter();\r
+    auto pluginInstance = rawToUniquePtr (::createPluginFilter());\r
     AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Undefined);\r
 \r
     // your createPluginFilter() method must return an object!\r
     jassert (pluginInstance != nullptr && pluginInstance->wrapperType == type);\r
 \r
    #if JucePlugin_Enable_ARA\r
-    jassert (dynamic_cast<juce::AudioProcessorARAExtension*> (pluginInstance) != nullptr);\r
+    jassert (dynamic_cast<juce::AudioProcessorARAExtension*> (pluginInstance.get()) != nullptr);\r
    #endif\r
 \r
     return pluginInstance;\r
index 0c2e7a179247d2d083575447ef5726902e652602..f6b4b2689deb63f1bf3ab7df5b16122c6b4dcf23 100644 (file)
@@ -56,7 +56,7 @@ namespace juce
       const auto juce_strcat  = [] (auto&& head, auto&&... tail) { strcat_s  (head, numElementsInArray (head), tail...); };\r
       const auto juce_sscanf  = [] (auto&&... args)              { sscanf_s  (args...); };\r
      #else\r
-      const auto juce_sprintf = [] (auto&&... args)              { sprintf   (args...); };\r
+      const auto juce_sprintf = [] (auto&& head, auto&&... tail) { snprintf  (head, (size_t) numElementsInArray (head), tail...); };\r
       const auto juce_strcpy  = [] (auto&&... args)              { strcpy    (args...); };\r
       const auto juce_strcat  = [] (auto&&... args)              { strcat    (args...); };\r
       const auto juce_sscanf  = [] (auto&&... args)              { sscanf    (args...); };\r
@@ -134,7 +134,10 @@ namespace juce
 \r
 #if JucePlugin_Build_VST\r
  bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float);\r
- bool JUCE_API handleManufacturerSpecificVST2Opcode (int32 index, pointer_sized_int value, void* ptr, float)\r
+ bool JUCE_API handleManufacturerSpecificVST2Opcode ([[maybe_unused]] int32 index,\r
+                                                     [[maybe_unused]] pointer_sized_int value,\r
+                                                     [[maybe_unused]] void* ptr,\r
+                                                     float)\r
  {\r
     #if VST3_REPLACEMENT_AVAILABLE\r
      if ((index == (int32) ByteOrder::bigEndianInt ("stCA") || index == (int32) ByteOrder::bigEndianInt ("stCa"))\r
@@ -145,8 +148,6 @@ namespace juce
          ::memcpy (ptr, fuid, 16);\r
          return true;\r
      }\r
-    #else\r
-     ignoreUnused (index, value, ptr);\r
     #endif\r
      return false;\r
  }\r
index 9ba57bea469753b805be1707f5fe5543ef5e796c..3e5c029bf47c0bd59078966ced48762b5cd77935 100644 (file)
@@ -64,10 +64,8 @@ void AudioPluginFormatManager::addDefaultFormats()
 \r
    #if JUCE_DEBUG\r
     // you should only call this method once!\r
-    for (auto* format : formats)\r
+    for (auto* format [[maybe_unused]] : formats)\r
     {\r
-        ignoreUnused (format);\r
-\r
        #if HAS_VST\r
         jassert (dynamic_cast<VSTPluginFormat*> (format) == nullptr);\r
        #endif\r
index 359c238f7cae6d75f9f382577f473c65749da227..ef7b30ad05ffcd2b6b8887825474b26cbc7eb750 100644 (file)
@@ -179,14 +179,15 @@ namespace AudioUnitFormatHelpers
         return false;\r
     }\r
 \r
-    static bool getComponentDescFromFile (const String& fileOrIdentifier, AudioComponentDescription& desc,\r
-                                          String& name, String& version, String& manufacturer)\r
+    static bool getComponentDescFromFile ([[maybe_unused]] const String& fileOrIdentifier,\r
+                                          [[maybe_unused]] AudioComponentDescription& desc,\r
+                                          [[maybe_unused]] String& name,\r
+                                          [[maybe_unused]] String& version,\r
+                                          [[maybe_unused]] String& manufacturer)\r
     {\r
         zerostruct (desc);\r
 \r
        #if JUCE_IOS\r
-        ignoreUnused (fileOrIdentifier, name, version, manufacturer);\r
-\r
         return false;\r
        #else\r
         const File file (fileOrIdentifier);\r
@@ -434,7 +435,7 @@ namespace AudioUnitFormatHelpers
     }\r
 }\r
 \r
-static bool hasARAExtension (AudioUnit audioUnit)\r
+static bool hasARAExtension ([[maybe_unused]] AudioUnit audioUnit)\r
 {\r
    #if JUCE_PLUGINHOST_ARA\r
     UInt32 propertySize = sizeof (ARA::ARAAudioUnitFactory);\r
@@ -449,8 +450,6 @@ static bool hasARAExtension (AudioUnit audioUnit)
 \r
     if ((status == noErr) && (propertySize == sizeof (ARA::ARAAudioUnitFactory)) && ! isWriteable)\r
         return true;\r
-   #else\r
-    ignoreUnused (audioUnit);\r
    #endif\r
 \r
     return false;\r
@@ -465,7 +464,7 @@ using AudioUnitUniquePtr = std::unique_ptr<std::remove_pointer_t<AudioUnit>, Aud
 using AudioUnitSharedPtr = std::shared_ptr<std::remove_pointer_t<AudioUnit>>;\r
 using AudioUnitWeakPtr = std::weak_ptr<std::remove_pointer_t<AudioUnit>>;\r
 \r
-static std::shared_ptr<const ARA::ARAFactory> getARAFactory (AudioUnitSharedPtr audioUnit)\r
+static std::shared_ptr<const ARA::ARAFactory> getARAFactory ([[maybe_unused]] AudioUnitSharedPtr audioUnit)\r
 {\r
    #if JUCE_PLUGINHOST_ARA\r
     jassert (audioUnit != nullptr);\r
@@ -491,8 +490,6 @@ static std::shared_ptr<const ARA::ARAFactory> getARAFactory (AudioUnitSharedPtr
                                           [owningAuPtr = std::move (audioUnit)]() {});\r
         }\r
     }\r
-   #else\r
-    ignoreUnused (audioUnit);\r
    #endif\r
 \r
     return {};\r
@@ -2640,13 +2637,12 @@ public:
         }\r
     }\r
 \r
-    void embedViewController (JUCE_IOS_MAC_VIEW* pluginView, const CGSize& size)\r
+    void embedViewController (JUCE_IOS_MAC_VIEW* pluginView, [[maybe_unused]] const CGSize& size)\r
     {\r
         wrapper.setView (pluginView);\r
         waitingForViewCallback = false;\r
 \r
       #if JUCE_MAC\r
-        ignoreUnused (size);\r
         if (pluginView != nil)\r
             wrapper.resizeToFitView();\r
       #else\r
@@ -2682,7 +2678,7 @@ private:
 \r
     bool waitingForViewCallback = false;\r
 \r
-    bool createView (bool createGenericViewIfNeeded)\r
+    bool createView ([[maybe_unused]] bool createGenericViewIfNeeded)\r
     {\r
         JUCE_IOS_MAC_VIEW* pluginView = nil;\r
         UInt32 dataSize = 0;\r
@@ -2756,8 +2752,6 @@ private:
 \r
             pluginView = [[AUGenericView alloc] initWithAudioUnit: plugin.audioUnit];\r
         }\r
-       #else\r
-        ignoreUnused (createGenericViewIfNeeded);\r
        #endif\r
 \r
         wrapper.setView (pluginView);\r
index cec1528a450b59395f4f11a2b3dc358c2156113d..6121dd84e8289327b21e91a1e86b231ed4782152 100644 (file)
@@ -384,10 +384,8 @@ public:
     void getCurrentProgramStateInformation (MemoryBlock& destData) override               { getStateInformation (destData); }\r
     void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override   { setStateInformation (data, sizeInBytes); }\r
 \r
-    void setStateInformation (const void* data, int sizeInBytes) override\r
+    void setStateInformation (const void* data, [[maybe_unused]] int sizeInBytes) override\r
     {\r
-        ignoreUnused (sizeInBytes);\r
-\r
         auto* p = static_cast<const float*> (data);\r
 \r
         for (int i = 0; i < getParameters().size(); ++i)\r
index d3f3275dbc816713a6d04b2698a9d1a7b51fed8e..92a5a987a4737b4ea643920f6c0eeb2d4c728320 100644 (file)
@@ -615,6 +615,55 @@ static inline std::vector<ParsedGroup> findStableBusOrder (const String& mainGro
     return result;\r
 }\r
 \r
+/*  See https://www.w3.org/TeamSubmission/turtle/#sec-grammar-grammar\r
+*/\r
+static inline bool isNameStartChar (juce_wchar input)\r
+{\r
+    return ('A' <= input && input <= 'Z')\r
+        || input == '_'\r
+        || ('a' <= input && input <= 'z')\r
+        || (0x000c0 <= input && input <= 0x000d6)\r
+        || (0x000d8 <= input && input <= 0x000f6)\r
+        || (0x000f8 <= input && input <= 0x000ff)\r
+        || (0x00370 <= input && input <= 0x0037d)\r
+        || (0x0037f <= input && input <= 0x01fff)\r
+        || (0x0200c <= input && input <= 0x0200d)\r
+        || (0x02070 <= input && input <= 0x0218f)\r
+        || (0x02c00 <= input && input <= 0x02fef)\r
+        || (0x03001 <= input && input <= 0x0d7ff)\r
+        || (0x0f900 <= input && input <= 0x0fdcf)\r
+        || (0x0fdf0 <= input && input <= 0x0fffd)\r
+        || (0x10000 <= input && input <= 0xeffff);\r
+}\r
+\r
+static inline bool isNameChar (juce_wchar input)\r
+{\r
+    return isNameStartChar (input)\r
+        || input == '-'\r
+        || ('0' <= input && input <= '9')\r
+        || input == 0x000b7\r
+        || (0x00300 <= input && input <= 0x0036f)\r
+        || (0x0203f <= input && input <= 0x02040);\r
+}\r
+\r
+static inline String sanitiseStringAsTtlName (const String& input)\r
+{\r
+    if (input.isEmpty())\r
+        return {};\r
+\r
+    std::vector<juce_wchar> sanitised;\r
+    sanitised.reserve (static_cast<size_t> (input.length()));\r
+\r
+    sanitised.push_back (isNameStartChar (input[0]) ? input[0] : '_');\r
+\r
+    std::for_each (std::begin (input) + 1, std::end (input), [&] (juce_wchar x)\r
+    {\r
+        sanitised.push_back (isNameChar (x) ? x : '_');\r
+    });\r
+\r
+    return String (CharPointer_UTF32 { sanitised.data() }, sanitised.size());\r
+}\r
+\r
 }\r
 }\r
 \r
index 933bad1d3560fefb7183f54fdce90e61af858a44..4ef7f4b3b5f1c089117eedd905ab4ebebf5edbe1 100644 (file)
@@ -1278,10 +1278,8 @@ private:
                                                   LV2_Options_Option* options,\r
                                                   LV2_Worker_Schedule* schedule,\r
                                                   LV2_Resize_Port_Resize* resize,\r
-                                                  LV2_Log_Log* log)\r
+                                                  [[maybe_unused]] LV2_Log_Log* log)\r
     {\r
-        ignoreUnused (log);\r
-\r
         return { LV2_Feature { LV2_STATE__loadDefaultState,         nullptr },\r
                  LV2_Feature { LV2_BUF_SIZE__boundedBlockLength,    nullptr },\r
                  LV2_Feature { LV2_URID__map,                       map },\r
@@ -2873,11 +2871,10 @@ private:
 \r
         ports.forEachPort ([&] (const PortHeader& header)\r
         {\r
-            const auto emplaced = result.emplace (header.symbol, header.index);\r
+            [[maybe_unused]] const auto emplaced = result.emplace (header.symbol, header.index);\r
 \r
             // This will complain if there are duplicate port symbols.\r
             jassert (emplaced.second);\r
-            ignoreUnused (emplaced);\r
         });\r
 \r
         return result;\r
@@ -4884,10 +4881,8 @@ private:
                                                              : freeWheelingPort->info.min;\r
     }\r
 \r
-    void pushMessage (MessageHeader header, uint32_t size, const void* data)\r
+    void pushMessage (MessageHeader header, [[maybe_unused]] uint32_t size, const void* data)\r
     {\r
-        ignoreUnused (size);\r
-\r
         if (header.protocol == 0 || header.protocol == instance->urids.mLV2_UI__floatProtocol)\r
         {\r
             const auto value = readUnaligned<float> (data);\r
index 0acdc860204717eedab4ea4ea324583734f36f92..cd757c39621814702ad8243a75c1d71ef79710a5 100644 (file)
@@ -68,7 +68,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-copy-dtor",
                                      "-Wtype-limits",\r
                                      "-Wcpp",\r
                                      "-W#warnings",\r
-                                     "-Wmaybe-uninitialized")\r
+                                     "-Wmaybe-uninitialized",\r
+                                     "-Wunused-but-set-variable")\r
 \r
 #undef DEVELOPMENT\r
 #define DEVELOPMENT 0  // This avoids a Clang warning in Steinberg code about unused values\r
index 43ec447636ff65bbca8318f549abb89766bf841e..7dca5a5b54ab52f7968ce2f51bc6d4ad6c8fa49e 100644 (file)
@@ -375,9 +375,8 @@ struct VST3HostContext  : public Vst::IComponentHandler,  // From VST V3.0.0
     tresult PLUGIN_API setDirty (TBool) override;\r
 \r
     //==============================================================================\r
-    tresult PLUGIN_API requestOpenEditor (FIDString name) override\r
+    tresult PLUGIN_API requestOpenEditor ([[maybe_unused]] FIDString name) override\r
     {\r
-        ignoreUnused (name);\r
         jassertfalse;\r
         return kResultFalse;\r
     }\r
@@ -1388,7 +1387,7 @@ static int compareWithString (Type (&charArray)[N], const String& str)
 }\r
 \r
 template <typename Callback>\r
-static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb)\r
+static void forEachARAFactory ([[maybe_unused]] IPluginFactory* pluginFactory, [[maybe_unused]] Callback&& cb)\r
 {\r
    #if JUCE_PLUGINHOST_ARA && (JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX)\r
     const auto numClasses = pluginFactory->countClasses();\r
@@ -1404,12 +1403,11 @@ static void forEachARAFactory (IPluginFactory* pluginFactory, Callback&& cb)
                 break;\r
         }\r
     }\r
-   #else\r
-    ignoreUnused (pluginFactory, cb);\r
    #endif\r
 }\r
 \r
-static std::shared_ptr<const ARA::ARAFactory> getARAFactory (Steinberg::IPluginFactory* pluginFactory, const String& pluginName)\r
+static std::shared_ptr<const ARA::ARAFactory> getARAFactory ([[maybe_unused]] Steinberg::IPluginFactory* pluginFactory,\r
+                                                             [[maybe_unused]] const String& pluginName)\r
 {\r
     std::shared_ptr<const ARA::ARAFactory> factory;\r
 \r
@@ -1432,8 +1430,6 @@ static std::shared_ptr<const ARA::ARAFactory> getARAFactory (Steinberg::IPluginF
 \r
                            return true;\r
                        });\r
-   #else\r
-    ignoreUnused (pluginFactory, pluginName);\r
    #endif\r
 \r
     return factory;\r
@@ -1667,8 +1663,8 @@ private:
                 return;\r
             }\r
 \r
-            const auto attachedResult = view->attached ((void*) pluginHandle, defaultVST3WindowType);\r
-            ignoreUnused (warnOnFailure (attachedResult));\r
+            [[maybe_unused]] const auto attachedResult = view->attached ((void*) pluginHandle, defaultVST3WindowType);\r
+            [[maybe_unused]] const auto warning = warnOnFailure (attachedResult);\r
 \r
             if (attachedResult == kResultOk)\r
                 attachedCalled = true;\r
@@ -1689,11 +1685,10 @@ private:
     {\r
         if (scaleInterface != nullptr)\r
         {\r
-            const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) getEffectiveScale());\r
-            ignoreUnused (result);\r
+            [[maybe_unused]] const auto result = scaleInterface->setContentScaleFactor ((Steinberg::IPlugViewContentScaleSupport::ScaleFactor) getEffectiveScale());\r
 \r
            #if ! JUCE_MAC\r
-            ignoreUnused (warnOnFailure (result));\r
+            [[maybe_unused]] const auto warning = warnOnFailure (result);\r
            #endif\r
         }\r
     }\r
@@ -1885,8 +1880,7 @@ struct VST3ComponentHolder
         if (classIdx >= 0)\r
         {\r
             PClassInfo info;\r
-            bool success = (factory->getClassInfo (classIdx, &info) == kResultOk);\r
-            ignoreUnused (success);\r
+            [[maybe_unused]] bool success = (factory->getClassInfo (classIdx, &info) == kResultOk);\r
             jassert (success);\r
 \r
             VSTComSmartPtr<IPluginFactory2> pf2;\r
@@ -2392,7 +2386,7 @@ public:
 \r
         auto configureParameters = [this]\r
         {\r
-            refreshParameterList();\r
+            initialiseParameterList();\r
             synchroniseStates();\r
             syncProgramNames();\r
         };\r
@@ -3091,9 +3085,9 @@ public:
     }\r
 \r
     /** @note Not applicable to VST3 */\r
-    void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override\r
+    void setCurrentProgramStateInformation ([[maybe_unused]] const void* data,\r
+                                            [[maybe_unused]] int sizeInBytes) override\r
     {\r
-        ignoreUnused (data, sizeInBytes);\r
     }\r
 \r
 private:\r
@@ -3222,7 +3216,7 @@ private:
         }\r
     }\r
 \r
-    void refreshParameterList() override\r
+    void initialiseParameterList()\r
     {\r
         AudioProcessorParameterGroup newParameterTree;\r
 \r
index f4bf5f79345b33efb9c50a4d58fc1f668f6e5500..1f38a2a9eee530f2da83eb57f88f7017d84bb806 100644 (file)
@@ -3028,10 +3028,8 @@ public:
     }\r
 \r
     //==============================================================================\r
-    void mouseDown (const MouseEvent& e) override\r
+    void mouseDown ([[maybe_unused]] const MouseEvent& e) override\r
     {\r
-        ignoreUnused (e);\r
-\r
        #if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD\r
         toFront (true);\r
        #endif\r
@@ -3442,7 +3440,7 @@ AudioProcessorEditor* VSTPluginInstance::createEditor()
    #endif\r
 }\r
 \r
-bool VSTPluginInstance::updateSizeFromEditor (int w, int h)\r
+bool VSTPluginInstance::updateSizeFromEditor ([[maybe_unused]] int w, [[maybe_unused]] int h)\r
 {\r
    #if ! JUCE_IOS && ! JUCE_ANDROID\r
     if (auto* editor = dynamic_cast<VSTPluginWindow*> (getActiveEditor()))\r
index b0ff4b67b46d9b8e8fb99921369b7ca87095200e..8bbc3a36d1156edd374ea4b293404abe60bbc069 100644 (file)
@@ -61,7 +61,7 @@
 namespace juce\r
 {\r
 \r
-#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && JUCE_LINUX)\r
+#if JUCE_PLUGINHOST_VST || (JUCE_PLUGINHOST_LADSPA && (JUCE_LINUX || JUCE_BSD))\r
 \r
 static bool arrayContainsPlugin (const OwnedArray<PluginDescription>& list,\r
                                  const PluginDescription& desc)\r
@@ -220,6 +220,7 @@ private:
 #include "utilities/juce_AudioProcessorValueTreeState.cpp"\r
 #include "utilities/juce_PluginHostType.cpp"\r
 #include "utilities/juce_NativeScaleFactorNotifier.cpp"\r
+#include "utilities/juce_VSTCallbackHandler.cpp"\r
 #include "utilities/ARA/juce_ARA_utils.cpp"\r
 \r
 #include "format_types/juce_LV2PluginFormat.cpp"\r
index 2403f0da30a81054f4b25eca909a3de965a8ad14..a02e46ab80c29cbac6768ce379ad7d1878d72137 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_processors\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE audio processor classes\r
   description:        Classes for loading and playing VST, AU, LADSPA, or internally-generated audio processors.\r
   website:            http://www.juce.com/juce\r
index 53aa9c3d83fa6a30f091658bb2f51241744fd3b4..f5815241ec080dc7e305815b91cc75de5193f95e 100644 (file)
@@ -340,7 +340,7 @@ void AudioProcessor::removeListener (AudioProcessorListener* listenerToRemove)
 \r
 void AudioProcessor::setPlayConfigDetails (int newNumIns, int newNumOuts, double newSampleRate, int newBlockSize)\r
 {\r
-    bool success = true;\r
+    [[maybe_unused]] bool success = true;\r
 \r
     if (getTotalNumInputChannels() != newNumIns)\r
         success &= setChannelLayoutOfBus (true,  0, AudioChannelSet::canonicalChannelSet (newNumIns));\r
@@ -362,7 +362,6 @@ void AudioProcessor::setPlayConfigDetails (int newNumIns, int newNumOuts, double
     jassert (success && newNumIns == getTotalNumInputChannels() && newNumOuts == getTotalNumOutputChannels());\r
 \r
     setRateAndBufferSizeDetails (newSampleRate, newBlockSize);\r
-    ignoreUnused (success);\r
 }\r
 \r
 void AudioProcessor::setRateAndBufferSizeDetails (double newSampleRate, int newBlockSize) noexcept\r
@@ -442,10 +441,8 @@ void AudioProcessor::validateParameter (AudioProcessorParameter* param)
    #endif\r
 }\r
 \r
-void AudioProcessor::checkForDuplicateTrimmedParamID (AudioProcessorParameter* param)\r
+void AudioProcessor::checkForDuplicateTrimmedParamID ([[maybe_unused]] AudioProcessorParameter* param)\r
 {\r
-    ignoreUnused (param);\r
-\r
    #if JUCE_DEBUG && ! JUCE_DISABLE_CAUTIOUS_PARAMETER_ID_CHECKING\r
     if (auto* withID = dynamic_cast<AudioProcessorParameterWithID*> (param))\r
     {\r
@@ -476,10 +473,8 @@ void AudioProcessor::checkForDuplicateTrimmedParamID (AudioProcessorParameter* p
    #endif\r
 }\r
 \r
-void AudioProcessor::checkForDuplicateParamID (AudioProcessorParameter* param)\r
+void AudioProcessor::checkForDuplicateParamID ([[maybe_unused]] AudioProcessorParameter* param)\r
 {\r
-    ignoreUnused (param);\r
-\r
    #if JUCE_DEBUG\r
     if (auto* withID = dynamic_cast<AudioProcessorParameterWithID*> (param))\r
     {\r
@@ -491,10 +486,8 @@ void AudioProcessor::checkForDuplicateParamID (AudioProcessorParameter* param)
    #endif\r
 }\r
 \r
-void AudioProcessor::checkForDuplicateGroupIDs (const AudioProcessorParameterGroup& newGroup)\r
+void AudioProcessor::checkForDuplicateGroupIDs ([[maybe_unused]] const AudioProcessorParameterGroup& newGroup)\r
 {\r
-    ignoreUnused (newGroup);\r
-\r
    #if JUCE_DEBUG\r
     auto groups = newGroup.getSubgroups (true);\r
     groups.add (&newGroup);\r
@@ -598,10 +591,9 @@ void AudioProcessor::processBypassed (AudioBuffer<floatType>& buffer, MidiBuffer
 void AudioProcessor::processBlockBypassed (AudioBuffer<float>&  buffer, MidiBuffer& midi)    { processBypassed (buffer, midi); }\r
 void AudioProcessor::processBlockBypassed (AudioBuffer<double>& buffer, MidiBuffer& midi)    { processBypassed (buffer, midi); }\r
 \r
-void AudioProcessor::processBlock (AudioBuffer<double>& buffer, MidiBuffer& midiMessages)\r
+void AudioProcessor::processBlock ([[maybe_unused]] AudioBuffer<double>& buffer,\r
+                                   [[maybe_unused]] MidiBuffer& midiMessages)\r
 {\r
-    ignoreUnused (buffer, midiMessages);\r
-\r
     // If you hit this assertion then either the caller called the double\r
     // precision version of processBlock on a processor which does not support it\r
     // (i.e. supportsDoublePrecisionProcessing() returns false), or the implementation\r
@@ -1493,6 +1485,9 @@ AudioProcessorParameter* AudioProcessor::getParamChecked (int index) const
     return p;\r
 }\r
 \r
+bool AudioProcessor::canAddBus ([[maybe_unused]] bool isInput) const                     { return false; }\r
+bool AudioProcessor::canRemoveBus ([[maybe_unused]] bool isInput) const                  { return false; }\r
+\r
 JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 JUCE_END_IGNORE_WARNINGS_MSVC\r
 \r
index 2ea13dc9d64065dc17f605d7f8d794b3a33660cb..b0acefa927340f8eba4bd042df6efc49b63d6851 100644 (file)
@@ -524,7 +524,7 @@ public:
 \r
          @see addBus\r
     */\r
-    virtual bool canAddBus (bool isInput) const                     { ignoreUnused (isInput); return false; }\r
+    virtual bool canAddBus (bool isInput) const;\r
 \r
     /**  Callback to query if the last bus can currently be removed.\r
 \r
@@ -537,7 +537,7 @@ public:
 \r
          The default implementation will always return false.\r
     */\r
-    virtual bool canRemoveBus (bool isInput) const                  { ignoreUnused (isInput); return false; }\r
+    virtual bool canRemoveBus (bool isInput) const;\r
 \r
     /** Dynamically request an additional bus.\r
 \r
index 3b88ccee001ed552731853196bfb25fc62c7d340..7b20407cca61e129da4f1adbe786eeafb001ada9 100644 (file)
@@ -216,13 +216,11 @@ void AudioProcessorEditor::setScaleFactor (float newScale)
 typedef ComponentPeer* (*createUnityPeerFunctionType) (Component&);\r
 createUnityPeerFunctionType juce_createUnityPeerFn = nullptr;\r
 \r
-ComponentPeer* AudioProcessorEditor::createNewPeer (int styleFlags, void* nativeWindow)\r
+ComponentPeer* AudioProcessorEditor::createNewPeer ([[maybe_unused]] int styleFlags,\r
+                                                    [[maybe_unused]] void* nativeWindow)\r
 {\r
     if (juce_createUnityPeerFn != nullptr)\r
-    {\r
-        ignoreUnused (styleFlags, nativeWindow);\r
         return juce_createUnityPeerFn (*this);\r
-    }\r
 \r
     return Component::createNewPeer (styleFlags, nativeWindow);\r
 }\r
index 218b4ac98ac623947cf5ff370002a2359e609be6..d9ef6303d86b1fc5c632235907c4a2c5b8548cc3 100644 (file)
@@ -498,6 +498,8 @@ struct GraphRenderSequence
         currentAudioInputBuffer = nullptr;\r
     }\r
 \r
+    JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4661)\r
+\r
     void addClearChannelOp (int index)\r
     {\r
         renderOps.push_back ([=] (const Context& c)    { FloatVectorOperations::clear (c.audioBuffers[index], c.numSamples); });\r
@@ -513,6 +515,8 @@ struct GraphRenderSequence
         renderOps.push_back ([=] (const Context& c)    { FloatVectorOperations::add (c.audioBuffers[dstIndex], c.audioBuffers[srcIndex], c.numSamples); });\r
     }\r
 \r
+    JUCE_END_IGNORE_WARNINGS_MSVC\r
+\r
     void addClearMidiBufferOp (int index)\r
     {\r
         renderOps.push_back ([=] (const Context& c)    { c.midiBuffers[index].clear(); });\r
@@ -1405,7 +1409,7 @@ bool AudioProcessorGraph::Connection::operator< (const Connection& other) const
 }\r
 \r
 //==============================================================================\r
-class AudioProcessorGraph::Pimpl : private AsyncUpdater\r
+class AudioProcessorGraph::Pimpl : public AsyncUpdater\r
 {\r
 public:\r
     explicit Pimpl (AudioProcessorGraph& o) : owner (&o) {}\r
@@ -1453,8 +1457,7 @@ public:
         if (lastNodeID < idToUse)\r
             lastNodeID = idToUse;\r
 \r
-        if (auto* ioProc = dynamic_cast<AudioGraphIOProcessor*> (added->getProcessor()))\r
-            ioProc->setParentGraph (owner);\r
+        setParentGraph (added->getProcessor());\r
 \r
         topologyChanged (updateKind);\r
         return added;\r
@@ -1606,6 +1609,12 @@ public:
     auto* getAudioThreadState() const { return renderSequenceExchange.getAudioThreadState(); }\r
 \r
 private:\r
+    void setParentGraph (AudioProcessor* p) const\r
+    {\r
+        if (auto* ioProc = dynamic_cast<AudioGraphIOProcessor*> (p))\r
+            ioProc->setParentGraph (owner);\r
+    }\r
+\r
     void topologyChanged (UpdateKind updateKind)\r
     {\r
         owner->sendChangeMessage();\r
@@ -1620,6 +1629,9 @@ private:
     {\r
         if (const auto newSettings = nodeStates.applySettings (nodes))\r
         {\r
+            for (const auto node : nodes.getNodes())\r
+                setParentGraph (node->getProcessor());\r
+\r
             auto sequence = std::make_unique<RenderSequence> (*newSettings, nodes, connections);\r
             owner->setLatencySamples (sequence->getLatencySamples());\r
             renderSequenceExchange.set (std::move (sequence));\r
index ad90849480eae9dc462f3b0ae873f837eb8f1710..d153c3d28912728399be46dab961efada84abc1a 100644 (file)
@@ -102,6 +102,8 @@ class ParameterComponent : public Component,
 {\r
 public:\r
     using ParameterListener::ParameterListener;\r
+\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParameterComponent)\r
 };\r
 \r
 //==============================================================================\r
index 0485808ddbe3af747d8f6f2d33aca48e07b419ce..f72d160ca638762d3de973207e546bd5886ce8af 100644 (file)
@@ -32,7 +32,7 @@ namespace juce
 \r
     @tags{Audio}\r
 */\r
-struct HostedAudioProcessorParameter : public AudioProcessorParameter\r
+struct JUCE_API  HostedAudioProcessorParameter : public AudioProcessorParameter\r
 {\r
     using AudioProcessorParameter::AudioProcessorParameter;\r
 \r
index dc7414c5b3ed1a8c29fafa0509324c50f41be9e7..6e819cda74f65009f605d2f52a153c8511b34014 100644 (file)
@@ -834,138 +834,122 @@ ARAEditorView* ARADocumentControllerSpecialisation::doCreateEditorView()
     return new ARAEditorView (getDocumentController());\r
 }\r
 \r
-bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAvailable (const ARA::PlugIn::AudioSource* audioSource,\r
-                                                                           ARA::ARAContentType type)\r
+bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAvailable ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource,\r
+                                                                           [[maybe_unused]] ARA::ARAContentType type)\r
 {\r
-    juce::ignoreUnused (audioSource, type);\r
     return false;\r
 }\r
 \r
-ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioSourceContentGrade (const ARA::PlugIn::AudioSource* audioSource,\r
-                                                                                        ARA::ARAContentType type)\r
+ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioSourceContentGrade ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource,\r
+                                                                                        [[maybe_unused]] ARA::ARAContentType type)\r
 {\r
     // Overriding doIsAudioSourceContentAvailable() requires overriding\r
     // doGetAudioSourceContentGrade() accordingly!\r
     jassertfalse;\r
 \r
-    juce::ignoreUnused (audioSource, type);\r
     return ARA::kARAContentGradeInitial;\r
 }\r
 \r
-ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioSourceContentReader (ARA::PlugIn::AudioSource* audioSource,\r
-                                                                                                   ARA::ARAContentType type,\r
-                                                                                                   const ARA::ARAContentTimeRange* range)\r
+ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioSourceContentReader ([[maybe_unused]] ARA::PlugIn::AudioSource* audioSource,\r
+                                                                                                   [[maybe_unused]] ARA::ARAContentType type,\r
+                                                                                                   [[maybe_unused]] const ARA::ARAContentTimeRange* range)\r
 {\r
     // Overriding doIsAudioSourceContentAvailable() requires overriding\r
     // doCreateAudioSourceContentReader() accordingly!\r
     jassertfalse;\r
 \r
-    juce::ignoreUnused (audioSource, type, range);\r
     return nullptr;\r
 }\r
 \r
-bool ARADocumentControllerSpecialisation::doIsAudioModificationContentAvailable (const ARA::PlugIn::AudioModification* audioModification,\r
-                                                                                 ARA::ARAContentType type)\r
+bool ARADocumentControllerSpecialisation::doIsAudioModificationContentAvailable ([[maybe_unused]] const ARA::PlugIn::AudioModification* audioModification,\r
+                                                                                 [[maybe_unused]] ARA::ARAContentType type)\r
 {\r
-    juce::ignoreUnused (audioModification, type);\r
     return false;\r
 }\r
 \r
-ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioModificationContentGrade (const ARA::PlugIn::AudioModification* audioModification,\r
-                                                                                              ARA::ARAContentType type)\r
+ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetAudioModificationContentGrade ([[maybe_unused]] const ARA::PlugIn::AudioModification* audioModification,\r
+                                                                                              [[maybe_unused]] ARA::ARAContentType type)\r
 {\r
     // Overriding doIsAudioModificationContentAvailable() requires overriding\r
     // doGetAudioModificationContentGrade() accordingly!\r
     jassertfalse;\r
 \r
-    juce::ignoreUnused (audioModification, type);\r
     return ARA::kARAContentGradeInitial;\r
 }\r
 \r
-ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioModificationContentReader (ARA::PlugIn::AudioModification* audioModification,\r
-                                                                                                         ARA::ARAContentType type,\r
-                                                                                                         const ARA::ARAContentTimeRange* range)\r
+ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreateAudioModificationContentReader ([[maybe_unused]] ARA::PlugIn::AudioModification* audioModification,\r
+                                                                                                         [[maybe_unused]] ARA::ARAContentType type,\r
+                                                                                                         [[maybe_unused]] const ARA::ARAContentTimeRange* range)\r
 {\r
     // Overriding doIsAudioModificationContentAvailable() requires overriding\r
     // doCreateAudioModificationContentReader() accordingly!\r
     jassertfalse;\r
 \r
-    juce::ignoreUnused (audioModification, type, range);\r
     return nullptr;\r
 }\r
 \r
-bool ARADocumentControllerSpecialisation::doIsPlaybackRegionContentAvailable (const ARA::PlugIn::PlaybackRegion* playbackRegion,\r
-                                                                              ARA::ARAContentType type)\r
+bool ARADocumentControllerSpecialisation::doIsPlaybackRegionContentAvailable ([[maybe_unused]] const ARA::PlugIn::PlaybackRegion* playbackRegion,\r
+                                                                              [[maybe_unused]] ARA::ARAContentType type)\r
 {\r
-    juce::ignoreUnused (playbackRegion, type);\r
     return false;\r
 }\r
 \r
-ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetPlaybackRegionContentGrade (const ARA::PlugIn::PlaybackRegion* playbackRegion,\r
-                                                                                           ARA::ARAContentType type)\r
+ARA::ARAContentGrade ARADocumentControllerSpecialisation::doGetPlaybackRegionContentGrade ([[maybe_unused]] const ARA::PlugIn::PlaybackRegion* playbackRegion,\r
+                                                                                           [[maybe_unused]] ARA::ARAContentType type)\r
 {\r
     // Overriding doIsPlaybackRegionContentAvailable() requires overriding\r
     // doGetPlaybackRegionContentGrade() accordingly!\r
     jassertfalse;\r
 \r
-    juce::ignoreUnused (playbackRegion, type);\r
     return ARA::kARAContentGradeInitial;\r
 }\r
 \r
-ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreatePlaybackRegionContentReader (ARA::PlugIn::PlaybackRegion* playbackRegion,\r
-                                                                                                      ARA::ARAContentType type,\r
-                                                                                                      const ARA::ARAContentTimeRange* range)\r
+ARA::PlugIn::ContentReader* ARADocumentControllerSpecialisation::doCreatePlaybackRegionContentReader ([[maybe_unused]] ARA::PlugIn::PlaybackRegion* playbackRegion,\r
+                                                                                                      [[maybe_unused]] ARA::ARAContentType type,\r
+                                                                                                      [[maybe_unused]] const ARA::ARAContentTimeRange* range)\r
 {\r
     // Overriding doIsPlaybackRegionContentAvailable() requires overriding\r
     // doCreatePlaybackRegionContentReader() accordingly!\r
     jassertfalse;\r
 \r
-    juce::ignoreUnused (playbackRegion, type, range);\r
     return nullptr;\r
 }\r
 \r
-bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAnalysisIncomplete (const ARA::PlugIn::AudioSource* audioSource,\r
-                                                                                    ARA::ARAContentType type)\r
+bool ARADocumentControllerSpecialisation::doIsAudioSourceContentAnalysisIncomplete ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource,\r
+                                                                                    [[maybe_unused]] ARA::ARAContentType type)\r
 {\r
-    juce::ignoreUnused (audioSource, type);\r
     return false;\r
 }\r
 \r
-void ARADocumentControllerSpecialisation::doRequestAudioSourceContentAnalysis (ARA::PlugIn::AudioSource* audioSource,\r
-                                                                               std::vector<ARA::ARAContentType> const& contentTypes)\r
+void ARADocumentControllerSpecialisation::doRequestAudioSourceContentAnalysis ([[maybe_unused]] ARA::PlugIn::AudioSource* audioSource,\r
+                                                                               [[maybe_unused]] std::vector<ARA::ARAContentType> const& contentTypes)\r
 {\r
-    juce::ignoreUnused (audioSource, contentTypes);\r
 }\r
 \r
 ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmsCount() { return 0; }\r
 \r
 const ARA::ARAProcessingAlgorithmProperties*\r
-    ARADocumentControllerSpecialisation::doGetProcessingAlgorithmProperties (ARA::ARAInt32 algorithmIndex)\r
+    ARADocumentControllerSpecialisation::doGetProcessingAlgorithmProperties ([[maybe_unused]] ARA::ARAInt32 algorithmIndex)\r
 {\r
-    juce::ignoreUnused (algorithmIndex);\r
     return nullptr;\r
 }\r
 \r
-ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmForAudioSource (const ARA::PlugIn::AudioSource* audioSource)\r
+ARA::ARAInt32 ARADocumentControllerSpecialisation::doGetProcessingAlgorithmForAudioSource ([[maybe_unused]] const ARA::PlugIn::AudioSource* audioSource)\r
 {\r
     // doGetProcessingAlgorithmForAudioSource() must be implemented if the supported\r
     // algorithm count is greater than zero.\r
     if (getDocumentController()->getProcessingAlgorithmsCount() > 0)\r
         jassertfalse;\r
 \r
-    juce::ignoreUnused (audioSource);\r
     return 0;\r
 }\r
 \r
-void ARADocumentControllerSpecialisation::doRequestProcessingAlgorithmForAudioSource (ARA::PlugIn::AudioSource* audioSource,\r
-                                                                                      ARA::ARAInt32 algorithmIndex)\r
+void ARADocumentControllerSpecialisation::doRequestProcessingAlgorithmForAudioSource ([[maybe_unused]] ARA::PlugIn::AudioSource* audioSource,\r
+                                                                                      [[maybe_unused]] ARA::ARAInt32 algorithmIndex)\r
 {\r
     // doRequestProcessingAlgorithmForAudioSource() must be implemented if the supported\r
     // algorithm count is greater than zero.\r
-    if (getDocumentController()->getProcessingAlgorithmsCount() > 0)\r
-        jassertfalse;\r
-\r
-    juce::ignoreUnused (audioSource, algorithmIndex);\r
+    jassert (getDocumentController()->getProcessingAlgorithmsCount() <= 0);\r
 }\r
 \r
 } // namespace juce\r
index 918aee434e7efe9c85a13b65a5cc40d6e45e03d4..3db14330272b8005106c0929ef44bfc2bf732139 100644 (file)
@@ -196,4 +196,98 @@ void ARAPlaybackRegion::notifyContentChanged (ARAContentUpdateScopes scopeFlags,
                                                                                                 notifyARAHost);\r
 }\r
 \r
+//==============================================================================\r
+void ARADocumentListener::willBeginEditing ([[maybe_unused]] ARADocument* document) {}\r
+void ARADocumentListener::didEndEditing ([[maybe_unused]] ARADocument* document) {}\r
+void ARADocumentListener::willNotifyModelUpdates ([[maybe_unused]] ARADocument* document) {}\r
+void ARADocumentListener::didNotifyModelUpdates ([[maybe_unused]] ARADocument* document) {}\r
+void ARADocumentListener::willUpdateDocumentProperties ([[maybe_unused]] ARADocument* document,\r
+                                                        [[maybe_unused]] ARA::PlugIn::PropertiesPtr<ARA::ARADocumentProperties> newProperties) {}\r
+void ARADocumentListener::didUpdateDocumentProperties ([[maybe_unused]] ARADocument* document) {}\r
+void ARADocumentListener::didAddMusicalContextToDocument ([[maybe_unused]] ARADocument* document,\r
+                                                          [[maybe_unused]] ARAMusicalContext* musicalContext) {}\r
+void ARADocumentListener::willRemoveMusicalContextFromDocument ([[maybe_unused]] ARADocument* document,\r
+                                                                [[maybe_unused]] ARAMusicalContext* musicalContext) {}\r
+void ARADocumentListener::didReorderMusicalContextsInDocument ([[maybe_unused]] ARADocument* document) {}\r
+void ARADocumentListener::didAddRegionSequenceToDocument ([[maybe_unused]] ARADocument* document,\r
+                                                          [[maybe_unused]] ARARegionSequence* regionSequence) {}\r
+void ARADocumentListener::willRemoveRegionSequenceFromDocument ([[maybe_unused]] ARADocument* document,\r
+                                                                [[maybe_unused]] ARARegionSequence* regionSequence) {}\r
+void ARADocumentListener::didReorderRegionSequencesInDocument ([[maybe_unused]] ARADocument* document) {}\r
+void ARADocumentListener::didAddAudioSourceToDocument ([[maybe_unused]] ARADocument* document,\r
+                                                       [[maybe_unused]] ARAAudioSource* audioSource) {}\r
+void ARADocumentListener::willRemoveAudioSourceFromDocument ([[maybe_unused]] ARADocument* document,\r
+                                                             [[maybe_unused]] ARAAudioSource* audioSource) {}\r
+void ARADocumentListener::willDestroyDocument ([[maybe_unused]] ARADocument* document) {}\r
+\r
+//==============================================================================\r
+void ARAMusicalContextListener::willUpdateMusicalContextProperties ([[maybe_unused]] ARAMusicalContext* musicalContext,\r
+                                                                    [[maybe_unused]] ARA::PlugIn::PropertiesPtr<ARA::ARAMusicalContextProperties> newProperties) {}\r
+void ARAMusicalContextListener::didUpdateMusicalContextProperties ([[maybe_unused]] ARAMusicalContext* musicalContext) {}\r
+void ARAMusicalContextListener::doUpdateMusicalContextContent ([[maybe_unused]] ARAMusicalContext* musicalContext,\r
+                                                               [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {}\r
+void ARAMusicalContextListener::didAddRegionSequenceToMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext,\r
+                                                                      [[maybe_unused]] ARARegionSequence* regionSequence) {}\r
+void ARAMusicalContextListener::willRemoveRegionSequenceFromMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext,\r
+                                                                            [[maybe_unused]] ARARegionSequence* regionSequence) {}\r
+void ARAMusicalContextListener::didReorderRegionSequencesInMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext) {}\r
+void ARAMusicalContextListener::willDestroyMusicalContext ([[maybe_unused]] ARAMusicalContext* musicalContext) {}\r
+\r
+//==============================================================================\r
+void ARAPlaybackRegionListener::willUpdatePlaybackRegionProperties ([[maybe_unused]] ARAPlaybackRegion* playbackRegion,\r
+                                                                    [[maybe_unused]] ARA::PlugIn::PropertiesPtr<ARA::ARAPlaybackRegionProperties> newProperties) {}\r
+void ARAPlaybackRegionListener::didUpdatePlaybackRegionProperties ([[maybe_unused]] ARAPlaybackRegion* playbackRegion) {}\r
+void ARAPlaybackRegionListener::didUpdatePlaybackRegionContent ([[maybe_unused]] ARAPlaybackRegion* playbackRegion,\r
+                                                                [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {}\r
+void ARAPlaybackRegionListener::willDestroyPlaybackRegion ([[maybe_unused]] ARAPlaybackRegion* playbackRegion) {}\r
+\r
+//==============================================================================\r
+void ARARegionSequenceListener::willUpdateRegionSequenceProperties ([[maybe_unused]] ARARegionSequence* regionSequence,\r
+                                                                    [[maybe_unused]] ARA::PlugIn::PropertiesPtr<ARA::ARARegionSequenceProperties> newProperties) {}\r
+void ARARegionSequenceListener::didUpdateRegionSequenceProperties ([[maybe_unused]] ARARegionSequence* regionSequence) {}\r
+void ARARegionSequenceListener::willRemovePlaybackRegionFromRegionSequence ([[maybe_unused]] ARARegionSequence* regionSequence,\r
+                                                                            [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {}\r
+void ARARegionSequenceListener::didAddPlaybackRegionToRegionSequence ([[maybe_unused]] ARARegionSequence* regionSequence,\r
+                                                                      [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {}\r
+void ARARegionSequenceListener::willDestroyRegionSequence ([[maybe_unused]] ARARegionSequence* regionSequence) {}\r
+\r
+//==============================================================================\r
+void ARAAudioSourceListener::willUpdateAudioSourceProperties ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                              [[maybe_unused]] ARA::PlugIn::PropertiesPtr<ARA::ARAAudioSourceProperties> newProperties) {}\r
+void ARAAudioSourceListener::didUpdateAudioSourceProperties ([[maybe_unused]] ARAAudioSource* audioSource) {}\r
+void ARAAudioSourceListener::doUpdateAudioSourceContent ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                         [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {}\r
+void ARAAudioSourceListener::didUpdateAudioSourceAnalysisProgress ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                                   [[maybe_unused]] ARA::ARAAnalysisProgressState state,\r
+                                                                   [[maybe_unused]] float progress) {}\r
+void ARAAudioSourceListener::willEnableAudioSourceSamplesAccess ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                                 [[maybe_unused]] bool enable) {}\r
+void ARAAudioSourceListener::didEnableAudioSourceSamplesAccess ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                                [[maybe_unused]] bool enable) {}\r
+void ARAAudioSourceListener::willDeactivateAudioSourceForUndoHistory ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                                      [[maybe_unused]] bool deactivate) {}\r
+void ARAAudioSourceListener::didDeactivateAudioSourceForUndoHistory ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                                     [[maybe_unused]] bool deactivate) {}\r
+void ARAAudioSourceListener::didAddAudioModificationToAudioSource ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                                   [[maybe_unused]] ARAAudioModification* audioModification) {}\r
+void ARAAudioSourceListener::willRemoveAudioModificationFromAudioSource ([[maybe_unused]] ARAAudioSource* audioSource,\r
+                                                                         [[maybe_unused]] ARAAudioModification* audioModification) {}\r
+void ARAAudioSourceListener::willDestroyAudioSource ([[maybe_unused]] ARAAudioSource* audioSource) {}\r
+\r
+//==============================================================================\r
+void ARAAudioModificationListener::willUpdateAudioModificationProperties ([[maybe_unused]] ARAAudioModification* audioModification,\r
+                                                                          [[maybe_unused]] ARA::PlugIn::PropertiesPtr<ARA::ARAAudioModificationProperties> newProperties) {}\r
+void ARAAudioModificationListener::didUpdateAudioModificationProperties ([[maybe_unused]] ARAAudioModification* audioModification) {}\r
+void ARAAudioModificationListener::didUpdateAudioModificationContent ([[maybe_unused]] ARAAudioModification* audioModification,\r
+                                                                      [[maybe_unused]] ARAContentUpdateScopes scopeFlags) {}\r
+void ARAAudioModificationListener::willDeactivateAudioModificationForUndoHistory ([[maybe_unused]] ARAAudioModification* audioModification,\r
+                                                                                  [[maybe_unused]] bool deactivate) {}\r
+void ARAAudioModificationListener::didDeactivateAudioModificationForUndoHistory ([[maybe_unused]] ARAAudioModification* audioModification,\r
+                                                                                 [[maybe_unused]] bool deactivate) {}\r
+void ARAAudioModificationListener::didAddPlaybackRegionToAudioModification ([[maybe_unused]] ARAAudioModification* audioModification,\r
+                                                                            [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {}\r
+void ARAAudioModificationListener::willRemovePlaybackRegionFromAudioModification ([[maybe_unused]] ARAAudioModification* audioModification,\r
+                                                                                  [[maybe_unused]] ARAPlaybackRegion* playbackRegion) {}\r
+void ARAAudioModificationListener::willDestroyAudioModification ([[maybe_unused]] ARAAudioModification* audioModification) {}\r
+\r
 } // namespace juce\r
index e5434e3c7bfab3e31ff70fc3a5233c0356c80467..2f3096f2f8141f02150f352ece17aa1ba03a1d49 100644 (file)
@@ -181,76 +181,49 @@ public:
     /** Destructor */\r
     virtual ~ARADocumentListener() = default;\r
 \r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN\r
-\r
     /** Called before the document enters an editing state.\r
         @param document The document about to enter an editing state.\r
     */\r
-    virtual void willBeginEditing (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
+    virtual void willBeginEditing (ARADocument* document);\r
 \r
     /** Called after the document exits an editing state.\r
         @param document The document about exit an editing state.\r
     */\r
-    virtual void didEndEditing (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
+    virtual void didEndEditing (ARADocument* document);\r
 \r
     /** Called before sending model updates do the host.\r
         @param document The document whose model updates are about to be sent.\r
     */\r
-    virtual void willNotifyModelUpdates (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
+    virtual void willNotifyModelUpdates (ARADocument* document);\r
 \r
     /** Called after sending model updates do the host.\r
         @param document The document whose model updates have just been sent.\r
     */\r
-    virtual void didNotifyModelUpdates (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
+    virtual void didNotifyModelUpdates (ARADocument* document);\r
 \r
     /** Called before the document's properties are updated.\r
         @param document The document whose properties will be updated.\r
         @param newProperties The document properties that will be assigned to \p document.\r
     */\r
     virtual void willUpdateDocumentProperties (ARADocument* document,\r
-                                               ARA::PlugIn::PropertiesPtr<ARA::ARADocumentProperties> newProperties)\r
-    {\r
-        ignoreUnused (document, newProperties);\r
-    }\r
+                                               ARA::PlugIn::PropertiesPtr<ARA::ARADocumentProperties> newProperties);\r
 \r
     /** Called after the document's properties are updated.\r
         @param document The document whose properties were updated.\r
     */\r
-    virtual void didUpdateDocumentProperties (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
+    virtual void didUpdateDocumentProperties (ARADocument* document);\r
 \r
     /** Called after a musical context is added to the document.\r
         @param document The document that \p musicalContext was added to.\r
         @param musicalContext The musical context that was added to \p document.\r
     */\r
-    virtual void didAddMusicalContextToDocument (ARADocument* document, ARAMusicalContext* musicalContext)\r
-    {\r
-        ignoreUnused (document, musicalContext);\r
-    }\r
+    virtual void didAddMusicalContextToDocument (ARADocument* document, ARAMusicalContext* musicalContext);\r
 \r
     /** Called before a musical context is removed from the document.\r
         @param document The document that \p musicalContext will be removed from.\r
         @param musicalContext The musical context that will be removed from \p document.\r
     */\r
-    virtual void willRemoveMusicalContextFromDocument (ARADocument* document,\r
-                                                       ARAMusicalContext* musicalContext)\r
-    {\r
-        ignoreUnused (document, musicalContext);\r
-    }\r
+    virtual void willRemoveMusicalContextFromDocument (ARADocument* document, ARAMusicalContext* musicalContext);\r
 \r
     /** Called after the musical contexts are reordered in an ARA document\r
 \r
@@ -259,29 +232,19 @@ public:
 \r
         @param document The document with reordered musical contexts.\r
     */\r
-    virtual void didReorderMusicalContextsInDocument (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
+    virtual void didReorderMusicalContextsInDocument (ARADocument* document);\r
 \r
     /** Called after a region sequence is added to the document.\r
         @param document The document that \p regionSequence was added to.\r
         @param regionSequence The region sequence that was added to \p document.\r
     */\r
-    virtual void didAddRegionSequenceToDocument (ARADocument* document, ARARegionSequence* regionSequence)\r
-    {\r
-        ignoreUnused (document, regionSequence);\r
-    }\r
+    virtual void didAddRegionSequenceToDocument (ARADocument* document, ARARegionSequence* regionSequence);\r
 \r
     /** Called before a region sequence is removed from the document.\r
         @param document The document that \p regionSequence will be removed from.\r
         @param regionSequence The region sequence that will be removed from \p document.\r
     */\r
-    virtual void willRemoveRegionSequenceFromDocument (ARADocument* document,\r
-                                                       ARARegionSequence* regionSequence)\r
-    {\r
-        ignoreUnused (document, regionSequence);\r
-    }\r
+    virtual void willRemoveRegionSequenceFromDocument (ARADocument* document, ARARegionSequence* regionSequence);\r
 \r
     /** Called after the region sequences are reordered in an ARA document\r
 \r
@@ -290,38 +253,24 @@ public:
 \r
         @param document The document with reordered region sequences.\r
     */\r
-    virtual void didReorderRegionSequencesInDocument (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
+    virtual void didReorderRegionSequencesInDocument (ARADocument* document);\r
 \r
     /** Called after an audio source is added to the document.\r
         @param document The document that \p audioSource was added to.\r
         @param audioSource The audio source that was added to \p document.\r
     */\r
-    virtual void didAddAudioSourceToDocument (ARADocument* document, ARAAudioSource* audioSource)\r
-    {\r
-        ignoreUnused (document, audioSource);\r
-    }\r
+    virtual void didAddAudioSourceToDocument (ARADocument* document, ARAAudioSource* audioSource);\r
 \r
     /** Called before an audio source is removed from the document.\r
         @param document The document that \p audioSource will be removed from .\r
         @param audioSource The audio source that will be removed from \p document.\r
     */\r
-    virtual void willRemoveAudioSourceFromDocument (ARADocument* document, ARAAudioSource* audioSource)\r
-    {\r
-        ignoreUnused (document, audioSource);\r
-    }\r
+    virtual void willRemoveAudioSourceFromDocument (ARADocument* document, ARAAudioSource* audioSource);\r
 \r
     /** Called before the document is destroyed by the ARA host.\r
         @param document The document that will be destroyed.\r
     */\r
-    virtual void willDestroyDocument (ARADocument* document)\r
-    {\r
-        ignoreUnused (document);\r
-    }\r
-\r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END\r
+    virtual void willDestroyDocument (ARADocument* document);\r
 };\r
 \r
 //==============================================================================\r
@@ -395,55 +344,36 @@ class JUCE_API  ARAMusicalContextListener
 public:\r
     virtual ~ARAMusicalContextListener() = default;\r
 \r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN\r
-\r
     /** Called before the musical context's properties are updated.\r
         @param musicalContext The musical context whose properties will be updated.\r
         @param newProperties The musical context properties that will be assigned to \p musicalContext.\r
     */\r
     virtual void willUpdateMusicalContextProperties (ARAMusicalContext* musicalContext,\r
-                                                     ARA::PlugIn::PropertiesPtr<ARA::ARAMusicalContextProperties> newProperties)\r
-    {\r
-        ignoreUnused (musicalContext, newProperties);\r
-    }\r
+                                                     ARA::PlugIn::PropertiesPtr<ARA::ARAMusicalContextProperties> newProperties);\r
 \r
     /** Called after the musical context's properties are updated by the host.\r
         @param musicalContext The musical context whose properties were updated.\r
     */\r
-    virtual void didUpdateMusicalContextProperties (ARAMusicalContext* musicalContext)\r
-    {\r
-        ignoreUnused (musicalContext);\r
-    }\r
+    virtual void didUpdateMusicalContextProperties (ARAMusicalContext* musicalContext);\r
 \r
     /** Called when the musical context's content (i.e tempo entries or chords) changes.\r
         @param musicalContext The musical context with updated content.\r
         @param scopeFlags The scope of the content update indicating what has changed.\r
     */\r
-    virtual void doUpdateMusicalContextContent (ARAMusicalContext* musicalContext,\r
-                                                ARAContentUpdateScopes scopeFlags)\r
-    {\r
-        ignoreUnused (musicalContext, scopeFlags);\r
-    }\r
+    virtual void doUpdateMusicalContextContent (ARAMusicalContext* musicalContext, ARAContentUpdateScopes scopeFlags);\r
 \r
     /** Called after a region sequence is added to the musical context.\r
         @param musicalContext The musical context that \p regionSequence was added to.\r
         @param regionSequence The region sequence that was added to \p musicalContext.\r
     */\r
-    virtual void didAddRegionSequenceToMusicalContext (ARAMusicalContext* musicalContext,\r
-                                                       ARARegionSequence* regionSequence)\r
-    {\r
-        ignoreUnused (musicalContext, regionSequence);\r
-    }\r
+    virtual void didAddRegionSequenceToMusicalContext (ARAMusicalContext* musicalContext, ARARegionSequence* regionSequence);\r
 \r
     /** Called before a region sequence is removed from the musical context.\r
         @param musicalContext The musical context that \p regionSequence will be removed from.\r
         @param regionSequence The region sequence that will be removed from \p musicalContext.\r
     */\r
     virtual void willRemoveRegionSequenceFromMusicalContext (ARAMusicalContext* musicalContext,\r
-                                                             ARARegionSequence* regionSequence)\r
-    {\r
-        ignoreUnused (musicalContext, regionSequence);\r
-    }\r
+                                                             ARARegionSequence* regionSequence);\r
 \r
     /** Called after the region sequences are reordered in an ARA MusicalContext\r
 \r
@@ -452,20 +382,12 @@ public:
 \r
         @param musicalContext The musical context with reordered region sequences.\r
     */\r
-    virtual void didReorderRegionSequencesInMusicalContext (ARAMusicalContext* musicalContext)\r
-    {\r
-        ignoreUnused (musicalContext);\r
-    }\r
+    virtual void didReorderRegionSequencesInMusicalContext (ARAMusicalContext* musicalContext);\r
 \r
     /** Called before the musical context is destroyed.\r
         @param musicalContext The musical context that will be destroyed.\r
     */\r
-    virtual void willDestroyMusicalContext (ARAMusicalContext* musicalContext)\r
-    {\r
-        ignoreUnused (musicalContext);\r
-    }\r
-\r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END\r
+    virtual void willDestroyMusicalContext (ARAMusicalContext* musicalContext);\r
 };\r
 \r
 //==============================================================================\r
@@ -528,45 +450,29 @@ public:
     /** Destructor. */\r
     virtual ~ARAPlaybackRegionListener() = default;\r
 \r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN\r
-\r
     /** Called before the playback region's properties are updated.\r
         @param playbackRegion The playback region whose properties will be updated.\r
         @param newProperties The playback region properties that will be assigned to \p playbackRegion.\r
     */\r
     virtual void willUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion,\r
-                                                     ARA::PlugIn::PropertiesPtr<ARA::ARAPlaybackRegionProperties> newProperties)\r
-    {\r
-        ignoreUnused (playbackRegion, newProperties);\r
-    }\r
+                                                     ARA::PlugIn::PropertiesPtr<ARA::ARAPlaybackRegionProperties> newProperties);\r
 \r
     /** Called after the playback region's properties are updated.\r
         @param playbackRegion The playback region whose properties were updated.\r
     */\r
-    virtual void didUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion)\r
-    {\r
-        ignoreUnused (playbackRegion);\r
-    }\r
+    virtual void didUpdatePlaybackRegionProperties (ARAPlaybackRegion* playbackRegion);\r
 \r
     /** Called when the playback region's content (i.e. samples or notes) changes.\r
         @param playbackRegion The playback region with updated content.\r
         @param scopeFlags The scope of the content update.\r
     */\r
     virtual void didUpdatePlaybackRegionContent (ARAPlaybackRegion* playbackRegion,\r
-                                                 ARAContentUpdateScopes scopeFlags)\r
-    {\r
-        ignoreUnused (playbackRegion, scopeFlags);\r
-    }\r
+                                                 ARAContentUpdateScopes scopeFlags);\r
 \r
     /** Called before the playback region is destroyed.\r
         @param playbackRegion The playback region that will be destroyed.\r
     */\r
-    virtual void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion)\r
-    {\r
-        ignoreUnused (playbackRegion);\r
-    }\r
-\r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END\r
+    virtual void willDestroyPlaybackRegion (ARAPlaybackRegion* playbackRegion);\r
 };\r
 \r
 //==============================================================================\r
@@ -665,55 +571,36 @@ public:
     /** Destructor. */\r
     virtual ~ARARegionSequenceListener() = default;\r
 \r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN\r
-\r
     /** Called before the region sequence's properties are updated.\r
         @param regionSequence The region sequence whose properties will be updated.\r
         @param newProperties The region sequence properties that will be assigned to \p regionSequence.\r
     */\r
     virtual void willUpdateRegionSequenceProperties (ARARegionSequence* regionSequence,\r
-                                                     ARA::PlugIn::PropertiesPtr<ARA::ARARegionSequenceProperties> newProperties)\r
-    {\r
-        ignoreUnused (regionSequence, newProperties);\r
-    }\r
+                                                     ARA::PlugIn::PropertiesPtr<ARA::ARARegionSequenceProperties> newProperties);\r
 \r
     /** Called after the region sequence's properties are updated.\r
         @param regionSequence The region sequence whose properties were updated.\r
     */\r
-    virtual void didUpdateRegionSequenceProperties (ARARegionSequence* regionSequence)\r
-    {\r
-        ignoreUnused (regionSequence);\r
-    }\r
+    virtual void didUpdateRegionSequenceProperties (ARARegionSequence* regionSequence);\r
 \r
     /** Called before a playback region is removed from the region sequence.\r
         @param regionSequence The region sequence that \p playbackRegion will be removed from.\r
         @param playbackRegion The playback region that will be removed from \p regionSequence.\r
     */\r
     virtual void willRemovePlaybackRegionFromRegionSequence (ARARegionSequence* regionSequence,\r
-                                                             ARAPlaybackRegion* playbackRegion)\r
-    {\r
-        ignoreUnused (regionSequence, playbackRegion);\r
-    }\r
+                                                             ARAPlaybackRegion* playbackRegion);\r
 \r
     /** Called after a playback region is added to the region sequence.\r
         @param regionSequence The region sequence that \p playbackRegion was added to.\r
         @param playbackRegion The playback region that was added to \p regionSequence.\r
     */\r
     virtual void didAddPlaybackRegionToRegionSequence (ARARegionSequence* regionSequence,\r
-                                                       ARAPlaybackRegion* playbackRegion)\r
-    {\r
-        ignoreUnused (regionSequence, playbackRegion);\r
-    }\r
+                                                       ARAPlaybackRegion* playbackRegion);\r
 \r
     /** Called before the region sequence is destroyed.\r
         @param regionSequence The region sequence that will be destroyed.\r
     */\r
-    virtual void willDestroyRegionSequence (ARARegionSequence* regionSequence)\r
-    {\r
-        ignoreUnused (regionSequence);\r
-    }\r
-\r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END\r
+    virtual void willDestroyRegionSequence (ARARegionSequence* regionSequence);\r
 };\r
 \r
 //==============================================================================\r
@@ -800,34 +687,23 @@ public:
     /** Destructor. */\r
     virtual ~ARAAudioSourceListener() = default;\r
 \r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN\r
-\r
     /** Called before the audio source's properties are updated.\r
         @param audioSource The audio source whose properties will be updated.\r
         @param newProperties The audio source properties that will be assigned to \p audioSource.\r
     */\r
     virtual void willUpdateAudioSourceProperties (ARAAudioSource* audioSource,\r
-                                                  ARA::PlugIn::PropertiesPtr<ARA::ARAAudioSourceProperties> newProperties)\r
-    {\r
-        ignoreUnused (audioSource, newProperties);\r
-    }\r
+                                                  ARA::PlugIn::PropertiesPtr<ARA::ARAAudioSourceProperties> newProperties);\r
 \r
     /** Called after the audio source's properties are updated.\r
         @param audioSource The audio source whose properties were updated.\r
     */\r
-    virtual void didUpdateAudioSourceProperties (ARAAudioSource* audioSource)\r
-    {\r
-        ignoreUnused (audioSource);\r
-    }\r
+    virtual void didUpdateAudioSourceProperties (ARAAudioSource* audioSource);\r
 \r
     /** Called when the audio source's content (i.e. samples or notes) changes.\r
         @param audioSource The audio source with updated content.\r
         @param scopeFlags The scope of the content update.\r
     */\r
-    virtual void doUpdateAudioSourceContent (ARAAudioSource* audioSource, ARAContentUpdateScopes scopeFlags)\r
-    {\r
-        ignoreUnused (audioSource, scopeFlags);\r
-    }\r
+    virtual void doUpdateAudioSourceContent (ARAAudioSource* audioSource, ARAContentUpdateScopes scopeFlags);\r
 \r
     /** Called to notify progress when an audio source is being analyzed.\r
         @param audioSource The audio source being analyzed.\r
@@ -836,76 +712,54 @@ public:
     */\r
     virtual void didUpdateAudioSourceAnalysisProgress (ARAAudioSource* audioSource,\r
                                                        ARA::ARAAnalysisProgressState state,\r
-                                                       float progress)\r
-    {\r
-        ignoreUnused (audioSource, state, progress);\r
-    }\r
+                                                       float progress);\r
 \r
     /** Called before access to an audio source's samples is enabled or disabled.\r
         @param audioSource The audio source whose sample access state will be changed.\r
         @param enable A bool indicating whether or not sample access will be enabled or disabled.\r
     */\r
-    virtual void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable)\r
-    {\r
-        ignoreUnused (audioSource, enable);\r
-    }\r
+    virtual void willEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource,\r
+                                                     bool enable);\r
 \r
     /** Called after access to an audio source's samples is enabled or disabled.\r
         @param audioSource The audio source whose sample access state was changed.\r
         @param enable A bool indicating whether or not sample access was enabled or disabled.\r
     */\r
-    virtual void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource, bool enable)\r
-    {\r
-        ignoreUnused (audioSource, enable);\r
-    }\r
+    virtual void didEnableAudioSourceSamplesAccess (ARAAudioSource* audioSource,\r
+                                                    bool enable);\r
 \r
     /** Called before an audio source is activated or deactivated when being removed / added from the host's undo history.\r
         @param audioSource The audio source that will be activated or deactivated\r
         @param deactivate A bool indicating whether \p audioSource was deactivated or activated.\r
     */\r
-    virtual void willDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate)\r
-    {\r
-        ignoreUnused (audioSource, deactivate);\r
-    }\r
+    virtual void willDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource,\r
+                                                          bool deactivate);\r
 \r
     /** Called after an audio source is activated or deactivated when being removed / added from the host's undo history.\r
         @param audioSource The audio source that was activated or deactivated\r
         @param deactivate A bool indicating whether \p audioSource was deactivated or activated.\r
     */\r
-    virtual void didDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource, bool deactivate)\r
-    {\r
-        ignoreUnused (audioSource, deactivate);\r
-    }\r
+    virtual void didDeactivateAudioSourceForUndoHistory (ARAAudioSource* audioSource,\r
+                                                         bool deactivate);\r
 \r
     /** Called after an audio modification is added to the audio source.\r
         @param audioSource The region sequence that \p audioModification was added to.\r
         @param audioModification The playback region that was added to \p audioSource.\r
     */\r
     virtual void didAddAudioModificationToAudioSource (ARAAudioSource* audioSource,\r
-                                                       ARAAudioModification* audioModification)\r
-    {\r
-        ignoreUnused (audioSource, audioModification);\r
-    }\r
+                                                       ARAAudioModification* audioModification);\r
 \r
     /** Called before an audio modification is removed from the audio source.\r
         @param audioSource The audio source that \p audioModification will be removed from.\r
         @param audioModification The audio modification that will be removed from \p audioSource.\r
     */\r
     virtual void willRemoveAudioModificationFromAudioSource (ARAAudioSource* audioSource,\r
-                                                             ARAAudioModification* audioModification)\r
-    {\r
-        ignoreUnused (audioSource, audioModification);\r
-    }\r
+                                                             ARAAudioModification* audioModification);\r
 \r
     /** Called before the audio source is destroyed.\r
         @param audioSource The audio source that will be destroyed.\r
     */\r
-    virtual void willDestroyAudioSource (ARAAudioSource* audioSource)\r
-    {\r
-        ignoreUnused (audioSource);\r
-    }\r
-\r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END\r
+    virtual void willDestroyAudioSource (ARAAudioSource* audioSource);\r
 };\r
 \r
 //==============================================================================\r
@@ -1004,82 +858,57 @@ public:
     /** Destructor. */\r
     virtual ~ARAAudioModificationListener() = default;\r
 \r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN\r
-\r
     /** Called before the audio modification's properties are updated.\r
         @param audioModification The audio modification whose properties will be updated.\r
         @param newProperties The audio modification properties that will be assigned to \p audioModification.\r
     */\r
     virtual void willUpdateAudioModificationProperties (ARAAudioModification* audioModification,\r
-                                                        ARA::PlugIn::PropertiesPtr<ARA::ARAAudioModificationProperties> newProperties)\r
-    {\r
-        ignoreUnused (audioModification, newProperties);\r
-    }\r
+                                                        ARA::PlugIn::PropertiesPtr<ARA::ARAAudioModificationProperties> newProperties);\r
 \r
     /** Called after the audio modification's properties are updated.\r
         @param audioModification The audio modification whose properties were updated.\r
     */\r
-    virtual void didUpdateAudioModificationProperties (ARAAudioModification* audioModification)\r
-    {\r
-        ignoreUnused (audioModification);\r
-    }\r
+    virtual void didUpdateAudioModificationProperties (ARAAudioModification* audioModification);\r
 \r
     /** Called when the audio modification's content (i.e. samples or notes) changes.\r
         @param audioModification The audio modification with updated content.\r
         @param scopeFlags The scope of the content update.\r
     */\r
-    virtual void didUpdateAudioModificationContent (ARAAudioModification* audioModification, ARAContentUpdateScopes scopeFlags)\r
-    {\r
-        ignoreUnused (audioModification, scopeFlags);\r
-    }\r
+    virtual void didUpdateAudioModificationContent (ARAAudioModification* audioModification,\r
+                                                    ARAContentUpdateScopes scopeFlags);\r
 \r
     /** Called before an audio modification is activated or deactivated when being removed / added from the host's undo history.\r
         @param audioModification The audio modification that was activated or deactivated\r
         @param deactivate A bool indicating whether \p audioModification was deactivated or activated.\r
     */\r
-    virtual void willDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate)\r
-    {\r
-        ignoreUnused (audioModification, deactivate);\r
-    }\r
+    virtual void willDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification,\r
+                                                                bool deactivate);\r
 \r
     /** Called after an audio modification is activated or deactivated when being removed / added from the host's undo history.\r
         @param audioModification The audio modification that was activated or deactivated\r
         @param deactivate A bool indicating whether \p audioModification was deactivated or activated.\r
     */\r
-    virtual void didDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification, bool deactivate)\r
-    {\r
-        ignoreUnused (audioModification, deactivate);\r
-    }\r
+    virtual void didDeactivateAudioModificationForUndoHistory (ARAAudioModification* audioModification,\r
+                                                               bool deactivate);\r
 \r
     /** Called after a playback region is added to the audio modification.\r
         @param audioModification The audio modification that \p playbackRegion was added to.\r
         @param playbackRegion The playback region that was added to \p audioModification.\r
     */\r
     virtual void didAddPlaybackRegionToAudioModification (ARAAudioModification* audioModification,\r
-                                                          ARAPlaybackRegion* playbackRegion)\r
-    {\r
-        ignoreUnused (audioModification, playbackRegion);\r
-    }\r
+                                                          ARAPlaybackRegion* playbackRegion);\r
 \r
     /** Called before a playback region is removed from the audio modification.\r
         @param audioModification The audio modification that \p playbackRegion will be removed from.\r
         @param playbackRegion The playback region that will be removed from \p audioModification.\r
     */\r
     virtual void willRemovePlaybackRegionFromAudioModification (ARAAudioModification* audioModification,\r
-                                                                ARAPlaybackRegion* playbackRegion)\r
-    {\r
-        ignoreUnused (audioModification, playbackRegion);\r
-    }\r
+                                                                ARAPlaybackRegion* playbackRegion);\r
 \r
     /** Called before the audio modification is destroyed.\r
         @param audioModification The audio modification that will be destroyed.\r
     */\r
-    virtual void willDestroyAudioModification (ARAAudioModification* audioModification)\r
-    {\r
-        ignoreUnused (audioModification);\r
-    }\r
-\r
-   ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END\r
+    virtual void willDestroyAudioModification (ARAAudioModification* audioModification);\r
 };\r
 \r
 //==============================================================================\r
index fcece498b55a0c60a92ce59aa2f1717f5b9c1f45..c80e1027d66213e2eb40d5bd741437aceb37ec86 100644 (file)
 namespace juce\r
 {\r
 \r
-bool ARARenderer::processBlock (AudioBuffer<double>& buffer,\r
-                                AudioProcessor::Realtime realtime,\r
-                                const AudioPlayHead::PositionInfo& positionInfo) noexcept\r
+bool ARARenderer::processBlock ([[maybe_unused]] AudioBuffer<double>& buffer,\r
+                                [[maybe_unused]] AudioProcessor::Realtime realtime,\r
+                                [[maybe_unused]] const AudioPlayHead::PositionInfo& positionInfo) noexcept\r
 {\r
-    ignoreUnused (buffer, realtime, positionInfo);\r
-\r
     // If you hit this assertion then either the caller called the double\r
     // precision version of processBlock on a processor which does not support it\r
     // (i.e. supportsDoublePrecisionProcessing() returns false), or the implementation\r
@@ -43,6 +41,12 @@ bool ARARenderer::processBlock (AudioBuffer<double>& buffer,
     return false;\r
 }\r
 \r
+void ARARenderer::prepareToPlay ([[maybe_unused]] double sampleRate,\r
+                                 [[maybe_unused]] int maximumSamplesPerBlock,\r
+                                 [[maybe_unused]] int numChannels,\r
+                                 [[maybe_unused]] AudioProcessor::ProcessingPrecision precision,\r
+                                 [[maybe_unused]] AlwaysNonRealtime alwaysNonRealtime) {}\r
+\r
 //==============================================================================\r
 #if ARA_VALIDATE_API_CALLS\r
 void ARAPlaybackRenderer::addPlaybackRegion (ARA::ARAPlaybackRegionRef playbackRegionRef) noexcept\r
@@ -62,6 +66,21 @@ void ARAPlaybackRenderer::removePlaybackRegion (ARA::ARAPlaybackRegionRef playba
 }\r
 #endif\r
 \r
+bool ARAPlaybackRenderer::processBlock ([[maybe_unused]] AudioBuffer<float>& buffer,\r
+                                        [[maybe_unused]] AudioProcessor::Realtime realtime,\r
+                                        [[maybe_unused]] const AudioPlayHead::PositionInfo& positionInfo) noexcept\r
+{\r
+    return false;\r
+}\r
+\r
+//==============================================================================\r
+bool ARAEditorRenderer::processBlock ([[maybe_unused]] AudioBuffer<float>& buffer,\r
+                                      [[maybe_unused]] AudioProcessor::Realtime isNonRealtime,\r
+                                      [[maybe_unused]] const AudioPlayHead::PositionInfo& positionInfo) noexcept\r
+{\r
+    return true;\r
+}\r
+\r
 //==============================================================================\r
 void ARAEditorView::doNotifySelection (const ARA::PlugIn::ViewSelection* viewSelection) noexcept\r
 {\r
@@ -89,4 +108,7 @@ void ARAEditorView::removeListener (Listener* l)
     listeners.remove (l);\r
 }\r
 \r
+void ARAEditorView::Listener::onNewSelection ([[maybe_unused]] const ARAViewSelection& viewSelection) {}\r
+void ARAEditorView::Listener::onHideRegionSequences ([[maybe_unused]] const std::vector<ARARegionSequence*>& regionSequences) {}\r
+\r
 } // namespace juce\r
index 4306d922b2e660cc659cdc50d163976320c60dfc..490e56670fce4c0eaa4699920a7d2e775156d0c7 100644 (file)
@@ -59,10 +59,7 @@ public:
                                 int maximumSamplesPerBlock,\r
                                 int numChannels,\r
                                 AudioProcessor::ProcessingPrecision precision,\r
-                                AlwaysNonRealtime alwaysNonRealtime = AlwaysNonRealtime::no)\r
-    {\r
-        ignoreUnused (sampleRate, maximumSamplesPerBlock, numChannels, precision, alwaysNonRealtime);\r
-    }\r
+                                AlwaysNonRealtime alwaysNonRealtime = AlwaysNonRealtime::no);\r
 \r
     /** Frees render resources allocated in prepareToPlay(). */\r
     virtual void releaseResources() {}\r
@@ -128,11 +125,7 @@ public:
 \r
     bool processBlock (AudioBuffer<float>& buffer,\r
                        AudioProcessor::Realtime realtime,\r
-                       const AudioPlayHead::PositionInfo& positionInfo) noexcept override\r
-    {\r
-        ignoreUnused (buffer, realtime, positionInfo);\r
-        return false;\r
-    }\r
+                       const AudioPlayHead::PositionInfo& positionInfo) noexcept override;\r
 \r
     using ARARenderer::processBlock;\r
 \r
@@ -191,11 +184,7 @@ public:
     // isNonRealtime of the process context - typically preview is limited to realtime.\r
     bool processBlock (AudioBuffer<float>& buffer,\r
                        AudioProcessor::Realtime isNonRealtime,\r
-                       const AudioPlayHead::PositionInfo& positionInfo) noexcept override\r
-    {\r
-        ignoreUnused (buffer, isNonRealtime, positionInfo);\r
-        return true;\r
-    }\r
+                       const AudioPlayHead::PositionInfo& positionInfo) noexcept override;\r
 \r
     using ARARenderer::processBlock;\r
 \r
@@ -218,7 +207,7 @@ public:
 \r
     // Shadowing templated getters to default to JUCE versions of the returned classes\r
     template <typename RegionSequence_t = ARARegionSequence>\r
-    std::vector<RegionSequence_t*> const& getHiddenRegionSequences() const noexcept\r
+    const std::vector<RegionSequence_t*>& getHiddenRegionSequences() const noexcept\r
     {\r
         return ARA::PlugIn::EditorView::getHiddenRegionSequences<RegionSequence_t>();\r
     }\r
@@ -227,7 +216,7 @@ public:
     void doNotifySelection (const ARA::PlugIn::ViewSelection* currentSelection) noexcept override;\r
 \r
     // Base class implementation must be called if overridden\r
-    void doNotifyHideRegionSequences (std::vector<ARA::PlugIn::RegionSequence*> const& regionSequences) noexcept override;\r
+    void doNotifyHideRegionSequences (const std::vector<ARA::PlugIn::RegionSequence*>& regionSequences) noexcept override;\r
 \r
     /** A base class for listeners that want to know about changes to an ARAEditorView object.\r
 \r
@@ -239,25 +228,15 @@ public:
         /** Destructor. */\r
         virtual ~Listener() = default;\r
 \r
-       ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_BEGIN\r
-\r
         /** Called when the editor view's selection changes.\r
             @param viewSelection The current selection state\r
         */\r
-        virtual void onNewSelection (const ARAViewSelection& viewSelection)\r
-        {\r
-            ignoreUnused (viewSelection);\r
-        }\r
+        virtual void onNewSelection (const ARAViewSelection& viewSelection);\r
 \r
         /** Called when region sequences are flagged as hidden in the host UI.\r
             @param regionSequences A vector containing all hidden region sequences.\r
         */\r
-        virtual void onHideRegionSequences (std::vector<ARARegionSequence*> const& regionSequences)\r
-        {\r
-            ignoreUnused (regionSequences);\r
-        }\r
-\r
-       ARA_DISABLE_UNREFERENCED_PARAMETER_WARNING_END\r
+        virtual void onHideRegionSequences (const std::vector<ARARegionSequence*>& regionSequences);\r
     };\r
 \r
     /** \copydoc ARAListenableModelClass::addListener */\r
index 0b90483f4d9ff8bfd6bd799754efd770d69951ca..a6e0de39476cb46d5613e55f5e7c2bd455ed8a29 100644 (file)
@@ -135,12 +135,7 @@ public:
         void add (std::unique_ptr<Items>... items)\r
         {\r
             parameters.reserve (parameters.size() + sizeof... (items));\r
-\r
-            // We can replace this with some nicer code once generic lambdas become available. A\r
-            // sequential context like an array initialiser is required to ensure we get the correct\r
-            // order from the parameter pack.\r
-            int unused[] { (parameters.emplace_back (MakeContents() (std::move (items))), 0)... };\r
-            ignoreUnused (unused);\r
+            (parameters.push_back (makeParameterStorage (std::move (items))), ...);\r
         }\r
 \r
         template <typename It, typename = ValidIfIterator<It>>\r
@@ -150,7 +145,7 @@ public:
             std::transform (std::make_move_iterator (begin),\r
                             std::make_move_iterator (end),\r
                             std::back_inserter (parameters),\r
-                            MakeContents());\r
+                            [] (auto item) { return makeParameterStorage (std::move (item)); });\r
         }\r
 \r
         ParameterLayout (const ParameterLayout& other) = delete;\r
@@ -191,14 +186,11 @@ public:
             std::unique_ptr<Contents> contents;\r
         };\r
 \r
-        struct MakeContents final\r
+        template <typename Contents>\r
+        static std::unique_ptr<ParameterStorage<Contents>> makeParameterStorage (std::unique_ptr<Contents> contents)\r
         {\r
-            template <typename Item>\r
-            std::unique_ptr<ParameterStorageBase> operator() (std::unique_ptr<Item> item) const\r
-            {\r
-                return std::unique_ptr<ParameterStorageBase> (new ParameterStorage<Item> (std::move (item)));\r
-            }\r
-        };\r
+            return std::make_unique<ParameterStorage<Contents>> (std::move (contents));\r
+        }\r
 \r
         void add() {}\r
 \r
index 6651bddf848cf6b3916c875f684ec94ed2100338..78f7ea2346cac7b1c3e9cb3c240b5455f5e03e37 100644 (file)
@@ -56,7 +56,7 @@ void PluginHostType::switchToHostApplication() const
    #endif\r
 }\r
 \r
-bool PluginHostType::isInAAXAudioSuite (AudioProcessor& processor)\r
+bool PluginHostType::isInAAXAudioSuite ([[maybe_unused]] AudioProcessor& processor)\r
 {\r
    #if JucePlugin_Build_AAX\r
     if (PluginHostType::getPluginLoadedAs() == AudioProcessor::wrapperType_AAX\r
@@ -66,14 +66,11 @@ bool PluginHostType::isInAAXAudioSuite (AudioProcessor& processor)
     }\r
    #endif\r
 \r
-    ignoreUnused (processor);\r
     return false;\r
 }\r
 \r
-Image PluginHostType::getHostIcon (int size) const\r
+Image PluginHostType::getHostIcon ([[maybe_unused]] int size) const\r
 {\r
-    ignoreUnused (size);\r
-\r
    #if JucePlugin_Enable_IAA && JucePlugin_Build_Standalone && JUCE_IOS && (! JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP)\r
     if (isInterAppAudioConnected())\r
         return juce_getIAAHostIcon (size);\r
@@ -101,10 +98,12 @@ const char* PluginHostType::getHostDescription() const noexcept
         case AdobeAudition:            return "Adobe Audition";\r
         case AdobePremierePro:         return "Adobe Premiere";\r
         case AppleGarageBand:          return "Apple GarageBand";\r
+        case AppleInfoHelper:          return "com.apple.audio.InfoHelper";\r
         case AppleLogic:               return "Apple Logic";\r
         case AppleMainStage:           return "Apple MainStage";\r
         case Ardour:                   return "Ardour";\r
         case AULab:                    return "AU Lab";\r
+        case AUVal:                    return "auval";\r
         case AvidProTools:             return "ProTools";\r
         case BitwigStudio:             return "Bitwig Studio";\r
         case CakewalkSonar8:           return "Cakewalk Sonar 8";\r
@@ -215,6 +214,8 @@ PluginHostType::HostType PluginHostType::getHostType()
     if (hostFilename.containsIgnoreCase   ("pluginval"))                return pluginval;\r
     if (hostFilename.containsIgnoreCase   ("AudioPluginHost"))          return JUCEPluginHost;\r
     if (hostFilename.containsIgnoreCase   ("Vienna Ensemble Pro"))      return ViennaEnsemblePro;\r
+    if (hostFilename.containsIgnoreCase   ("auvaltool"))                return AUVal;\r
+    if (hostFilename.containsIgnoreCase   ("com.apple.audio.infohelper")) return AppleInfoHelper;\r
 \r
     if (hostIdReportedByWrapper == "com.apple.logic.pro")               return AppleLogic;\r
     if (hostIdReportedByWrapper == "com.apple.garageband")              return AppleGarageBand;\r
index c222899fd41b15966933cfe1218af07d48ce4da9..cf5f0e405b441ce5b4ac236f01d0cdea45b66460 100644 (file)
@@ -58,10 +58,12 @@ public:
         AdobeAudition,              /**< Represents Adobe Audition. */\r
         AdobePremierePro,           /**< Represents Adobe Premiere Pro. */\r
         AppleGarageBand,            /**< Represents Apple GarageBand. */\r
+        AppleInfoHelper,            /**< Represents Apple com.apple.audio.InfoHelper. */\r
         AppleLogic,                 /**< Represents Apple Logic Pro. */\r
         AppleMainStage,             /**< Represents Apple Main Stage. */\r
         Ardour,                     /**< Represents Ardour. */\r
         AULab,                      /**< Represents AU Lab. */\r
+        AUVal,                      /**< Represents Apple AU validator. */\r
         AvidProTools,               /**< Represents Avid Pro Tools. */\r
         BitwigStudio,               /**< Represents Bitwig Studio. */\r
         CakewalkSonar8,             /**< Represents Cakewalk Sonar 8. */\r
@@ -121,10 +123,14 @@ public:
                                                       || type == AbletonLiveGeneric; }\r
     /** Returns true if the host is Adobe Audition. */\r
     bool isAdobeAudition() const noexcept     { return type == AdobeAudition; }\r
+    /** Returns true if the host is com.apple.audio.InfoHelper. */\r
+    bool isAppleInfoHelper() const noexcept   { return type == AppleInfoHelper; }\r
     /** Returns true if the host is Ardour. */\r
     bool isArdour() const noexcept            { return type == Ardour; }\r
     /** Returns true if the host is AU Lab. */\r
     bool isAULab() const noexcept             { return type == AULab; }\r
+    /** Returns true if the host is auval. */\r
+    bool isAUVal() const noexcept             { return type == AUVal; }\r
     /** Returns true if the host is Bitwig Studio. */\r
     bool isBitwigStudio() const noexcept      { return type == BitwigStudio; }\r
     /** Returns true if the host is any version of Steinberg Cubase. */\r
diff --git a/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp b/modules/juce_audio_processors/utilities/juce_VSTCallbackHandler.cpp
new file mode 100644 (file)
index 0000000..e8b42e9
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+   Agreement and JUCE Privacy Policy.\r
+\r
+   End User License Agreement: www.juce.com/juce-7-licence\r
+   Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+pointer_sized_int VSTCallbackHandler::handleVstPluginCanDo ([[maybe_unused]] int32 index,\r
+                                                            [[maybe_unused]] pointer_sized_int value,\r
+                                                            [[maybe_unused]] void* ptr,\r
+                                                            [[maybe_unused]] float opt)\r
+{\r
+    return 0;\r
+}\r
+\r
+void VSTCallbackHandler::handleVstHostCallbackAvailable ([[maybe_unused]] std::function<VstHostCallbackType>&& callback) {}\r
+\r
+} // namespace juce\r
index d5a4ea5e05ec2a97bee9c3b5874169c6c5d0bff9..9fe3a0ad82c38441769e702e275ee782d1d18ef2 100644 (file)
@@ -46,11 +46,7 @@ struct VSTCallbackHandler
     virtual pointer_sized_int handleVstPluginCanDo (int32 index,\r
                                                     pointer_sized_int value,\r
                                                     void* ptr,\r
-                                                    float opt)\r
-    {\r
-        ignoreUnused (index, value, ptr, opt);\r
-        return 0;\r
-    }\r
+                                                    float opt);\r
 \r
     /** This is called by the VST plug-in wrapper when it receives unhandled\r
         vendor specific calls from the host.\r
@@ -71,10 +67,7 @@ struct VSTCallbackHandler
     /** This is called once by the VST plug-in wrapper after its constructor.\r
         You can use the supplied function to query the VST host.\r
     */\r
-    virtual void handleVstHostCallbackAvailable (std::function<VstHostCallbackType>&& callback)\r
-    {\r
-        ignoreUnused (callback);\r
-    }\r
+    virtual void handleVstHostCallbackAvailable (std::function<VstHostCallbackType>&& callback);\r
 };\r
 \r
 } // namespace juce\r
index 3ffc44384f54112e1a66b3aefea05682c6437490..809162f583fb859abcd0e49c526115611e728d59 100644 (file)
@@ -1193,11 +1193,18 @@ void AudioDeviceSelectorComponent::updateAllControls()
 \r
 void AudioDeviceSelectorComponent::handleBluetoothButton()\r
 {\r
-    if (! RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi))\r
-        RuntimePermissions::request (RuntimePermissions::bluetoothMidi, nullptr);\r
-\r
     if (RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi))\r
+    {\r
         BluetoothMidiDevicePairingDialogue::open();\r
+    }\r
+    else\r
+    {\r
+        RuntimePermissions::request (RuntimePermissions::bluetoothMidi, [] (auto)\r
+        {\r
+            if (RuntimePermissions::isGranted (RuntimePermissions::bluetoothMidi))\r
+                BluetoothMidiDevicePairingDialogue::open();\r
+        });\r
+    }\r
 }\r
 \r
 ListBox* AudioDeviceSelectorComponent::getMidiInputSelectorListBox() const noexcept\r
index be3ff67d0d1e9a307ad7aa849a05d6a875933639..fbd90eac384cc2900cdaf402652d46c0521394ba 100644 (file)
@@ -478,4 +478,9 @@ void MidiKeyboardComponent::handleNoteOff (MidiKeyboardState*, int /*midiChannel
     noPendingUpdates.store (false);\r
 }\r
 \r
+//==============================================================================\r
+bool MidiKeyboardComponent::mouseDownOnKey    ([[maybe_unused]] int midiNoteNumber, [[maybe_unused]] const MouseEvent& e)  { return true; }\r
+bool MidiKeyboardComponent::mouseDraggedToKey ([[maybe_unused]] int midiNoteNumber, [[maybe_unused]] const MouseEvent& e)  { return true; }\r
+void MidiKeyboardComponent::mouseUpOnKey      ([[maybe_unused]] int midiNoteNumber, [[maybe_unused]] const MouseEvent& e)  {}\r
+\r
 } // namespace juce\r
index 70dedb688d33bfa619e7264dd4c5245b3fbe5a34..2c9c6ab6c2fbb9da16bf2bd4e3d1c98dd1eeffa8 100644 (file)
@@ -193,7 +193,7 @@ public:
 \r
         @see mouseDraggedToKey\r
     */\r
-    virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e)     { ignoreUnused (midiNoteNumber, e); return true; }\r
+    virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e);\r
 \r
     /** Callback when the mouse is dragged from one key onto another.\r
 \r
@@ -202,13 +202,13 @@ public:
 \r
         @see mouseDownOnKey\r
     */\r
-    virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e)  { ignoreUnused (midiNoteNumber, e); return true; }\r
+    virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e);\r
 \r
     /** Callback when the mouse is released from a key.\r
 \r
         @see mouseDownOnKey\r
     */\r
-    virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e)       { ignoreUnused (midiNoteNumber, e); }\r
+    virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e);\r
 \r
     /** Allows text to be drawn on the white notes.\r
 \r
index d9f41d7ad042d4e5282bf300e8c930846650b62d..ae55099200840b29d2684e1d1011671656906cd6 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_utils\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE extra audio utility classes\r
   description:        Classes for audio-related GUI and miscellaneous tasks.\r
   website:            http://www.juce.com/juce\r
index 381c98fc04c7e59ffe8d99d4cf8bb2fde209aa37..9eb0d6e0611bd8569f185d19cb8f34a8950933c0 100644 (file)
@@ -171,8 +171,7 @@ void AudioCDReader::refreshTrackLengths()
     if (toc.exists())\r
     {\r
         XmlDocument doc (toc);\r
-        const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples);\r
-        ignoreUnused (error); // could be logged..\r
+        [[maybe_unused]] const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples);\r
 \r
         lengthInSamples = trackStartSamples.getLast() - trackStartSamples.getFirst();\r
     }\r
index 3b6bf308b0b1007027ad867b6b4292b3b5897f50..db26e24a8e1bc7343d4f81708aa0b770fa7fb508 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_box2d\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE wrapper for the Box2D physics engine\r
   description:        The Box2D physics engine and some utility classes.\r
   website:            http://www.juce.com/juce\r
index d80046b0c11a84c7dcddcc5c01ba8b991261465c..316e54526f9fae3b5218938f7251e8db1186219f 100644 (file)
@@ -727,32 +727,7 @@ public:
         @see addSorted, sort\r
     */\r
     template <typename ElementComparator, typename TargetValueType>\r
-    int indexOfSorted (ElementComparator& comparator, TargetValueType elementToLookFor) const\r
-    {\r
-        ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
-                                   // avoids getting warning messages about the parameter being unused\r
-\r
-        const ScopedLockType lock (getLock());\r
-\r
-        for (int s = 0, e = values.size();;)\r
-        {\r
-            if (s >= e)\r
-                return -1;\r
-\r
-            if (comparator.compareElements (elementToLookFor, values[s]) == 0)\r
-                return s;\r
-\r
-            auto halfway = (s + e) / 2;\r
-\r
-            if (halfway == s)\r
-                return -1;\r
-\r
-            if (comparator.compareElements (elementToLookFor, values[halfway]) >= 0)\r
-                s = halfway;\r
-            else\r
-                e = halfway;\r
-        }\r
-    }\r
+    int indexOfSorted (ElementComparator& comparator, TargetValueType elementToLookFor) const;\r
 \r
     //==============================================================================\r
     /** Removes an element from the array.\r
@@ -1106,14 +1081,7 @@ public:
         @see addSorted, indexOfSorted, sortArray\r
     */\r
     template <class ElementComparator>\r
-    void sort (ElementComparator& comparator,\r
-               bool retainOrderOfEquivalentItems = false)\r
-    {\r
-        const ScopedLockType lock (getLock());\r
-        ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
-                                   // avoids getting warning messages about the parameter being unused\r
-        sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
-    }\r
+    void sort (ElementComparator& comparator, bool retainOrderOfEquivalentItems = false);\r
 \r
     //==============================================================================\r
     /** Returns the CriticalSection that locks this array.\r
@@ -1150,4 +1118,43 @@ private:
     }\r
 };\r
 \r
+//==============================================================================\r
+template <typename ElementType, typename TypeOfCriticalSectionToUse, int minimumAllocatedSize>\r
+template <typename ElementComparator, typename TargetValueType>\r
+int Array<ElementType, TypeOfCriticalSectionToUse, minimumAllocatedSize>::indexOfSorted (\r
+    [[maybe_unused]] ElementComparator& comparator,\r
+    TargetValueType elementToLookFor) const\r
+{\r
+    const ScopedLockType lock (getLock());\r
+\r
+    for (int s = 0, e = values.size();;)\r
+    {\r
+        if (s >= e)\r
+            return -1;\r
+\r
+        if (comparator.compareElements (elementToLookFor, values[s]) == 0)\r
+            return s;\r
+\r
+        auto halfway = (s + e) / 2;\r
+\r
+        if (halfway == s)\r
+            return -1;\r
+\r
+        if (comparator.compareElements (elementToLookFor, values[halfway]) >= 0)\r
+            s = halfway;\r
+        else\r
+            e = halfway;\r
+    }\r
+}\r
+\r
+template <typename ElementType, typename TypeOfCriticalSectionToUse, int minimumAllocatedSize>\r
+template <class ElementComparator>\r
+void Array<ElementType, TypeOfCriticalSectionToUse, minimumAllocatedSize>::sort (\r
+    [[maybe_unused]] ElementComparator& comparator,\r
+    bool retainOrderOfEquivalentItems)\r
+{\r
+    const ScopedLockType lock (getLock());\r
+    sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
+}\r
+\r
 } // namespace juce\r
index af0d1be364626cccd47627fb8e228a594a82b546..353fcfae50a571b1ab045a727c5a71e751186048 100644 (file)
@@ -542,7 +542,7 @@ private:
     template <typename... Elements>\r
     void addImpl (Elements&&... toAdd)\r
     {\r
-        ignoreUnused (std::initializer_list<int> { (((void) checkSourceIsNotAMember (toAdd)), 0)... });\r
+        (checkSourceIsNotAMember (toAdd), ...);\r
         ensureAllocatedSize (numUsed + (int) sizeof... (toAdd));\r
         addAssumingCapacityIsReady (std::forward<Elements> (toAdd)...);\r
     }\r
@@ -550,7 +550,7 @@ private:
     template <typename... Elements>\r
     void addAssumingCapacityIsReady (Elements&&... toAdd)\r
     {\r
-        ignoreUnused (std::initializer_list<int> { ((void) (new (elements + numUsed++) ElementType (std::forward<Elements> (toAdd))), 0)... });\r
+        (new (elements + numUsed++) ElementType (std::forward<Elements> (toAdd)), ...);\r
     }\r
 \r
     //==============================================================================\r
index 5bf7d5e12ff4cae4a0aa67e25b3df1042057c594..8f7ce2bbecfd9d461ebc83fd12c8bc181fb50652 100644 (file)
@@ -123,7 +123,7 @@ static void sortArray (ElementComparator& comparator,
     @param lastElement      the index of the last element in the range (this is non-inclusive)\r
 */\r
 template <class ElementType, class ElementComparator>\r
-static int findInsertIndexInSortedArray (ElementComparator& comparator,\r
+static int findInsertIndexInSortedArray ([[maybe_unused]] ElementComparator& comparator,\r
                                          ElementType* const array,\r
                                          const ElementType newElement,\r
                                          int firstElement,\r
@@ -131,9 +131,6 @@ static int findInsertIndexInSortedArray (ElementComparator& comparator,
 {\r
     jassert (firstElement <= lastElement);\r
 \r
-    ignoreUnused (comparator); // if you pass in an object with a static compareElements() method, this\r
-                               // avoids getting warning messages about the parameter being unused\r
-\r
     while (firstElement < lastElement)\r
     {\r
         if (comparator.compareElements (newElement, array [firstElement]) == 0)\r
index 63bcbd9ffae6967c6725d1acd18e9fd35eb51224..b7609278e3b83093fdcbc97080c60667e1c966a7 100644 (file)
@@ -126,7 +126,7 @@ public:
     decltype (auto) operator* ()       { return opt.operator* (); }\r
     decltype (auto) operator* () const { return opt.operator* (); }\r
 \r
-    operator bool() const noexcept { return opt.has_value(); }\r
+    explicit operator bool() const noexcept { return opt.has_value(); }\r
     bool hasValue() const noexcept { return opt.has_value(); }\r
 \r
     template <typename U>\r
index 5bc789eda7692803193636e57db1512228ec4fe2..c89b11255a7fa3fc003341215dc076c44444eb20 100644 (file)
@@ -46,7 +46,6 @@ namespace juce
 */\r
 template <class ObjectClass,\r
           class TypeOfCriticalSectionToUse = DummyCriticalSection>\r
-\r
 class OwnedArray\r
 {\r
 public:\r
@@ -531,17 +530,7 @@ public:
         @see add, sort, indexOfSorted\r
     */\r
     template <class ElementComparator>\r
-    int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept\r
-    {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
-        ignoreUnused (comparator);\r
-\r
-        const ScopedLockType lock (getLock());\r
-        auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
-        insert (index, newObject);\r
-        return index;\r
-    }\r
+    int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept;\r
 \r
     /** Finds the index of an object in the array, assuming that the array is sorted.\r
 \r
@@ -556,33 +545,7 @@ public:
         @see addSorted, sort\r
     */\r
     template <typename ElementComparator>\r
-    int indexOfSorted (ElementComparator& comparator, const ObjectClass* objectToLookFor) const noexcept\r
-    {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
-        ignoreUnused (comparator);\r
-\r
-        const ScopedLockType lock (getLock());\r
-        int s = 0, e = values.size();\r
-\r
-        while (s < e)\r
-        {\r
-            if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
-                return s;\r
-\r
-            auto halfway = (s + e) / 2;\r
-\r
-            if (halfway == s)\r
-                break;\r
-\r
-            if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
-                s = halfway;\r
-            else\r
-                e = halfway;\r
-        }\r
-\r
-        return -1;\r
-    }\r
+    int indexOfSorted (ElementComparator& comparator, const ObjectClass* objectToLookFor) const noexcept;\r
 \r
     //==============================================================================\r
     /** Removes an object from the array.\r
@@ -818,18 +781,7 @@ public:
         @see sortArray, indexOfSorted\r
     */\r
     template <class ElementComparator>\r
-    void sort (ElementComparator& comparator,\r
-               bool retainOrderOfEquivalentItems = false) noexcept\r
-    {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
-        ignoreUnused (comparator);\r
-\r
-        const ScopedLockType lock (getLock());\r
-\r
-        if (size() > 1)\r
-            sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
-    }\r
+    void sort (ElementComparator& comparator, bool retainOrderOfEquivalentItems = false) noexcept;\r
 \r
     //==============================================================================\r
     /** Returns the CriticalSection that locks this array.\r
@@ -870,4 +822,57 @@ private:
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray)\r
 };\r
 \r
+//==============================================================================\r
+template <class ObjectClass, class TypeOfCriticalSectionToUse>\r
+template <class ElementComparator>\r
+int OwnedArray<ObjectClass, TypeOfCriticalSectionToUse>::addSorted (\r
+    [[maybe_unused]] ElementComparator& comparator,\r
+    ObjectClass* newObject) noexcept\r
+{\r
+    const ScopedLockType lock (getLock());\r
+    auto index = findInsertIndexInSortedArray (comparator, values.begin(), newObject, 0, values.size());\r
+    insert (index, newObject);\r
+    return index;\r
+}\r
+\r
+template <class ObjectClass, class TypeOfCriticalSectionToUse>\r
+template <typename ElementComparator>\r
+int OwnedArray<ObjectClass, TypeOfCriticalSectionToUse>::indexOfSorted (\r
+    [[maybe_unused]] ElementComparator& comparator,\r
+    const ObjectClass* objectToLookFor) const noexcept\r
+{\r
+    const ScopedLockType lock (getLock());\r
+    int s = 0, e = values.size();\r
+\r
+    while (s < e)\r
+    {\r
+        if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
+            return s;\r
+\r
+        auto halfway = (s + e) / 2;\r
+\r
+        if (halfway == s)\r
+            break;\r
+\r
+        if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
+            s = halfway;\r
+        else\r
+            e = halfway;\r
+    }\r
+\r
+    return -1;\r
+}\r
+\r
+template <class ObjectClass, class TypeOfCriticalSectionToUse>\r
+template <typename ElementComparator>\r
+void OwnedArray<ObjectClass, TypeOfCriticalSectionToUse>::sort (\r
+    [[maybe_unused]] ElementComparator& comparator,\r
+    bool retainOrderOfEquivalentItems) noexcept\r
+{\r
+    const ScopedLockType lock (getLock());\r
+\r
+    if (size() > 1)\r
+        sortArray (comparator, values.begin(), 0, size() - 1, retainOrderOfEquivalentItems);\r
+}\r
+\r
 } // namespace juce\r
index c281a1c4c1b8042721b01114d27b9b1d95158839..fe7dbdf55a896f83892dac49576493f8f5580a1a 100644 (file)
@@ -563,31 +563,7 @@ public:
         @see addSorted, sort\r
     */\r
     template <class ElementComparator>\r
-    int indexOfSorted (ElementComparator& comparator,\r
-                       const ObjectClass* objectToLookFor) const noexcept\r
-    {\r
-        ignoreUnused (comparator);\r
-        const ScopedLockType lock (getLock());\r
-        int s = 0, e = values.size();\r
-\r
-        while (s < e)\r
-        {\r
-            if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
-                return s;\r
-\r
-            auto halfway = (s + e) / 2;\r
-\r
-            if (halfway == s)\r
-                break;\r
-\r
-            if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
-                s = halfway;\r
-            else\r
-                e = halfway;\r
-        }\r
-\r
-        return -1;\r
-    }\r
+    int indexOfSorted (ElementComparator& comparator, const ObjectClass* objectToLookFor) const noexcept;\r
 \r
     //==============================================================================\r
     /** Removes an object from the array.\r
@@ -828,16 +804,7 @@ public:
         @see sortArray\r
     */\r
     template <class ElementComparator>\r
-    void sort (ElementComparator& comparator,\r
-               bool retainOrderOfEquivalentItems = false) noexcept\r
-    {\r
-        // If you pass in an object with a static compareElements() method, this\r
-        // avoids getting warning messages about the parameter being unused\r
-        ignoreUnused (comparator);\r
-\r
-        const ScopedLockType lock (getLock());\r
-        sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems);\r
-    }\r
+    void sort (ElementComparator& comparator, bool retainOrderOfEquivalentItems = false) noexcept;\r
 \r
     //==============================================================================\r
     /** Reduces the amount of storage being used by the array.\r
@@ -904,4 +871,43 @@ private:
     }\r
 };\r
 \r
+//==============================================================================\r
+template <class ObjectClass, class TypeOfCriticalSectionToUse>\r
+template <class ElementComparator>\r
+int ReferenceCountedArray<ObjectClass, TypeOfCriticalSectionToUse>::indexOfSorted (\r
+    [[maybe_unused]] ElementComparator& comparator,\r
+    const ObjectClass* objectToLookFor) const noexcept\r
+{\r
+    const ScopedLockType lock (getLock());\r
+    int s = 0, e = values.size();\r
+\r
+    while (s < e)\r
+    {\r
+        if (comparator.compareElements (objectToLookFor, values[s]) == 0)\r
+            return s;\r
+\r
+        auto halfway = (s + e) / 2;\r
+\r
+        if (halfway == s)\r
+            break;\r
+\r
+        if (comparator.compareElements (objectToLookFor, values[halfway]) >= 0)\r
+            s = halfway;\r
+        else\r
+            e = halfway;\r
+    }\r
+\r
+    return -1;\r
+}\r
+\r
+template <class ObjectClass, class TypeOfCriticalSectionToUse>\r
+template <class ElementComparator>\r
+void ReferenceCountedArray<ObjectClass, TypeOfCriticalSectionToUse>::sort (\r
+    [[maybe_unused]] ElementComparator& comparator,\r
+    bool retainOrderOfEquivalentItems) noexcept\r
+{\r
+    const ScopedLockType lock (getLock());\r
+    sortArray (comparator, values.begin(), 0, values.size() - 1, retainOrderOfEquivalentItems);\r
+}\r
+\r
 } // namespace juce\r
index 2321da3d81c3332a97b20db30c53c63ed4ba0c3c..e84baa02af19e2097680e9ec6343d6dadc19eced 100644 (file)
@@ -493,18 +493,6 @@ struct var::Instance
     static constexpr VariantType attributesObject         { VariantType::ObjectTag{} };\r
 };\r
 \r
-constexpr var::VariantType var::Instance::attributesVoid;\r
-constexpr var::VariantType var::Instance::attributesUndefined;\r
-constexpr var::VariantType var::Instance::attributesInt;\r
-constexpr var::VariantType var::Instance::attributesInt64;\r
-constexpr var::VariantType var::Instance::attributesBool;\r
-constexpr var::VariantType var::Instance::attributesDouble;\r
-constexpr var::VariantType var::Instance::attributesMethod;\r
-constexpr var::VariantType var::Instance::attributesArray;\r
-constexpr var::VariantType var::Instance::attributesString;\r
-constexpr var::VariantType var::Instance::attributesBinary;\r
-constexpr var::VariantType var::Instance::attributesObject;\r
-\r
 //==============================================================================\r
 var::var() noexcept : type (&Instance::attributesVoid) {}\r
 var::var (const VariantType& t) noexcept  : type (&t) {}\r
index 20561f3959d0f14fb35d14f957fba5479f78a7d4..d19f14b86886aa888ae9e83bb199b5c48f8287a7 100644 (file)
@@ -953,7 +953,7 @@ File File::createTempFile (StringRef fileNameEnding)
 }\r
 \r
 bool File::createSymbolicLink (const File& linkFileToCreate,\r
-                               const String& nativePathOfTarget,\r
+                               [[maybe_unused]] const String& nativePathOfTarget,\r
                                bool overwriteExisting)\r
 {\r
     if (linkFileToCreate.exists())\r
@@ -986,7 +986,6 @@ bool File::createSymbolicLink (const File& linkFileToCreate,
                                nativePathOfTarget.toWideCharPointer(),\r
                                targetFile.isDirectory() ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0) != FALSE;\r
    #else\r
-    ignoreUnused (nativePathOfTarget);\r
     jassertfalse; // symbolic links not supported on this platform!\r
     return false;\r
    #endif\r
index 3ad6c7754ac7a66804358c92714b8c41760f8e98..1582571c145d122d6c0eb5137f736b804fb20c99 100644 (file)
@@ -1278,7 +1278,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
         Expression* parseFunctionCall (FunctionCall* call, ExpPtr& function)\r
         {\r
             std::unique_ptr<FunctionCall> s (call);\r
-            s->object.reset (function.release());\r
+            s->object = std::move (function);\r
             match (TokenTypes::openParen);\r
 \r
             while (currentType != TokenTypes::closeParen)\r
@@ -1304,7 +1304,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             if (matchIf (TokenTypes::openBracket))\r
             {\r
                 std::unique_ptr<ArraySubscript> s (new ArraySubscript (location));\r
-                s->object.reset (input.release());\r
+                s->object = std::move (input);\r
                 s->index.reset (parseExpression());\r
                 match (TokenTypes::closeBracket);\r
                 return parseSuffixes (s.release());\r
@@ -1513,7 +1513,7 @@ struct JavascriptEngine::RootObject   : public DynamicObject
         Expression* parseTernaryOperator (ExpPtr& condition)\r
         {\r
             std::unique_ptr<ConditionalOp> e (new ConditionalOp (location));\r
-            e->condition.reset (condition.release());\r
+            e->condition = std::move (condition);\r
             e->trueBranch.reset (parseExpression());\r
             match (TokenTypes::colon);\r
             e->falseBranch.reset (parseExpression());\r
@@ -1539,9 +1539,9 @@ struct JavascriptEngine::RootObject   : public DynamicObject
             setMethod ("clone", cloneFn);\r
         }\r
 \r
-        static Identifier getClassName()   { static const Identifier i ("Object"); return i; }\r
-        static var dump  (Args a)          { DBG (JSON::toString (a.thisObject)); ignoreUnused (a); return var::undefined(); }\r
-        static var cloneFn (Args a)        { return a.thisObject.clone(); }\r
+        static Identifier getClassName()            { static const Identifier i ("Object"); return i; }\r
+        static var dump  ([[maybe_unused]] Args a)  { DBG (JSON::toString (a.thisObject)); return var::undefined(); }\r
+        static var cloneFn (Args a)                 { return a.thisObject.clone(); }\r
     };\r
 \r
     //==============================================================================\r
index 1920c0d44d6be382617ba75209f4156b968e4c29..1e08fb4dc0c0bf90c82358856fe5ac5d2823f103 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_core\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE core classes\r
   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.\r
   website:            http://www.juce.com/juce\r
index f4dd5e45cf31128c41885d30c98d39c50c4dfe85..49542942d7c576bfedf19ee65870b1d6bf9c9185 100644 (file)
@@ -424,9 +424,8 @@ struct Expression::Helpers
         String getName() const          { return "-"; }\r
         TermPtr negated()               { return input; }\r
 \r
-        TermPtr createTermToEvaluateInput (const Scope& scope, const Term* t, double overallTarget, Term* topLevelTerm) const\r
+        TermPtr createTermToEvaluateInput (const Scope& scope, [[maybe_unused]] const Term* t, double overallTarget, Term* topLevelTerm) const\r
         {\r
-            ignoreUnused (t);\r
             jassert (t == input);\r
 \r
             const Term* const dest = findDestinationFor (topLevelTerm, this);\r
index 1e3fcd2e90a021c38cbb239e092ed9a0bb18fdd7..2eddc07d681ff8a9d1290cf401b9d4f1d523bbd6 100644 (file)
@@ -49,7 +49,7 @@ struct ContainerDeletePolicy
         // implementation of all methods trying to use the OwnedArray (e.g. the destructor\r
         // of the class owning it) into cpp files where they can see to the definition\r
         // of ObjectType. This should fix the error.\r
-        ignoreUnused (sizeof (ObjectType));\r
+        [[maybe_unused]] constexpr auto size = sizeof (ObjectType);\r
 \r
         delete object;\r
     }\r
index 05eaca5161906a4ff02ec51a0e1cd90648696782..e2a8bbfd1fc31eec3a61a27124e5d1961233ff29 100644 (file)
@@ -113,4 +113,19 @@ Object withMember (Object copy, Member OtherObject::* member, Other&& value)
 template <typename Fn> struct ScopeGuard : Fn { ~ScopeGuard() { Fn::operator()(); } };\r
 template <typename Fn> ScopeGuard (Fn) -> ScopeGuard<Fn>;\r
 \r
+#ifndef DOXYGEN\r
+namespace detail\r
+{\r
+template <typename Functor, typename Return, typename... Args>\r
+static constexpr auto toFnPtr (Functor functor, Return (Functor::*) (Args...) const)\r
+{\r
+    return static_cast<Return (*) (Args...)> (functor);\r
+}\r
+} // namespace detail\r
+#endif\r
+\r
+/** Converts a captureless lambda to its equivalent function pointer type. */\r
+template <typename Functor>\r
+static constexpr auto toFnPtr (Functor functor) { return detail::toFnPtr (functor, &Functor::operator()); }\r
+\r
 } // namespace juce\r
index 3f1cd113db1f5c77259c066041f6741928fdf289..ca8d139fb9210a27001cece1f628287021fb842f 100644 (file)
@@ -86,7 +86,22 @@ public:
         writeExternalStorage = 4,\r
 \r
         /** Permission to use camera */\r
-        camera = 5\r
+        camera = 5,\r
+\r
+        /** Permission to read audio files that your app didn't create.\r
+            Has the same effect as readExternalStorage on iOS and Android versions before 33.\r
+        */\r
+        readMediaAudio = 6,\r
+\r
+        /** Permission to read image files that your app didn't create.\r
+            Has the same effect as readExternalStorage on iOS and Android versions before 33.\r
+        */\r
+        readMediaImages = 7,\r
+\r
+        /** Permission to read video files that your app didn't create.\r
+            Has the same effect as readExternalStorage on iOS and Android versions before 33.\r
+        */\r
+        readMediaVideo = 8\r
     };\r
 \r
     //==============================================================================\r
index e3dba249e46e29d6c12a29e98fc57226d7864427..d86eb2f0b95413ee1d4e2aceb1bec7019f4f2b79 100644 (file)
@@ -101,8 +101,7 @@ struct AndroidDocumentDetail
         auto* env = getEnv();\r
         LocalRef<jobjectArray> array { env->NewObjectArray (sizeof... (args), JavaString, nullptr) };\r
 \r
-        int unused[] { (env->SetObjectArrayElement (array.get(), Ix, args.get()), 0)... };\r
-        ignoreUnused (unused);\r
+        (env->SetObjectArrayElement (array.get(), Ix, args.get()), ...);\r
 \r
         return array;\r
     }\r
@@ -745,21 +744,17 @@ struct AndroidDocument::Utils
 };\r
 \r
 //==============================================================================\r
-void AndroidDocumentPermission::takePersistentReadWriteAccess (const URL& url)\r
+void AndroidDocumentPermission::takePersistentReadWriteAccess ([[maybe_unused]] const URL& url)\r
 {\r
    #if JUCE_ANDROID\r
     AndroidDocumentDetail::setPermissions (url, ContentResolver19.takePersistableUriPermission);\r
-   #else\r
-    ignoreUnused (url);\r
    #endif\r
 }\r
 \r
-void AndroidDocumentPermission::releasePersistentReadWriteAccess (const URL& url)\r
+void AndroidDocumentPermission::releasePersistentReadWriteAccess ([[maybe_unused]] const URL& url)\r
 {\r
    #if JUCE_ANDROID\r
     AndroidDocumentDetail::setPermissions (url, ContentResolver19.releasePersistableUriPermission);\r
-   #else\r
-    ignoreUnused (url);\r
    #endif\r
 }\r
 \r
@@ -817,7 +812,7 @@ AndroidDocument AndroidDocument::fromFile (const File& filePath)
                                                 : nullptr };\r
 }\r
 \r
-AndroidDocument AndroidDocument::fromDocument (const URL& documentUrl)\r
+AndroidDocument AndroidDocument::fromDocument ([[maybe_unused]] const URL& documentUrl)\r
 {\r
    #if JUCE_ANDROID\r
     if (getAndroidSDKVersion() < 19)\r
@@ -839,12 +834,11 @@ AndroidDocument AndroidDocument::fromDocument (const URL& documentUrl)
 \r
     return AndroidDocument { Utils::createPimplForSdk (javaUri) };\r
    #else\r
-    ignoreUnused (documentUrl);\r
     return AndroidDocument{};\r
    #endif\r
 }\r
 \r
-AndroidDocument AndroidDocument::fromTree (const URL& treeUrl)\r
+AndroidDocument AndroidDocument::fromTree ([[maybe_unused]] const URL& treeUrl)\r
 {\r
    #if JUCE_ANDROID\r
     if (getAndroidSDKVersion() < 21)\r
@@ -874,7 +868,6 @@ AndroidDocument AndroidDocument::fromTree (const URL& treeUrl)
 \r
     return AndroidDocument { Utils::createPimplForSdk (documentUri) };\r
    #else\r
-    ignoreUnused (treeUrl);\r
     return AndroidDocument{};\r
    #endif\r
 }\r
index eb2c3838b328551338ac28581db13ead69c63a0b..45eb542f433fe42319c796e1b9f9bb007595519a 100644 (file)
@@ -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;") \\r
  CALLBACK (juce_dispatchDelete, "dispatchFinalize", "(J)V")\r
 \r
- DECLARE_JNI_CLASS_WITH_BYTECODE (JuceInvocationHandler, "com/rmsl/juce/JuceInvocationHandler", 10, invocationHandleByteCode, sizeof (invocationHandleByteCode))\r
+ DECLARE_JNI_CLASS_WITH_BYTECODE (JuceInvocationHandler, "com/rmsl/juce/JuceInvocationHandler", 10, invocationHandleByteCode)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
@@ -116,7 +116,7 @@ struct SystemJavaClassComparator
 };\r
 \r
 //==============================================================================\r
-JNIClassBase::JNIClassBase (const char* cp, int classMinSDK, const void* bc, size_t n)\r
+JNIClassBase::JNIClassBase (const char* cp, int classMinSDK, const uint8* bc, size_t n)\r
     : classPath (cp), byteCode (bc), byteCodeSize (n), minSDK (classMinSDK), classRef (nullptr)\r
 {\r
     SystemJavaClassComparator comparator;\r
@@ -552,12 +552,12 @@ static const uint8 javaFragmentOverlay[] =
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
  METHOD (construct,   "<init>",   "()V") \\r
  METHOD (close,       "close",    "()V") \\r
- CALLBACK (FragmentOverlay::onActivityResultNative, "onActivityResultNative", "(JIILandroid/content/Intent;)V") \\r
- CALLBACK (FragmentOverlay::onCreateNative,         "onCreateNative",         "(JLandroid/os/Bundle;)V") \\r
- CALLBACK (FragmentOverlay::onStartNative,          "onStartNative",          "(J)V") \\r
- CALLBACK (FragmentOverlay::onRequestPermissionsResultNative, "onRequestPermissionsResultNative", "(JI[Ljava/lang/String;[I)V")\r
+ CALLBACK (generatedCallback<&FragmentOverlay::onActivityResultCallback>,           "onActivityResultNative",           "(JIILandroid/content/Intent;)V") \\r
+ CALLBACK (generatedCallback<&FragmentOverlay::onCreatedCallback>,                  "onCreateNative",                   "(JLandroid/os/Bundle;)V") \\r
+ CALLBACK (generatedCallback<&FragmentOverlay::onStartCallback>,                    "onStartNative",                    "(J)V") \\r
+ CALLBACK (generatedCallback<&FragmentOverlay::onRequestPermissionsResultCallback>, "onRequestPermissionsResultNative", "(JI[Ljava/lang/String;[I)V")\r
 \r
- DECLARE_JNI_CLASS_WITH_BYTECODE (JuceFragmentOverlay, "com/rmsl/juce/FragmentOverlay", 16, javaFragmentOverlay, sizeof(javaFragmentOverlay))\r
+ DECLARE_JNI_CLASS_WITH_BYTECODE (JuceFragmentOverlay, "com/rmsl/juce/FragmentOverlay", 16, javaFragmentOverlay)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
@@ -590,47 +590,39 @@ void FragmentOverlay::open()
     env->CallVoidMethod (native.get(), AndroidDialogFragment.show, fm.get(), javaString ("FragmentOverlay").get());\r
 }\r
 \r
-void FragmentOverlay::onActivityResultNative (JNIEnv* env, jobject, jlong host,\r
-                                              jint requestCode, jint resultCode, jobject data)\r
+void FragmentOverlay::onCreatedCallback (JNIEnv* env, FragmentOverlay& t, jobject obj)\r
 {\r
-    if (auto* myself = reinterpret_cast<FragmentOverlay*> (host))\r
-        myself->onActivityResult (requestCode, resultCode, LocalRef<jobject> (env->NewLocalRef (data)));\r
+    t.onCreated (LocalRef<jobject> { env->NewLocalRef (obj) });\r
 }\r
 \r
-void FragmentOverlay::onCreateNative (JNIEnv* env, jobject, jlong host, jobject bundle)\r
+void FragmentOverlay::onStartCallback (JNIEnv*, FragmentOverlay& t)\r
 {\r
-    if (auto* myself = reinterpret_cast<FragmentOverlay*> (host))\r
-        myself->onCreated (LocalRef<jobject> (env->NewLocalRef (bundle)));\r
+    t.onStart();\r
 }\r
 \r
-void FragmentOverlay::onStartNative (JNIEnv*, jobject, jlong host)\r
+void FragmentOverlay::onRequestPermissionsResultCallback (JNIEnv* env, FragmentOverlay& t, jint requestCode, jobjectArray jPermissions, jintArray jGrantResults)\r
 {\r
-    if (auto* myself = reinterpret_cast<FragmentOverlay*> (host))\r
-        myself->onStart();\r
-}\r
+    Array<int> grantResults;\r
+    int n = (jGrantResults != nullptr ? env->GetArrayLength (jGrantResults) : 0);\r
 \r
-void FragmentOverlay::onRequestPermissionsResultNative (JNIEnv* env, jobject, jlong host, jint requestCode,\r
-                                                        jobjectArray jPermissions, jintArray jGrantResults)\r
-{\r
-    if (auto* myself = reinterpret_cast<FragmentOverlay*> (host))\r
+    if (n > 0)\r
     {\r
-        Array<int> grantResults;\r
-        int n = (jGrantResults != nullptr ? env->GetArrayLength (jGrantResults) : 0);\r
+        auto* data = env->GetIntArrayElements (jGrantResults, nullptr);\r
 \r
-        if (n > 0)\r
-        {\r
-            auto* data = env->GetIntArrayElements (jGrantResults, nullptr);\r
+        for (int i = 0; i < n; ++i)\r
+            grantResults.add (data[i]);\r
 \r
-            for (int i = 0; i < n; ++i)\r
-                grantResults.add (data[i]);\r
+        env->ReleaseIntArrayElements (jGrantResults, data, 0);\r
+    }\r
 \r
-            env->ReleaseIntArrayElements (jGrantResults, data, 0);\r
-        }\r
+    t.onRequestPermissionsResult (requestCode,\r
+                                  javaStringArrayToJuce (LocalRef<jobjectArray> (jPermissions)),\r
+                                  grantResults);\r
+}\r
 \r
-        myself->onRequestPermissionsResult (requestCode,\r
-                                            javaStringArrayToJuce (LocalRef<jobjectArray> (jPermissions)),\r
-                                            grantResults);\r
-    }\r
+void FragmentOverlay::onActivityResultCallback (JNIEnv* env, FragmentOverlay& t, jint requestCode, jint resultCode, jobject data)\r
+{\r
+    t.onActivityResult (requestCode, resultCode, LocalRef<jobject> (env->NewLocalRef (data)));\r
 }\r
 \r
 jobject FragmentOverlay::getNativeHandle()\r
index bdfa4c3880495c4618ec29c119b66c3d8a1065df..aeb49f97b2f8a0ce135cc250d90cc18aea9472eb 100644 (file)
@@ -172,7 +172,7 @@ struct SystemJavaClassComparator;
 class JNIClassBase\r
 {\r
 public:\r
-    JNIClassBase (const char* classPath, int minSDK, const void* byteCode, size_t byteCodeSize);\r
+    JNIClassBase (const char* classPath, int minSDK, const uint8* byteCode, size_t byteCodeSize);\r
     virtual ~JNIClassBase();\r
 \r
     operator jclass() const noexcept  { return classRef; }\r
@@ -210,6 +210,9 @@ private:
 };\r
 \r
 //==============================================================================\r
+template <typename T, size_t N> constexpr auto numBytes (const T (&) [N]) { return N; }\r
+                                constexpr auto numBytes (std::nullptr_t)  { return static_cast<size_t> (0); }\r
+\r
 #define CREATE_JNI_METHOD(methodID, stringName, params)          methodID = resolveMethod (env, stringName, params);\r
 #define CREATE_JNI_STATICMETHOD(methodID, stringName, params)    methodID = resolveStaticMethod (env, stringName, params);\r
 #define CREATE_JNI_FIELD(fieldID, stringName, signature)         fieldID  = resolveField (env, stringName, signature);\r
@@ -219,26 +222,26 @@ private:
 #define DECLARE_JNI_FIELD(fieldID, stringName, signature)        jfieldID  fieldID;\r
 #define DECLARE_JNI_CALLBACK(fieldID, stringName, signature)\r
 \r
-#define DECLARE_JNI_CLASS_WITH_BYTECODE(CppClassName, javaPath, minSDK, byteCodeData, byteCodeSize) \\r
-    class CppClassName ## _Class   : public JNIClassBase \\r
-    { \\r
-    public: \\r
-        CppClassName ## _Class() : JNIClassBase (javaPath, minSDK, byteCodeData, byteCodeSize) {} \\r
-    \\r
-        void initialiseFields (JNIEnv* env) \\r
-        { \\r
-            Array<JNINativeMethod> callbacks; \\r
-            JNI_CLASS_MEMBERS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD, CREATE_JNI_CALLBACK); \\r
-            resolveCallbacks (env, callbacks); \\r
-        } \\r
-    \\r
-        JNI_CLASS_MEMBERS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD, DECLARE_JNI_CALLBACK) \\r
-    }; \\r
-    static CppClassName ## _Class CppClassName;\r
+#define DECLARE_JNI_CLASS_WITH_BYTECODE(CppClassName, javaPath, minSDK, byteCodeData)                                                       \\r
+    class CppClassName ## _Class   : public JNIClassBase                                                                                    \\r
+    {                                                                                                                                       \\r
+    public:                                                                                                                                 \\r
+        CppClassName ## _Class() : JNIClassBase (javaPath, minSDK, byteCodeData, numBytes (byteCodeData)) {}                                \\r
+                                                                                                                                            \\r
+        void initialiseFields (JNIEnv* env)                                                                                                 \\r
+        {                                                                                                                                   \\r
+            Array<JNINativeMethod> callbacks;                                                                                               \\r
+            JNI_CLASS_MEMBERS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD, CREATE_JNI_CALLBACK);  \\r
+            resolveCallbacks (env, callbacks);                                                                                              \\r
+        }                                                                                                                                   \\r
+                                                                                                                                            \\r
+        JNI_CLASS_MEMBERS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD, DECLARE_JNI_CALLBACK)              \\r
+    };                                                                                                                                      \\r
+    static inline const CppClassName ## _Class CppClassName;\r
 \r
 //==============================================================================\r
 #define DECLARE_JNI_CLASS_WITH_MIN_SDK(CppClassName, javaPath, minSDK) \\r
-    DECLARE_JNI_CLASS_WITH_BYTECODE (CppClassName, javaPath, minSDK, nullptr, 0)\r
+    DECLARE_JNI_CLASS_WITH_BYTECODE (CppClassName, javaPath, minSDK, nullptr)\r
 \r
 //==============================================================================\r
 #define DECLARE_JNI_CLASS(CppClassName, javaPath) \\r
@@ -1005,20 +1008,20 @@ public:
                                              const Array<int>& /*grantResults*/) {}\r
     virtual void onActivityResult (int /*requestCode*/, int /*resultCode*/, LocalRef<jobject> /*data*/) {}\r
 \r
+    /** @internal */\r
+    static void onCreatedCallback (JNIEnv*, FragmentOverlay&, jobject obj);\r
+    /** @internal */\r
+    static void onStartCallback (JNIEnv*, FragmentOverlay&);\r
+    /** @internal */\r
+    static void onRequestPermissionsResultCallback (JNIEnv*, FragmentOverlay&, jint requestCode, jobjectArray jPermissions, jintArray jGrantResults);\r
+    /** @internal */\r
+    static void onActivityResultCallback (JNIEnv*, FragmentOverlay&, jint requestCode, jint resultCode, jobject data);\r
+\r
 protected:\r
     jobject getNativeHandle();\r
 \r
 private:\r
-\r
     GlobalRef native;\r
-\r
-public:\r
-    /* internal: do not use */\r
-    static void onActivityResultNative (JNIEnv*, jobject, jlong, jint, jint, jobject);\r
-    static void onCreateNative (JNIEnv*, jobject, jlong, jobject);\r
-    static void onStartNative (JNIEnv*, jobject, jlong);\r
-    static void onRequestPermissionsResultNative (JNIEnv*, jobject, jlong, jint,\r
-                                                  jobjectArray, jintArray);\r
 };\r
 \r
 //==============================================================================\r
@@ -1030,4 +1033,30 @@ void startAndroidActivityForResult (const LocalRef<jobject>& intent, int request
 bool androidHasSystemFeature (const String& property);\r
 String audioManagerGetProperty (const String& property);\r
 \r
+namespace detail\r
+{\r
+\r
+template <auto Fn, typename Result, typename Class, typename... Args>\r
+inline constexpr auto generatedCallbackImpl =\r
+    juce::toFnPtr (JNICALL [] (JNIEnv* env, jobject, jlong host, Args... args) -> Result\r
+                   {\r
+                       if (auto* object = reinterpret_cast<Class*> (host))\r
+                           return Fn (env, *object, args...);\r
+\r
+                       return {};\r
+                   });\r
+\r
+template <auto Fn, typename Result, typename Class, typename... Args>\r
+constexpr auto generateCallbackImpl (Result (*) (JNIEnv*, Class&, Args...))        { return generatedCallbackImpl<Fn, Result, Class, Args...>; }\r
+\r
+template <auto Fn, typename Result, typename Class, typename... Args>\r
+constexpr auto generateCallbackImpl (Result (*) (JNIEnv*, const Class&, Args...))  { return generatedCallbackImpl<Fn, Result, Class, Args...>; }\r
+\r
+} // namespace detail\r
+\r
+// Evaluates to a static function that forwards to the provided Fn, assuming that the\r
+// 'host' argument points to an object on which it is valid to call Fn\r
+template <auto Fn>\r
+inline constexpr auto generatedCallback = detail::generateCallbackImpl<Fn> (Fn);\r
+\r
 } // namespace juce\r
index f5a3afa89b6e05b4b5e4dc5909e945b49d9e423c..c128cc6926ff2ca7e65ce5370a409ea6f629bdab 100644 (file)
@@ -195,7 +195,7 @@ DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer")
  METHOD (isExhausted, "isExhausted", "()Z") \\r
  METHOD (setPosition, "setPosition", "(J)Z") \\r
 \r
-DECLARE_JNI_CLASS_WITH_BYTECODE (HTTPStream, "com/rmsl/juce/JuceHTTPStream", 16, javaJuceHttpStream, sizeof(javaJuceHttpStream))\r
+DECLARE_JNI_CLASS_WITH_BYTECODE (HTTPStream, "com/rmsl/juce/JuceHTTPStream", 16, javaJuceHttpStream)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
 //==============================================================================\r
index 1bbc073b7518e226cd9d0d5a6c6690596be9e1b8..285b92c1e16687f01b636d4c59d330855edc8b29 100644 (file)
@@ -24,15 +24,47 @@ namespace juce
 {\r
 \r
 //==============================================================================\r
-static String jucePermissionToAndroidPermission (RuntimePermissions::PermissionID permission)\r
+static StringArray jucePermissionToAndroidPermissions (RuntimePermissions::PermissionID permission)\r
 {\r
+    const auto externalStorageOrMedia = [] (const auto* newPermission)\r
+    {\r
+        return getAndroidSDKVersion() < 33 ? "android.permission.READ_EXTERNAL_STORAGE" : newPermission;\r
+    };\r
+\r
     switch (permission)\r
     {\r
-        case RuntimePermissions::recordAudio:           return "android.permission.RECORD_AUDIO";\r
-        case RuntimePermissions::bluetoothMidi:         return "android.permission.ACCESS_FINE_LOCATION";\r
-        case RuntimePermissions::readExternalStorage:   return "android.permission.READ_EXTERNAL_STORAGE";\r
-        case RuntimePermissions::writeExternalStorage:  return "android.permission.WRITE_EXTERNAL_STORAGE";\r
-        case RuntimePermissions::camera:                return "android.permission.CAMERA";\r
+        case RuntimePermissions::recordAudio:           return { "android.permission.RECORD_AUDIO" };\r
+        case RuntimePermissions::bluetoothMidi:\r
+        {\r
+            if (getAndroidSDKVersion() < 31)\r
+                return { "android.permission.ACCESS_FINE_LOCATION" };\r
+\r
+            return { "android.permission.BLUETOOTH_SCAN",\r
+                     "android.permission.BLUETOOTH_CONNECT" };\r
+        }\r
+\r
+        case RuntimePermissions::writeExternalStorage:  return { "android.permission.WRITE_EXTERNAL_STORAGE" };\r
+        case RuntimePermissions::camera:                return { "android.permission.CAMERA" };\r
+\r
+        case RuntimePermissions::readExternalStorage:\r
+        {\r
+            // See: https://developer.android.com/reference/android/Manifest.permission#READ_EXTERNAL_STORAGE\r
+            if (getAndroidSDKVersion() < 33)\r
+                return { "android.permission.READ_EXTERNAL_STORAGE" };\r
+\r
+            return { "android.permission.READ_MEDIA_AUDIO",\r
+                     "android.permission.READ_MEDIA_IMAGES",\r
+                     "android.permission.READ_MEDIA_VIDEO" };\r
+        }\r
+\r
+        case RuntimePermissions::readMediaAudio:\r
+            return { externalStorageOrMedia ("android.permission.READ_MEDIA_AUDIO") };\r
+\r
+        case RuntimePermissions::readMediaImages:\r
+            return { externalStorageOrMedia ("android.permission.READ_MEDIA_IMAGES") };\r
+\r
+        case RuntimePermissions::readMediaVideo:\r
+            return { externalStorageOrMedia ("android.permission.READ_MEDIA_VIDEO") };\r
     }\r
 \r
     // invalid permission\r
@@ -42,53 +74,29 @@ static String jucePermissionToAndroidPermission (RuntimePermissions::PermissionI
 \r
 static RuntimePermissions::PermissionID androidPermissionToJucePermission (const String& permission)\r
 {\r
-    if      (permission == "android.permission.RECORD_AUDIO")            return RuntimePermissions::recordAudio;\r
-    else if (permission == "android.permission.ACCESS_FINE_LOCATION")    return RuntimePermissions::bluetoothMidi;\r
-    else if (permission == "android.permission.READ_EXTERNAL_STORAGE")   return RuntimePermissions::readExternalStorage;\r
-    else if (permission == "android.permission.WRITE_EXTERNAL_STORAGE")  return RuntimePermissions::writeExternalStorage;\r
-    else if (permission == "android.permission.CAMERA")                  return RuntimePermissions::camera;\r
+    static const std::map<String, RuntimePermissions::PermissionID> map\r
+    {\r
+        { "android.permission.RECORD_AUDIO",            RuntimePermissions::recordAudio },\r
+        { "android.permission.ACCESS_FINE_LOCATION",    RuntimePermissions::bluetoothMidi },\r
+        { "android.permission.READ_EXTERNAL_STORAGE",   RuntimePermissions::readExternalStorage },\r
+        { "android.permission.WRITE_EXTERNAL_STORAGE",  RuntimePermissions::writeExternalStorage },\r
+        { "android.permission.CAMERA",                  RuntimePermissions::camera },\r
+        { "android.permission.READ_MEDIA_AUDIO",        RuntimePermissions::readMediaAudio },\r
+        { "android.permission.READ_MEDIA_IMAGES",       RuntimePermissions::readMediaImages },\r
+        { "android.permission.READ_MEDIA_VIDEO",        RuntimePermissions::readMediaVideo },\r
+        { "android.permission.BLUETOOTH_SCAN",          RuntimePermissions::bluetoothMidi },\r
+    };\r
 \r
-    return static_cast<RuntimePermissions::PermissionID> (-1);\r
+    const auto iter = map.find (permission);\r
+    return iter != map.cend() ? iter->second\r
+                              : static_cast<RuntimePermissions::PermissionID> (-1);\r
 }\r
 \r
 //==============================================================================\r
 struct PermissionsRequest\r
 {\r
-    PermissionsRequest() {}\r
-\r
-    // using "= default" on the following method triggers an internal compiler error\r
-    // in Android NDK 17\r
-    PermissionsRequest (const PermissionsRequest& o)\r
-        : callback (o.callback), permission (o.permission)\r
-    {}\r
-\r
-    PermissionsRequest (PermissionsRequest&& o)\r
-        : callback (std::move (o.callback)), permission (o.permission)\r
-    {\r
-        o.permission = static_cast<RuntimePermissions::PermissionID> (-1);\r
-    }\r
-\r
-    PermissionsRequest (RuntimePermissions::Callback && callbackToUse,\r
-                        RuntimePermissions::PermissionID permissionToRequest)\r
-        : callback (std::move (callbackToUse)), permission (permissionToRequest)\r
-    {}\r
-\r
-    PermissionsRequest& operator= (const PermissionsRequest & o)\r
-    {\r
-        callback   = o.callback;\r
-        permission = o.permission;\r
-        return *this;\r
-    }\r
-\r
-    PermissionsRequest& operator= (PermissionsRequest && o)\r
-    {\r
-        callback   = std::move (o.callback);\r
-        permission = o.permission;\r
-        return *this;\r
-    }\r
-\r
     RuntimePermissions::Callback callback;\r
-    RuntimePermissions::PermissionID permission;\r
+    RuntimePermissions::PermissionID permission = static_cast<RuntimePermissions::PermissionID> (-1);\r
 };\r
 \r
 //==============================================================================\r
@@ -165,8 +173,7 @@ struct PermissionsOverlay   : FragmentOverlay
             {\r
                 auto &request = requests.front();\r
 \r
-                StringArray permissionsArray{\r
-                        jucePermissionToAndroidPermission (request.permission)};\r
+                auto permissionsArray = jucePermissionToAndroidPermissions (request.permission);\r
                 auto jPermissionsArray = juceStringArrayToJava (permissionsArray);\r
 \r
 \r
@@ -199,9 +206,16 @@ struct PermissionsOverlay   : FragmentOverlay
 //==============================================================================\r
 void RuntimePermissions::request (PermissionID permission, Callback callback)\r
 {\r
-    auto requestedPermission = jucePermissionToAndroidPermission (permission);\r
+    const auto requestedPermissions = jucePermissionToAndroidPermissions (permission);\r
+\r
+    const auto allPermissionsInManifest = std::all_of (requestedPermissions.begin(),\r
+                                                       requestedPermissions.end(),\r
+                                                       [] (const auto& p)\r
+                                                       {\r
+                                                           return isPermissionDeclaredInManifest (p);\r
+                                                       });\r
 \r
-    if (! isPermissionDeclaredInManifest (requestedPermission))\r
+    if (! allPermissionsInManifest)\r
     {\r
         // Error! If you want to be able to request this runtime permission, you\r
         // also need to declare it in your app's manifest. You can do so via\r
@@ -220,7 +234,7 @@ void RuntimePermissions::request (PermissionID permission, Callback callback)
         return;\r
     }\r
 \r
-    PermissionsRequest request (std::move (callback), permission);\r
+    PermissionsRequest request { std::move (callback), permission };\r
 \r
     static CriticalSection overlayGuard;\r
     ScopedLock lock (overlayGuard);\r
@@ -250,12 +264,15 @@ bool RuntimePermissions::isGranted (PermissionID permission)
 {\r
     auto* env = getEnv();\r
 \r
-    auto requestedPermission = jucePermissionToAndroidPermission (permission);\r
-    int result = env->CallIntMethod (getAppContext().get(), AndroidContext.checkCallingOrSelfPermission,\r
-                                     javaString (requestedPermission).get());\r
+    const auto requestedPermissions = jucePermissionToAndroidPermissions (permission);\r
 \r
+    return std::all_of (requestedPermissions.begin(), requestedPermissions.end(), [env] (const auto& p)\r
+    {\r
+        return 0 == env->CallIntMethod (getAppContext().get(),\r
+                                        AndroidContext.checkCallingOrSelfPermission,\r
+                                        javaString (p).get());\r
+    });\r
 \r
-    return result == 0 /* PERMISSION_GRANTED */;\r
 }\r
 \r
 } // namespace juce\r
index e69b3bd9d2e364c0d1b9eeafe9865e0f111d80d8..fe6088553a98b0363daa2b54cc32782cb36d353e 100644 (file)
@@ -344,34 +344,32 @@ LocalRef<jobject> getMainActivity() noexcept
 }\r
 \r
 //==============================================================================\r
-#if JUCE_ANDROID && JUCE_MODULE_AVAILABLE_juce_audio_devices && (JUCE_USE_ANDROID_OPENSLES || JUCE_USE_ANDROID_OBOE)\r
- #define JUCE_ANDROID_REALTIME_THREAD_AVAILABLE 1\r
-#endif\r
+using RealtimeThreadFactory = pthread_t (*) (void* (*entry) (void*), void* userPtr);\r
+// This is defined in the juce_audio_devices module, with different definitions depending on\r
+// whether OpenSL/Oboe are enabled.\r
+RealtimeThreadFactory getAndroidRealtimeThreadFactory();\r
 \r
-#if JUCE_ANDROID_REALTIME_THREAD_AVAILABLE\r
-pthread_t juce_createRealtimeAudioThread (void* (*entry) (void*), void* userPtr);\r
+#if ! JUCE_MODULE_AVAILABLE_juce_audio_devices\r
+RealtimeThreadFactory getAndroidRealtimeThreadFactory() { return nullptr; }\r
 #endif\r
 \r
 extern JavaVM* androidJNIJavaVM;\r
 \r
-bool Thread::createNativeThread (Priority)\r
+static auto setPriorityOfThisThread (Thread::Priority p)\r
 {\r
-    if (isRealtime())\r
-    {\r
-       #if JUCE_ANDROID_REALTIME_THREAD_AVAILABLE\r
-        threadHandle = (void*) juce_createRealtimeAudioThread (threadEntryProc, this);\r
-        threadId = (ThreadID) threadHandle.get();\r
-        return threadId != nullptr;\r
-       #else\r
-        jassertfalse;\r
-       #endif\r
-    }\r
+    return setpriority (PRIO_PROCESS,\r
+                        (id_t) gettid(),\r
+                        ThreadPriorities::getNativePriority (p)) == 0;\r
+}\r
 \r
-    PosixThreadAttribute attr { threadStackSize };\r
-    threadId = threadHandle = makeThreadHandle (attr, this, [] (void* userData) -> void*\r
+bool Thread::createNativeThread (Priority)\r
+{\r
+    const auto threadEntryProc = [] (void* userData) -> void*\r
     {\r
         auto* myself = static_cast<Thread*> (userData);\r
 \r
+        setPriorityOfThisThread (myself->priority);\r
+\r
         juce_threadEntryPoint (myself);\r
 \r
         if (androidJNIJavaVM != nullptr)\r
@@ -385,7 +383,24 @@ bool Thread::createNativeThread (Priority)
         }\r
 \r
         return nullptr;\r
-    });\r
+    };\r
+\r
+    if (isRealtime())\r
+    {\r
+        if (const auto factory = getAndroidRealtimeThreadFactory())\r
+        {\r
+            threadHandle = (void*) factory (threadEntryProc, this);\r
+            threadId = (ThreadID) threadHandle.load();\r
+            return threadId != nullptr;\r
+        }\r
+        else\r
+        {\r
+            jassertfalse;\r
+        }\r
+    }\r
+\r
+    PosixThreadAttribute attr { threadStackSize };\r
+    threadId = threadHandle = makeThreadHandle (attr, this, threadEntryProc);\r
 \r
     return threadId != nullptr;\r
 }\r
@@ -404,14 +419,15 @@ Thread::Priority Thread::getPriority() const
     return ThreadPriorities::getJucePriority (native);\r
 }\r
 \r
-bool Thread::setPriority (Priority)\r
+bool Thread::setPriority (Priority priorityIn)\r
 {\r
     jassert (Thread::getCurrentThreadId() == getThreadId());\r
 \r
     if (isRealtime())\r
         return false;\r
 \r
-    return setpriority (PRIO_PROCESS, (id_t) gettid(), ThreadPriorities::getNativePriority (priority)) == 0;\r
+    const auto priorityToUse = priority = priorityIn;\r
+    return setPriorityOfThisThread (priorityToUse) == 0;\r
 }\r
 \r
 //==============================================================================\r
index dcee53f11a56ab54301928f5cbcf21f1e7707dea..ffd68758aee1c006f6db6cc8c30b9e370fa6c968 100644 (file)
@@ -397,7 +397,7 @@ bool DirectoryIterator::NativeIterator::next (String& filenameFound,
 \r
 \r
 //==============================================================================\r
-bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters)\r
+bool JUCE_CALLTYPE Process::openDocument (const String& fileName, [[maybe_unused]] const String& parameters)\r
 {\r
     JUCE_AUTORELEASEPOOL\r
     {\r
@@ -406,8 +406,6 @@ bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String&
                                                                                        : [NSURL URLWithString: fileNameAsNS];\r
 \r
       #if JUCE_IOS\r
-        ignoreUnused (parameters);\r
-\r
         if (@available (iOS 10.0, *))\r
         {\r
             [[UIApplication sharedApplication] openURL: filenameAsURL\r
index 51939b48488741510515ab42e96048efc2e2835b..56110874d2c5a6f44120ecc342e9ac13508bad01 100644 (file)
@@ -58,14 +58,12 @@ void MACAddress::findAllAddresses (Array<MACAddress>& result)
 }\r
 \r
 //==============================================================================\r
-bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress,\r
-                                                      const String& emailSubject,\r
-                                                      const String& bodyText,\r
-                                                      const StringArray& filesToAttach)\r
+bool JUCE_CALLTYPE Process::openEmailWithAttachments ([[maybe_unused]] const String& targetEmailAddress,\r
+                                                      [[maybe_unused]] const String& emailSubject,\r
+                                                      [[maybe_unused]] const String& bodyText,\r
+                                                      [[maybe_unused]] const StringArray& filesToAttach)\r
 {\r
   #if JUCE_IOS\r
-    ignoreUnused (targetEmailAddress, emailSubject, bodyText, filesToAttach);\r
-\r
     //xxx probably need to use MFMailComposeViewController\r
     jassertfalse;\r
     return false;\r
@@ -282,9 +280,9 @@ public:
         return newRequest;\r
     }\r
 \r
-    void didFailWithError (NSError* error)\r
+    void didFailWithError ([[maybe_unused]] NSError* error)\r
     {\r
-        DBG (nsStringToJuce ([error description])); ignoreUnused (error);\r
+        DBG (nsStringToJuce ([error description]));\r
         nsUrlErrorCode = [error code];\r
         hasFailed = true;\r
         initialised = true;\r
@@ -951,10 +949,8 @@ public:
         connection.reset();\r
     }\r
 \r
-    bool connect (WebInputStream::Listener* webInputListener, int numRetries = 0)\r
+    bool connect (WebInputStream::Listener* webInputListener, [[maybe_unused]] int numRetries = 0)\r
     {\r
-        ignoreUnused (numRetries);\r
-\r
         {\r
             const ScopedLock lock (createConnectionLock);\r
 \r
index ac67c4d75aaaab16967917a0a409b9acb288385d..de20b86a181dcb60692cc4b5db1c6d29aa7ca6b5 100644 (file)
@@ -342,15 +342,6 @@ namespace detail
     {\r
         return joinCompileTimeStr (v, makeCompileTimeStr (others...));\r
     }\r
-\r
-    template <typename Functor, typename Return, typename... Args>\r
-    static constexpr auto toFnPtr (Functor functor, Return (Functor::*) (Args...) const)\r
-    {\r
-        return static_cast<Return (*) (Args...)> (functor);\r
-    }\r
-\r
-    template <typename Functor>\r
-    static constexpr auto toFnPtr (Functor functor) { return toFnPtr (functor, &Functor::operator()); }\r
 } // namespace detail\r
 \r
 //==============================================================================\r
@@ -391,12 +382,12 @@ struct ObjCClass
     template <typename Type>\r
     void addIvar (const char* name)\r
     {\r
-        BOOL b = class_addIvar (cls, name, sizeof (Type), (uint8_t) rint (log2 (sizeof (Type))), @encode (Type));\r
-        jassert (b); ignoreUnused (b);\r
+        [[maybe_unused]] BOOL b = class_addIvar (cls, name, sizeof (Type), (uint8_t) rint (log2 (sizeof (Type))), @encode (Type));\r
+        jassert (b);\r
     }\r
 \r
     template <typename Fn>\r
-    void addMethod (SEL selector, Fn callbackFn) { addMethod (selector, detail::toFnPtr (callbackFn)); }\r
+    void addMethod (SEL selector, Fn callbackFn) { addMethod (selector, toFnPtr (callbackFn)); }\r
 \r
     template <typename Result, typename... Args>\r
     void addMethod (SEL selector, Result (*callbackFn) (id, SEL, Args...))\r
@@ -408,8 +399,8 @@ struct ObjCClass
 \r
     void addProtocol (Protocol* protocol)\r
     {\r
-        BOOL b = class_addProtocol (cls, protocol);\r
-        jassert (b); ignoreUnused (b);\r
+        [[maybe_unused]] BOOL b = class_addProtocol (cls, protocol);\r
+        jassert (b);\r
     }\r
 \r
     template <typename ReturnType, typename... Params>\r
index 32c02312189a13caae0e88d123986becb22c71a3..2b6939e0d1f8974e5ba074479da1717900cf7ea0 100644 (file)
@@ -153,6 +153,10 @@ String SystemStats::getOperatingSystemName()
 \r
 String SystemStats::getDeviceDescription()\r
 {\r
+    if (auto* userInfo = [[NSProcessInfo processInfo] environment])\r
+        if (auto* simDeviceName = [userInfo objectForKey: @"SIMULATOR_MODEL_IDENTIFIER"])\r
+            return nsStringToJuce (simDeviceName);\r
+\r
    #if JUCE_IOS\r
     const char* name = "hw.machine";\r
    #else\r
@@ -166,22 +170,7 @@ String SystemStats::getDeviceDescription()
         HeapBlock<char> model (size);\r
 \r
         if (sysctlbyname (name, model, &size, nullptr, 0) >= 0)\r
-        {\r
-            String description (model.get());\r
-\r
-           #if JUCE_IOS\r
-            if (description == "x86_64") // running in the simulator\r
-            {\r
-                if (auto* userInfo = [[NSProcessInfo processInfo] environment])\r
-                {\r
-                    if (auto* simDeviceName = [userInfo objectForKey: @"SIMULATOR_DEVICE_NAME"])\r
-                        return nsStringToJuce (simDeviceName);\r
-                }\r
-            }\r
-          #endif\r
-\r
-            return description;\r
-        }\r
+            return String (model.get());\r
     }\r
 \r
     return {};\r
index dde81fab3aca77a2710a80d36bbd0c9f22b018c5..7d0e1ba59fe177fdb79d4761028749a957a3b4bb 100644 (file)
@@ -254,8 +254,7 @@ void NamedPipe::close()
             pimpl->stopReadOperation = true;\r
 \r
             const char buffer[] { 0 };\r
-            const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer));\r
-            ignoreUnused (done);\r
+            [[maybe_unused]] const auto done = ::write (pimpl->pipeIn.get(), buffer, numElementsInArray (buffer));\r
         }\r
     }\r
 \r
index dee843cb57573ed2fec1ca04c3969445227380ec..a2649055acb6a90f8824b9742cd1dd5b7fc40849 100644 (file)
@@ -140,10 +140,9 @@ bool File::setAsCurrentWorkingDirectory() const
 \r
 //==============================================================================\r
 // The unix siginterrupt function is deprecated - this does the same job.\r
-int juce_siginterrupt (int sig, int flag)\r
+int juce_siginterrupt ([[maybe_unused]] int sig, [[maybe_unused]] int flag)\r
 {\r
    #if JUCE_WASM\r
-    ignoreUnused (sig, flag);\r
     return 0;\r
    #else\r
     #if JUCE_ANDROID\r
@@ -693,8 +692,7 @@ int File::getVolumeSerialNumber() const
 void juce_runSystemCommand (const String&);\r
 void juce_runSystemCommand (const String& command)\r
 {\r
-    int result = system (command.toUTF8());\r
-    ignoreUnused (result);\r
+    [[maybe_unused]] int result = system (command.toUTF8());\r
 }\r
 \r
 String juce_getOutputFromCommand (const String&);\r
@@ -1015,7 +1013,7 @@ void JUCE_CALLTYPE Thread::yield()
  #define SUPPORT_AFFINITIES 1\r
 #endif\r
 \r
-void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (uint32 affinityMask)\r
+void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask ([[maybe_unused]] uint32 affinityMask)\r
 {\r
    #if SUPPORT_AFFINITIES\r
     cpu_set_t affinity;\r
@@ -1042,7 +1040,6 @@ void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (uint32 affinityMask)
     // affinities aren't supported because either the appropriate header files weren't found,\r
     // or the SUPPORT_AFFINITIES macro was turned off\r
     jassertfalse;\r
-    ignoreUnused (affinityMask);\r
    #endif\r
 }\r
 \r
index 7d93f26afbf7f1f05e271a8de97b3bc39cd7cf7d..6bc65bf22868c3df52196227a5fe66bb4137180d 100644 (file)
@@ -960,7 +960,7 @@ bool File::createShortcut (const String& description, const File& linkFileToCrea
     ComSmartPtr<IShellLink> shellLink;\r
     ComSmartPtr<IPersistFile> persistFile;\r
 \r
-    ignoreUnused (CoInitialize (nullptr));\r
+    [[maybe_unused]] const auto result = CoInitialize (nullptr);\r
 \r
     return SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink))\r
         && SUCCEEDED (shellLink->SetPath (getFullPathName().toWideCharPointer()))\r
index 64b03b627ee17c0978056afa6507745c893b598e..63163d148b67d1983fb69e24c4ddca0e7ddbfb93 100644 (file)
@@ -457,8 +457,7 @@ public:
        #endif\r
 \r
        #if JUCE_WIN32_TIMER_PERIOD > 0\r
-        auto res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD);\r
-        ignoreUnused (res);\r
+        [[maybe_unused]] auto res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD);\r
         jassert (res == TIMERR_NOERROR);\r
        #endif\r
 \r
index 478978cbd37da88e5bd6f7717c533d6dcb2e39c6..590a9976bfce7eae93b280e2f8e159fe6f1fe968 100644 (file)
@@ -134,7 +134,7 @@ void Thread::killThread()
     }\r
 }\r
 \r
-void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name)\r
+void JUCE_CALLTYPE Thread::setCurrentThreadName ([[maybe_unused]] const String& name)\r
 {\r
    #if JUCE_DEBUG && JUCE_MSVC\r
     struct\r
@@ -159,8 +159,6 @@ void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name)
     {\r
         OutputDebugStringA ("** Warning - Encountered noncontinuable exception **\n");\r
     }\r
-   #else\r
-    ignoreUnused (name);\r
    #endif\r
 }\r
 \r
index 0823d429e490193be4fef0d6d8944caf4492de03..c020720b2a0f6f2d204558f3b5cdab517ca6454d 100644 (file)
@@ -91,15 +91,16 @@ namespace SocketHelpers
                                : setOption (handle, IPPROTO_TCP, TCP_NODELAY, (int) 1));\r
     }\r
 \r
-    static void closeSocket (std::atomic<int>& handle, CriticalSection& readLock,\r
-                             bool isListener, int portNumber, std::atomic<bool>& connected) noexcept\r
+    static void closeSocket (std::atomic<int>& handle,\r
+                             [[maybe_unused]] CriticalSection& readLock,\r
+                             [[maybe_unused]] bool isListener,\r
+                             [[maybe_unused]] int portNumber,\r
+                             std::atomic<bool>& connected) noexcept\r
     {\r
         const auto h = (SocketHandle) handle.load();\r
         handle = -1;\r
 \r
        #if JUCE_WINDOWS\r
-        ignoreUnused (portNumber, isListener, readLock);\r
-\r
         if (h != invalidSocket || connected)\r
             closesocket (h);\r
 \r
@@ -771,11 +772,9 @@ bool DatagramSocket::setMulticastLoopbackEnabled (bool enable)
     return SocketHelpers::setOption<bool> ((SocketHandle) handle.load(), IPPROTO_IP, IP_MULTICAST_LOOP, enable);\r
 }\r
 \r
-bool DatagramSocket::setEnablePortReuse (bool enabled)\r
+bool DatagramSocket::setEnablePortReuse ([[maybe_unused]] bool enabled)\r
 {\r
-   #if JUCE_ANDROID\r
-    ignoreUnused (enabled);\r
-   #else\r
+   #if ! JUCE_ANDROID\r
     if (handle >= 0)\r
         return SocketHelpers::setOption ((SocketHandle) handle.load(),\r
                                         #if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD\r
index f2133077461b03b723cf2d2ae5032e61fa11a73d..dd10be083e9fba0849e4a64da260b2cabe3ee175 100644 (file)
@@ -630,8 +630,7 @@ public:
             }\r
             else\r
             {\r
-                auto desc = [error localizedDescription];\r
-                ignoreUnused (desc);\r
+                [[maybe_unused]] auto desc = [error localizedDescription];\r
                 jassertfalse;\r
             }\r
         }\r
@@ -664,8 +663,7 @@ private:
                 return urlToUse.getLocalFile();\r
             }\r
 \r
-            auto desc = [error localizedDescription];\r
-            ignoreUnused (desc);\r
+            [[maybe_unused]] auto desc = [error localizedDescription];\r
             jassertfalse;\r
         }\r
 \r
index daffbc44283fa38787ca02db3c80ec2005e47119..1183c1bc728b0f0abf29b6e2eaf0815456f03425 100644 (file)
@@ -96,4 +96,11 @@ void WebInputStream::createHeadersAndPostData (const URL& aURL,
     aURL.createHeadersAndPostData (headers, data, addParametersToBody);\r
 }\r
 \r
+bool WebInputStream::Listener::postDataSendProgress ([[maybe_unused]] WebInputStream& request,\r
+                                                     [[maybe_unused]] int bytesSent,\r
+                                                     [[maybe_unused]] int totalBytes)\r
+{\r
+    return true;\r
+}\r
+\r
 } // namespace juce\r
index 883012129ddbcf2356463fd751d403a4ce2523b2..308adfe4e7df90ee039823eca87a5139f44fdef0 100644 (file)
@@ -107,11 +107,7 @@ class JUCE_API WebInputStream  : public InputStream
 \r
             @returns true to continue or false to cancel the upload\r
         */\r
-        virtual bool postDataSendProgress (WebInputStream& request, int bytesSent, int totalBytes)\r
-        {\r
-            ignoreUnused (request, bytesSent, totalBytes);\r
-            return true;\r
-        }\r
+        virtual bool postDataSendProgress (WebInputStream& request, int bytesSent, int totalBytes);\r
     };\r
 \r
     /** Wait until the first byte is ready for reading.\r
index 2ca69dc62cc636e8dbcc90a9d2c876dae01bee03..d3be4a8bbd88256bef5c7241e18c24f57f8e6d51 100644 (file)
@@ -176,11 +176,11 @@ int64 MemoryOutputStream::writeFromInputStream (InputStream& source, int64 maxNu
 \r
     if (availableData > 0)\r
     {\r
-        if (maxNumBytesToWrite > availableData || maxNumBytesToWrite < 0)\r
+        if (maxNumBytesToWrite < 0 || availableData < maxNumBytesToWrite)\r
             maxNumBytesToWrite = availableData;\r
 \r
         if (blockToUse != nullptr)\r
-            preallocate (position + (size_t) availableData);\r
+            preallocate (position + (size_t) maxNumBytesToWrite);\r
     }\r
 \r
     return OutputStream::writeFromInputStream (source, maxNumBytesToWrite);\r
index 8b466006dfa6af03c9023ead0bce83c6c70a8316..96285478a6ee5959220da53348cfc33f6c9ea119 100644 (file)
@@ -29,7 +29,7 @@
 */\r
 #define JUCE_MAJOR_VERSION      7\r
 #define JUCE_MINOR_VERSION      0\r
-#define JUCE_BUILDNUMBER        3\r
+#define JUCE_BUILDNUMBER        4\r
 \r
 /** Current JUCE version number.\r
 \r
@@ -43,8 +43,7 @@
 \r
 #if ! DOXYGEN\r
 #define JUCE_VERSION_ID \\r
-    volatile auto juceVersionId = "juce_version_" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) "_" JUCE_STRINGIFY(JUCE_MINOR_VERSION) "_" JUCE_STRINGIFY(JUCE_BUILDNUMBER); \\r
-    ignoreUnused (juceVersionId);\r
+    [[maybe_unused]] volatile auto juceVersionId = "juce_version_" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) "_" JUCE_STRINGIFY(JUCE_MINOR_VERSION) "_" JUCE_STRINGIFY(JUCE_BUILDNUMBER);\r
 #endif\r
 \r
 //==============================================================================\r
index e0f00e240e9af482b04e80aef6c9ebfd2431292a..28ca899d96d6ba73652c9845446284f2b17d12e9 100644 (file)
@@ -23,7 +23,7 @@
 namespace juce\r
 {\r
 \r
-class HighResolutionTimer::Pimpl : private Thread\r
+class HighResolutionTimer::Pimpl : public Thread\r
 {\r
     using steady_clock = std::chrono::steady_clock;\r
     using milliseconds = std::chrono::milliseconds;\r
@@ -45,6 +45,8 @@ public:
             nextTickTime = steady_clock::now() + milliseconds (periodMillis);\r
         }\r
 \r
+        waitEvent.notify_one();\r
+\r
         if (! isThreadRunning())\r
             startThread (Thread::Priority::high);\r
     }\r
index 2c970bd2b038050c7a540455ec40204f49d01689..5b870311c4d725f5b63fb782c0abfc142972d1aa 100644 (file)
@@ -81,10 +81,6 @@ void Thread::threadEntryPoint()
     const CurrentThreadHolder::Ptr currentThreadHolder (getCurrentThreadHolder());\r
     currentThreadHolder->value = this;\r
 \r
-   #if JUCE_ANDROID\r
-    setPriority (priority);\r
-   #endif\r
-\r
     if (threadName.isNotEmpty())\r
         setCurrentThreadName (threadName);\r
 \r
@@ -130,10 +126,10 @@ bool Thread::startThreadInternal (Priority threadPriority)
     shouldExit = false;\r
 \r
     // 'priority' is essentially useless on Linux as only realtime\r
-    // has any options but we need to set this here to satsify\r
+    // has any options but we need to set this here to satisfy\r
     // later queries, otherwise we get inconsistent results across\r
     // platforms.\r
-   #if JUCE_LINUX || JUCE_BSD\r
+   #if JUCE_ANDROID || JUCE_LINUX || JUCE_BSD\r
     priority = threadPriority;\r
    #endif\r
 \r
index 37fd6bf559c709b451bd85dbfc43fc331967d826..97b66ff6fbb8e195c928428cd995991a854bc234 100644 (file)
@@ -75,9 +75,9 @@ public:
         /** Linux only: A value with a range of 0-10, where 10 is the highest priority. */\r
         int priority = 5;\r
 \r
-        /* iOS/macOS only: A millisecond value representing the estimated time between each\r
-                           'Thread::run' call. Your thread may be penalised if you frequently\r
-                           overrun this.\r
+        /** iOS/macOS only: A millisecond value representing the estimated time between each\r
+                            'Thread::run' call. Your thread may be penalised if you frequently\r
+                            overrun this.\r
         */\r
         uint32_t workDurationMs = 0;\r
     };\r
index efa17b827ad63252120bb88a727b016569ae4e64..60b1a1e9a578a1ce6bcd00d9f8064bdfaeae12f3 100644 (file)
@@ -86,7 +86,7 @@ String RelativeTime::getApproximateDescription() const
     if (weeks > 8)    return describeMonths ((weeks * 12) / 52);\r
     if (weeks > 1)    return describeWeeks (weeks);\r
 \r
-    auto days = (int) inWeeks();\r
+    auto days = (int) inDays();\r
 \r
     if (days > 1)\r
         return describeDays (days);\r
index 150890e4e19e132bdb9438f60b5bfe2f87ba0d9d..a47e45985490f3e50d56e82e0961157a20fecd6b 100644 (file)
@@ -280,9 +280,8 @@ void BlowFish::encrypt (MemoryBlock& data) const
     auto size = data.getSize();\r
     data.setSize (size + (8u - (size % 8u)));\r
 \r
-    auto success = encrypt (data.getData(), size, data.getSize());\r
+    [[maybe_unused]] auto success = encrypt (data.getData(), size, data.getSize());\r
 \r
-    ignoreUnused (success);\r
     jassert (success >= 0);\r
 }\r
 \r
index cfce3db6eaea44928e84f0dc91f8acde8aa47041..57c6e670f7182f61f5b8d0f0ec43bb28d4b36a74 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_cryptography\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE cryptography classes\r
   description:        Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.\r
   website:            http://www.juce.com/juce\r
index 4b482629c70b1a2c680c526d827e76117aed715e..90d0d3d11ae2831dfd4e0c2752029aa4a1903423 100644 (file)
@@ -39,6 +39,7 @@
 #include "values/juce_ValueTreeSynchroniser.cpp"\r
 #include "values/juce_CachedValue.cpp"\r
 #include "undomanager/juce_UndoManager.cpp"\r
+#include "undomanager/juce_UndoableAction.cpp"\r
 #include "app_properties/juce_ApplicationProperties.cpp"\r
 #include "app_properties/juce_PropertiesFile.cpp"\r
 \r
index cb4f8b9fe1a37e912f0802940332d30826a58df1..0c9313236dac1de32ca04e9dc4c66855b557109e 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_data_structures\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE data model helper classes\r
   description:        Classes for undo/redo management, and smart data structures.\r
   website:            http://www.juce.com/juce\r
diff --git a/modules/juce_data_structures/undomanager/juce_UndoableAction.cpp b/modules/juce_data_structures/undomanager/juce_UndoableAction.cpp
new file mode 100644 (file)
index 0000000..f939626
--- /dev/null
@@ -0,0 +1,31 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+   Agreement and JUCE Privacy Policy.\r
+\r
+   End User License Agreement: www.juce.com/juce-7-licence\r
+   Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+UndoableAction* UndoableAction::createCoalescedAction ([[maybe_unused]] UndoableAction* nextAction)  { return nullptr; }\r
+\r
+} // namespace juce\r
index 51e495ab0ea43f49a6a978d9fe879bb8735ba43b..df868b062ee312310d1a7e06b03a4131560d39d9 100644 (file)
@@ -94,7 +94,7 @@ public:
 \r
         If it's not possible to merge the two actions, the method should return a nullptr.\r
     */\r
-    virtual UndoableAction* createCoalescedAction (UndoableAction* nextAction)  { ignoreUnused (nextAction); return nullptr; }\r
+    virtual UndoableAction* createCoalescedAction (UndoableAction* nextAction);\r
 };\r
 \r
 } // namespace juce\r
index 234c4aa971649a8483a068e4cfbcf538365d7993..1051e8536238ee0d872e6e40f5fee5195d4009f8 100644 (file)
@@ -70,10 +70,9 @@ namespace detail
     template <typename Fn>\r
     void clear (void* s)\r
     {\r
-        auto& fn = *reinterpret_cast<Fn*> (s);\r
-        fn.~Fn();\r
         // I know this looks insane, for some reason MSVC 14 sometimes thinks fn is unreferenced\r
-        ignoreUnused (fn);\r
+        [[maybe_unused]] auto& fn = *reinterpret_cast<Fn*> (s);\r
+        fn.~Fn();\r
     }\r
 \r
     template <typename Fn, typename Ret, typename... Args>\r
index 6c4aa84a050c24a7fcff5313a84da11cec70bde5..e81221913ac17c81f035b71a07e4ca63a802beb1 100644 (file)
@@ -334,8 +334,8 @@ public:
             bool smallCalled = false;\r
             bool largeCalled = false;\r
 \r
-            SmallFn small = [&smallCalled, a = std::array<char, 8>{}] { smallCalled = true; juce::ignoreUnused (a); };\r
-            LargeFn large = [&largeCalled, a = std::array<char, 8>{}] { largeCalled = true; juce::ignoreUnused (a); };\r
+            SmallFn small = [&smallCalled, a = std::array<char, 8>{}] { smallCalled = true; ignoreUnused (a); };\r
+            LargeFn large = [&largeCalled, a = std::array<char, 8>{}] { largeCalled = true; ignoreUnused (a); };\r
 \r
             large = std::move (small);\r
 \r
index f4d2591b3f41ce73fe0b7cac3d2a76eeefb79ac0..05bd7ca214279c70737fa4928817f4fa5e46a2f5 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_dsp\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE DSP classes\r
   description:        Classes for audio buffer manipulation, digital audio processing, filtering, oversampling, fast math functions etc.\r
   website:            http://www.juce.com/juce\r
@@ -208,10 +208,10 @@ namespace juce
             inline void snapToZero (long double& x) noexcept            { JUCE_SNAP_TO_ZERO (x); }\r
            #endif\r
           #else\r
-            inline void snapToZero (float&       x) noexcept            { ignoreUnused (x); }\r
+            inline void snapToZero ([[maybe_unused]] float&       x) noexcept            {}\r
            #ifndef DOXYGEN\r
-            inline void snapToZero (double&      x) noexcept            { ignoreUnused (x); }\r
-            inline void snapToZero (long double& x) noexcept            { ignoreUnused (x); }\r
+            inline void snapToZero ([[maybe_unused]] double&      x) noexcept            {}\r
+            inline void snapToZero ([[maybe_unused]] long double& x) noexcept            {}\r
            #endif\r
           #endif\r
         }\r
index 1a9885924f7137b4f326aaa741c1c6f11c7fe76a..7906e7b7d1e25af0db46a9e1a1519e92e85d1cda 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_events\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE message and event handling classes\r
   description:        Classes for running an application's main event loop and sending/receiving messages, timers, etc.\r
   website:            http://www.juce.com/juce\r
index 604a649e6554c93d342c4588f97a100987c9ee98..04f534bef6e205a5e58841401eb8c502d88a8afc 100644 (file)
@@ -199,14 +199,12 @@ String JUCEApplicationBase::getCommandLineParameters()
 {\r
     String argString;\r
 \r
-    for (int i = 1; i < juce_argc; ++i)\r
+    for (const auto& arg : getCommandLineParameterArray())\r
     {\r
-        String arg { CharPointer_UTF8 (juce_argv[i]) };\r
-\r
-        if (arg.containsChar (' ') && ! arg.isQuotedString())\r
-            arg = arg.quoted ('"');\r
-\r
-        argString << arg << ' ';\r
+        const auto withQuotes = arg.containsChar (' ') && ! arg.isQuotedString()\r
+                              ? arg.quoted ('"')\r
+                              : arg;\r
+        argString << withQuotes << ' ';\r
     }\r
 \r
     return argString.trim();\r
@@ -214,7 +212,12 @@ String JUCEApplicationBase::getCommandLineParameters()
 \r
 StringArray JUCEApplicationBase::getCommandLineParameterArray()\r
 {\r
-    return StringArray (juce_argv + 1, juce_argc - 1);\r
+    StringArray result;\r
+\r
+    for (int i = 1; i < juce_argc; ++i)\r
+        result.add (CharPointer_UTF8 (juce_argv[i]));\r
+\r
+    return result;\r
 }\r
 \r
 int JUCEApplicationBase::main (int argc, const char* argv[])\r
index dcf583346693e5cbea53e21bdadbf0fb87b230f1..69fa23943fa36dd2a969f72076931427b49df795 100644 (file)
@@ -68,8 +68,7 @@ public:
 \r
             ScopedUnlock ul (lock);\r
             unsigned char x = 0xff;\r
-            auto numBytes = write (getWriteHandle(), &x, 1);\r
-            ignoreUnused (numBytes);\r
+            [[maybe_unused]] auto numBytes = write (getWriteHandle(), &x, 1);\r
         }\r
     }\r
 \r
@@ -97,8 +96,7 @@ private:
 \r
             ScopedUnlock ul (lock);\r
             unsigned char x;\r
-            auto numBytes = read (fd, &x, 1);\r
-            ignoreUnused (numBytes);\r
+            [[maybe_unused]] auto numBytes = read (fd, &x, 1);\r
         }\r
 \r
         return queue.removeAndReturn (0);\r
index 3266f7a3eba987d43cc4d17c215839ce42fcad74..0e91c21596286d36db244811d2a48029fdbf7f36 100644 (file)
@@ -288,7 +288,7 @@ void MessageManager::broadcastMessage (const String& value)
 //==============================================================================\r
 void MessageManager::doPlatformSpecificInitialisation()\r
 {\r
-    ignoreUnused (OleInitialize (nullptr));\r
+    [[maybe_unused]] const auto result = OleInitialize (nullptr);\r
     InternalMessageQueue::getInstance();\r
 }\r
 \r
index af0e1b96fd235a52545ab3ff9e471d8234e8c0e4..12c67f2f8500714f16badd53b341f049e8dec3ea 100644 (file)
@@ -30,7 +30,7 @@ public:
     ~WinRTWrapper();\r
     bool isInitialised() const noexcept  { return initialised; }\r
 \r
-    JUCE_DECLARE_SINGLETON (WinRTWrapper, true)\r
+    JUCE_DECLARE_SINGLETON (WinRTWrapper, false)\r
 \r
     //==============================================================================\r
     template <class ComClass>\r
index 8e106cd40ec5f4c243017a12d305abfcd4249b01..c05a698433838fc7e668b26696f20494142232e3 100644 (file)
@@ -201,76 +201,108 @@ public:
         Any rectangles in the list which overlap this will be clipped and subdivided\r
         if necessary.\r
     */\r
-    void subtract (RectangleType rect)\r
+    void subtract (const RectangleType rect)\r
     {\r
         if (auto numRects = rects.size())\r
         {\r
-            auto x1 = rect.getX();\r
-            auto y1 = rect.getY();\r
-            auto x2 = x1 + rect.getWidth();\r
-            auto y2 = y1 + rect.getHeight();\r
+            const auto x1 = rect.getX();\r
+            const auto y1 = rect.getY();\r
+            const auto x2 = x1 + rect.getWidth();\r
+            const auto y2 = y1 + rect.getHeight();\r
 \r
             for (int i = numRects; --i >= 0;)\r
             {\r
                 auto& r = rects.getReference (i);\r
 \r
-                auto rx1 = r.getX();\r
-                auto ry1 = r.getY();\r
-                auto rx2 = rx1 + r.getWidth();\r
-                auto ry2 = ry1 + r.getHeight();\r
+                const auto rx1 = r.getX();\r
+                const auto ry1 = r.getY();\r
+                const auto rx2 = rx1 + r.getWidth();\r
+                const auto ry2 = ry1 + r.getHeight();\r
 \r
-                if (! (x2 <= rx1 || x1 >= rx2 || y2 <= ry1 || y1 >= ry2))\r
+                const auto isNotEqual = [&] (const RectangleType newRect)\r
                 {\r
-                    if (x1 > rx1 && x1 < rx2)\r
+                    // When subtracting tiny slices from relatively large rectangles, the\r
+                    // subtraction may have no effect (due to limited-precision floating point\r
+                    // maths) and the original rectangle may remain unchanged.\r
+                    // We check that any 'new' rectangle has different dimensions to the rectangle\r
+                    // being tested before adding it to the rects array.\r
+                    // Integer arithmetic is not susceptible to this problem, so there's no need\r
+                    // for this additional equality check when working with integral rectangles.\r
+                    if constexpr (std::is_floating_point_v<ValueType>)\r
                     {\r
-                        if (y1 <= ry1 && y2 >= ry2 && x2 >= rx2)\r
+                        return newRect != r;\r
+                    }\r
+                    else\r
+                    {\r
+                        ignoreUnused (newRect);\r
+                        return true;\r
+                    }\r
+                };\r
+\r
+                if (rx1 < x2 && x1 < rx2 && ry1 < y2 && y1 < ry2)\r
+                {\r
+                    if (rx1 < x1 && x1 < rx2)\r
+                    {\r
+                        if (y1 <= ry1 && ry2 <= y2 && rx2 <= x2)\r
                         {\r
                             r.setWidth (x1 - rx1);\r
                         }\r
                         else\r
                         {\r
-                            r.setX (x1);\r
-                            r.setWidth (rx2 - x1);\r
-\r
-                            rects.insert (++i, RectangleType (rx1, ry1, x1 - rx1,  ry2 - ry1));\r
-                            ++i;\r
+                            if (const RectangleType newRect (rx1, ry1, x1 - rx1, ry2 - ry1); isNotEqual (newRect))\r
+                            {\r
+                                r.setX (x1);\r
+                                r.setWidth (rx2 - x1);\r
+\r
+                                rects.insert (++i, newRect);\r
+                                ++i;\r
+                            }\r
                         }\r
                     }\r
-                    else if (x2 > rx1 && x2 < rx2)\r
+                    else if (rx1 < x2 && x2 < rx2)\r
                     {\r
                         r.setX (x2);\r
                         r.setWidth (rx2 - x2);\r
 \r
-                        if (y1 > ry1 || y2 < ry2 || x1 > rx1)\r
+                        if (ry1 < y1 || y2 < ry2 || rx1 < x1)\r
                         {\r
-                            rects.insert (++i, RectangleType (rx1, ry1, x2 - rx1,  ry2 - ry1));\r
-                            ++i;\r
+                            if (const RectangleType newRect (rx1, ry1, x2 - rx1, ry2 - ry1); isNotEqual (newRect))\r
+                            {\r
+                                rects.insert (++i, newRect);\r
+                                ++i;\r
+                            }\r
                         }\r
                     }\r
-                    else if (y1 > ry1 && y1 < ry2)\r
+                    else if (ry1 < y1 && y1 < ry2)\r
                     {\r
-                        if (x1 <= rx1 && x2 >= rx2 && y2 >= ry2)\r
+                        if (x1 <= rx1 && rx2 <= x2 && ry2 <= y2)\r
                         {\r
                             r.setHeight (y1 - ry1);\r
                         }\r
                         else\r
                         {\r
-                            r.setY (y1);\r
-                            r.setHeight (ry2 - y1);\r
-\r
-                            rects.insert (++i, RectangleType (rx1, ry1, rx2 - rx1, y1 - ry1));\r
-                            ++i;\r
+                            if (const RectangleType newRect (rx1, ry1, rx2 - rx1, y1 - ry1); isNotEqual (newRect))\r
+                            {\r
+                                r.setY (y1);\r
+                                r.setHeight (ry2 - y1);\r
+\r
+                                rects.insert (++i, newRect);\r
+                                ++i;\r
+                            }\r
                         }\r
                     }\r
-                    else if (y2 > ry1 && y2 < ry2)\r
+                    else if (ry1 < y2 && y2 < ry2)\r
                     {\r
                         r.setY (y2);\r
                         r.setHeight (ry2 - y2);\r
 \r
-                        if (x1 > rx1 || x2 < rx2 || y1 > ry1)\r
+                        if (rx1 < x1 || x2 < rx2 || ry1 < y1)\r
                         {\r
-                            rects.insert (++i, RectangleType (rx1, ry1, rx2 - rx1, y2 - ry1));\r
-                            ++i;\r
+                            if (const RectangleType newRect (rx1, ry1, rx2 - rx1, y2 - ry1); isNotEqual (newRect))\r
+                            {\r
+                                rects.insert (++i, newRect);\r
+                                ++i;\r
+                            }\r
                         }\r
                     }\r
                     else\r
index 187e2002208e8913a4d5790706a11294670730d8..2e5699e4608ed47fc235b9604166c1c4cabbddf2 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_graphics\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE graphics classes\r
   description:        Classes for 2D vector graphics, image loading/saving, font handling, etc.\r
   website:            http://www.juce.com/juce\r
index b5e3340f9cd8ed8646bfe82c05c4576148ed8bec..d848addf84530afded315e5d1239a2ad9b929f85 100644 (file)
@@ -528,8 +528,8 @@ Direct2DLowLevelGraphicsContext::Direct2DLowLevelGraphicsContext (HWND hwnd_)
 \r
     if (pimpl->factories->d2dFactory != nullptr)\r
     {\r
-        auto hr = pimpl->factories->d2dFactory->CreateHwndRenderTarget ({}, { hwnd, size }, pimpl->renderingTarget.resetAndGetPointerAddress());\r
-        jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
+        [[maybe_unused]] auto hr = pimpl->factories->d2dFactory->CreateHwndRenderTarget ({}, { hwnd, size }, pimpl->renderingTarget.resetAndGetPointerAddress());\r
+        jassert (SUCCEEDED (hr));\r
         hr = pimpl->renderingTarget->CreateSolidColorBrush (D2D1::ColorF::ColorF (0.0f, 0.0f, 0.0f, 1.0f), pimpl->colourBrush.resetAndGetPointerAddress());\r
     }\r
 }\r
index b82b4c53516c5b551acdcf8443cf32c0c71a5ec3..f565a58321f4202e6bc5adcbb76590fe41723053 100644 (file)
@@ -200,8 +200,7 @@ namespace DirectWriteTypeLayout
             }\r
 \r
             ComSmartPtr<IDWriteFont> dwFont;\r
-            auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
-            ignoreUnused (hr);\r
+            [[maybe_unused]] auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
             jassert (dwFont != nullptr);\r
 \r
             ComSmartPtr<IDWriteFontFamily> dwFontFamily;\r
@@ -299,8 +298,7 @@ namespace DirectWriteTypeLayout
                 fontIndex = 0;\r
 \r
             ComSmartPtr<IDWriteFontFamily> fontFamily;\r
-            auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
-            ignoreUnused (hr);\r
+            [[maybe_unused]] auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
 \r
             ComSmartPtr<IDWriteFont> dwFont;\r
             uint32 fontFacesCount = 0;\r
@@ -420,8 +418,7 @@ namespace DirectWriteTypeLayout
             return;\r
 \r
         UINT32 actualLineCount = 0;\r
-        auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
-        ignoreUnused (hr);\r
+        [[maybe_unused]] auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
 \r
         layout.ensureStorageAllocated ((int) actualLineCount);\r
 \r
@@ -486,7 +483,7 @@ static bool canAllTypefacesAndFontsBeUsedInLayout (const AttributedString& text)
 \r
 #endif\r
 \r
-bool TextLayout::createNativeLayout (const AttributedString& text)\r
+bool TextLayout::createNativeLayout ([[maybe_unused]] const AttributedString& text)\r
 {\r
    #if JUCE_USE_DIRECTWRITE\r
     if (! canAllTypefacesAndFontsBeUsedInLayout (text))\r
@@ -506,8 +503,6 @@ bool TextLayout::createNativeLayout (const AttributedString& text)
 \r
         return true;\r
     }\r
-   #else\r
-    ignoreUnused (text);\r
    #endif\r
 \r
     return false;\r
index da59341e6259ad540f426f42ce065b2f69ca54f4..5da133517a78d1573465405faffc44d608cdc102 100644 (file)
@@ -35,8 +35,7 @@ namespace
 \r
         uint32 index = 0;\r
         BOOL exists = false;\r
-        auto hr = names->FindLocaleName (L"en-us", &index, &exists);\r
-        ignoreUnused (hr);\r
+        [[maybe_unused]] auto hr = names->FindLocaleName (L"en-us", &index, &exists);\r
 \r
         if (! exists)\r
             index = 0;\r
@@ -152,8 +151,7 @@ public:
         jassert (fontCollection != nullptr);\r
 \r
         uint32 fontIndex = 0;\r
-        auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
-        ignoreUnused (hr);\r
+        [[maybe_unused]] auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
 \r
         if (! fontFound)\r
             fontIndex = 0;\r
index b7d4afe2486d922356a1b52c4d1385234ad908da..005061efb47e496585920a1e16569da78fa22109 100644 (file)
@@ -234,8 +234,7 @@ StringArray Font::findAllTypefaceStyles (const String& family)
     {\r
         BOOL fontFound = false;\r
         uint32 fontIndex = 0;\r
-        auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
-        ignoreUnused (hr);\r
+        [[maybe_unused]] auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
 \r
         if (! fontFound)\r
             fontIndex = 0;\r
index 3ed50b82beff14ec75165bb0e4fa56a3e7fbe8b3..9f8d9d7426b02681fce3efc8f56ccd89c172ed8c 100644 (file)
@@ -123,47 +123,32 @@ public:
     template <typename EventMethod, typename... Params>\r
     static void sendMouseEvent (HierarchyChecker& checker, EventMethod&& eventMethod, Params&&... params)\r
     {\r
-        auto* parent = checker.nearestNonNullParent();\r
-\r
-        if (parent == nullptr)\r
-            return;\r
-\r
-        if (auto* list = parent->mouseListeners.get())\r
+        const auto callListeners = [&] (auto& parentComp, const auto findNumListeners)\r
         {\r
-            for (int i = list->listeners.size(); --i >= 0;)\r
+            if (auto* list = parentComp.mouseListeners.get())\r
             {\r
-                (list->listeners.getUnchecked (i)->*eventMethod) (checker.eventWithNearestParent(), params...);\r
+                const WeakReference safePointer { &parentComp };\r
 \r
-                if (checker.shouldBailOut())\r
-                    return;\r
+                for (int i = findNumListeners (*list); --i >= 0; i = jmin (i, findNumListeners (*list)))\r
+                {\r
+                    (list->listeners.getUnchecked (i)->*eventMethod) (checker.eventWithNearestParent(), params...);\r
 \r
-                i = jmin (i, list->listeners.size());\r
+                    if (checker.shouldBailOut() || safePointer == nullptr)\r
+                        return false;\r
+                }\r
             }\r
-        }\r
-\r
-        for (Component* p = checker.nearestNonNullParent()->parentComponent; p != nullptr; p = p->parentComponent)\r
-        {\r
-            if (auto* list = p->mouseListeners.get())\r
-            {\r
-                if (list->numDeepMouseListeners > 0)\r
-                {\r
-                    const auto shouldBailOut = [&checker, safePointer = WeakReference { p }]\r
-                    {\r
-                        return checker.shouldBailOut() || safePointer == nullptr;\r
-                    };\r
 \r
-                    for (int i = list->numDeepMouseListeners; --i >= 0;)\r
-                    {\r
-                        (list->listeners.getUnchecked(i)->*eventMethod) (checker.eventWithNearestParent(), params...);\r
+            return true;\r
+        };\r
 \r
-                        if (shouldBailOut())\r
-                            return;\r
+        if (auto* parent = checker.nearestNonNullParent())\r
+            if (! callListeners (*parent, [] (auto& list) { return list.listeners.size(); }))\r
+                return;\r
 \r
-                        i = jmin (i, list->numDeepMouseListeners);\r
-                    }\r
-                }\r
-            }\r
-        }\r
+        if (auto* parent = checker.nearestNonNullParent())\r
+            for (Component* p = parent->parentComponent; p != nullptr; p = p->parentComponent)\r
+                if (! callListeners (*p, [] (auto& list) { return list.numDeepMouseListeners; }))\r
+                    return;\r
     }\r
 \r
 private:\r
@@ -2583,7 +2568,8 @@ void Component::internalMouseUp (MouseInputSource source, const PointerState& re
     // check for double-click\r
     if (me.getNumberOfClicks() >= 2)\r
     {\r
-        mouseDoubleClick (checker.eventWithNearestParent());\r
+        if (checker.nearestNonNullParent() == this)\r
+            mouseDoubleClick (checker.eventWithNearestParent());\r
 \r
         if (checker.shouldBailOut())\r
             return;\r
index 24529bf5358bb0028b717695bbf83b75c51114b8..9f7304969532ae9cc3f1a00f14f641c5dd5563f8 100644 (file)
@@ -2132,7 +2132,7 @@ public:
 \r
         @see runModalLoop, enterModalState, isCurrentlyModal\r
     */\r
-    void exitModalState (int returnValue);\r
+    void exitModalState (int returnValue = 0);\r
 \r
     /** Returns true if this component is the modal one.\r
 \r
index 9887b1c363a0cbd4e588ee2eac281c622539c069..eb1c7514d27ac7ed5ef38334868dde63915fcf85 100644 (file)
@@ -150,15 +150,13 @@ JUCE_IMPLEMENT_SINGLETON (ContentSharer)
 ContentSharer::ContentSharer() {}\r
 ContentSharer::~ContentSharer() { clearSingletonInstance(); }\r
 \r
-void ContentSharer::shareFiles (const Array<URL>& files,\r
+void ContentSharer::shareFiles ([[maybe_unused]] const Array<URL>& files,\r
                                 std::function<void (bool, const String&)> callbackToUse)\r
 {\r
   #if JUCE_CONTENT_SHARING\r
     startNewShare (callbackToUse);\r
     pimpl->shareFiles (files);\r
   #else\r
-    ignoreUnused (files);\r
-\r
     // Content sharing is not available on this platform!\r
     jassertfalse;\r
 \r
@@ -188,15 +186,13 @@ void ContentSharer::startNewShare (std::function<void (bool, const String&)> cal
 }\r
 #endif\r
 \r
-void ContentSharer::shareText (const String& text,\r
+void ContentSharer::shareText ([[maybe_unused]] const String& text,\r
                                std::function<void (bool, const String&)> callbackToUse)\r
 {\r
   #if JUCE_CONTENT_SHARING\r
     startNewShare (callbackToUse);\r
     pimpl->shareText (text);\r
   #else\r
-    ignoreUnused (text);\r
-\r
     // Content sharing is not available on this platform!\r
     jassertfalse;\r
 \r
@@ -205,16 +201,14 @@ void ContentSharer::shareText (const String& text,
   #endif\r
 }\r
 \r
-void ContentSharer::shareImages (const Array<Image>& images,\r
+void ContentSharer::shareImages ([[maybe_unused]] const Array<Image>& images,\r
                                  std::function<void (bool, const String&)> callbackToUse,\r
-                                 ImageFileFormat* imageFileFormatToUse)\r
+                                 [[maybe_unused]] ImageFileFormat* imageFileFormatToUse)\r
 {\r
   #if JUCE_CONTENT_SHARING\r
     startNewShare (callbackToUse);\r
     prepareImagesThread.reset (new PrepareImagesThread (*this, images, imageFileFormatToUse));\r
   #else\r
-    ignoreUnused (images, imageFileFormatToUse);\r
-\r
     // Content sharing is not available on this platform!\r
     jassertfalse;\r
 \r
@@ -238,15 +232,13 @@ void ContentSharer::filesToSharePrepared()
 }\r
 #endif\r
 \r
-void ContentSharer::shareData (const MemoryBlock& mb,\r
+void ContentSharer::shareData ([[maybe_unused]] const MemoryBlock& mb,\r
                                std::function<void (bool, const String&)> callbackToUse)\r
 {\r
   #if JUCE_CONTENT_SHARING\r
     startNewShare (callbackToUse);\r
     prepareDataThread.reset (new PrepareDataThread (*this, mb));\r
   #else\r
-    ignoreUnused (mb);\r
-\r
     if (callbackToUse)\r
         callbackToUse (false, "Content sharing not available on this platform!");\r
   #endif\r
index 15593e6c713f0386a60a1839c4876708e23bb35c..13e4f9d764b4169e5bba7954d92e18a6409b30a0 100644 (file)
@@ -440,7 +440,7 @@ void FileBrowserComponent::fileDoubleClicked (const File& f)
 \r
 void FileBrowserComponent::browserRootChanged (const File&) {}\r
 \r
-bool FileBrowserComponent::keyPressed (const KeyPress& key)\r
+bool FileBrowserComponent::keyPressed ([[maybe_unused]] const KeyPress& key)\r
 {\r
    #if JUCE_LINUX || JUCE_BSD || JUCE_WINDOWS\r
     if (key.getModifiers().isCommandDown()\r
@@ -452,7 +452,6 @@ bool FileBrowserComponent::keyPressed (const KeyPress& key)
     }\r
    #endif\r
 \r
-    ignoreUnused (key);\r
     return false;\r
 }\r
 \r
index 4ba17166551a2ece7d8f8a6164b50fc00af1cf98..daa711279fa078fbeaf354af36a3ef96f6c8c0c4 100644 (file)
@@ -328,6 +328,7 @@ namespace juce
 \r
  JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wzero-as-null-pointer-constant")\r
 \r
+ #include "native/x11/juce_linux_ScopedWindowAssociation.h"\r
  #include "native/juce_linux_Windowing.cpp"\r
  #include "native/x11/juce_linux_XWindowSystem.cpp"\r
 \r
@@ -336,6 +337,28 @@ namespace juce
  #include "native/juce_linux_FileChooser.cpp"\r
 \r
 #elif JUCE_ANDROID\r
+\r
+namespace juce\r
+{\r
+static jobject makeAndroidRect (Rectangle<int> r)\r
+{\r
+    return getEnv()->NewObject (AndroidRect,\r
+                                AndroidRect.constructor,\r
+                                r.getX(),\r
+                                r.getY(),\r
+                                r.getRight(),\r
+                                r.getBottom());\r
+}\r
+\r
+static jobject makeAndroidPoint (Point<int> p)\r
+{\r
+    return getEnv()->NewObject (AndroidPoint,\r
+                                AndroidPoint.create,\r
+                                p.getX(),\r
+                                p.getY());\r
+}\r
+} // namespace juce\r
+\r
  #include "juce_core/files/juce_common_MimeTypes.h"\r
  #include "native/accessibility/juce_android_Accessibility.cpp"\r
  #include "native/juce_android_Windowing.cpp"\r
index 843a3d810b9b1261a7df89e207ac13b33a85cda0..bd449fb5a70a65f92b47ffd0ff6f60219926746e 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_gui_basics\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE GUI core classes\r
   description:        Basic user-interface components and related classes.\r
   website:            http://www.juce.com/juce\r
index b255a2a0f0381871c73fb01174974d153339bfb9..fe5ac1a3003020913227343addcbe474e7e9a1c3 100644 (file)
@@ -26,7 +26,6 @@
 namespace juce\r
 {\r
 \r
-//==============================================================================\r
 /**\r
     An abstract base class which can be implemented by components that function as\r
     text editors.\r
@@ -108,7 +107,8 @@ public:
         decimalKeyboard,\r
         urlKeyboard,\r
         emailAddressKeyboard,\r
-        phoneNumberKeyboard\r
+        phoneNumberKeyboard,\r
+        passwordKeyboard\r
     };\r
 \r
     /** Returns the target's preference for the type of keyboard that would be most appropriate.\r
index 758b5d96ae66f60c3969f7cadb6036866041c085..dfd36a45c979eb9a8c2f93978233617e4b591769 100644 (file)
@@ -159,7 +159,8 @@ void SidePanel::paint (Graphics& g)
                                                                                 : shadowArea.getTopLeft()).toFloat(), false));\r
     g.fillRect (shadowArea);\r
 \r
-    g.excludeClipRegion (shadowArea);\r
+    g.reduceClipRegion (getLocalBounds().withTrimmedRight (shadowArea.getWidth())\r
+                                        .withX (isOnLeft ? 0 : shadowArea.getWidth()));\r
     g.fillAll (bgColour);\r
 }\r
 \r
@@ -242,10 +243,8 @@ void SidePanel::lookAndFeelChanged()
     titleLabel.setJustificationType (lf.getSidePanelTitleJustification (*this));\r
 }\r
 \r
-void SidePanel::componentMovedOrResized (Component& component, bool wasMoved, bool wasResized)\r
+void SidePanel::componentMovedOrResized (Component& component, [[maybe_unused]] bool wasMoved, bool wasResized)\r
 {\r
-    ignoreUnused (wasMoved);\r
-\r
     if (wasResized && (&component == parent))\r
         setBounds (calculateBoundsInParent (component));\r
 }\r
index 0ec5d7d253a35b4d239d970e95aaafcb8d0440ac..3c6a6e66fda6072b125b456aaeb7cf938b465bbd 100644 (file)
@@ -464,10 +464,9 @@ void LookAndFeel_V3::drawLinearSliderBackground (Graphics& g, int x, int y, int
     g.strokePath (indent, PathStrokeType (0.5f));\r
 }\r
 \r
-void LookAndFeel_V3::drawPopupMenuBackground (Graphics& g, int width, int height)\r
+void LookAndFeel_V3::drawPopupMenuBackground (Graphics& g, [[maybe_unused]] int width, [[maybe_unused]] int height)\r
 {\r
     g.fillAll (findColour (PopupMenu::backgroundColourId));\r
-    ignoreUnused (width, height);\r
 \r
    #if ! JUCE_MAC\r
     g.setColour (findColour (PopupMenu::textColourId).withAlpha (0.6f));\r
index bd87b26a968886241ad3e08407433814be7890db..d400073ad6502b6cf19d9913af85da5154e2f2fc 100644 (file)
@@ -353,12 +353,10 @@ void LookAndFeel_V4::drawToggleButton (Graphics& g, ToggleButton& button,
 void LookAndFeel_V4::drawTickBox (Graphics& g, Component& component,\r
                                   float x, float y, float w, float h,\r
                                   const bool ticked,\r
-                                  const bool isEnabled,\r
-                                  const bool shouldDrawButtonAsHighlighted,\r
-                                  const bool shouldDrawButtonAsDown)\r
+                                  [[maybe_unused]] const bool isEnabled,\r
+                                  [[maybe_unused]] const bool shouldDrawButtonAsHighlighted,\r
+                                  [[maybe_unused]] const bool shouldDrawButtonAsDown)\r
 {\r
-    ignoreUnused (isEnabled, shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown);\r
-\r
     Rectangle<float> tickBounds (x, y, w, h);\r
 \r
     g.setColour (component.findColour (ToggleButton::tickDisabledColourId));\r
@@ -619,10 +617,8 @@ int LookAndFeel_V4::getDefaultScrollbarWidth()
 }\r
 \r
 void LookAndFeel_V4::drawScrollbar (Graphics& g, ScrollBar& scrollbar, int x, int y, int width, int height,\r
-                                    bool isScrollbarVertical, int thumbStartPosition, int thumbSize, bool isMouseOver, bool isMouseDown)\r
+                                    bool isScrollbarVertical, int thumbStartPosition, int thumbSize, bool isMouseOver, [[maybe_unused]] bool isMouseDown)\r
 {\r
-    ignoreUnused (isMouseDown);\r
-\r
     Rectangle<int> thumbBounds;\r
 \r
     if (isScrollbarVertical)\r
@@ -1253,10 +1249,8 @@ void LookAndFeel_V4::drawPropertyComponentBackground (Graphics& g, int width, in
     g.fillRect  (0, 0, width, height - 1);\r
 }\r
 \r
-void LookAndFeel_V4::drawPropertyComponentLabel (Graphics& g, int width, int height, PropertyComponent& component)\r
+void LookAndFeel_V4::drawPropertyComponentLabel (Graphics& g, [[maybe_unused]] int width, int height, PropertyComponent& component)\r
 {\r
-    ignoreUnused (width);\r
-\r
     auto indent = getPropertyComponentIndent (component);\r
 \r
     g.setColour (component.findColour (PropertyComponent::labelTextColourId)\r
index ef413750dab14ef35966aa899af98628f92e303a..8dd135733a6c292656737fea3ffffb7b842a465b 100644 (file)
@@ -324,12 +324,16 @@ private:
 //==============================================================================\r
 struct MenuWindow  : public Component\r
 {\r
-    MenuWindow (const PopupMenu& menu, MenuWindow* parentWindow,\r
-                Options opts, bool alignToRectangle, bool shouldDismissOnMouseUp,\r
-                ApplicationCommandManager** manager, float parentScaleFactor = 1.0f)\r
+    MenuWindow (const PopupMenu& menu,\r
+                MenuWindow* parentWindow,\r
+                Options opts,\r
+                bool alignToRectangle,\r
+                bool shouldDismissOnMouseUp,\r
+                ApplicationCommandManager** manager,\r
+                float parentScaleFactor = 1.0f)\r
         : Component ("menu"),\r
           parent (parentWindow),\r
-          options (opts.withParentComponent (getLookAndFeel().getParentComponentForMenuOptions (opts))),\r
+          options (opts.withParentComponent (findLookAndFeel (menu, parentWindow)->getParentComponentForMenuOptions (opts))),\r
           managerOfChosenCommand (manager),\r
           componentAttachedTo (options.getTargetComponent()),\r
           dismissOnMouseUp (shouldDismissOnMouseUp),\r
@@ -343,8 +347,7 @@ struct MenuWindow  : public Component
         setAlwaysOnTop (true);\r
         setFocusContainerType (FocusContainerType::focusContainer);\r
 \r
-        setLookAndFeel (parent != nullptr ? &(parent->getLookAndFeel())\r
-                                          : menu.lookAndFeel.get());\r
+        setLookAndFeel (findLookAndFeel (menu, parentWindow));\r
 \r
         auto& lf = getLookAndFeel();\r
 \r
@@ -1291,6 +1294,17 @@ struct MenuWindow  : public Component
                                                        }));\r
     }\r
 \r
+    LookAndFeel* findLookAndFeel (const PopupMenu& menu, MenuWindow* parentWindow) const\r
+    {\r
+        if (parentWindow != nullptr)\r
+            return &(parentWindow->getLookAndFeel());\r
+\r
+        if (auto* lnf = menu.lookAndFeel.get())\r
+            return lnf;\r
+\r
+        return &getLookAndFeel();\r
+    }\r
+\r
     //==============================================================================\r
     MenuWindow* parent;\r
     const Options options;\r
@@ -2098,7 +2112,7 @@ struct PopupMenuCompletionCallback  : public ModalComponentManager::Callback
 \r
 int PopupMenu::showWithOptionalCallback (const Options& options,\r
                                          ModalComponentManager::Callback* userCallback,\r
-                                         bool canBeModal)\r
+                                         [[maybe_unused]] bool canBeModal)\r
 {\r
     std::unique_ptr<ModalComponentManager::Callback> userCallbackDeleter (userCallback);\r
     std::unique_ptr<PopupMenuCompletionCallback> callback (new PopupMenuCompletionCallback());\r
@@ -2120,7 +2134,6 @@ int PopupMenu::showWithOptionalCallback (const Options& options,
         if (userCallback == nullptr && canBeModal)\r
             return window->runModalLoop();\r
        #else\r
-        ignoreUnused (canBeModal);\r
         jassert (! (userCallback == nullptr && canBeModal));\r
        #endif\r
     }\r
index c36306d2fef220b0b0013e84a1cd0f7f784ea64f..9b60308b4e2440011c4cff3814fad78771a8ee4f 100644 (file)
@@ -62,10 +62,8 @@ static Rectangle<float> getLogoArea (Rectangle<float> parentRect)
 }\r
 \r
 //==============================================================================\r
-JUCESplashScreen::JUCESplashScreen (Component& parent)\r
+JUCESplashScreen::JUCESplashScreen ([[maybe_unused]] Component& parent)\r
 {\r
-    ignoreUnused (parent);\r
-\r
    #if JUCE_DISPLAY_SPLASH_SCREEN\r
     if (splashDisplayTime == 0\r
          || Time::getMillisecondCounter() < splashDisplayTime + (uint32) millisecondsToDisplaySplash)\r
index 24d0e63a042ab71649f87606c0912a28eca2b0b4..646cdd1932a446e3d34120b6a4ed04262b113d4c 100644 (file)
@@ -57,18 +57,18 @@ public:
         return lastPeer;\r
     }\r
 \r
-    Component* findComponentAt (Point<float> screenPos)\r
+    static Component* findComponentAt (Point<float> screenPos, ComponentPeer* peer)\r
     {\r
-        if (auto* peer = getPeer())\r
-        {\r
-            auto relativePos = ScalingHelpers::unscaledScreenPosToScaled (peer->getComponent(),\r
-                                                                          peer->globalToLocal (screenPos));\r
-            auto& comp = peer->getComponent();\r
+        if (! ComponentPeer::isValidPeer (peer))\r
+            return nullptr;\r
 \r
-            // (the contains() call is needed to test for overlapping desktop windows)\r
-            if (comp.contains (relativePos))\r
-                return comp.getComponentAt (relativePos);\r
-        }\r
+        auto relativePos = ScalingHelpers::unscaledScreenPosToScaled (peer->getComponent(),\r
+                                                                      peer->globalToLocal (screenPos));\r
+        auto& comp = peer->getComponent();\r
+\r
+        // (the contains() call is needed to test for overlapping desktop windows)\r
+        if (comp.contains (relativePos))\r
+            return comp.getComponentAt (relativePos);\r
 \r
         return nullptr;\r
     }\r
@@ -244,11 +244,12 @@ public:
 \r
     void setPeer (ComponentPeer& newPeer, const PointerState& pointerState, Time time)\r
     {\r
-        if (&newPeer != lastPeer)\r
+        if (&newPeer != lastPeer && (   findComponentAt (pointerState.position, &newPeer) != nullptr\r
+                                     || findComponentAt (pointerState.position, lastPeer) == nullptr))\r
         {\r
             setComponentUnderMouse (nullptr, pointerState, time);\r
             lastPeer = &newPeer;\r
-            setComponentUnderMouse (findComponentAt (pointerState.position), pointerState, time);\r
+            setComponentUnderMouse (findComponentAt (pointerState.position, getPeer()), pointerState, time);\r
         }\r
     }\r
 \r
@@ -257,7 +258,7 @@ public:
         const auto& newScreenPos = newPointerState.position;\r
 \r
         if (! isDragging())\r
-            setComponentUnderMouse (findComponentAt (newScreenPos), newPointerState, time);\r
+            setComponentUnderMouse (findComponentAt (newScreenPos, getPeer()), newPointerState, time);\r
 \r
         if ((newPointerState != lastPointerState) || forceUpdate)\r
         {\r
index a0976b455515149f22d7017fbec7ebbab32253ae..0eba1c6365854bf974b613e8e0e9a1c4701ebc06 100644 (file)
@@ -58,6 +58,7 @@ public:
     as a base class and calling setTooltip().\r
 \r
     Many of the JUCE widgets already use this as a base class to implement their\r
+    tooltips. See the TooltipWindow docs for more information about implementing\r
     tooltips.\r
 \r
     @see TooltipClient, TooltipWindow\r
index 1ac5ed6705b2eb5d0a19207eb821fdda7fced30d..b6b2dee71cbc7c02bae2c9e37929d6e596adcc36 100644 (file)
@@ -297,21 +297,13 @@ public:
         {\r
             const auto scale = Desktop::getInstance().getDisplays().getPrimaryDisplay()->scale;\r
 \r
-            const auto screenBounds = accessibilityHandler.getComponent().getScreenBounds() * scale;\r
+            LocalRef<jobject> screenBounds (makeAndroidRect (accessibilityHandler.getComponent().getScreenBounds() * scale));\r
 \r
-            LocalRef<jobject> rect (env->NewObject (AndroidRect, AndroidRect.constructor,\r
-                                                    screenBounds.getX(),     screenBounds.getY(),\r
-                                                    screenBounds.getRight(), screenBounds.getBottom()));\r
+            env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInScreen, screenBounds.get());\r
 \r
-            env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInScreen, rect.get());\r
+            LocalRef<jobject> boundsInParent (makeAndroidRect (accessibilityHandler.getComponent().getBoundsInParent() * scale));\r
 \r
-            const auto boundsInParent = accessibilityHandler.getComponent().getBoundsInParent() * scale;\r
-\r
-            rect = LocalRef<jobject> (env->NewObject (AndroidRect, AndroidRect.constructor,\r
-                                                      boundsInParent.getX(),     boundsInParent.getY(),\r
-                                                      boundsInParent.getRight(), boundsInParent.getBottom()));\r
-\r
-            env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInParent, rect.get());\r
+            env->CallVoidMethod (info, AndroidAccessibilityNodeInfo.setBoundsInParent, boundsInParent.get());\r
         }\r
 \r
         const auto state = accessibilityHandler.getCurrentState();\r
index 48ae16e2c230f7827ed302df218e318c5d46e9c2..9a82e2c19b948cf5cb65a741e093e7d7b450aa30 100644 (file)
@@ -32,9 +32,19 @@ import android.graphics.Canvas;
 import android.graphics.ColorMatrix;\r
 import android.graphics.ColorMatrixColorFilter;\r
 import android.graphics.Paint;\r
+import android.graphics.Point;\r
 import android.graphics.Rect;\r
+import android.os.Build;\r
+import android.text.Selection;\r
+import android.text.SpanWatcher;\r
+import android.text.Spannable;\r
+import android.text.Spanned;\r
+import android.text.TextWatcher;\r
+import android.util.Pair;\r
 import android.os.Bundle;\r
+import android.text.Editable;\r
 import android.text.InputType;\r
+import android.text.SpannableStringBuilder;\r
 import android.view.Choreographer;\r
 import android.view.KeyEvent;\r
 import android.view.MotionEvent;\r
@@ -51,6 +61,7 @@ import android.view.inputmethod.InputMethodManager;
 \r
 import java.lang.reflect.Method;\r
 import java.util.ArrayList;\r
+\r
 import java.util.List;\r
 \r
 public final class ComponentPeerView extends ViewGroup\r
@@ -63,9 +74,10 @@ public final class ComponentPeerView extends ViewGroup
         if (Application.class.isInstance (context))\r
         {\r
             ((Application) context).registerActivityLifecycleCallbacks (this);\r
-        } else\r
+        }\r
+        else\r
         {\r
-            ((Application) context.getApplicationContext ()).registerActivityLifecycleCallbacks (this);\r
+            ((Application) context.getApplicationContext()).registerActivityLifecycleCallbacks (this);\r
         }\r
 \r
         this.host = host;\r
@@ -77,7 +89,7 @@ public final class ComponentPeerView extends ViewGroup
         setOnFocusChangeListener (this);\r
 \r
         // swap red and blue colours to match internal opengl texture format\r
-        ColorMatrix colorMatrix = new ColorMatrix ();\r
+        ColorMatrix colorMatrix = new ColorMatrix();\r
 \r
         float[] colorTransform = {0, 0, 1.0f, 0, 0,\r
                 0, 1.0f, 0, 0, 0,\r
@@ -91,10 +103,12 @@ public final class ComponentPeerView extends ViewGroup
 \r
         try\r
         {\r
-            method = getClass ().getMethod ("setLayerType", int.class, Paint.class);\r
-        } catch (SecurityException e)\r
+            method = getClass().getMethod ("setLayerType", int.class, Paint.class);\r
+        }\r
+        catch (SecurityException e)\r
         {\r
-        } catch (NoSuchMethodException e)\r
+        }\r
+        catch (NoSuchMethodException e)\r
         {\r
         }\r
 \r
@@ -104,11 +118,14 @@ public final class ComponentPeerView extends ViewGroup
             {\r
                 int layerTypeNone = 0;\r
                 method.invoke (this, layerTypeNone, null);\r
-            } catch (java.lang.IllegalArgumentException e)\r
+            }\r
+            catch (java.lang.IllegalArgumentException e)\r
             {\r
-            } catch (java.lang.IllegalAccessException e)\r
+            }\r
+            catch (java.lang.IllegalAccessException e)\r
             {\r
-            } catch (java.lang.reflect.InvocationTargetException e)\r
+            }\r
+            catch (java.lang.reflect.InvocationTargetException e)\r
             {\r
             }\r
         }\r
@@ -116,7 +133,7 @@ public final class ComponentPeerView extends ViewGroup
         Choreographer.getInstance().postFrameCallback (this);\r
     }\r
 \r
-    public void clear ()\r
+    public void clear()\r
     {\r
         host = 0;\r
     }\r
@@ -147,14 +164,14 @@ public final class ComponentPeerView extends ViewGroup
     }\r
 \r
     @Override\r
-    public boolean isOpaque ()\r
+    public boolean isOpaque()\r
     {\r
         return opaque;\r
     }\r
 \r
     private final boolean opaque;\r
     private long host;\r
-    private final Paint paint = new Paint ();\r
+    private final Paint paint = new Paint();\r
 \r
     //==============================================================================\r
     private native void handleMouseDown (long host, int index, float x, float y, long time);\r
@@ -168,25 +185,25 @@ public final class ComponentPeerView extends ViewGroup
         if (host == 0)\r
             return false;\r
 \r
-        int action = event.getAction ();\r
-        long time = event.getEventTime ();\r
+        int action = event.getAction();\r
+        long time = event.getEventTime();\r
 \r
         switch (action & MotionEvent.ACTION_MASK)\r
         {\r
             case MotionEvent.ACTION_DOWN:\r
-                handleMouseDown (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
+                handleMouseDown (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);\r
                 return true;\r
 \r
             case MotionEvent.ACTION_CANCEL:\r
             case MotionEvent.ACTION_UP:\r
-                handleMouseUp (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
+                handleMouseUp (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);\r
                 return true;\r
 \r
             case MotionEvent.ACTION_MOVE:\r
             {\r
-                handleMouseDrag (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
+                handleMouseDrag (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);\r
 \r
-                int n = event.getPointerCount ();\r
+                int n = event.getPointerCount();\r
 \r
                 if (n > 1)\r
                 {\r
@@ -206,8 +223,9 @@ public final class ComponentPeerView extends ViewGroup
 \r
                 if (i == 0)\r
                 {\r
-                    handleMouseUp (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
-                } else\r
+                    handleMouseUp (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);\r
+                }\r
+                else\r
                 {\r
                     int point[] = new int[2];\r
                     getLocationOnScreen (point);\r
@@ -223,8 +241,9 @@ public final class ComponentPeerView extends ViewGroup
 \r
                 if (i == 0)\r
                 {\r
-                    handleMouseDown (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
-                } else\r
+                    handleMouseDown (host, event.getPointerId (0), event.getRawX(), event.getRawY(), time);\r
+                }\r
+                else\r
                 {\r
                     int point[] = new int[2];\r
                     getLocationOnScreen (point);\r
@@ -253,32 +272,132 @@ public final class ComponentPeerView extends ViewGroup
         return false;\r
     }\r
 \r
+    //==============================================================================\r
+    public static class TextInputTarget\r
+    {\r
+        public TextInputTarget (long owner) { host = owner; }\r
+\r
+        public boolean isTextInputActive()                                      { return ComponentPeerView.textInputTargetIsTextInputActive (host); }\r
+        public int getHighlightedRegionBegin()                                  { return ComponentPeerView.textInputTargetGetHighlightedRegionBegin (host); }\r
+        public int getHighlightedRegionEnd()                                    { return ComponentPeerView.textInputTargetGetHighlightedRegionEnd (host); }\r
+        public void setHighlightedRegion (int b, int e)                         {        ComponentPeerView.textInputTargetSetHighlightedRegion (host, b, e); }\r
+        public String getTextInRange (int b, int e)                             { return ComponentPeerView.textInputTargetGetTextInRange (host, b, e); }\r
+        public void insertTextAtCaret (String text)                             {        ComponentPeerView.textInputTargetInsertTextAtCaret (host, text); }\r
+        public int getCaretPosition()                                           { return ComponentPeerView.textInputTargetGetCaretPosition (host); }\r
+        public int getTotalNumChars()                                           { return ComponentPeerView.textInputTargetGetTotalNumChars (host); }\r
+        public int getCharIndexForPoint (Point point)                           { return ComponentPeerView.textInputTargetGetCharIndexForPoint (host, point); }\r
+        public int getKeyboardType()                                            { return ComponentPeerView.textInputTargetGetKeyboardType (host); }\r
+        public void setTemporaryUnderlining (List<Pair<Integer, Integer>> list) {        ComponentPeerView.textInputTargetSetTemporaryUnderlining (host, list); }\r
+\r
+        //==============================================================================\r
+        private final long host;\r
+    }\r
+\r
+    private native static boolean   textInputTargetIsTextInputActive (long host);\r
+    private native static int       textInputTargetGetHighlightedRegionBegin (long host);\r
+    private native static int       textInputTargetGetHighlightedRegionEnd (long host);\r
+    private native static void      textInputTargetSetHighlightedRegion (long host, int begin, int end);\r
+    private native static String    textInputTargetGetTextInRange (long host, int begin, int end);\r
+    private native static void      textInputTargetInsertTextAtCaret (long host, String text);\r
+    private native static int       textInputTargetGetCaretPosition (long host);\r
+    private native static int       textInputTargetGetTotalNumChars (long host);\r
+    private native static int       textInputTargetGetCharIndexForPoint (long host, Point point);\r
+    private native static int       textInputTargetGetKeyboardType (long host);\r
+    private native static void      textInputTargetSetTemporaryUnderlining (long host, List<Pair<Integer, Integer>> list);\r
+\r
+    private native long getFocusedTextInputTargetPointer (long host);\r
+\r
+    private TextInputTarget getFocusedTextInputTarget (long host)\r
+    {\r
+        final long ptr = getFocusedTextInputTargetPointer (host);\r
+        return ptr != 0 ? new TextInputTarget (ptr) : null;\r
+    }\r
+\r
     //==============================================================================\r
     private native void handleKeyDown (long host, int keycode, int textchar, int kbFlags);\r
     private native void handleKeyUp (long host, int keycode, int textchar);\r
     private native void handleBackButton (long host);\r
     private native void handleKeyboardHidden (long host);\r
 \r
-    public void showKeyboard (String type)\r
+    private static int getInputTypeForJuceVirtualKeyboardType (int type)\r
     {\r
-        InputMethodManager imm = (InputMethodManager) getContext ().getSystemService (Context.INPUT_METHOD_SERVICE);\r
-\r
-        if (imm != null)\r
+        switch (type)\r
         {\r
-            if (type.length () > 0)\r
-            {\r
-                imm.showSoftInput (this, android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT);\r
-                imm.setInputMethod (getWindowToken (), type);\r
-                keyboardDismissListener.startListening ();\r
-            } else\r
-            {\r
-                imm.hideSoftInputFromWindow (getWindowToken (), 0);\r
-                keyboardDismissListener.stopListening ();\r
-            }\r
+            case 0:                                             // textKeyboard\r
+                return InputType.TYPE_CLASS_TEXT\r
+                     | InputType.TYPE_TEXT_VARIATION_NORMAL\r
+                     | InputType.TYPE_TEXT_FLAG_MULTI_LINE\r
+                     | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;\r
+            case 1:                                             // numericKeyboard\r
+                return InputType.TYPE_CLASS_NUMBER\r
+                     | InputType.TYPE_NUMBER_VARIATION_NORMAL;\r
+            case 2:                                             // decimalKeyboard\r
+                return InputType.TYPE_CLASS_NUMBER\r
+                     | InputType.TYPE_NUMBER_VARIATION_NORMAL\r
+                     | InputType.TYPE_NUMBER_FLAG_DECIMAL;\r
+            case 3:                                             // urlKeyboard\r
+                return InputType.TYPE_CLASS_TEXT\r
+                     | InputType.TYPE_TEXT_VARIATION_URI\r
+                     | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;\r
+            case 4:                                             // emailAddressKeyboard\r
+                return InputType.TYPE_CLASS_TEXT\r
+                     | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS\r
+                     | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;\r
+            case 5:                                             // phoneNumberKeyboard\r
+                return InputType.TYPE_CLASS_PHONE;\r
+            case 6:                                             // passwordKeyboard\r
+                return InputType.TYPE_CLASS_TEXT\r
+                     | InputType.TYPE_TEXT_VARIATION_PASSWORD\r
+                     | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;\r
         }\r
+\r
+        return 0;\r
+    }\r
+\r
+    InputMethodManager getInputMethodManager()\r
+    {\r
+        return (InputMethodManager) getContext().getSystemService (Context.INPUT_METHOD_SERVICE);\r
+    }\r
+\r
+    public void closeInputMethodContext()\r
+    {\r
+        InputMethodManager imm = getInputMethodManager();\r
+\r
+        if (imm == null)\r
+            return;\r
+\r
+        if (cachedConnection != null)\r
+            cachedConnection.closeConnection();\r
+\r
+        imm.restartInput (this);\r
+    }\r
+\r
+    public void showKeyboard (int virtualKeyboardType, int selectionStart, int selectionEnd)\r
+    {\r
+        InputMethodManager imm = getInputMethodManager();\r
+\r
+        if (imm == null)\r
+            return;\r
+\r
+        // restartingInput causes a call back to onCreateInputConnection, where we'll pick\r
+        // up the correct keyboard characteristics to use for the focused TextInputTarget.\r
+        imm.restartInput (this);\r
+        imm.showSoftInput (this, 0);\r
+        keyboardDismissListener.startListening();\r
     }\r
 \r
-    public void backButtonPressed ()\r
+    public void hideKeyboard()\r
+    {\r
+        InputMethodManager imm = getInputMethodManager();\r
+\r
+        if (imm == null)\r
+            return;\r
+\r
+        imm.hideSoftInputFromWindow (getWindowToken(), 0);\r
+        keyboardDismissListener.stopListening();\r
+    }\r
+\r
+    public void backButtonPressed()\r
     {\r
         if (host == 0)\r
             return;\r
@@ -292,6 +411,11 @@ public final class ComponentPeerView extends ViewGroup
         if (host == 0)\r
             return false;\r
 \r
+        // The key event may move the cursor, or in some cases it might enter characters (e.g.\r
+        // digits). In this case, we need to reset the IME so that it's aware of the new contents\r
+        // of the TextInputTarget.\r
+        closeInputMethodContext();\r
+\r
         switch (keyCode)\r
         {\r
             case KeyEvent.KEYCODE_VOLUME_UP:\r
@@ -299,7 +423,7 @@ public final class ComponentPeerView extends ViewGroup
                 return super.onKeyDown (keyCode, event);\r
             case KeyEvent.KEYCODE_BACK:\r
             {\r
-                backButtonPressed ();\r
+                backButtonPressed();\r
                 return true;\r
             }\r
 \r
@@ -309,8 +433,9 @@ public final class ComponentPeerView extends ViewGroup
 \r
         handleKeyDown (host,\r
                        keyCode,\r
-                       event.getUnicodeChar (),\r
-                       event.getMetaState ());\r
+                       event.getUnicodeChar(),\r
+                       event.getMetaState());\r
+\r
         return true;\r
     }\r
 \r
@@ -320,7 +445,7 @@ public final class ComponentPeerView extends ViewGroup
         if (host == 0)\r
             return false;\r
 \r
-        handleKeyUp (host, keyCode, event.getUnicodeChar ());\r
+        handleKeyUp (host, keyCode, event.getUnicodeChar());\r
         return true;\r
     }\r
 \r
@@ -330,17 +455,17 @@ public final class ComponentPeerView extends ViewGroup
         if (host == 0)\r
             return false;\r
 \r
-        if (keyCode != KeyEvent.KEYCODE_UNKNOWN || event.getAction () != KeyEvent.ACTION_MULTIPLE)\r
+        if (keyCode != KeyEvent.KEYCODE_UNKNOWN || (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && event.getAction() != KeyEvent.ACTION_MULTIPLE))\r
             return super.onKeyMultiple (keyCode, count, event);\r
 \r
-        if (event.getCharacters () != null)\r
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q && event.getCharacters() != null)\r
         {\r
-            int utf8Char = event.getCharacters ().codePointAt (0);\r
+            int utf8Char = event.getCharacters().codePointAt (0);\r
 \r
             handleKeyDown (host,\r
                            keyCode,\r
                            utf8Char,\r
-                           event.getMetaState ());\r
+                           event.getMetaState());\r
             return true;\r
         }\r
 \r
@@ -355,39 +480,40 @@ public final class ComponentPeerView extends ViewGroup
             view = viewToUse;\r
         }\r
 \r
-        private void startListening ()\r
+        private void startListening()\r
         {\r
-            view.getViewTreeObserver ().addOnGlobalLayoutListener (viewTreeObserver);\r
+            view.getViewTreeObserver().addOnGlobalLayoutListener (viewTreeObserver);\r
         }\r
 \r
-        private void stopListening ()\r
+        private void stopListening()\r
         {\r
-            view.getViewTreeObserver ().removeGlobalOnLayoutListener (viewTreeObserver);\r
+            view.getViewTreeObserver().removeOnGlobalLayoutListener (viewTreeObserver);\r
         }\r
 \r
         private class TreeObserver implements ViewTreeObserver.OnGlobalLayoutListener\r
         {\r
-            TreeObserver ()\r
+            TreeObserver()\r
             {\r
                 keyboardShown = false;\r
             }\r
 \r
             @Override\r
-            public void onGlobalLayout ()\r
+            public void onGlobalLayout()\r
             {\r
-                Rect r = new Rect ();\r
+                Rect r = new Rect();\r
 \r
-                View parentView = getRootView ();\r
+                View parentView = getRootView();\r
                 int diff;\r
 \r
                 if (parentView == null)\r
                 {\r
                     getWindowVisibleDisplayFrame (r);\r
-                    diff = getHeight () - (r.bottom - r.top);\r
-                } else\r
+                    diff = getHeight() - (r.bottom - r.top);\r
+                }\r
+                else\r
                 {\r
                     parentView.getWindowVisibleDisplayFrame (r);\r
-                    diff = parentView.getHeight () - (r.bottom - r.top);\r
+                    diff = parentView.getHeight() - (r.bottom - r.top);\r
                 }\r
 \r
                 // Arbitrary threshold, surely keyboard would take more than 20 pix.\r
@@ -397,7 +523,7 @@ public final class ComponentPeerView extends ViewGroup
                     handleKeyboardHidden (view.host);\r
                 }\r
 \r
-                if (!keyboardShown && diff > 20)\r
+                if (! keyboardShown && diff > 20)\r
                     keyboardShown = true;\r
             }\r
 \r
@@ -405,26 +531,219 @@ public final class ComponentPeerView extends ViewGroup
         }\r
 \r
         private final ComponentPeerView view;\r
-        private final TreeObserver viewTreeObserver = new TreeObserver ();\r
+        private final TreeObserver viewTreeObserver = new TreeObserver();\r
     }\r
 \r
     private final KeyboardDismissListener keyboardDismissListener = new KeyboardDismissListener (this);\r
 \r
-    // this is here to make keyboard entry work on a Galaxy Tab2 10.1\r
+    //==============================================================================\r
+    // This implementation is quite similar to the ChangeListener in Android's built-in TextView.\r
+    private static final class ChangeWatcher implements SpanWatcher, TextWatcher\r
+    {\r
+        public ChangeWatcher (ComponentPeerView viewIn, Editable editableIn, TextInputTarget targetIn)\r
+        {\r
+            view = viewIn;\r
+            editable = editableIn;\r
+            target = targetIn;\r
+\r
+            updateEditableSelectionFromTarget (editable, target);\r
+        }\r
+\r
+        @Override\r
+        public void onSpanAdded (Spannable text, Object what, int start, int end)\r
+        {\r
+            updateTargetRangesFromEditable (editable, target);\r
+        }\r
+\r
+        @Override\r
+        public void onSpanRemoved (Spannable text, Object what, int start, int end)\r
+        {\r
+            updateTargetRangesFromEditable (editable, target);\r
+        }\r
+\r
+        @Override\r
+        public void onSpanChanged (Spannable text, Object what, int ostart, int oend, int nstart, int nend)\r
+        {\r
+            updateTargetRangesFromEditable (editable, target);\r
+        }\r
+\r
+        @Override\r
+        public void afterTextChanged (Editable s)\r
+        {\r
+        }\r
+\r
+        @Override\r
+        public void beforeTextChanged (CharSequence s, int start, int count, int after)\r
+        {\r
+            contentsBeforeChange = s.toString();\r
+        }\r
+\r
+        @Override\r
+        public void onTextChanged (CharSequence s, int start, int before, int count)\r
+        {\r
+            if (editable != s || contentsBeforeChange == null)\r
+                return;\r
+\r
+            final String newText = s.subSequence (start, start + count).toString();\r
+\r
+            int code = 0;\r
+\r
+            if (newText.endsWith ("\n") || newText.endsWith ("\r"))\r
+                code = KeyEvent.KEYCODE_ENTER;\r
+\r
+            if (newText.endsWith ("\t"))\r
+                code = KeyEvent.KEYCODE_TAB;\r
+\r
+            target.setHighlightedRegion (contentsBeforeChange.codePointCount (0, start),\r
+                                         contentsBeforeChange.codePointCount (0, start + before));\r
+            target.insertTextAtCaret (code != 0 ? newText.substring (0, newText.length() - 1)\r
+                                                : newText);\r
+\r
+            // Treating return/tab as individual keypresses rather than part of the composition\r
+            // sequence allows TextEditor onReturn and onTab to work as expected.\r
+            if (code != 0)\r
+                view.onKeyDown (code, new KeyEvent (KeyEvent.ACTION_DOWN, code));\r
+\r
+            updateTargetRangesFromEditable (editable, target);\r
+            contentsBeforeChange = null;\r
+        }\r
+\r
+        private static void updateEditableSelectionFromTarget (Editable editable, TextInputTarget text)\r
+        {\r
+            final int start = text.getHighlightedRegionBegin();\r
+            final int end   = text.getHighlightedRegionEnd();\r
+\r
+            if (start < 0 || end < 0)\r
+                return;\r
+\r
+            final String string = editable.toString();\r
+            Selection.setSelection (editable,\r
+                                    string.offsetByCodePoints (0, start),\r
+                                    string.offsetByCodePoints (0, end));\r
+        }\r
+\r
+        private static void updateTargetSelectionFromEditable (Editable editable, TextInputTarget target)\r
+        {\r
+            final int start = Selection.getSelectionStart (editable);\r
+            final int end   = Selection.getSelectionEnd   (editable);\r
+\r
+            if (start < 0 || end < 0)\r
+                return;\r
+\r
+            final String string = editable.toString();\r
+            target.setHighlightedRegion (string.codePointCount (0, start),\r
+                                         string.codePointCount (0, end));\r
+        }\r
+\r
+        private static List<Pair<Integer, Integer>> getUnderlinedRanges (Editable editable)\r
+        {\r
+            final int start = BaseInputConnection.getComposingSpanStart (editable);\r
+            final int end   = BaseInputConnection.getComposingSpanEnd   (editable);\r
+\r
+            if (start < 0 || end < 0)\r
+                return null;\r
+\r
+            final String string = editable.toString();\r
+\r
+            final ArrayList<Pair<Integer, Integer>> pairs = new ArrayList<>();\r
+            pairs.add (new Pair<> (string.codePointCount (0, start), string.codePointCount (0, end)));\r
+            return pairs;\r
+        }\r
+\r
+        private static void updateTargetCompositionRangesFromEditable (Editable editable, TextInputTarget target)\r
+        {\r
+            target.setTemporaryUnderlining (getUnderlinedRanges (editable));\r
+        }\r
+\r
+        private static void updateTargetRangesFromEditable (Editable editable, TextInputTarget target)\r
+        {\r
+            updateTargetSelectionFromEditable         (editable, target);\r
+            updateTargetCompositionRangesFromEditable (editable, target);\r
+        }\r
+\r
+        private final ComponentPeerView view;\r
+        private final TextInputTarget target;\r
+        private final Editable editable;\r
+        private String contentsBeforeChange;\r
+    }\r
+\r
+    private static final class Connection extends BaseInputConnection\r
+    {\r
+        Connection (ComponentPeerView viewIn, boolean fullEditor, TextInputTarget targetIn)\r
+        {\r
+            super (viewIn, fullEditor);\r
+            view = viewIn;\r
+            target = targetIn;\r
+        }\r
+\r
+        @Override\r
+        public Editable getEditable()\r
+        {\r
+            if (cached != null)\r
+                return cached;\r
+\r
+            if (target == null)\r
+                return cached = super.getEditable();\r
+\r
+            int length = target.getTotalNumChars();\r
+            String initialText = target.getTextInRange (0, length);\r
+            cached = new SpannableStringBuilder (initialText);\r
+            // Span the entire range of text, so that we pick up changes at any location.\r
+            // Use cached.length rather than target.getTotalNumChars here, because this\r
+            // range is in UTF-16 code units, rather than code points.\r
+            changeWatcher = new ChangeWatcher (view, cached, target);\r
+            cached.setSpan (changeWatcher, 0, cached.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);\r
+            return cached;\r
+        }\r
+\r
+        /** Call this to stop listening for selection/composition updates.\r
+\r
+            We do this before closing the current input method context (e.g. when the user\r
+            taps on a text view to move the cursor), because otherwise the input system\r
+            might send another round of notifications *during* the restartInput call, after we've\r
+            requested that the input session should end.\r
+        */\r
+        @Override\r
+        public void closeConnection()\r
+        {\r
+            if (cached != null && changeWatcher != null)\r
+                cached.removeSpan (changeWatcher);\r
+\r
+            cached = null;\r
+            target = null;\r
+\r
+            super.closeConnection();\r
+        }\r
+\r
+        private ComponentPeerView view;\r
+        private TextInputTarget target;\r
+        private Editable cached;\r
+        private ChangeWatcher changeWatcher;\r
+    }\r
+\r
     @Override\r
     public InputConnection onCreateInputConnection (EditorInfo outAttrs)\r
     {\r
+        TextInputTarget focused = getFocusedTextInputTarget (host);\r
+\r
         outAttrs.actionLabel = "";\r
         outAttrs.hintText = "";\r
         outAttrs.initialCapsMode = 0;\r
-        outAttrs.initialSelEnd = outAttrs.initialSelStart = -1;\r
+        outAttrs.initialSelStart = focused != null ? focused.getHighlightedRegionBegin() : -1;\r
+        outAttrs.initialSelEnd   = focused != null ? focused.getHighlightedRegionEnd()   : -1;\r
         outAttrs.label = "";\r
-        outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI;\r
-        outAttrs.inputType = InputType.TYPE_NULL;\r
-\r
-        return new BaseInputConnection (this, false);\r
+        outAttrs.imeOptions = EditorInfo.IME_ACTION_UNSPECIFIED\r
+                            | EditorInfo.IME_FLAG_NO_EXTRACT_UI\r
+                            | EditorInfo.IME_FLAG_NO_ENTER_ACTION;\r
+        outAttrs.inputType = focused != null ? getInputTypeForJuceVirtualKeyboardType (focused.getKeyboardType())\r
+                                             : 0;\r
+\r
+        cachedConnection = new Connection (this, true, focused);\r
+        return cachedConnection;\r
     }\r
 \r
+    private Connection cachedConnection;\r
+\r
     //==============================================================================\r
     @Override\r
     protected void onSizeChanged (int w, int h, int oldw, int oldh)\r
@@ -463,11 +782,13 @@ public final class ComponentPeerView extends ViewGroup
         Method systemUIVisibilityMethod = null;\r
         try\r
         {\r
-            systemUIVisibilityMethod = this.getClass ().getMethod ("setSystemUiVisibility", int.class);\r
-        } catch (SecurityException e)\r
+            systemUIVisibilityMethod = this.getClass().getMethod ("setSystemUiVisibility", int.class);\r
+        }\r
+        catch (SecurityException e)\r
         {\r
             return;\r
-        } catch (NoSuchMethodException e)\r
+        }\r
+        catch (NoSuchMethodException e)\r
         {\r
             return;\r
         }\r
@@ -476,18 +797,21 @@ public final class ComponentPeerView extends ViewGroup
         try\r
         {\r
             systemUIVisibilityMethod.invoke (this, visibility);\r
-        } catch (java.lang.IllegalArgumentException e)\r
+        }\r
+        catch (java.lang.IllegalArgumentException e)\r
         {\r
-        } catch (java.lang.IllegalAccessException e)\r
+        }\r
+        catch (java.lang.IllegalAccessException e)\r
         {\r
-        } catch (java.lang.reflect.InvocationTargetException e)\r
+        }\r
+        catch (java.lang.reflect.InvocationTargetException e)\r
         {\r
         }\r
     }\r
 \r
-    public boolean isVisible ()\r
+    public boolean isVisible()\r
     {\r
-        return getVisibility () == VISIBLE;\r
+        return getVisibility() == VISIBLE;\r
     }\r
 \r
     public void setVisible (boolean b)\r
@@ -572,11 +896,22 @@ public final class ComponentPeerView extends ViewGroup
             if (host == 0)\r
                 return null;\r
 \r
-            final AccessibilityNodeInfo nodeInfo = AccessibilityNodeInfo.obtain (view, virtualViewId);\r
+            final AccessibilityNodeInfo nodeInfo;\r
+\r
+            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R)\r
+            {\r
+                nodeInfo = new AccessibilityNodeInfo (view, virtualViewId);\r
+            }\r
+            else\r
+            {\r
+                nodeInfo = AccessibilityNodeInfo.obtain (view, virtualViewId);\r
+            }\r
 \r
             if (! populateAccessibilityNodeInfo (host, virtualViewId, nodeInfo))\r
             {\r
-                nodeInfo.recycle();\r
+                if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.R)\r
+                    nodeInfo.recycle();\r
+\r
                 return null;\r
             }\r
 \r
@@ -617,10 +952,10 @@ public final class ComponentPeerView extends ViewGroup
     }\r
 \r
     private final JuceAccessibilityNodeProvider nodeProvider = new JuceAccessibilityNodeProvider (this);\r
-    private final AccessibilityManager accessibilityManager = (AccessibilityManager) getContext ().getSystemService (Context.ACCESSIBILITY_SERVICE);\r
+    private final AccessibilityManager accessibilityManager = (AccessibilityManager) getContext().getSystemService (Context.ACCESSIBILITY_SERVICE);\r
 \r
     @Override\r
-    public AccessibilityNodeProvider getAccessibilityNodeProvider ()\r
+    public AccessibilityNodeProvider getAccessibilityNodeProvider()\r
     {\r
         return nodeProvider;\r
     }\r
index a89dc646c1b2000330f13ec51eb6ec179f1469f6..61f9a070e82f53eb4032cb2961e76b6086b8da5c 100644 (file)
@@ -34,7 +34,6 @@ public final class JuceContentProviderFileObserver extends FileObserver
     public JuceContentProviderFileObserver (long hostToUse, String path, int mask)\r
     {\r
         super (path, mask);\r
-\r
         host = hostToUse;\r
     }\r
 \r
index ba3f337698a53006de08ff6ed96ed8ae63c1b005..9330d28dec5cd5b09e67d4d85aba138e2eea2438 100644 (file)
@@ -101,7 +101,7 @@ public:
     class Owner\r
     {\r
     public:\r
-        virtual ~Owner() {}\r
+        virtual ~Owner() = default;\r
 \r
         virtual void cursorClosed (const AndroidContentSharerCursor&) = 0;\r
     };\r
@@ -121,9 +121,9 @@ public:
 \r
     jobject getNativeCursor() { return cursor.get(); }\r
 \r
-    void cursorClosed()\r
+    static void cursorClosed (JNIEnv*, AndroidContentSharerCursor& t)\r
     {\r
-        MessageManager::callAsync ([this] { owner.cursorClosed (*this); });\r
+        MessageManager::callAsync ([&t] { t.owner.cursorClosed (t); });\r
     }\r
 \r
     void addRow (LocalRef<jobjectArray>& values)\r
@@ -141,20 +141,12 @@ private:
     #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
      METHOD (addRow,      "addRow", "([Ljava/lang/Object;)V") \\r
      METHOD (constructor, "<init>", "(J[Ljava/lang/String;)V") \\r
-     CALLBACK (contentSharerCursorClosed, "contentSharerCursorClosed", "(J)V") \\r
+     CALLBACK (generatedCallback<&AndroidContentSharerCursor::cursorClosed>, "contentSharerCursorClosed", "(J)V") \\r
 \r
-    DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderCursor, "com/rmsl/juce/JuceContentProviderCursor", 16, javaJuceContentProviderCursor, sizeof (javaJuceContentProviderCursor))\r
+    DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderCursor, "com/rmsl/juce/JuceContentProviderCursor", 16, javaJuceContentProviderCursor)\r
     #undef JNI_CLASS_MEMBERS\r
-\r
-    static void JNICALL contentSharerCursorClosed (JNIEnv*, jobject, jlong host)\r
-    {\r
-        if (auto* myself = reinterpret_cast<AndroidContentSharerCursor*> (host))\r
-            myself->cursorClosed();\r
-    }\r
 };\r
 \r
-AndroidContentSharerCursor::JuceContentProviderCursor_Class AndroidContentSharerCursor::JuceContentProviderCursor;\r
-\r
 //==============================================================================\r
 class AndroidContentSharerFileObserver\r
 {\r
@@ -184,10 +176,8 @@ public:
         env->CallVoidMethod (fileObserver, JuceContentProviderFileObserver.startWatching);\r
     }\r
 \r
-    void onFileEvent (int event, const LocalRef<jstring>& path)\r
+    void onFileEvent (int event, [[maybe_unused]] const LocalRef<jstring>& path)\r
     {\r
-        ignoreUnused (path);\r
-\r
         if (event == open)\r
         {\r
             ++numOpenedHandles;\r
@@ -230,20 +220,17 @@ private:
      METHOD (constructor,   "<init>",        "(JLjava/lang/String;I)V") \\r
      METHOD (startWatching, "startWatching", "()V") \\r
      METHOD (stopWatching,  "stopWatching",  "()V") \\r
-     CALLBACK (contentSharerFileObserverEvent, "contentSharerFileObserverEvent", "(JILjava/lang/String;)V") \\r
+     CALLBACK (generatedCallback<&AndroidContentSharerFileObserver::onFileEventCallback>, "contentSharerFileObserverEvent", "(JILjava/lang/String;)V") \\r
 \r
-    DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderFileObserver, "com/rmsl/juce/JuceContentProviderFileObserver", 16, javaJuceContentProviderFileObserver, sizeof (javaJuceContentProviderFileObserver))\r
+    DECLARE_JNI_CLASS_WITH_BYTECODE (JuceContentProviderFileObserver, "com/rmsl/juce/JuceContentProviderFileObserver", 16, javaJuceContentProviderFileObserver)\r
     #undef JNI_CLASS_MEMBERS\r
 \r
-    static void JNICALL contentSharerFileObserverEvent (JNIEnv*, jobject /*fileObserver*/, jlong host, int event, jstring path)\r
+    static void onFileEventCallback (JNIEnv*, AndroidContentSharerFileObserver& t, jint event, jstring path)\r
     {\r
-        if (auto* myself = reinterpret_cast<AndroidContentSharerFileObserver*> (host))\r
-            myself->onFileEvent (event, LocalRef<jstring> (path));\r
+        t.onFileEvent (event, LocalRef<jstring> (path));\r
     }\r
 };\r
 \r
-AndroidContentSharerFileObserver::JuceContentProviderFileObserver_Class AndroidContentSharerFileObserver::JuceContentProviderFileObserver;\r
-\r
 //==============================================================================\r
 class AndroidContentSharerPrepareFilesThread    : private Thread\r
 {\r
@@ -513,10 +500,8 @@ public:
 \r
     //==============================================================================\r
     jobject openFile (const LocalRef<jobject>& contentProvider,\r
-                      const LocalRef<jobject>& uri, const LocalRef<jstring>& mode)\r
+                      const LocalRef<jobject>& uri, [[maybe_unused]] const LocalRef<jstring>& mode)\r
     {\r
-        ignoreUnused (mode);\r
-\r
         WeakReference<ContentSharerNativeImpl> weakRef (this);\r
 \r
         if (weakRef == nullptr)\r
@@ -895,6 +880,4 @@ ContentSharer::Pimpl* ContentSharer::createPimpl()
     return new ContentSharerNativeImpl (*this);\r
 }\r
 \r
-ContentSharer::ContentSharerNativeImpl::JuceSharingContentProvider_Class ContentSharer::ContentSharerNativeImpl::JuceSharingContentProvider;\r
-\r
 } // namespace juce\r
index e3ade3c666514239bb3cde252c078c414c1357cc..1fadc42a53e0f8c56ac732ac9b1bbcefcdf1a070 100644 (file)
 \r
 namespace juce\r
 {\r
+\r
 // This byte-code is generated from native/java/com/rmsl/juce/ComponentPeerView.java with min sdk version 16\r
 // See juce_core/native/java/README.txt on how to generate this byte-code.\r
-static const uint8 javaComponentPeerView[] =\r
-{ 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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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,\r
-  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 };\r
+static const uint8 javaComponentPeerView[]\r
+{\r
+  0x1f, 0x8b, 0x08, 0x08, 0x16, 0x5e, 0x87, 0x63, 0x00, 0x03, 0x63, 0x6c,\r
+  0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0xad, 0x7c,\r
+  0x0b, 0x7c, 0x94, 0xd5, 0xb5, 0xef, 0xda, 0xdf, 0x3c, 0x33, 0x79, 0xcd,\r
+  0x4c, 0x02, 0xe1, 0xcd, 0x24, 0xa0, 0xe4, 0x9d, 0x21, 0xbc, 0x12, 0x12,\r
+  0x20, 0x21, 0x04, 0x4c, 0x08, 0x10, 0xc8, 0x10, 0x24, 0xa1, 0xca, 0x90,\r
+  0x0c, 0x64, 0x64, 0x98, 0x19, 0x66, 0x26, 0x01, 0x7c, 0x15, 0x29, 0x0a,\r
+  0xf5, 0x51, 0xb1, 0xda, 0x4a, 0xd5, 0xf6, 0x58, 0xaf, 0x2f, 0x3c, 0xea,\r
+  0x41, 0xc5, 0xfa, 0xa8, 0xb6, 0xd6, 0xaa, 0xd5, 0xa3, 0xa7, 0xea, 0x39,\r
+  0xf6, 0x96, 0xdb, 0x63, 0xab, 0x1e, 0xb5, 0xad, 0xad, 0x57, 0xed, 0xa9,\r
+  0xad, 0x7a, 0x8f, 0x3d, 0xde, 0xff, 0xda, 0x7b, 0xcf, 0xe4, 0x1b, 0x12,\r
+  0xd4, 0xde, 0xdf, 0x4d, 0xf8, 0x7f, 0x6b, 0xed, 0xb5, 0xd6, 0x7e, 0xaf,\r
+  0xbd, 0xf6, 0xde, 0xdf, 0x84, 0x19, 0x0c, 0xed, 0x75, 0xf9, 0xe7, 0x2d,\r
+  0xa0, 0xee, 0xef, 0xbf, 0xfb, 0xe4, 0x77, 0xef, 0x38, 0xfe, 0xef, 0xe7,\r
+  0xdc, 0x31, 0xe9, 0xf1, 0x87, 0x7e, 0x3c, 0xf2, 0xe2, 0x88, 0x38, 0x74,\r
+  0xe6, 0xbc, 0x07, 0xde, 0xff, 0xaa, 0xbf, 0x8b, 0x28, 0x4e, 0x44, 0x7b,\r
+  0x7b, 0xe7, 0x7b, 0x49, 0xff, 0x44, 0x56, 0x13, 0x85, 0x84, 0x92, 0xaf,\r
+  0x04, 0xac, 0x76, 0xa2, 0x21, 0xd0, 0x69, 0x0e, 0xa2, 0x59, 0xa0, 0x9f,\r
+  0xe6, 0x12, 0xfd, 0x1c, 0xb4, 0x38, 0x9f, 0x08, 0x22, 0x3a, 0x58, 0x44,\r
+  0xf4, 0xc2, 0x22, 0xa2, 0xc1, 0x62, 0x22, 0x5f, 0x2d, 0x51, 0x19, 0x70,\r
+  0x06, 0x50, 0x0e, 0x54, 0x01, 0xb5, 0x40, 0x3d, 0xb0, 0x00, 0x58, 0x02,\r
+  0xb4, 0x02, 0xab, 0x80, 0x75, 0xc0, 0x39, 0xc0, 0x08, 0x70, 0x00, 0xb8,\r
+  0x14, 0xf8, 0x3a, 0x70, 0x25, 0x70, 0x04, 0xb8, 0x0e, 0xf8, 0x0e, 0xf0,\r
+  0x5d, 0xe0, 0x16, 0xe0, 0x76, 0xe0, 0x18, 0x70, 0x0f, 0x70, 0x1f, 0xf0,\r
+  0x12, 0xf0, 0x0e, 0xf0, 0x2e, 0xf0, 0x01, 0xf0, 0x17, 0xe0, 0x13, 0xe0,\r
+  0x33, 0xc0, 0x52, 0x47, 0xe4, 0x04, 0xf2, 0x01, 0x2f, 0x50, 0x09, 0x6c,\r
+  0x05, 0x2e, 0x00, 0xbe, 0x0d, 0xdc, 0x07, 0xbc, 0x0c, 0xfc, 0x09, 0x98,\r
+  0xe6, 0x27, 0x5a, 0x08, 0x74, 0x03, 0x61, 0xe0, 0x52, 0xe0, 0x06, 0xe0,\r
+  0x38, 0xf0, 0x1c, 0xf0, 0x26, 0xf0, 0x19, 0x30, 0x79, 0x2e, 0x51, 0x0b,\r
+  0xb0, 0x05, 0xd8, 0x0d, 0x5c, 0x06, 0xdc, 0x0f, 0xbc, 0x04, 0xbc, 0x03,\r
+  0xd8, 0xea, 0x89, 0xfc, 0x40, 0x3b, 0x70, 0x2e, 0x70, 0x3d, 0xf0, 0x30,\r
+  0xf0, 0x47, 0x60, 0xe6, 0x3c, 0xa2, 0x4d, 0xc0, 0x21, 0xe0, 0x5e, 0xe0,\r
+  0x57, 0x40, 0xce, 0x7c, 0xa2, 0xc5, 0xc0, 0x10, 0x70, 0x0c, 0xf8, 0x13,\r
+  0x50, 0xbd, 0x00, 0x79, 0x81, 0x03, 0xc0, 0xed, 0xc0, 0x33, 0xc0, 0x3b,\r
+  0x80, 0x73, 0x21, 0xc6, 0x15, 0x58, 0x00, 0x6c, 0x06, 0xbe, 0x0a, 0x5c,\r
+  0x07, 0x3c, 0x04, 0x3c, 0x0f, 0xfc, 0x01, 0xf8, 0x6f, 0xa0, 0x06, 0xf3,\r
+  0xd0, 0x01, 0x6c, 0x05, 0x12, 0xc0, 0x41, 0xe0, 0x2a, 0xe0, 0x5a, 0xe0,\r
+  0x56, 0xe0, 0x7e, 0xe0, 0x41, 0xe0, 0x11, 0xe0, 0x47, 0xc0, 0x53, 0xc0,\r
+  0xf3, 0xc0, 0x8b, 0xc0, 0x2f, 0x81, 0x5f, 0x03, 0x6f, 0x01, 0xef, 0x00,\r
+  0xef, 0x01, 0x1f, 0x02, 0x9f, 0x00, 0x7f, 0x03, 0x8c, 0x06, 0xb4, 0x03,\r
+  0x28, 0x04, 0x8a, 0x81, 0xc9, 0x80, 0x0f, 0xa8, 0x00, 0xea, 0x80, 0xf9,\r
+  0xc0, 0x62, 0xa0, 0x05, 0x58, 0x01, 0x74, 0x01, 0xeb, 0x80, 0x00, 0xd0,\r
+  0x07, 0x9c, 0x0b, 0x0c, 0x00, 0xe7, 0x01, 0x71, 0x20, 0x05, 0xec, 0x03,\r
+  0x2e, 0x01, 0x0e, 0x03, 0x57, 0x02, 0x47, 0x80, 0x5b, 0x81, 0x47, 0x80,\r
+  0xa7, 0x81, 0x97, 0x81, 0xdf, 0x00, 0x7f, 0x04, 0x3e, 0x06, 0x6c, 0x8d,\r
+  0x98, 0x4f, 0x60, 0x26, 0x50, 0x0d, 0x34, 0x02, 0x2b, 0x81, 0x1e, 0xe0,\r
+  0x5c, 0x60, 0x27, 0xb0, 0x07, 0xf8, 0x1a, 0x70, 0x35, 0x70, 0x23, 0x70,\r
+  0x07, 0xf0, 0x00, 0xf0, 0x04, 0xf0, 0x22, 0xf0, 0x36, 0xf0, 0x9f, 0xc0,\r
+  0x47, 0x5c, 0xd6, 0x62, 0xa2, 0xd9, 0xc0, 0x22, 0xa0, 0x13, 0xd8, 0x00,\r
+  0xf4, 0x01, 0x11, 0xe0, 0x02, 0xe0, 0x00, 0x70, 0x2d, 0x70, 0x37, 0xf0,\r
+  0x08, 0xf0, 0x1c, 0x70, 0x12, 0x78, 0x0f, 0xc8, 0x6d, 0xc2, 0x38, 0x00,\r
+  0x33, 0x80, 0x72, 0xa0, 0x13, 0xd8, 0x08, 0x0c, 0x00, 0xfb, 0x81, 0xef,\r
+  0x01, 0xc7, 0x80, 0x47, 0x81, 0x97, 0x81, 0x37, 0x81, 0x4f, 0x00, 0x67,\r
+  0x33, 0xea, 0x05, 0xe6, 0x00, 0x4b, 0x81, 0x4e, 0x60, 0x13, 0x10, 0x02,\r
+  0xf6, 0x03, 0xb7, 0x00, 0xf7, 0x00, 0xcf, 0x02, 0x6f, 0x00, 0x7f, 0x05,\r
+  0xf2, 0x97, 0x60, 0xee, 0x81, 0xe5, 0x40, 0x0f, 0x30, 0x04, 0x8c, 0x00,\r
+  0x97, 0x00, 0xdf, 0x04, 0x6e, 0x06, 0x8e, 0x01, 0xf7, 0x03, 0x3f, 0x06,\r
+  0x5e, 0x02, 0xde, 0x04, 0xfe, 0x02, 0xd8, 0x96, 0x12, 0x95, 0x00, 0xd5,\r
+  0x40, 0x33, 0xb0, 0x1e, 0xd8, 0x0a, 0xc4, 0x81, 0x6f, 0x00, 0xd7, 0x01,\r
+  0x37, 0x00, 0x27, 0x80, 0xa7, 0x81, 0x5f, 0x02, 0xef, 0x00, 0x1f, 0x03,\r
+  0x8e, 0x65, 0xe8, 0x23, 0x50, 0x09, 0x34, 0x01, 0x5d, 0x40, 0x3f, 0x30,\r
+  0x04, 0x5c, 0x04, 0x5c, 0x01, 0xdc, 0x0a, 0xdc, 0x0b, 0x9c, 0x00, 0x9e,\r
+  0x00, 0x5e, 0x06, 0x5e, 0x07, 0xfe, 0x04, 0x7c, 0x0a, 0xb8, 0x5a, 0x88,\r
+  0xa6, 0x03, 0x73, 0x80, 0x3a, 0xa0, 0x09, 0x68, 0x07, 0xce, 0x06, 0x92,\r
+  0xc0, 0xc5, 0xc0, 0xf5, 0xc0, 0xed, 0xc0, 0x3d, 0xc0, 0x83, 0xc0, 0x0f,\r
+  0x81, 0xe7, 0x80, 0x97, 0x81, 0xb7, 0x81, 0x8f, 0x81, 0xfc, 0x56, 0xcc,\r
+  0x3b, 0x50, 0x0f, 0xac, 0x03, 0xb6, 0x01, 0xc3, 0xc0, 0x37, 0x80, 0x6f,\r
+  0x03, 0xb7, 0x01, 0x0f, 0x02, 0x3f, 0x05, 0x7e, 0x0e, 0xfc, 0x1a, 0xf8,\r
+  0x2d, 0xf0, 0x01, 0xf0, 0x19, 0x90, 0xb7, 0x9c, 0x68, 0x2a, 0x50, 0x09,\r
+  0x34, 0x02, 0xab, 0x80, 0x75, 0x40, 0x2f, 0x10, 0x02, 0x0e, 0x02, 0xd7,\r
+  0x03, 0x37, 0x03, 0x4f, 0x01, 0xff, 0x01, 0xbc, 0x07, 0x7c, 0x0a, 0x88,\r
+  0x36, 0x22, 0x0f, 0x30, 0x13, 0x68, 0x00, 0xd6, 0x02, 0x5b, 0x80, 0x11,\r
+  0xe0, 0x20, 0x70, 0x15, 0x70, 0x2b, 0xf0, 0x13, 0xe0, 0x57, 0xc0, 0xef,\r
+  0x80, 0xbf, 0x02, 0xc6, 0x0a, 0xcc, 0x35, 0xe0, 0x03, 0xea, 0x80, 0x65,\r
+  0xc0, 0x5a, 0xa0, 0x1f, 0xd8, 0x0e, 0x44, 0x81, 0xab, 0x81, 0x13, 0xc0,\r
+  0x6f, 0x00, 0x7b, 0x3b, 0xd1, 0x99, 0x40, 0x3b, 0xb0, 0x1d, 0x38, 0x0c,\r
+  0xdc, 0x05, 0xbc, 0x08, 0x7c, 0x04, 0x7c, 0x06, 0x38, 0x10, 0x94, 0x3d,\r
+  0xc0, 0x44, 0xa0, 0x11, 0x18, 0x04, 0x0e, 0x02, 0x77, 0x00, 0xf7, 0x02,\r
+  0x0f, 0x01, 0x8f, 0x03, 0x3f, 0x07, 0x5e, 0x07, 0x0a, 0x10, 0xa3, 0xdd,\r
+  0x40, 0x09, 0x70, 0x06, 0x70, 0x26, 0x30, 0x07, 0x28, 0x07, 0x2a, 0x80,\r
+  0x4a, 0xa0, 0x0a, 0xa8, 0x06, 0x6a, 0x00, 0x84, 0x4f, 0x42, 0x58, 0x24,\r
+  0x84, 0x3c, 0x42, 0x58, 0x23, 0x84, 0x2f, 0x42, 0xb8, 0x22, 0x84, 0x27,\r
+  0x42, 0x28, 0x22, 0x84, 0x19, 0x42, 0x38, 0x20, 0x2c, 0x47, 0xc2, 0x12,\r
+  0x22, 0xb8, 0x34, 0xc1, 0x45, 0x09, 0xae, 0x46, 0x70, 0x19, 0xc2, 0x94,\r
+  0x13, 0xa6, 0x8b, 0x30, 0xe4, 0x84, 0xa1, 0x23, 0x0c, 0x03, 0xa1, 0x6b,\r
+  0xd4, 0xae, 0xf7, 0x93, 0x55, 0xc0, 0x59, 0x40, 0x07, 0xd0, 0x09, 0x60,\r
+  0xbb, 0x21, 0x6c, 0x43, 0xb4, 0x06, 0x58, 0x0b, 0xac, 0x03, 0xba, 0x81,\r
+  0xf5, 0xc0, 0x06, 0xa0, 0x07, 0x08, 0x00, 0x1b, 0x81, 0x5e, 0x60, 0x13,\r
+  0x70, 0x36, 0xb0, 0x19, 0xe8, 0x03, 0xfa, 0x81, 0x2d, 0xc0, 0x57, 0x80,\r
+  0x73, 0x80, 0x73, 0x81, 0xad, 0x40, 0x10, 0xd8, 0x46, 0x6a, 0xef, 0xfa,\r
+  0x1a, 0xf0, 0x0d, 0xe0, 0x6a, 0xe0, 0x08, 0x70, 0x0d, 0xa9, 0x71, 0x49,\r
+  0xff, 0x14, 0x6a, 0x7a, 0xa2, 0x4a, 0x8d, 0x95, 0xd0, 0x69, 0xaf, 0xe6,\r
+  0x59, 0x5e, 0xa4, 0xf9, 0xc7, 0xc0, 0x17, 0x6b, 0xfe, 0x29, 0xf0, 0x13,\r
+  0x34, 0xff, 0x02, 0xf8, 0x89, 0x9a, 0x7f, 0xc5, 0xc4, 0xbf, 0x6a, 0xe2,\r
+  0xdf, 0xaa, 0x52, 0xf3, 0x60, 0xe8, 0xf2, 0x27, 0x69, 0x9e, 0xcb, 0x99,\r
+  0xac, 0xf9, 0x77, 0xc1, 0x4f, 0x03, 0xb5, 0x6b, 0x9b, 0x52, 0xc0, 0x09,\r
+  0x7c, 0xa8, 0xe5, 0x6e, 0x2d, 0x67, 0xde, 0x63, 0xe2, 0x27, 0x9b, 0xf8,\r
+  0xe9, 0x26, 0xde, 0xa7, 0x79, 0x96, 0x95, 0xe9, 0xbe, 0x94, 0x69, 0xfe,\r
+  0x53, 0x5d, 0xe6, 0x2c, 0x53, 0x5d, 0xec, 0x1f, 0xd6, 0x6a, 0x25, 0x9f,\r
+  0xa3, 0xe5, 0x33, 0x49, 0xf9, 0x06, 0xb7, 0x93, 0x6d, 0xd8, 0x47, 0xf2,\r
+  0x60, 0x33, 0x83, 0x94, 0x6f, 0x3c, 0xa6, 0xcb, 0x99, 0x6f, 0xaa, 0x6b,\r
+  0x91, 0xae, 0x6b, 0xa6, 0xe6, 0x39, 0xef, 0x2c, 0xcd, 0x17, 0x23, 0xef,\r
+  0x6c, 0x52, 0xfe, 0x33, 0xad, 0x5a, 0x95, 0xc9, 0xfc, 0x6c, 0x5d, 0x6f,\r
+  0x93, 0x2e, 0x67, 0x86, 0xe6, 0xb9, 0x7c, 0x9f, 0xe6, 0xab, 0x75, 0x5e,\r
+  0xf6, 0xb7, 0x06, 0x9d, 0x57, 0xfa, 0x5c, 0xb5, 0xea, 0x13, 0xf3, 0x67,\r
+  0x55, 0xab, 0x79, 0x6f, 0xd1, 0xe5, 0x84, 0x35, 0xcf, 0xed, 0x39, 0x4f,\r
+  0xf3, 0x5c, 0xe6, 0x4e, 0xcd, 0x77, 0xc3, 0x3e, 0xa2, 0xf9, 0x2d, 0xe0,\r
+  0x77, 0x69, 0x9e, 0xdb, 0x1c, 0xd5, 0xfc, 0x10, 0xe4, 0x31, 0xcd, 0x73,\r
+  0x1b, 0xe2, 0x9a, 0xdf, 0x0b, 0x7e, 0xb7, 0xe6, 0x0f, 0x82, 0x4f, 0x6a,\r
+  0xfe, 0x4a, 0xf0, 0x09, 0xcd, 0x1f, 0x35, 0xf1, 0x37, 0x83, 0x4f, 0x69,\r
+  0xfe, 0x4e, 0xf0, 0xc3, 0x9a, 0x3f, 0x0e, 0xfe, 0x7c, 0xcd, 0x3f, 0x6c,\r
+  0x92, 0x3f, 0x61, 0xe2, 0x9f, 0x05, 0xff, 0x55, 0xcd, 0xbf, 0x64, 0x92,\r
+  0xbf, 0x6a, 0xe2, 0xdf, 0x32, 0xf1, 0xef, 0x9a, 0xf8, 0x16, 0x53, 0xf9,\r
+  0x1f, 0x82, 0xdf, 0xa3, 0xf9, 0x4f, 0xc1, 0x5f, 0xa0, 0x79, 0x27, 0x26,\r
+  0xf9, 0x42, 0xcd, 0x17, 0xd7, 0x8c, 0xe6, 0x9d, 0x6d, 0xe2, 0xab, 0x4d,\r
+  0xfc, 0x7c, 0xf0, 0x23, 0xe9, 0x72, 0x30, 0x56, 0x17, 0x6b, 0xbe, 0xd9,\r
+  0x64, 0x73, 0x73, 0xd5, 0x28, 0xcf, 0x3e, 0xb3, 0x2f, 0x5d, 0x3e, 0xf8,\r
+  0x8b, 0x34, 0xbf, 0xa2, 0x66, 0xb4, 0x6d, 0xdd, 0xe0, 0xf7, 0x6b, 0xfe,\r
+  0x6c, 0x53, 0x39, 0xbc, 0x76, 0xf6, 0x6a, 0x7e, 0xd0, 0x24, 0x8f, 0xd7,\r
+  0x8c, 0xca, 0xf7, 0x9a, 0xca, 0x39, 0x68, 0x6e, 0xbf, 0x69, 0x1c, 0xae,\r
+  0x84, 0xfc, 0x12, 0xcd, 0x5f, 0x07, 0xfe, 0x80, 0xe6, 0x6f, 0x32, 0xd9,\r
+  0xdf, 0x6d, 0xe2, 0x4f, 0xd4, 0xa8, 0xf8, 0xc1, 0xf1, 0x8c, 0x7f, 0x0e,\r
+  0x6a, 0x9e, 0xfd, 0xe7, 0xd2, 0x34, 0x5f, 0x33, 0xca, 0x3f, 0x0b, 0xfe,\r
+  0x32, 0xcd, 0xbf, 0x02, 0xfe, 0x90, 0xe6, 0xd9, 0x97, 0x0e, 0x6b, 0xfe,\r
+  0x55, 0xc8, 0xbf, 0xae, 0xf9, 0xdf, 0x83, 0xbf, 0x42, 0xf3, 0x1f, 0x82,\r
+  0xbf, 0x5c, 0xf3, 0x9f, 0x9a, 0xe4, 0x3c, 0xb6, 0x57, 0x6a, 0xde, 0x8a,\r
+  0xc5, 0x77, 0x95, 0xe6, 0x8b, 0x6b, 0x47, 0xed, 0xe3, 0xa6, 0xbc, 0xdc,\r
+  0xdf, 0x7c, 0x44, 0x9c, 0x7f, 0x22, 0x45, 0xfb, 0x04, 0xc7, 0x3b, 0x41,\r
+  0x83, 0xc4, 0x7b, 0xc0, 0x3c, 0x3a, 0xa6, 0xe9, 0xdf, 0x24, 0x15, 0xf4,\r
+  0x99, 0xa6, 0xfc, 0x8f, 0xa9, 0xd0, 0xd4, 0xd0, 0xd4, 0x22, 0x94, 0x7d,\r
+  0xa1, 0xe0, 0x7d, 0xa3, 0x89, 0x1e, 0x21, 0xa6, 0x1e, 0x7a, 0x4c, 0xd2,\r
+  0x1a, 0x5a, 0x2d, 0xe5, 0xb5, 0x14, 0x14, 0xbc, 0xa7, 0x78, 0xe8, 0x38,\r
+  0x31, 0x2d, 0xa7, 0xfb, 0x25, 0x55, 0xfa, 0x0a, 0xad, 0xaf, 0x04, 0xdd,\r
+  0xa4, 0x29, 0xa7, 0xab, 0xd0, 0xe2, 0x02, 0x49, 0xab, 0xe9, 0x6c, 0xc1,\r
+  0xfb, 0x90, 0xd2, 0x57, 0x6b, 0x7d, 0x35, 0x34, 0x03, 0x82, 0xe3, 0x8f,\r
+  0x41, 0xff, 0x4d, 0x1c, 0x7b, 0x4a, 0xe9, 0x4e, 0x49, 0x2b, 0xe8, 0x3e,\r
+  0x49, 0xd3, 0xf2, 0x6a, 0xca, 0x17, 0x4c, 0x2b, 0xc9, 0x2b, 0x69, 0x2b,\r
+  0x55, 0x49, 0x9a, 0x4b, 0xd5, 0x82, 0xe3, 0xce, 0x7c, 0x0a, 0xc1, 0xce,\r
+  0x86, 0x9d, 0x6b, 0xae, 0xe0, 0xf8, 0x9a, 0x4f, 0x4f, 0x13, 0xd3, 0x52,\r
+  0x7a, 0x13, 0x34, 0x07, 0xed, 0x75, 0x48, 0xba, 0x89, 0x16, 0x40, 0xef,\r
+  0xc2, 0xae, 0xc6, 0xe9, 0x5c, 0x2d, 0xcf, 0xc5, 0x08, 0x2e, 0x14, 0x3c,\r
+  0x9e, 0x2a, 0xed, 0x41, 0xbd, 0x6e, 0xc1, 0xb4, 0x9b, 0xe6, 0x49, 0xba,\r
+  0x9e, 0x96, 0x08, 0xde, 0x33, 0x72, 0xe8, 0x0d, 0x52, 0xf4, 0x3f, 0x24,\r
+  0x6d, 0xa1, 0x66, 0xc1, 0xfb, 0xc4, 0x5a, 0x99, 0xaf, 0x04, 0xbb, 0x1a,\r
+  0xd3, 0xc9, 0xc8, 0xf1, 0x4b, 0x49, 0xdb, 0xa8, 0x0e, 0xfa, 0x29, 0x68,\r
+  0x37, 0xcb, 0xa7, 0xa0, 0xdc, 0x9f, 0x4a, 0x5a, 0x46, 0xcf, 0xea, 0xf4,\r
+  0xaf, 0x34, 0xfd, 0x1d, 0xe8, 0x54, 0xad, 0x67, 0xfa, 0x94, 0xa4, 0x2e,\r
+  0x79, 0x1f, 0xe3, 0xf4, 0xab, 0x92, 0x5a, 0xe8, 0xd7, 0x92, 0xe2, 0x4c,\r
+  0xa1, 0xe9, 0x6b, 0x92, 0x0a, 0x7a, 0x57, 0xd3, 0xff, 0x4d, 0x1c, 0xa3,\r
+  0x0d, 0x7a, 0x59, 0xd2, 0x25, 0xf4, 0x47, 0xe2, 0x58, 0xdb, 0x28, 0xeb,\r
+  0x9f, 0x81, 0x9d, 0xb4, 0x54, 0x30, 0xdd, 0x42, 0x65, 0x92, 0x56, 0xd3,\r
+  0x19, 0x82, 0xe3, 0xef, 0x59, 0xf4, 0x8f, 0xa4, 0x68, 0xbd, 0xe0, 0xb8,\r
+  0xbb, 0x99, 0x72, 0x05, 0xc7, 0xdc, 0x95, 0x32, 0x5f, 0x19, 0x7a, 0x58,\r
+  0x24, 0xd3, 0xe5, 0xe4, 0x17, 0x1c, 0xeb, 0xd5, 0x38, 0xcd, 0xc6, 0x8e,\r
+  0xaf, 0x68, 0x39, 0x9d, 0x90, 0xd4, 0x49, 0xff, 0xac, 0xe9, 0xf3, 0x92,\r
+  0xba, 0xe9, 0x5f, 0x88, 0xf7, 0x9a, 0x20, 0x7d, 0x2a, 0x69, 0x3b, 0xcd,\r
+  0x17, 0x4c, 0x07, 0x68, 0xa5, 0xf4, 0xab, 0xd5, 0x32, 0x7f, 0x39, 0x4e,\r
+  0x17, 0x77, 0x4b, 0xba, 0x8e, 0xee, 0x95, 0xf4, 0x4c, 0xfa, 0xad, 0xa4,\r
+  0xad, 0x74, 0xa6, 0xb4, 0x5b, 0x4e, 0x73, 0x84, 0x4a, 0x97, 0x0b, 0x65,\r
+  0x57, 0x21, 0xe9, 0x32, 0xea, 0xd7, 0x74, 0x8b, 0xa6, 0x5f, 0xd1, 0xf4,\r
+  0x1c, 0xe9, 0x97, 0x6b, 0x64, 0xf9, 0x15, 0xba, 0x7d, 0x15, 0xba, 0x3d,\r
+  0x95, 0x38, 0x95, 0x38, 0x24, 0x2d, 0xa6, 0x47, 0x25, 0x9d, 0x43, 0x3f,\r
+  0xd2, 0xe9, 0x1f, 0x4b, 0xda, 0x4f, 0x35, 0xd2, 0x6f, 0x3b, 0xa4, 0x5d,\r
+  0x15, 0xf2, 0xcf, 0x94, 0xfe, 0xaa, 0xf2, 0x55, 0x43, 0xfe, 0x2d, 0x4d,\r
+  0xbf, 0x2d, 0xe9, 0x14, 0xba, 0x5e, 0xd2, 0x72, 0x5a, 0x25, 0x14, 0x3d,\r
+  0x4b, 0xfa, 0x75, 0x8d, 0xb4, 0x67, 0xff, 0x7e, 0x46, 0x52, 0x07, 0xfd,\r
+  0x4c, 0xa7, 0xff, 0x55, 0xd3, 0x7f, 0xd3, 0xf4, 0xa4, 0xa4, 0xb3, 0xe8,\r
+  0x2d, 0x9d, 0x7e, 0x5b, 0xd2, 0x1e, 0xb2, 0xc9, 0x72, 0x36, 0x93, 0x4b,\r
+  0xd2, 0x4a, 0x6a, 0x94, 0x34, 0x40, 0x2d, 0xd2, 0xff, 0x17, 0xcb, 0xf2,\r
+  0x6b, 0x71, 0x3a, 0xfa, 0xa6, 0xa4, 0x36, 0xba, 0x56, 0xd2, 0xf9, 0x74,\r
+  0x9d, 0xa4, 0x79, 0x74, 0x54, 0xd2, 0x4e, 0xfa, 0x8e, 0xa4, 0x21, 0xba,\r
+  0x41, 0xd2, 0x99, 0x74, 0xa3, 0xa6, 0x37, 0x49, 0x3a, 0x48, 0xdf, 0xd5,\r
+  0xf9, 0xbf, 0x27, 0x69, 0x1d, 0xfd, 0x83, 0xa4, 0xb3, 0xe9, 0x66, 0x49,\r
+  0xe7, 0xd1, 0xf7, 0xb5, 0xfe, 0x16, 0x4d, 0xff, 0x87, 0xa4, 0x76, 0xba,\r
+  0x55, 0xa7, 0x6f, 0x93, 0xb4, 0x9c, 0xee, 0xd1, 0xf4, 0x01, 0x4d, 0x1f,\r
+  0x94, 0xb4, 0x8f, 0x1e, 0x96, 0xb4, 0x86, 0x7e, 0x28, 0xe9, 0x02, 0x7a,\r
+  0x42, 0xd2, 0x19, 0xf4, 0x13, 0x49, 0x27, 0xd2, 0x93, 0x92, 0xe6, 0xd3,\r
+  0x0b, 0x92, 0x4e, 0xa6, 0x17, 0x49, 0xad, 0xef, 0x97, 0x74, 0x1c, 0x78,\r
+  0x59, 0xdb, 0xbf, 0x22, 0xe9, 0x24, 0xfa, 0x85, 0xa4, 0x16, 0xfa, 0x9f,\r
+  0x92, 0x9e, 0x4d, 0xff, 0x4b, 0x52, 0x2f, 0xbd, 0x2e, 0x69, 0x11, 0xfd,\r
+  0x5e, 0xe7, 0x7b, 0x47, 0xd2, 0x42, 0xfa, 0x83, 0xa4, 0x6a, 0x3d, 0xd4,\r
+  0xe2, 0xf7, 0x3d, 0xdd, 0x9e, 0xf7, 0x35, 0xfd, 0x40, 0xd3, 0x3f, 0x49,\r
+  0x3a, 0x97, 0xfe, 0x53, 0x52, 0x3f, 0xfd, 0x59, 0x8f, 0xc7, 0x87, 0x5a,\r
+  0xff, 0x17, 0x9d, 0xff, 0xaf, 0x9a, 0x7e, 0xa4, 0xe9, 0xc7, 0x92, 0xd6,\r
+  0xd3, 0x27, 0x92, 0x9e, 0x4b, 0xff, 0x47, 0xf7, 0xff, 0xbf, 0x24, 0xdd,\r
+  0x4c, 0x39, 0x42, 0xd1, 0x3c, 0x49, 0x17, 0xd1, 0x04, 0x49, 0x17, 0xd2,\r
+  0x44, 0x4d, 0x4b, 0x34, 0x9d, 0xa4, 0xf5, 0x93, 0x75, 0x7a, 0x8a, 0xa6,\r
+  0x53, 0x25, 0x2d, 0xa1, 0x69, 0x92, 0x36, 0xd1, 0x74, 0x49, 0x57, 0xd1,\r
+  0x0c, 0x49, 0xb7, 0x91, 0x4f, 0x52, 0xb5, 0xbe, 0x6b, 0xf5, 0xfa, 0xe6,\r
+  0xf4, 0x2c, 0x49, 0x7b, 0x69, 0xb6, 0x50, 0x71, 0xf4, 0x0c, 0x6d, 0x5f,\r
+  0x29, 0xe9, 0x56, 0xaa, 0x95, 0x74, 0x23, 0x2d, 0xd2, 0xb4, 0x41, 0xd2,\r
+  0x15, 0xd4, 0x24, 0x54, 0x1c, 0x5e, 0x26, 0x69, 0x0f, 0xb5, 0xea, 0xf4,\r
+  0x72, 0x6d, 0xd7, 0xa6, 0xe9, 0x0a, 0x49, 0xab, 0xa8, 0x5d, 0x28, 0x3f,\r
+  0xe8, 0x12, 0xca, 0x2f, 0xd6, 0xe8, 0xf4, 0x5a, 0x4d, 0xd7, 0x69, 0xda,\r
+  0x2d, 0x94, 0x5f, 0xad, 0xd7, 0xe9, 0x0d, 0x42, 0xf9, 0x57, 0x8f, 0x50,\r
+  0x7e, 0x1c, 0x10, 0x6a, 0xbc, 0x37, 0x0a, 0xe5, 0xc7, 0xbd, 0x42, 0x8d,\r
+  0xfb, 0x36, 0xc1, 0xe7, 0xd1, 0xa9, 0xd4, 0x21, 0x69, 0x19, 0x6d, 0x16,\r
+  0x7c, 0x26, 0x3d, 0x83, 0xfe, 0x9d, 0x98, 0x6e, 0x27, 0xa7, 0xdc, 0x07,\r
+  0x0c, 0xb2, 0x4b, 0x3a, 0x9d, 0xb6, 0x0a, 0x3e, 0x77, 0xaa, 0x38, 0xd5,\r
+  0x88, 0x93, 0xe7, 0x73, 0x92, 0xaa, 0x7c, 0x4d, 0xf0, 0x9b, 0x1f, 0x10,\r
+  0x53, 0x2b, 0x3d, 0x24, 0xe9, 0x0e, 0x7a, 0x5c, 0x52, 0x15, 0xf7, 0x59,\r
+  0x5e, 0x2c, 0xe9, 0x2c, 0xea, 0x14, 0x7c, 0x1e, 0xf5, 0x91, 0x43, 0xf0,\r
+  0x1d, 0x48, 0x95, 0xb7, 0x14, 0xf5, 0xdd, 0x45, 0xea, 0x9e, 0xe5, 0x26,\r
+  0x75, 0xbe, 0x3d, 0x8a, 0x7d, 0x3c, 0x0f, 0xf4, 0x55, 0x5c, 0x7c, 0x0a,\r
+  0xf8, 0x12, 0x44, 0xea, 0x0e, 0xe6, 0x26, 0x75, 0xa6, 0xe5, 0x1f, 0xd6,\r
+  0x7f, 0x08, 0x7d, 0x97, 0xd6, 0x57, 0x6a, 0xfd, 0x2c, 0x93, 0xde, 0x8a,\r
+  0x4b, 0xd3, 0x76, 0xad, 0xaf, 0xd2, 0x72, 0x2e, 0xff, 0x66, 0x5d, 0xfe,\r
+  0x34, 0xe8, 0x2f, 0xd5, 0xfa, 0x6a, 0x53, 0xfd, 0xe9, 0xfc, 0xd5, 0xd0,\r
+  0x1f, 0xd5, 0x7a, 0x3e, 0xd7, 0x8b, 0x53, 0xf4, 0xcd, 0xd0, 0x3f, 0xa1,\r
+  0xf5, 0x7c, 0xd6, 0xe7, 0x7b, 0x06, 0x9f, 0xc5, 0xef, 0xd4, 0xe5, 0x07,\r
+  0xa0, 0xff, 0x58, 0xeb, 0xed, 0x7c, 0x3e, 0x00, 0x2d, 0xae, 0x50, 0x77,\r
+  0xc5, 0xdd, 0xee, 0xb9, 0x98, 0x31, 0x17, 0xa8, 0x9f, 0xa9, 0x58, 0xcc,\r
+  0x27, 0x06, 0x61, 0xa1, 0xf2, 0xd9, 0x51, 0xf7, 0x53, 0x90, 0xe4, 0xd9,\r
+  0xca, 0x8c, 0xa5, 0x14, 0x77, 0xbf, 0x80, 0x71, 0x2c, 0xb3, 0x94, 0x90,\r
+  0xd7, 0x1a, 0xf5, 0x3f, 0x83, 0x98, 0xcf, 0x39, 0x7e, 0x22, 0xeb, 0x97,\r
+  0x69, 0xe1, 0xb2, 0x71, 0x9a, 0xed, 0xe3, 0x7e, 0x37, 0x59, 0x6c, 0x51,\r
+  0xdf, 0xbf, 0xa0, 0x7c, 0x8f, 0xe1, 0xb5, 0x79, 0x6c, 0x56, 0x8c, 0x3d,\r
+  0xdf, 0x95, 0x66, 0x54, 0xf0, 0x7e, 0x8c, 0xb3, 0x8f, 0x9b, 0x23, 0x43,\r
+  0xbf, 0x28, 0xa0, 0x7e, 0x23, 0x8f, 0xfa, 0x2d, 0xf9, 0xb4, 0xdb, 0xb7,\r
+  0x14, 0xd6, 0x7c, 0xc7, 0x33, 0x32, 0xb7, 0x2d, 0xd5, 0x4f, 0x96, 0xd9,\r
+  0xf0, 0xcb, 0x7c, 0x65, 0x85, 0x7a, 0x87, 0x99, 0x70, 0x3f, 0x8e, 0x74,\r
+  0x9e, 0xe8, 0x17, 0xb9, 0x19, 0x3d, 0xe7, 0x9a, 0x57, 0xa1, 0xee, 0x5e,\r
+  0x01, 0x91, 0x47, 0x01, 0x83, 0x4b, 0x6d, 0xc1, 0xbe, 0x57, 0x80, 0x3c,\r
+  0x0e, 0xa9, 0x6f, 0x3e, 0x8d, 0x3e, 0x9d, 0x7f, 0xd5, 0x69, 0xf4, 0x39,\r
+  0xd0, 0xf3, 0x98, 0x75, 0x57, 0xa8, 0x7b, 0x47, 0xa0, 0x25, 0x8f, 0xe6,\r
+  0x75, 0x87, 0x41, 0x73, 0x31, 0x0f, 0x18, 0xab, 0x81, 0xe3, 0x43, 0x09,\r
+  0xff, 0x63, 0x14, 0x72, 0xe6, 0xd9, 0xb8, 0x6d, 0x3c, 0x0a, 0x53, 0x9c,\r
+  0x06, 0x45, 0x7d, 0x3f, 0xc3, 0x39, 0xd3, 0xe5, 0xf4, 0x52, 0xa3, 0x33,\r
+  0x9f, 0xa6, 0x38, 0x2d, 0x19, 0x49, 0x03, 0xf8, 0x72, 0x8b, 0xd7, 0x59,\r
+  0x6e, 0x29, 0x72, 0x2e, 0x47, 0x3c, 0x10, 0x52, 0x33, 0x01, 0xe3, 0xdf,\r
+  0x20, 0xac, 0x54, 0xe4, 0x5c, 0x42, 0x81, 0xd6, 0x7c, 0x0a, 0x2c, 0xcf,\r
+  0x95, 0xa3, 0x6b, 0xd8, 0x5d, 0x46, 0xa0, 0x2d, 0x97, 0x8e, 0x8f, 0x70,\r
+  0xca, 0x62, 0x77, 0xd9, 0xa3, 0xfe, 0x2d, 0x54, 0x6a, 0x0f, 0xac, 0xcc,\r
+  0xa7, 0x06, 0x27, 0x66, 0xc0, 0xfd, 0x2c, 0xcf, 0x9d, 0xe3, 0xa4, 0xc3,\r
+  0xf1, 0x59, 0xd4, 0xff, 0xcf, 0x64, 0x73, 0xe4, 0x61, 0xfc, 0xfb, 0x10,\r
+  0x21, 0x58, 0x1b, 0x68, 0x2f, 0xa0, 0x32, 0xfb, 0x14, 0x8a, 0xfb, 0x8b,\r
+  0xc8, 0xee, 0x8c, 0xfa, 0x6f, 0xa6, 0x4b, 0xed, 0x81, 0x76, 0xc8, 0x57,\r
+  0xaa, 0x1e, 0x86, 0xc8, 0x6b, 0xeb, 0x6f, 0xcf, 0x95, 0xe3, 0x60, 0xc8,\r
+  0x7e, 0xee, 0xa8, 0x50, 0xfe, 0x13, 0x75, 0x6f, 0xc4, 0xcc, 0xb9, 0x40,\r
+  0x7b, 0x99, 0x5a, 0x17, 0xa3, 0x85, 0x4d, 0x56, 0xb4, 0xdc, 0xc3, 0xbe,\r
+  0x61, 0xc1, 0x0c, 0x78, 0x8d, 0xa8, 0xff, 0x39, 0x8c, 0x11, 0x6c, 0x98,\r
+  0x5a, 0x5d, 0xd6, 0xdd, 0xfe, 0x02, 0xb2, 0x58, 0x0b, 0xe4, 0x3c, 0xf2,\r
+  0x98, 0x26, 0xf5, 0x98, 0xee, 0x76, 0x37, 0x2a, 0x6f, 0xf1, 0x7d, 0x05,\r
+  0x73, 0x37, 0xaa, 0x3f, 0x5f, 0xcf, 0xe9, 0x6e, 0x5f, 0x2b, 0xfc, 0x7e,\r
+  0xb7, 0x6f, 0x19, 0x9e, 0x6a, 0x4e, 0x55, 0x5b, 0x0e, 0xe8, 0xb6, 0xec,\r
+  0x76, 0xe7, 0x23, 0xcd, 0x5e, 0x97, 0xc7, 0x54, 0xc8, 0xb6, 0x08, 0x53,\r
+  0x5b, 0x2c, 0xdc, 0x96, 0x67, 0xb0, 0xee, 0x5c, 0x72, 0xcc, 0x66, 0x09,\r
+  0x97, 0x85, 0x47, 0xc9, 0x6a, 0x29, 0x90, 0x3e, 0x6f, 0x43, 0x19, 0xdf,\r
+  0xa8, 0x50, 0x77, 0xd2, 0x40, 0x77, 0x21, 0x4e, 0x95, 0x16, 0xac, 0x93,\r
+  0x40, 0xb7, 0x07, 0x33, 0x98, 0x43, 0x31, 0x77, 0x3d, 0xcf, 0x1a, 0xf5,\r
+  0x43, 0xe3, 0x41, 0x7f, 0xf9, 0x6d, 0x85, 0x8b, 0x02, 0xeb, 0x3d, 0xc4,\r
+  0xa5, 0x9e, 0x8d, 0x1e, 0xe6, 0x21, 0xfa, 0x4e, 0xa0, 0xb8, 0xaf, 0x10,\r
+  0x65, 0xf5, 0xaf, 0x2f, 0x94, 0xe7, 0xa6, 0x40, 0x8f, 0x97, 0x02, 0x01,\r
+  0x0f, 0xc5, 0x5b, 0x16, 0x92, 0xbf, 0xb5, 0xbf, 0xdb, 0x8d, 0x1c, 0x85,\r
+  0xf0, 0xce, 0x1c, 0xd8, 0xb8, 0x2c, 0x45, 0x56, 0x2f, 0x25, 0x02, 0xb9,\r
+  0x24, 0xea, 0x03, 0xb2, 0x54, 0xc4, 0x01, 0xfc, 0x72, 0x9f, 0x6e, 0xd4,\r
+  0x63, 0x12, 0xf7, 0xd7, 0x92, 0xdb, 0xe8, 0x17, 0x5e, 0xac, 0x01, 0x0f,\r
+  0x7a, 0x6d, 0xe1, 0x33, 0x3c, 0xe4, 0xb7, 0x55, 0xa8, 0x77, 0x16, 0x01,\r
+  0x1f, 0xb7, 0x33, 0x87, 0x02, 0xa5, 0x6e, 0xc4, 0x70, 0x1b, 0x25, 0x7c,\r
+  0x2e, 0x8c, 0x0e, 0xac, 0x21, 0xef, 0xf7, 0x79, 0xd0, 0xea, 0x3a, 0xd8,\r
+  0x17, 0xa0, 0x2c, 0x43, 0xf6, 0xef, 0xde, 0x0a, 0x75, 0x5f, 0x0f, 0x6c,\r
+  0x2d, 0xc2, 0x38, 0xf1, 0xdb, 0x94, 0x5c, 0xb4, 0x7f, 0x22, 0xaa, 0x9c,\r
+  0x0b, 0x07, 0x6e, 0xb4, 0xa1, 0xc7, 0xc6, 0x56, 0xd8, 0x16, 0x89, 0x19,\r
+  0x34, 0xdf, 0xed, 0x42, 0x1f, 0xca, 0x28, 0x30, 0x50, 0x8c, 0x76, 0x54,\r
+  0x92, 0xdf, 0x51, 0xee, 0x08, 0x6c, 0x2d, 0xc6, 0x0c, 0x54, 0xe1, 0xae,\r
+  0x0c, 0xef, 0x18, 0x50, 0x65, 0x58, 0x28, 0xd7, 0xba, 0xbb, 0x7b, 0x90,\r
+  0xda, 0x86, 0x5d, 0x8e, 0x46, 0x87, 0x8b, 0xb6, 0x3a, 0x0c, 0x5a, 0x50,\r
+  0x62, 0xc3, 0x18, 0x71, 0xa4, 0xf2, 0x18, 0xdc, 0x2f, 0xa7, 0x9e, 0xab,\r
+  0x47, 0x75, 0x4c, 0xf9, 0xbc, 0xfa, 0xbd, 0xee, 0x79, 0x0e, 0x78, 0xf6,\r
+  0x0e, 0x65, 0xe1, 0x80, 0xc5, 0x6e, 0x7f, 0x08, 0x91, 0x38, 0xcf, 0x51,\r
+  0x9e, 0x9b, 0x2d, 0xdd, 0x2e, 0xa5, 0x0d, 0x0e, 0xac, 0x01, 0xf7, 0x13,\r
+  0x90, 0xb9, 0x1c, 0x51, 0xdf, 0x4a, 0xdc, 0x5f, 0xf3, 0x1c, 0x1e, 0x87,\r
+  0xc7, 0x70, 0x61, 0x2c, 0xf9, 0x9d, 0xcb, 0xd3, 0x15, 0xea, 0x1d, 0x84,\r
+  0xb9, 0xce, 0x89, 0x18, 0xc4, 0xb9, 0x08, 0x39, 0x8d, 0x56, 0x2b, 0x79,\r
+  0x1d, 0x85, 0x0e, 0x93, 0x4e, 0x88, 0xa4, 0x38, 0xe8, 0xf8, 0xd6, 0x1e,\r
+  0xfb, 0x0e, 0x9e, 0x61, 0xe8, 0x2c, 0x72, 0xd4, 0x89, 0x7e, 0x5e, 0xa1,\r
+  0xde, 0xe1, 0x94, 0x09, 0x15, 0xed, 0x04, 0x79, 0x44, 0x5a, 0xf7, 0x0b,\r
+  0x3d, 0x5f, 0xfd, 0xa2, 0x08, 0x3a, 0x8e, 0xc0, 0xfd, 0x46, 0xb1, 0xf6,\r
+  0x61, 0xd6, 0xff, 0xba, 0x82, 0xef, 0x21, 0xac, 0x9f, 0xa8, 0x63, 0x9b,\r
+  0x57, 0x6c, 0x81, 0xb7, 0x14, 0x98, 0xe2, 0xed, 0x5b, 0x15, 0xea, 0x7d,\r
+  0x58, 0x19, 0x22, 0x60, 0xdc, 0x2d, 0xa3, 0xcc, 0xfa, 0x89, 0x14, 0xf0,\r
+  0x94, 0xa0, 0x77, 0xfb, 0x65, 0x34, 0x6b, 0x44, 0xee, 0x8c, 0xcc, 0x77,\r
+  0x10, 0xb2, 0x51, 0x8b, 0x0b, 0xd8, 0xa3, 0xc4, 0x06, 0x83, 0xdf, 0xb1,\r
+  0x09, 0x2a, 0xcf, 0x8b, 0xfa, 0xca, 0x40, 0xa3, 0xee, 0xd2, 0x2c, 0xf9,\r
+  0x7d, 0xc6, 0x7d, 0xa5, 0x45, 0xf0, 0x9c, 0x05, 0x62, 0x0a, 0x6d, 0xdc,\r
+  0x30, 0x81, 0x1a, 0x8c, 0x89, 0x18, 0xff, 0x2d, 0xe0, 0x02, 0x1b, 0x50,\r
+  0x52, 0x59, 0x09, 0x3c, 0x76, 0x22, 0x46, 0x62, 0x9d, 0x5c, 0x2f, 0x7a,\r
+  0x76, 0x2d, 0xbb, 0xfd, 0x03, 0x54, 0x6f, 0x65, 0xfb, 0x46, 0xc3, 0x81,\r
+  0x33, 0x83, 0x8d, 0xbc, 0xee, 0x2d, 0xdd, 0x13, 0xe4, 0x0d, 0x54, 0xc8,\r
+  0x38, 0xfc, 0x17, 0xb4, 0x9d, 0xfb, 0x10, 0xc0, 0x19, 0x8d, 0xe7, 0x9b,\r
+  0xc7, 0x85, 0xfd, 0xf4, 0xbf, 0x2a, 0xd4, 0xbb, 0xb8, 0x7e, 0x51, 0xa2,\r
+  0xfb, 0x5d, 0x26, 0xe0, 0x3d, 0xbe, 0x4e, 0x5e, 0x23, 0x62, 0x32, 0x46,\r
+  0x69, 0x92, 0x1c, 0x03, 0xa1, 0x4b, 0xe2, 0x72, 0xac, 0x32, 0xfe, 0x77,\r
+  0x13, 0xe9, 0xf2, 0xb3, 0xe5, 0xeb, 0xa5, 0x3c, 0xbd, 0x0e, 0x9c, 0x95,\r
+  0x7a, 0xff, 0xf2, 0x4d, 0x42, 0x5f, 0x2f, 0x91, 0xf1, 0x23, 0x50, 0x3a,\r
+  0x19, 0xa3, 0x33, 0x47, 0x46, 0x89, 0xb4, 0x5d, 0xfe, 0x69, 0xed, 0xca,\r
+  0xb3, 0xec, 0xbc, 0x95, 0x2a, 0xd6, 0xf4, 0xf8, 0xa6, 0xc0, 0xcf, 0xcf,\r
+  0x85, 0xce, 0x25, 0xdb, 0x9f, 0xd6, 0x97, 0x64, 0xe9, 0x23, 0x19, 0xbd,\r
+  0x55, 0xfb, 0xf7, 0x34, 0xb3, 0xde, 0x1f, 0x25, 0xb7, 0xc5, 0x65, 0x29,\r
+  0xb4, 0x8c, 0xe6, 0x2f, 0xcb, 0xca, 0xbf, 0x75, 0x4c, 0xf9, 0x73, 0xb2,\r
+  0xf4, 0x43, 0x63, 0xf4, 0xd5, 0x59, 0xfa, 0xd8, 0x18, 0xfd, 0xdc, 0x2c,\r
+  0xfd, 0xae, 0x8c, 0x9e, 0x77, 0x27, 0x1e, 0xbf, 0x85, 0x66, 0x7d, 0xcb,\r
+  0x79, 0xe4, 0x6e, 0xcb, 0xb3, 0x78, 0x2c, 0x6a, 0xbe, 0x78, 0x9c, 0x97,\r
+  0x54, 0x2a, 0x1f, 0x57, 0x73, 0xd5, 0x07, 0x2f, 0x29, 0xc8, 0xf4, 0xad,\r
+  0x4d, 0xeb, 0x54, 0xdf, 0x76, 0xa2, 0x6f, 0x05, 0x99, 0x72, 0x3b, 0xcc,\r
+  0xba, 0x96, 0x30, 0xca, 0x1d, 0xcd, 0xd7, 0x9d, 0x95, 0x2f, 0x28, 0xf3,\r
+  0x19, 0xda, 0x6f, 0x7a, 0x2b, 0xb5, 0xdf, 0xb8, 0x67, 0x4a, 0xbf, 0xe1,\r
+  0x5d, 0x98, 0xcb, 0xeb, 0xaf, 0x54, 0xef, 0x03, 0x7b, 0xba, 0xa7, 0x23,\r
+  0xf6, 0xec, 0xc3, 0x7d, 0x28, 0x4f, 0x9e, 0x89, 0xfb, 0x83, 0x16, 0x00,\r
+  0x6b, 0xd6, 0xd8, 0xbc, 0xcd, 0x4e, 0xde, 0x3f, 0x37, 0x20, 0x07, 0xef,\r
+  0x41, 0x58, 0xa9, 0xd6, 0x72, 0xc3, 0xfb, 0xe1, 0xe6, 0x41, 0x27, 0xe2,\r
+  0xa1, 0x5d, 0xee, 0x47, 0x90, 0x59, 0x36, 0x0f, 0x38, 0x60, 0xef, 0xe2,\r
+  0x73, 0x77, 0xf7, 0xe6, 0x20, 0xbf, 0x29, 0xe0, 0xbd, 0x8a, 0xdf, 0x38,\r
+  0xbb, 0xc4, 0x6e, 0xf7, 0xc5, 0xbc, 0x36, 0x50, 0x52, 0x0e, 0x76, 0xbf,\r
+  0x0a, 0xf2, 0x7a, 0xe2, 0x2d, 0xcb, 0x71, 0xf2, 0xec, 0xef, 0x9d, 0x46,\r
+  0x1e, 0xfb, 0xe8, 0x98, 0xee, 0xac, 0x54, 0x67, 0x92, 0xa8, 0x7b, 0x2f,\r
+  0xd2, 0xdc, 0x0e, 0xab, 0x88, 0xfa, 0x70, 0x66, 0x04, 0x3f, 0x13, 0x77,\r
+  0x48, 0x8f, 0x3e, 0x93, 0xb0, 0x6d, 0xbc, 0x92, 0x64, 0x9c, 0xdd, 0xed,\r
+  0x7b, 0xd8, 0x34, 0xf6, 0x36, 0x29, 0x1b, 0xd6, 0xba, 0x78, 0xe0, 0x76,\r
+  0x72, 0xd7, 0x2b, 0x9d, 0x5d, 0xfe, 0x12, 0x5d, 0xa4, 0x75, 0x23, 0xf6,\r
+  0x6b, 0xe4, 0xbe, 0x52, 0xa8, 0xd7, 0x50, 0xfa, 0x47, 0xfa, 0xa6, 0xa7,\r
+  0x50, 0xa4, 0xc7, 0xed, 0x32, 0x3d, 0x6e, 0x1b, 0xdd, 0x3e, 0x69, 0x6b,\r
+  0xe8, 0x75, 0x72, 0x45, 0x25, 0xe7, 0xe6, 0xb6, 0x1e, 0xe0, 0xbe, 0x61,\r
+  0xe7, 0xc2, 0x58, 0xb9, 0x31, 0x32, 0xb0, 0xca, 0x85, 0x15, 0x47, 0x95,\r
+  0x23, 0x95, 0xea, 0xbd, 0x6a, 0xe0, 0xc8, 0x54, 0xd8, 0x55, 0xc8, 0xfa,\r
+  0x1a, 0x70, 0x97, 0xed, 0xf9, 0xe6, 0x74, 0xa4, 0x27, 0x23, 0xe5, 0xb2,\r
+  0x46, 0xdd, 0xd3, 0x99, 0xda, 0xa2, 0xee, 0x19, 0x4c, 0xed, 0x51, 0xf7,\r
+  0x14, 0xd0, 0x5c, 0x87, 0xe3, 0x9a, 0x11, 0xe7, 0xa5, 0x28, 0xd9, 0x3b,\r
+  0xa5, 0xd0, 0xe5, 0x75, 0x15, 0xba, 0x72, 0xd1, 0x0a, 0x6e, 0xff, 0xf5,\r
+  0x95, 0x2a, 0xae, 0xf7, 0xec, 0x9f, 0x9e, 0x1d, 0x5b, 0x73, 0x0a, 0x73,\r
+  0xa2, 0xee, 0x04, 0xea, 0xf5, 0xb6, 0x78, 0x3d, 0xf5, 0x39, 0x33, 0x71,\r
+  0x47, 0x9b, 0x44, 0xf5, 0x39, 0x13, 0x41, 0x27, 0x83, 0x7a, 0xa9, 0xe7,\r
+  0x6b, 0x5c, 0x6b, 0x89, 0xae, 0x65, 0x22, 0x53, 0x87, 0xe3, 0x80, 0xf8,\r
+  0xd6, 0x88, 0xfd, 0x72, 0xb4, 0xb7, 0x50, 0xc4, 0xfc, 0xb3, 0xe9, 0xa8,\r
+  0xcb, 0x25, 0xcb, 0x89, 0xa3, 0x9c, 0x42, 0x91, 0xaf, 0xe3, 0xfa, 0xb1,\r
+  0x4a, 0xf5, 0x6e, 0xb8, 0xe7, 0xc8, 0xf4, 0x53, 0xf6, 0x90, 0x42, 0xa3,\r
+  0xd1, 0xe5, 0x27, 0xb5, 0x8f, 0x4d, 0xa7, 0x05, 0x6e, 0x9e, 0xf3, 0x62,\r
+  0xcc, 0x96, 0x8b, 0xbc, 0xb3, 0xea, 0xfd, 0x38, 0x11, 0x94, 0x6e, 0xcd,\r
+  0xc5, 0x1e, 0x35, 0x95, 0x6b, 0x9e, 0x00, 0x79, 0x5e, 0x6e, 0x43, 0x6e,\r
+  0x49, 0x86, 0x8f, 0xfa, 0x9e, 0xc6, 0x19, 0xdc, 0xe5, 0xe8, 0xb9, 0x8e,\r
+  0xf5, 0x13, 0x39, 0x9f, 0xd3, 0x71, 0xad, 0xb8, 0x9d, 0x5b, 0x64, 0x91,\r
+  0x3d, 0x2f, 0x34, 0x62, 0x2d, 0x67, 0xd0, 0xb1, 0xe7, 0x5d, 0x18, 0x01,\r
+  0x8e, 0xfb, 0x16, 0x39, 0x77, 0x8f, 0x56, 0xaa, 0xcf, 0x14, 0xd8, 0x67,\r
+  0xb3, 0xc6, 0xc0, 0x5e, 0x68, 0xe7, 0x1e, 0xf2, 0xfe, 0x14, 0xdf, 0x74,\r
+  0x05, 0xd9, 0x82, 0xde, 0x89, 0x85, 0x76, 0xb6, 0x55, 0xf3, 0xf1, 0x24,\r
+  0xf2, 0xf1, 0xbd, 0xce, 0xe9, 0xf4, 0x90, 0x93, 0x47, 0x04, 0x63, 0xe8,\r
+  0x75, 0x8d, 0x96, 0x80, 0xfe, 0xb8, 0x52, 0x62, 0x12, 0x76, 0x75, 0x17,\r
+  0xa5, 0xb0, 0x22, 0xbd, 0x94, 0x9b, 0xfb, 0x0b, 0xf1, 0x19, 0x79, 0xa7,\r
+  0x37, 0x88, 0xf7, 0xa9, 0xfe, 0xe5, 0x93, 0xe4, 0xad, 0xad, 0x7f, 0xe3,\r
+  0x1a, 0xf2, 0xd6, 0xd7, 0x97, 0xfe, 0x2b, 0x79, 0x37, 0x14, 0x5b, 0xf8,\r
+  0xf5, 0x5f, 0x7d, 0xe9, 0x2a, 0xf2, 0x6e, 0xab, 0x2f, 0xe5, 0xdc, 0x0f,\r
+  0xfa, 0xdf, 0x40, 0xf1, 0x8d, 0xb8, 0x47, 0xf6, 0x5c, 0x82, 0x3e, 0xf9,\r
+  0xa6, 0xd1, 0x31, 0xac, 0x8d, 0x14, 0xc6, 0x06, 0x65, 0x5a, 0x53, 0xd8,\r
+  0xeb, 0x41, 0x6d, 0x4e, 0x78, 0xb2, 0xf5, 0x07, 0x23, 0x4e, 0xfe, 0x4c,\r
+  0xa5, 0x7c, 0xce, 0xac, 0x37, 0xda, 0x60, 0xf9, 0x55, 0xcc, 0x56, 0xcf,\r
+  0x01, 0x95, 0x27, 0x87, 0xfd, 0xc2, 0x37, 0x93, 0xa9, 0x6d, 0x85, 0x5d,\r
+  0xb8, 0x0e, 0x6c, 0x7f, 0x26, 0x14, 0xf5, 0xf9, 0x38, 0x8d, 0xfb, 0xa0,\r
+  0xc8, 0x3f, 0xe0, 0xb9, 0x1d, 0x5b, 0x99, 0x2c, 0xa5, 0x54, 0xb4, 0x89,\r
+  0x80, 0x08, 0xa5, 0x4b, 0x2b, 0xcc, 0xff, 0xfb, 0x5a, 0x70, 0xd5, 0xff,\r
+  0xd7, 0x16, 0x5c, 0x25, 0x5b, 0xf0, 0x65, 0xea, 0xe5, 0x4f, 0x94, 0x52,\r
+  0x62, 0x2a, 0xcb, 0x0a, 0x17, 0xbd, 0x56, 0x45, 0xb3, 0xde, 0x53, 0x2d,\r
+  0xf8, 0x3d, 0x79, 0x27, 0x2e, 0xf8, 0xeb, 0xac, 0x4c, 0xdb, 0xc3, 0x28,\r
+  0x83, 0xdb, 0x11, 0xe6, 0x7a, 0xad, 0x05, 0xae, 0x03, 0x2b, 0x9e, 0xb1,\r
+  0x72, 0x3b, 0x64, 0xda, 0x56, 0x90, 0x7f, 0x60, 0xe3, 0x33, 0xb2, 0x4c,\r
+  0xc3, 0x6d, 0xcf, 0x94, 0x7b, 0xd2, 0xee, 0x16, 0xe5, 0xbf, 0xf9, 0x72,\r
+  0xed, 0xb8, 0xfa, 0x4b, 0xb7, 0x58, 0xf5, 0x8d, 0xe3, 0x88, 0x8a, 0x16,\r
+  0x1f, 0x54, 0xaa, 0xcf, 0xb8, 0xe2, 0xfe, 0xf3, 0xa9, 0xcd, 0x96, 0x6b,\r
+  0xe5, 0xcf, 0xa9, 0xe6, 0x1a, 0x56, 0xec, 0xf3, 0x4e, 0xac, 0xf9, 0x1a,\r
+  0xc8, 0x37, 0x50, 0x8b, 0x8d, 0xe3, 0x81, 0x67, 0x9c, 0x98, 0x75, 0x7f,\r
+  0x26, 0x66, 0x8d, 0xd5, 0x3d, 0xf0, 0x39, 0xba, 0xe3, 0x9f, 0xa3, 0xfb,\r
+  0x81, 0x69, 0x8f, 0x52, 0x6d, 0xfc, 0x28, 0xad, 0xf3, 0xdf, 0x87, 0xb3,\r
+  0xed, 0xe9, 0xf2, 0x9d, 0xc8, 0xe4, 0x4b, 0x9f, 0x31, 0xf8, 0x87, 0xef,\r
+  0xae, 0x55, 0xf2, 0x34, 0xc7, 0x11, 0xad, 0x98, 0x2e, 0xe1, 0x88, 0x40,\r
+  0x5e, 0x3f, 0xf3, 0xa5, 0x92, 0x2f, 0x46, 0xcf, 0x98, 0x62, 0x75, 0xe1,\r
+  0x0c, 0xec, 0xf5, 0xb1, 0x44, 0xa8, 0x92, 0x84, 0x43, 0x96, 0xc1, 0x9f,\r
+  0xd1, 0xf1, 0xb8, 0xf0, 0x5a, 0xe5, 0xf2, 0x73, 0x49, 0x9d, 0xcd, 0x6c,\r
+  0xe3, 0xb4, 0x31, 0xee, 0xbf, 0x10, 0x6d, 0xcc, 0xcb, 0x9c, 0x69, 0xb2,\r
+  0x75, 0x23, 0x19, 0x9d, 0x55, 0xfe, 0x12, 0xfd, 0x2d, 0xdd, 0xfe, 0x96,\r
+  0x07, 0x11, 0xe3, 0xd3, 0xf9, 0x54, 0xfb, 0xe3, 0x3a, 0x66, 0xf7, 0xf8,\r
+  0xa6, 0xcb, 0xfb, 0xbb, 0xba, 0x33, 0x62, 0xbf, 0xc3, 0x1d, 0x9c, 0x77,\r
+  0xdb, 0xb8, 0x6f, 0x16, 0xce, 0x4f, 0x65, 0x68, 0x4f, 0xdc, 0xcd, 0xf1,\r
+  0xad, 0xbf, 0xa5, 0x14, 0xa7, 0xa5, 0x6a, 0xd4, 0xd3, 0x45, 0xad, 0xd6,\r
+  0xfe, 0xd6, 0x19, 0x48, 0x55, 0x22, 0xd5, 0x2e, 0x53, 0x33, 0xe5, 0x7e,\r
+  0x64, 0xc5, 0xa9, 0x70, 0x8a, 0x71, 0x07, 0xf1, 0x7e, 0x84, 0x1b, 0x88,\r
+  0x98, 0x29, 0x4a, 0xa9, 0xbf, 0x75, 0x2a, 0x4d, 0xc3, 0x19, 0x2d, 0xea,\r
+  0xfb, 0x31, 0xad, 0x97, 0xf7, 0x45, 0x27, 0xcd, 0xb4, 0x71, 0x9a, 0x3f,\r
+  0xb3, 0x2d, 0x77, 0x45, 0xdd, 0x42, 0xde, 0x3f, 0x47, 0x65, 0x7d, 0xab,\r
+  0xe0, 0x5d, 0xb8, 0x0f, 0xde, 0x8b, 0xfa, 0xb7, 0xac, 0xf4, 0xc1, 0xdb,\r
+  0xa3, 0xbe, 0x3b, 0x68, 0x10, 0xda, 0x3b, 0xe5, 0xf3, 0x18, 0xad, 0xa0,\r
+  0x32, 0x47, 0x0e, 0xda, 0x65, 0x41, 0x14, 0x2b, 0x72, 0x16, 0xd3, 0xac,\r
+  0xc3, 0xcb, 0xe9, 0x4c, 0x27, 0x7f, 0x3a, 0x1c, 0xf5, 0x59, 0xe9, 0x10,\r
+  0x95, 0x39, 0x5d, 0x68, 0xbf, 0x8d, 0xf6, 0x22, 0xed, 0xa0, 0xfd, 0xe4,\r
+  0x9d, 0xe3, 0x75, 0x46, 0xdd, 0x3f, 0xe5, 0xf6, 0x61, 0xbf, 0x5c, 0x2c,\r
+  0x66, 0x25, 0x56, 0xd0, 0x36, 0x4b, 0x19, 0xad, 0xb1, 0x18, 0xb6, 0x69,\r
+  0x96, 0x5c, 0xa6, 0xb8, 0xa1, 0xfe, 0x48, 0x8e, 0x5f, 0xb9, 0xe1, 0xd8,\r
+  0xdf, 0x80, 0x99, 0x98, 0xb5, 0xa7, 0x9d, 0xf4, 0x1b, 0x02, 0xb1, 0x46,\r
+  0x38, 0x6c, 0x6b, 0x9c, 0x0e, 0xd8, 0x3c, 0x4f, 0x2d, 0x8e, 0xdd, 0x72,\r
+  0x1c, 0xf9, 0xc6, 0xea, 0x45, 0x6b, 0xe5, 0xe7, 0xbc, 0x16, 0xab, 0xbc,\r
+  0xff, 0x8c, 0xfe, 0xec, 0x5f, 0x46, 0x7f, 0x57, 0xfa, 0xd4, 0x1f, 0xa5,\r
+  0xe7, 0xcf, 0x18, 0xd9, 0x5f, 0xf6, 0x13, 0xef, 0xf9, 0x76, 0x32, 0x8c,\r
+  0xc5, 0x17, 0x35, 0x5c, 0x64, 0x59, 0x78, 0x95, 0x58, 0x70, 0x95, 0x68,\r
+  0xbe, 0x4a, 0x98, 0x7d, 0xc0, 0x2a, 0x7d, 0xf8, 0x51, 0xf4, 0xa1, 0x80,\r
+  0x4e, 0x95, 0xc7, 0xfd, 0x57, 0x4a, 0xb9, 0xd9, 0x2f, 0xa4, 0x7d, 0xcb,\r
+  0x23, 0xf0, 0x8b, 0xb1, 0xf6, 0xbb, 0xfd, 0x0f, 0x49, 0xfb, 0xf4, 0x5d,\r
+  0x60, 0x6e, 0x95, 0x3a, 0x73, 0x64, 0xef, 0x25, 0x16, 0xf4, 0x3d, 0xee,\r
+  0x3f, 0x8c, 0xd3, 0x50, 0x81, 0xc9, 0xaf, 0x16, 0x55, 0x29, 0x9f, 0x63,\r
+  0x9f, 0xee, 0x83, 0x6f, 0xa5, 0x75, 0xf2, 0x7d, 0x46, 0x95, 0x8a, 0x07,\r
+  0x51, 0xf7, 0x45, 0xf2, 0xec, 0xc2, 0xef, 0x22, 0x0a, 0x70, 0xf2, 0x9d,\r
+  0x26, 0x6f, 0x8b, 0x51, 0x77, 0x1b, 0xdf, 0x11, 0x7c, 0xf3, 0xc9, 0x27,\r
+  0xef, 0x88, 0x6a, 0x1f, 0x5b, 0xa1, 0x3f, 0x0f, 0x1f, 0xa7, 0xee, 0x4d,\r
+  0x5f, 0xc7, 0xee, 0xa5, 0x67, 0xc3, 0xce, 0xb3, 0xd1, 0x2b, 0xcf, 0x87,\r
+  0xaa, 0xcd, 0x5d, 0xfa, 0xb3, 0x73, 0xae, 0xcb, 0x92, 0xa9, 0x2b, 0xea,\r
+  0xfe, 0x5a, 0xe6, 0x3d, 0xc0, 0x3c, 0xf4, 0x31, 0xe0, 0x9f, 0x81, 0x59,\r
+  0xe6, 0xbf, 0x0b, 0x28, 0xa0, 0xec, 0x33, 0x4e, 0xfa, 0x5d, 0xce, 0x78,\r
+  0xef, 0x77, 0xec, 0xfa, 0x2c, 0xd9, 0x93, 0x1e, 0x97, 0x16, 0xdd, 0x36,\r
+  0x1b, 0xda, 0x66, 0x53, 0xe3, 0x72, 0x19, 0x59, 0x85, 0xd9, 0xb6, 0xef,\r
+  0x73, 0x6c, 0x0f, 0x69, 0xdb, 0x2f, 0x5b, 0xff, 0x78, 0x32, 0x87, 0xbe,\r
+  0x53, 0x07, 0xab, 0x54, 0x1c, 0x19, 0x3b, 0x5e, 0x81, 0x0d, 0xa5, 0x14,\r
+  0xdf, 0x70, 0x04, 0x63, 0xc6, 0xf6, 0x4e, 0x7d, 0x56, 0x1e, 0x3a, 0xad,\r
+  0xfd, 0xbc, 0x5e, 0x1b, 0xc5, 0x5b, 0x86, 0xc9, 0xb6, 0x5b, 0xf5, 0xc3,\r
+  0x3e, 0xa6, 0x4e, 0xbb, 0x3e, 0x4b, 0xc6, 0x75, 0x19, 0xb1, 0x8d, 0x67,\r
+  0x52, 0x69, 0x5b, 0x8f, 0x17, 0x25, 0x59, 0xf9, 0xaf, 0x3b, 0x0c, 0x6b,\r
+  0x03, 0xf4, 0x71, 0xff, 0x0f, 0xa9, 0xd4, 0xa2, 0xea, 0x34, 0x64, 0x8c,\r
+  0xb9, 0x40, 0x7f, 0xce, 0xcf, 0x6b, 0xd2, 0x2e, 0xd7, 0xe4, 0x52, 0xe1,\r
+  0xf5, 0xce, 0x9a, 0x85, 0x55, 0x69, 0x2d, 0xc3, 0xda, 0x5f, 0x63, 0xb5,\r
+  0xd8, 0xe4, 0x7a, 0xb4, 0xa4, 0xe7, 0x6d, 0x56, 0xa9, 0x5a, 0x8d, 0x0e,\r
+  0xdc, 0xa6, 0xd7, 0x38, 0x84, 0x8d, 0x57, 0xe2, 0x56, 0x91, 0xfe, 0x1b,\r
+  0x0b, 0x2f, 0x5a, 0xc4, 0x73, 0x9d, 0xab, 0xd6, 0x88, 0xaf, 0xc1, 0x67,\r
+  0x59, 0xe8, 0x5b, 0xe0, 0x6b, 0xf6, 0x7d, 0xce, 0xf8, 0xb1, 0xf4, 0xb2,\r
+  0x2a, 0x15, 0x6b, 0xf9, 0x1d, 0x96, 0x57, 0x60, 0x1f, 0x6a, 0x8d, 0xfa,\r
+  0xee, 0xd6, 0xef, 0x73, 0xd2, 0xef, 0x3e, 0xae, 0xd4, 0xfe, 0xc7, 0x7e,\r
+  0x44, 0xf2, 0xd6, 0x2b, 0xfd, 0x08, 0x5e, 0x2a, 0xe4, 0xbb, 0x96, 0x05,\r
+  0x24, 0x8c, 0x80, 0x60, 0x2f, 0x5a, 0x23, 0xdf, 0x13, 0xed, 0xb7, 0xe1,\r
+  0xb9, 0xfa, 0x86, 0xae, 0x3e, 0xba, 0xd9, 0xca, 0xf9, 0x0b, 0x9a, 0x6b,\r
+  0x6a, 0x6a, 0xe9, 0x49, 0x2b, 0x8f, 0x35, 0xd4, 0xff, 0x98, 0x66, 0x1e,\r
+  0xb2, 0xea, 0xf1, 0x2c, 0xa0, 0xfb, 0xd2, 0xb2, 0x67, 0x35, 0x73, 0xc7,\r
+  0x9d, 0x62, 0xa2, 0xe7, 0xeb, 0x27, 0x3a, 0x96, 0x88, 0xa2, 0xe2, 0xdb,\r
+  0x0f, 0xd1, 0xdb, 0x56, 0x34, 0x16, 0x65, 0xf6, 0xaf, 0x3e, 0x8b, 0xae,\r
+  0xb6, 0x31, 0x4f, 0xd7, 0x49, 0xd2, 0x4c, 0x7f, 0xd6, 0xaa, 0xbe, 0xd5,\r
+  0x1d, 0x74, 0x97, 0x8d, 0x0a, 0xb6, 0xac, 0xde, 0xb7, 0x7a, 0xef, 0x05,\r
+  0x27, 0x4e, 0xd0, 0x2d, 0x36, 0x5d, 0x39, 0x3d, 0x0d, 0xf1, 0xa1, 0x2e,\r
+  0xb4, 0x61, 0xbf, 0x03, 0x2d, 0x7b, 0xfb, 0xbc, 0xcb, 0x77, 0x3e, 0xb5,\r
+  0x9a, 0x6e, 0x61, 0x5e, 0x78, 0x3c, 0x27, 0x9e, 0xa6, 0xfb, 0x1c, 0xd2,\r
+  0xf2, 0x4d, 0xba, 0xc9, 0x21, 0x8b, 0xfe, 0xc4, 0xce, 0xa4, 0x8f, 0x3e,\r
+  0xb0, 0xc0, 0x24, 0x4c, 0x1f, 0xa1, 0xbb, 0xfd, 0xc7, 0xf6, 0xfe, 0xa2,\r
+  0xf9, 0xad, 0xfe, 0x1a, 0x64, 0xd8, 0x4b, 0xaf, 0xb2, 0x9c, 0x5e, 0xb3,\r
+  0xb0, 0x95, 0xb1, 0x68, 0xb3, 0xd1, 0xb9, 0x87, 0xde, 0xe6, 0x21, 0xf9,\r
+  0x03, 0x3f, 0x8e, 0xf2, 0xeb, 0x9d, 0xef, 0xf1, 0xe3, 0x66, 0x83, 0xcd,\r
+  0xbe, 0xc3, 0xec, 0x0d, 0xfc, 0xf8, 0x3e, 0x3f, 0xfe, 0x81, 0x1f, 0x37,\r
+  0x19, 0xb2, 0x9e, 0x6f, 0x4b, 0x83, 0xef, 0xca, 0xe7, 0x8d, 0x4a, 0x74,\r
+  0x8b, 0x4c, 0x3c, 0xe1, 0xc0, 0xe3, 0x97, 0x3c, 0x8c, 0x87, 0x6b, 0x9a,\r
+  0xfb, 0x6e, 0x0b, 0xaf, 0x5e, 0x73, 0xa8, 0x96, 0x7e, 0xc7, 0x39, 0xdb,\r
+  0x58, 0xdd, 0xa6, 0x07, 0xab, 0xcd, 0xa6, 0x87, 0xef, 0x18, 0x4b, 0xef,\r
+  0xb5, 0xe3, 0x71, 0x39, 0xe7, 0x3f, 0x4c, 0x37, 0xca, 0xb6, 0xdd, 0x65,\r
+  0x78, 0xde, 0xaf, 0x5d, 0x1d, 0x32, 0x86, 0x3b, 0xb7, 0xd0, 0xcf, 0x2c,\r
+  0xb2, 0x8f, 0x4f, 0xbf, 0x79, 0xfb, 0xe1, 0xba, 0x90, 0x71, 0xfe, 0x10,\r
+  0x3d, 0x2e, 0x4d, 0xee, 0xa0, 0x47, 0x84, 0xa0, 0xce, 0x3b, 0x56, 0x1b,\r
+  0x67, 0x08, 0x5f, 0x81, 0x28, 0x29, 0x5a, 0x62, 0xe4, 0x8a, 0x39, 0x8a,\r
+  0x59, 0x2f, 0xca, 0x0a, 0x44, 0xb1, 0xfb, 0x8a, 0x9d, 0xc6, 0x6e, 0x70,\r
+  0xc6, 0x05, 0x62, 0x42, 0x01, 0x3d, 0xcc, 0xe5, 0xdf, 0x46, 0x6d, 0xb2,\r
+  0xb1, 0x6d, 0xb2, 0x48, 0x3a, 0x4b, 0x12, 0xe3, 0xb7, 0xd4, 0x64, 0xfc,\r
+  0xd1, 0xd8, 0x63, 0x7c, 0xdf, 0xb2, 0x67, 0xaf, 0x71, 0xf5, 0xbe, 0xd7,\r
+  0x0f, 0x47, 0x8e, 0x36, 0x37, 0x2f, 0x69, 0x6e, 0x5e, 0x7a, 0x7d, 0x4b,\r
+  0xf3, 0x5d, 0x46, 0x81, 0x98, 0x52, 0x60, 0xe4, 0x3f, 0x40, 0xdf, 0xc4,\r
+  0x18, 0x1d, 0xa5, 0xcb, 0x05, 0x55, 0xd3, 0xbb, 0xe8, 0xd0, 0x85, 0xab,\r
+  0x97, 0xd0, 0xf7, 0xd0, 0x82, 0x82, 0xa3, 0x4b, 0xe8, 0x10, 0x54, 0x17,\r
+  0x1e, 0xa2, 0x27, 0xed, 0x9c, 0xa4, 0x77, 0x98, 0x7c, 0x87, 0xae, 0x95,\r
+  0x4a, 0xfa, 0x4c, 0xce, 0xf6, 0x43, 0xf4, 0xbe, 0x4d, 0xf5, 0x7d, 0xc9,\r
+  0x21, 0xba, 0x86, 0x0d, 0x50, 0x6e, 0x49, 0x01, 0x3d, 0x00, 0x76, 0x33,\r
+  0x7d, 0x62, 0xc8, 0x86, 0x5c, 0xbc, 0xba, 0x59, 0xdd, 0xcf, 0x8a, 0x10,\r
+  0x81, 0xd9, 0xdf, 0x67, 0x92, 0xda, 0xe7, 0xa7, 0xc1, 0x9f, 0x27, 0xe9,\r
+  0x35, 0x20, 0x48, 0xd9, 0xa4, 0xdf, 0x67, 0x18, 0x19, 0xe4, 0xc9, 0x74,\r
+  0x9e, 0xb6, 0x49, 0xff, 0x1d, 0xd2, 0x3c, 0x4d, 0x6b, 0x35, 0x75, 0x6a,\r
+  0xfb, 0xe9, 0x3a, 0xff, 0x19, 0x5a, 0x5e, 0xad, 0xe5, 0xb5, 0x7a, 0x7d,\r
+  0x35, 0x62, 0x7f, 0x64, 0x79, 0x93, 0x6e, 0x83, 0x61, 0xaa, 0xaf, 0x09,\r
+  0xbb, 0x38, 0xf3, 0x9e, 0x4c, 0x5a, 0xc5, 0xed, 0x74, 0x9b, 0xac, 0x19,\r
+  0x5e, 0xbd, 0x0b, 0x4d, 0xdf, 0x35, 0x0d, 0xad, 0x33, 0xb4, 0xce, 0xd0,\r
+  0xeb, 0x59, 0x95, 0xef, 0x90, 0xe7, 0x27, 0x25, 0x6b, 0xd2, 0x74, 0x99,\r
+  0xa6, 0xad, 0xb2, 0x04, 0x8b, 0xd6, 0xe3, 0x26, 0x62, 0xaa, 0x47, 0xbd,\r
+  0x13, 0xb0, 0x48, 0xda, 0xaa, 0xc7, 0x46, 0xbd, 0x9b, 0x60, 0x9a, 0xa3,\r
+  0x69, 0xbe, 0xce, 0xeb, 0xc1, 0xd9, 0x55, 0x7e, 0x26, 0x61, 0x6a, 0x6b,\r
+  0x31, 0x7a, 0xcb, 0x29, 0xbb, 0x89, 0x4f, 0xf7, 0x25, 0x3d, 0xee, 0xd3,\r
+  0x34, 0x9d, 0x9e, 0x19, 0xbf, 0x56, 0x59, 0x4e, 0xad, 0x2c, 0x31, 0x3d,\r
+  0x76, 0xb5, 0x5a, 0xd6, 0x2a, 0x65, 0x56, 0x39, 0xfe, 0xa3, 0x65, 0x35,\r
+  0x6a, 0x59, 0xa3, 0xa9, 0xff, 0x8d, 0x32, 0xa5, 0xee, 0x9f, 0x4c, 0x5b,\r
+  0x49, 0xed, 0xc1, 0xad, 0xa6, 0x7c, 0x8c, 0xe5, 0x9a, 0xb6, 0xe9, 0xbe,\r
+  0xb2, 0xa6, 0xd0, 0xc4, 0x4f, 0xc9, 0xf8, 0xc5, 0x14, 0xd3, 0x18, 0x17,\r
+  0x66, 0xe6, 0xae, 0x4c, 0xeb, 0xdd, 0xba, 0xcc, 0xa9, 0xba, 0x9e, 0xda,\r
+  0x8c, 0xa5, 0x6a, 0x5b, 0x6d, 0xc6, 0x5a, 0xe4, 0x90, 0x70, 0x11, 0x2e,\r
+  0xc9, 0xa2, 0x9c, 0x8c, 0xf2, 0x4e, 0x12, 0x15, 0x64, 0x6f, 0x0e, 0x47,\r
+  0xc3, 0xa9, 0xa5, 0x64, 0x2c, 0x6d, 0x22, 0xeb, 0xd2, 0x26, 0x3c, 0xed,\r
+  0xfc, 0xac, 0xe8, 0xa5, 0xfc, 0xb6, 0xa1, 0x60, 0x74, 0x47, 0x68, 0x53,\r
+  0x30, 0x35, 0x30, 0x14, 0x4a, 0xd0, 0xc4, 0xb6, 0xd8, 0xae, 0x78, 0x2c,\r
+  0x1a, 0x8a, 0xa6, 0xba, 0x43, 0xa1, 0x44, 0x6f, 0x38, 0xb4, 0xa7, 0xf6,\r
+  0xbc, 0xe0, 0x48, 0x90, 0x5c, 0x6d, 0xb1, 0x68, 0x34, 0x34, 0x90, 0x0a,\r
+  0xc7, 0xa2, 0x24, 0x56, 0x92, 0xb1, 0xb2, 0x83, 0x44, 0x07, 0x19, 0x1d,\r
+  0x15, 0x40, 0x07, 0x59, 0x3a, 0x3a, 0x38, 0xd1, 0x09, 0xa6, 0xb3, 0x0b,\r
+  0x4c, 0x17, 0x89, 0x4e, 0x32, 0x3a, 0x19, 0x5d, 0x34, 0xbd, 0x73, 0x78,\r
+  0x20, 0xd4, 0x3a, 0x30, 0x10, 0x4a, 0x26, 0xc3, 0xdb, 0xc2, 0x91, 0x70,\r
+  0x6a, 0xdf, 0xda, 0xd8, 0x60, 0xa8, 0x3b, 0x11, 0x1b, 0x09, 0x0f, 0xa2,\r
+  0xc6, 0x92, 0xd5, 0xa1, 0x7d, 0xdb, 0x62, 0xc1, 0xc4, 0xe0, 0x8a, 0x70,\r
+  0x72, 0x57, 0x38, 0x99, 0xec, 0x0a, 0x27, 0x53, 0xa1, 0x28, 0x14, 0x02,\r
+  0x25, 0x75, 0xa1, 0xec, 0x2e, 0x2e, 0xbb, 0xab, 0x93, 0xac, 0x5d, 0x9d,\r
+  0x92, 0xeb, 0x82, 0x48, 0xca, 0x21, 0xc3, 0xa3, 0x8b, 0x26, 0x76, 0x05,\r
+  0xa3, 0x83, 0x89, 0x58, 0x78, 0xb0, 0x2e, 0x18, 0x8f, 0xd7, 0xb5, 0xa2,\r
+  0x91, 0x23, 0xa8, 0xa4, 0x89, 0xe6, 0x67, 0xcb, 0xe3, 0xf1, 0x48, 0x78,\r
+  0x20, 0xc8, 0x3d, 0x98, 0x9d, 0xb6, 0xe9, 0x0a, 0x6f, 0x0f, 0x0d, 0xec,\r
+  0x1b, 0x88, 0x84, 0xda, 0x82, 0x91, 0xc8, 0xb6, 0xe0, 0xc0, 0xce, 0x64,\r
+  0x13, 0x4d, 0x3e, 0x5d, 0x2e, 0xb3, 0x6a, 0x20, 0x16, 0x45, 0x23, 0x53,\r
+  0x75, 0x6d, 0x4c, 0xf7, 0xa6, 0xcc, 0xaa, 0x1d, 0x89, 0x60, 0x7c, 0x28,\r
+  0x3c, 0x90, 0xac, 0x6b, 0x0b, 0x46, 0x47, 0x82, 0x28, 0x70, 0xc6, 0x38,\r
+  0xaa, 0x58, 0x24, 0x96, 0x58, 0x19, 0x8e, 0xa4, 0x42, 0x89, 0xd3, 0xeb,\r
+  0xd7, 0x04, 0x53, 0x89, 0xf0, 0xde, 0x26, 0xaa, 0xf8, 0x5c, 0x7d, 0x56,\r
+  0x51, 0x93, 0xc6, 0x9a, 0x76, 0x07, 0xc3, 0xd1, 0xd4, 0xf8, 0x9a, 0x98,\r
+  0xd4, 0x94, 0x8c, 0xd5, 0x6c, 0xc0, 0x44, 0x37, 0xd1, 0x94, 0x8c, 0x22,\r
+  0x96, 0xac, 0x5b, 0x3e, 0x1c, 0x8e, 0x0c, 0xce, 0xee, 0x6d, 0xdf, 0xd0,\r
+  0xd3, 0xb1, 0x6e, 0x6d, 0x13, 0x15, 0x65, 0xeb, 0xa2, 0x83, 0x91, 0x50,\r
+  0x13, 0x15, 0x9b, 0x85, 0x1d, 0xcb, 0xc3, 0xd1, 0x41, 0x6e, 0xd3, 0x68,\r
+  0xf9, 0x3c, 0x52, 0x75, 0xed, 0x83, 0xe1, 0x54, 0x70, 0x1b, 0x9b, 0x4f,\r
+  0xca, 0x56, 0xf4, 0x84, 0x22, 0xca, 0xbf, 0xcc, 0x35, 0x2b, 0x4d, 0x3c,\r
+  0x18, 0xd5, 0xfe, 0x39, 0x36, 0x17, 0x74, 0x51, 0x55, 0xde, 0x19, 0xa7,\r
+  0xd1, 0xf4, 0x60, 0x98, 0xa2, 0x3b, 0x64, 0x07, 0xb8, 0x80, 0x53, 0x0a,\r
+  0x0f, 0xe0, 0x91, 0x29, 0x7c, 0xb4, 0x5b, 0xc3, 0xa9, 0x70, 0x84, 0xc7,\r
+  0x6e, 0x7c, 0x61, 0x33, 0x55, 0x66, 0x84, 0x23, 0x58, 0x23, 0x75, 0x6d,\r
+  0x43, 0xb1, 0x44, 0x28, 0x26, 0x07, 0x30, 0x94, 0x98, 0xbd, 0x32, 0x11,\r
+  0xdc, 0x95, 0x71, 0xa9, 0x26, 0x9a, 0xf6, 0x39, 0xb6, 0xe6, 0xf1, 0x91,\r
+  0x5a, 0xac, 0x86, 0xf6, 0x91, 0x50, 0x34, 0x6b, 0xfc, 0xa5, 0x62, 0x4d,\r
+  0x8c, 0x07, 0x47, 0xeb, 0x2a, 0xb2, 0x75, 0xbc, 0x4e, 0x67, 0xaf, 0x8b,\r
+  0xae, 0x8c, 0x0d, 0x0c, 0x27, 0xd5, 0x7a, 0x4e, 0xaf, 0x22, 0x73, 0xf3,\r
+  0x33, 0xa6, 0xe6, 0x51, 0xcc, 0x08, 0x57, 0x25, 0x62, 0xc3, 0xf1, 0x26,\r
+  0x5a, 0x38, 0x56, 0x13, 0x48, 0x84, 0x42, 0xeb, 0xb6, 0x25, 0x43, 0x89,\r
+  0x11, 0xf4, 0x6d, 0x5d, 0x74, 0x55, 0x24, 0xb6, 0x2d, 0x18, 0xe9, 0x0a,\r
+  0xee, 0x8b, 0x0d, 0xa7, 0x46, 0xab, 0x99, 0xf9, 0xf9, 0xf9, 0x9a, 0x68,\r
+  0x6e, 0xb6, 0x41, 0xd0, 0x1c, 0x10, 0xea, 0xb2, 0xc2, 0xc3, 0x9a, 0x60,\r
+  0x34, 0xb8, 0x83, 0xb3, 0xd4, 0x7f, 0xe9, 0x2c, 0x1c, 0x51, 0x3a, 0xa2,\r
+  0xdb, 0x63, 0x63, 0xda, 0xff, 0x05, 0x79, 0xd2, 0x51, 0xa8, 0x89, 0x6a,\r
+  0xb3, 0xf3, 0x85, 0xa3, 0xf1, 0xe1, 0xd4, 0xae, 0x50, 0x6a, 0x28, 0x36,\r
+  0x58, 0xb7, 0x3c, 0x98, 0x44, 0xe1, 0x48, 0x8f, 0xc6, 0x40, 0xb3, 0xb7,\r
+  0x8d, 0xb1, 0x67, 0x17, 0x8f, 0x25, 0x54, 0x73, 0x2a, 0x4f, 0x6f, 0x36,\r
+  0xa6, 0xc8, 0x9a, 0x2f, 0xb0, 0x5d, 0x23, 0xf9, 0xcc, 0xe8, 0xd4, 0x75,\r
+  0x0d, 0xc4, 0x76, 0xd5, 0x25, 0x76, 0x25, 0x23, 0x75, 0xe7, 0x21, 0xc2,\r
+  0xd6, 0x8d, 0x89, 0xdc, 0xb3, 0xb3, 0x42, 0x7b, 0x13, 0x55, 0x7f, 0x71,\r
+  0x06, 0x53, 0x6b, 0x96, 0x7d, 0xa1, 0xf5, 0xe7, 0xc6, 0xf5, 0x26, 0x5a,\r
+  0xf9, 0x85, 0x05, 0x9c, 0x26, 0xf2, 0xcf, 0xce, 0x76, 0x9c, 0xc6, 0xff,\r
+  0xd7, 0x72, 0xd8, 0xe7, 0xbe, 0x28, 0x2b, 0x2f, 0x7f, 0x39, 0xb8, 0x81,\r
+  0x60, 0x62, 0x47, 0x08, 0x2b, 0xab, 0xf4, 0x8b, 0xb2, 0x34, 0x51, 0x59,\r
+  0xd7, 0x60, 0x30, 0x32, 0x12, 0xde, 0x59, 0x87, 0x00, 0x13, 0x4b, 0xc9,\r
+  0xbd, 0xa1, 0xae, 0x3d, 0x3a, 0x10, 0x89, 0x25, 0x11, 0x67, 0xda, 0x22,\r
+  0xc1, 0xa4, 0x0c, 0xfa, 0x63, 0x6d, 0x3a, 0x30, 0xb8, 0x09, 0xad, 0x2f,\r
+  0x1d, 0x47, 0xbf, 0x26, 0xb4, 0x6b, 0x9b, 0x36, 0x08, 0xc1, 0x64, 0xfa,\r
+  0x38, 0x26, 0x3d, 0xe1, 0x1d, 0xd1, 0x60, 0x6a, 0x38, 0x21, 0xc3, 0x27,\r
+  0x6f, 0xcc, 0x75, 0x11, 0x4c, 0x31, 0x42, 0x4a, 0x30, 0xd1, 0x13, 0xda,\r
+  0x3d, 0x1c, 0x8a, 0x0e, 0x40, 0xe3, 0x31, 0x6b, 0x54, 0x75, 0x65, 0x26,\r
+  0x51, 0x47, 0x24, 0x12, 0xda, 0x11, 0x8c, 0xa8, 0x99, 0x6b, 0xdf, 0x3b,\r
+  0x10, 0x8a, 0xab, 0x09, 0x9f, 0x3d, 0x8e, 0x4d, 0x62, 0xc7, 0xf0, 0x2e,\r
+  0xf4, 0xdd, 0x64, 0x55, 0x64, 0xb6, 0xc2, 0xe6, 0x27, 0x5d, 0xb1, 0xd4,\r
+  0x24, 0x5c, 0x1b, 0xeb, 0x19, 0x1e, 0x18, 0x52, 0xbe, 0x6a, 0xca, 0xe7,\r
+  0x35, 0x99, 0xac, 0xdb, 0x76, 0x9e, 0xdc, 0x61, 0xa6, 0x9b, 0x64, 0x3d,\r
+  0xa1, 0x81, 0xe1, 0x04, 0x7c, 0xe8, 0x34, 0x59, 0x54, 0x10, 0xe7, 0x35,\r
+  0x32, 0x2a, 0x4b, 0x84, 0xb6, 0xf3, 0x96, 0x81, 0x66, 0x8c, 0xc4, 0xd4,\r
+  0x16, 0xad, 0x26, 0xd1, 0x54, 0xc4, 0x94, 0x71, 0xcc, 0x55, 0xd3, 0x9a,\r
+  0x68, 0x82, 0xd2, 0xc9, 0xa0, 0xde, 0x9a, 0x48, 0x04, 0xf7, 0xb1, 0xdf,\r
+  0x34, 0x91, 0xdb, 0x24, 0x1e, 0x5f, 0xd2, 0x4c, 0x8e, 0x9e, 0x15, 0xab,\r
+  0xcf, 0xed, 0x58, 0x1b, 0x20, 0x6b, 0x60, 0x73, 0x77, 0x3b, 0x15, 0x9e,\r
+  0xe2, 0x45, 0x94, 0x67, 0xf6, 0x60, 0x12, 0xbd, 0x64, 0xf4, 0xe2, 0xc0,\r
+  0xd2, 0x8b, 0xe3, 0x8b, 0xb5, 0x97, 0x8f, 0x4a, 0x36, 0x7e, 0xe2, 0x2c,\r
+  0xd3, 0xdb, 0x49, 0xf6, 0xde, 0xce, 0x8e, 0x95, 0x2b, 0x71, 0xba, 0xe9,\r
+  0xed, 0x94, 0x8a, 0x4e, 0x56, 0x58, 0x7a, 0x71, 0x76, 0xc2, 0xa3, 0x8b,\r
+  0xc5, 0x7c, 0xe0, 0xe9, 0xed, 0xec, 0x83, 0x35, 0x33, 0x5d, 0x5c, 0x46,\r
+  0x97, 0x34, 0xed, 0x52, 0xa6, 0x7c, 0x0c, 0xea, 0x85, 0x11, 0x04, 0x2c,\r
+  0x77, 0x48, 0x22, 0xab, 0xea, 0x92, 0x59, 0x71, 0x2b, 0x06, 0xdb, 0xd7,\r
+  0x29, 0x9f, 0x38, 0x53, 0xf5, 0xf6, 0xa1, 0xd2, 0x3e, 0x69, 0x22, 0xfa,\r
+  0xc8, 0xd2, 0xc7, 0xa6, 0x78, 0x74, 0x31, 0x0b, 0x35, 0x0c, 0x6d, 0x7d,\r
+  0x9d, 0x9c, 0xb6, 0x82, 0xb0, 0x80, 0x35, 0xa8, 0xd6, 0xde, 0xd7, 0x25,\r
+  0xc5, 0x36, 0xa6, 0x90, 0xf7, 0xe3, 0x18, 0xd8, 0xdf, 0x41, 0xde, 0xfe,\r
+  0xb1, 0xee, 0x56, 0xd4, 0x3f, 0xce, 0x6c, 0xbb, 0x54, 0x2c, 0x9e, 0xed,\r
+  0xf7, 0xfb, 0x33, 0xfc, 0x5c, 0xf0, 0xb9, 0xa3, 0xbc, 0x29, 0x91, 0xa5,\r
+  0xa9, 0x37, 0x27, 0xe6, 0x99, 0x13, 0xf3, 0xcd, 0x89, 0x05, 0xe6, 0xc4,\r
+  0x42, 0x73, 0x62, 0x91, 0x39, 0xd1, 0x60, 0x4e, 0x34, 0x9a, 0x5a, 0x53,\r
+  0x6f, 0xe2, 0xe7, 0x99, 0xf8, 0xf9, 0x26, 0x7e, 0x81, 0x89, 0x5f, 0x68,\r
+  0xe2, 0x17, 0x99, 0xf8, 0x06, 0x13, 0xdf, 0x38, 0x5a, 0xd9, 0xca, 0x48,\r
+  0x70, 0x47, 0x92, 0xf2, 0xb3, 0xb6, 0x24, 0x2a, 0x0e, 0x8e, 0xb3, 0xf5,\r
+  0x71, 0x0e, 0x76, 0xe0, 0xae, 0xe0, 0xb6, 0x50, 0x84, 0x2c, 0xc1, 0xc1,\r
+  0x41, 0x9a, 0x8c, 0xc7, 0xf8, 0x7b, 0x2f, 0xb9, 0x83, 0xdb, 0x71, 0xfa,\r
+  0x63, 0x1f, 0x54, 0x01, 0x7f, 0x90, 0x3c, 0x7c, 0xf0, 0x58, 0x3e, 0x9c,\r
+  0x4a, 0xc5, 0xa2, 0xdd, 0x09, 0x94, 0x2e, 0x45, 0xa1, 0xed, 0x38, 0x77,\r
+  0x98, 0xad, 0xec, 0xdb, 0x62, 0xb0, 0xd8, 0x45, 0xf6, 0x81, 0x20, 0x36,\r
+  0x88, 0x41, 0x72, 0x2b, 0x6a, 0x3a, 0xe9, 0xe7, 0x0f, 0x64, 0x5d, 0x0e,\r
+  0x6c, 0x38, 0x29, 0x07, 0x13, 0x54, 0xc8, 0xa1, 0x2e, 0x64, 0x32, 0x2b,\r
+  0x91, 0x02, 0xd3, 0x1e, 0xa5, 0x8f, 0xc5, 0x94, 0x3b, 0xc0, 0x3b, 0x02,\r
+  0x9f, 0x33, 0x5b, 0x53, 0x54, 0x90, 0x49, 0xb4, 0xc5, 0x86, 0xa3, 0x29,\r
+  0x14, 0x0e, 0x2b, 0x9c, 0x4e, 0x93, 0x52, 0x46, 0xc5, 0xfa, 0x4c, 0x9d,\r
+  0x5c, 0x2e, 0x1b, 0xaa, 0x1a, 0x49, 0x53, 0x07, 0x12, 0xa1, 0x60, 0x6a,\r
+  0xec, 0x36, 0xc3, 0xbb, 0x2b, 0x39, 0x06, 0x63, 0xf2, 0xa8, 0x45, 0xce,\r
+  0x90, 0x3e, 0x55, 0x82, 0x8b, 0x0e, 0x26, 0x37, 0x85, 0x53, 0x43, 0xe4,\r
+  0xdb, 0x8e, 0x03, 0xe8, 0xb8, 0xf9, 0x92, 0xcb, 0xf7, 0xf1, 0x30, 0x50,\r
+  0x0e, 0x5b, 0xc8, 0x33, 0x13, 0xe5, 0x6d, 0x1f, 0x3d, 0x3a, 0x0d, 0xd2,\r
+  0x54, 0xac, 0xe1, 0xac, 0x9c, 0xd2, 0x88, 0x83, 0x7f, 0xc7, 0x20, 0x4d,\r
+  0x3b, 0x55, 0x99, 0x75, 0x9b, 0xc9, 0x91, 0x5a, 0x39, 0x2a, 0x85, 0x19,\r
+  0x76, 0x4d, 0x30, 0xb9, 0x13, 0xc5, 0x4e, 0x60, 0xc1, 0xe8, 0x7d, 0x22,\r
+  0x3d, 0x48, 0x6e, 0x88, 0xdb, 0x82, 0x89, 0x50, 0xaa, 0x1b, 0x1b, 0x88,\r
+  0xcc, 0x59, 0xcc, 0x12, 0x84, 0xf4, 0x0e, 0x9c, 0xa0, 0xf7, 0xae, 0x8c,\r
+  0x25, 0xd4, 0x00, 0xe5, 0x6b, 0x29, 0x5c, 0x23, 0x94, 0x48, 0x92, 0x93,\r
+  0x93, 0xbc, 0xdc, 0xa8, 0x88, 0x39, 0xde, 0xa6, 0x78, 0xff, 0xe1, 0x63,\r
+  0x6f, 0x7b, 0x54, 0x55, 0x96, 0x25, 0xec, 0x49, 0x05, 0x13, 0x29, 0x72,\r
+  0x49, 0xb1, 0x9e, 0x1d, 0x8e, 0x95, 0xe9, 0x81, 0xcb, 0xe3, 0x04, 0x1f,\r
+  0x2e, 0x03, 0x61, 0x0c, 0xe8, 0x64, 0xa4, 0x64, 0xa7, 0x43, 0x83, 0xa7,\r
+  0xc6, 0x36, 0xdf, 0x69, 0x55, 0xb2, 0x99, 0x7a, 0x0c, 0xce, 0x0a, 0x85,\r
+  0x77, 0x0c, 0xa5, 0x64, 0x39, 0x67, 0x81, 0x8b, 0x70, 0x2a, 0x34, 0xb8,\r
+  0x21, 0xb4, 0x03, 0xfd, 0x5b, 0x8e, 0x27, 0x9c, 0x66, 0x3c, 0x15, 0xb7,\r
+  0x9c, 0xbb, 0x23, 0x4b, 0x35, 0x8f, 0xfa, 0x84, 0xb4, 0x30, 0xeb, 0x10,\r
+  0x44, 0x67, 0xa6, 0xc5, 0x81, 0x7d, 0xf1, 0x10, 0x46, 0x8a, 0x8f, 0x24,\r
+  0xbd, 0xe1, 0x44, 0x6a, 0x38, 0x18, 0x49, 0x1f, 0x0a, 0x58, 0x23, 0xbb,\r
+  0xda, 0x11, 0x4d, 0xa6, 0x82, 0xd8, 0x20, 0xe5, 0xc4, 0x64, 0x69, 0xb9,\r
+  0xc6, 0x2e, 0xbd, 0x85, 0xac, 0x8b, 0xf6, 0xc0, 0xe5, 0x42, 0x51, 0x39,\r
+  0x20, 0xa8, 0x2c, 0x88, 0x71, 0x4b, 0x85, 0x64, 0x9f, 0x54, 0xd5, 0x32,\r
+  0xbb, 0xee, 0xaa, 0x72, 0xe4, 0xbc, 0x51, 0x01, 0x5a, 0xea, 0x40, 0x6a,\r
+  0x43, 0x70, 0xcf, 0xd9, 0x69, 0x66, 0xb3, 0xac, 0x7c, 0x43, 0x2c, 0x96,\r
+  0xe2, 0xae, 0xc8, 0xdc, 0x99, 0xab, 0x0e, 0x77, 0xd7, 0x63, 0x16, 0xa8,\r
+  0x49, 0x62, 0x8f, 0xe8, 0xd9, 0x87, 0xd5, 0xbd, 0xab, 0x07, 0x3b, 0x48,\r
+  0x18, 0x4d, 0x2e, 0x80, 0x44, 0x8d, 0xf6, 0x06, 0xb9, 0x2c, 0xd8, 0x22,\r
+  0x80, 0x43, 0x41, 0x64, 0xed, 0xf0, 0x2e, 0xf6, 0x09, 0xe5, 0x04, 0x1b,\r
+  0xf9, 0xc6, 0x15, 0x09, 0x47, 0x31, 0x9a, 0x6c, 0x95, 0x94, 0xd9, 0x36,\r
+  0x46, 0xc3, 0xbc, 0xf0, 0xd8, 0x4a, 0x1a, 0x9d, 0x7a, 0x32, 0x97, 0x7e,\r
+  0xd5, 0x1b, 0xce, 0x04, 0x24, 0xce, 0xb3, 0x09, 0x0b, 0x23, 0xb6, 0x27,\r
+  0x10, 0xdb, 0x89, 0x71, 0x98, 0x96, 0x49, 0x4b, 0xa3, 0x48, 0x08, 0xa7,\r
+  0xac, 0x78, 0x24, 0xb8, 0x4f, 0xad, 0x3c, 0x2b, 0xb4, 0x67, 0xcb, 0xe7,\r
+  0x66, 0x9a, 0x84, 0xe5, 0x83, 0x8b, 0x60, 0xd6, 0xe2, 0x38, 0x2b, 0xc6,\r
+  0x55, 0x14, 0x6a, 0x4d, 0x3c, 0xde, 0x1d, 0x64, 0xc7, 0x21, 0x77, 0x46,\r
+  0xb0, 0x21, 0x94, 0xc4, 0x11, 0x23, 0x23, 0x59, 0x9e, 0x09, 0x5c, 0x94,\r
+  0xaf, 0x24, 0x2b, 0xf4, 0x1a, 0xd7, 0x49, 0x4c, 0xdc, 0x8a, 0xd8, 0x9e,\r
+  0x28, 0xe5, 0x66, 0x92, 0x1b, 0xe3, 0x54, 0x9c, 0x49, 0xc8, 0x49, 0x3d,\r
+  0x2b, 0x3c, 0x38, 0x88, 0x96, 0xeb, 0x5a, 0xd7, 0xc4, 0x50, 0xa5, 0xcc,\r
+  0x93, 0x25, 0x48, 0x04, 0x77, 0xa4, 0xcb, 0x94, 0x02, 0x14, 0xa3, 0xcb,\r
+  0x94, 0x57, 0x66, 0x2a, 0xd2, 0x89, 0x50, 0x02, 0xe1, 0x68, 0x97, 0x5e,\r
+  0xd3, 0x79, 0x43, 0x58, 0xe5, 0xe9, 0x6a, 0xa8, 0x84, 0x53, 0x3d, 0xb1,\r
+  0xed, 0xda, 0x5d, 0x13, 0xb1, 0x5d, 0x6a, 0xa0, 0xc8, 0x39, 0x84, 0x12,\r
+  0x64, 0x8c, 0xb1, 0x0e, 0xc5, 0x92, 0x58, 0x75, 0x58, 0x53, 0xeb, 0xe4,\r
+  0x91, 0x24, 0x49, 0x85, 0xfc, 0x26, 0x26, 0x1c, 0x8c, 0xb4, 0x05, 0xe3,\r
+  0xc9, 0x35, 0x98, 0x18, 0xca, 0xd7, 0x02, 0x38, 0x01, 0xfb, 0x43, 0xe1,\r
+  0x68, 0x52, 0x79, 0x43, 0x4e, 0x38, 0xed, 0xe0, 0x94, 0x27, 0xd9, 0x73,\r
+  0xd5, 0xa5, 0x80, 0x3c, 0x88, 0x9d, 0xa1, 0x84, 0xac, 0xa7, 0x55, 0x45,\r
+  0x10, 0x72, 0xa2, 0xde, 0xde, 0x60, 0x64, 0x38, 0x44, 0xf6, 0x30, 0x4e,\r
+  0x45, 0x3b, 0x43, 0xa8, 0x3a, 0x99, 0x71, 0x7c, 0x67, 0x38, 0xb9, 0x2e,\r
+  0x1e, 0xc4, 0x31, 0x11, 0x59, 0x93, 0x99, 0xc5, 0x2b, 0x5f, 0x86, 0x60,\r
+  0xc9, 0x43, 0x14, 0xc3, 0xc9, 0xad, 0x7d, 0x6f, 0x3c, 0x12, 0x4b, 0x04,\r
+  0x95, 0x7b, 0x72, 0x68, 0x18, 0x44, 0x0b, 0x92, 0x7a, 0xee, 0xa9, 0x64,\r
+  0xe7, 0x69, 0xde, 0xd6, 0xe4, 0xa7, 0x15, 0x3d, 0x43, 0x3c, 0xd4, 0xb6,\r
+  0x88, 0xdc, 0xba, 0xec, 0x91, 0x50, 0x74, 0x07, 0x82, 0xb1, 0x35, 0xca,\r
+  0x53, 0x98, 0x17, 0x35, 0x87, 0x4a, 0x7b, 0x6c, 0x1b, 0x87, 0x7f, 0xf2,\r
+  0xc6, 0xb6, 0x6f, 0x4f, 0x86, 0x52, 0xcb, 0xf7, 0xb5, 0xa5, 0xf7, 0x87,\r
+  0x24, 0x79, 0x62, 0xd1, 0xf4, 0x3b, 0x9a, 0x36, 0xb9, 0x01, 0x20, 0x2c,\r
+  0x8c, 0x8a, 0x56, 0x84, 0x92, 0xa9, 0x44, 0x6c, 0x1f, 0x7b, 0xcd, 0xa8,\r
+  0x50, 0x7b, 0x96, 0x29, 0x67, 0xda, 0xb5, 0xa6, 0x8e, 0x8a, 0x7a, 0x82,\r
+  0x23, 0xa1, 0xf4, 0x70, 0xa8, 0x85, 0x6d, 0xb2, 0x97, 0xc3, 0x9d, 0x5d,\r
+  0x44, 0x4f, 0x2a, 0x16, 0x8f, 0x43, 0x54, 0x82, 0x70, 0x2d, 0xdb, 0x71,\r
+  0xca, 0xa5, 0x0d, 0x9d, 0x88, 0xc2, 0x93, 0xf6, 0x50, 0x7e, 0xcc, 0x7c,\r
+  0xfb, 0xa6, 0x82, 0x58, 0xd6, 0x56, 0x4d, 0x79, 0xb1, 0xa8, 0x5c, 0x09,\r
+  0x32, 0xc2, 0x52, 0x4e, 0x2c, 0x9a, 0x76, 0xe3, 0x7c, 0xc9, 0xae, 0x19,\r
+  0x8e, 0xa4, 0xc2, 0x71, 0x0c, 0xaf, 0x43, 0x26, 0xe1, 0x8a, 0x4e, 0xde,\r
+  0xfc, 0x65, 0x56, 0x58, 0xf4, 0x84, 0xcf, 0x0f, 0xa5, 0xf7, 0xa6, 0x5c,\r
+  0x24, 0x11, 0xcd, 0x5b, 0xe1, 0xe1, 0x83, 0x52, 0x87, 0x44, 0x5a, 0xa7,\r
+  0x93, 0x1b, 0x42, 0xbb, 0x50, 0x97, 0x4c, 0x9a, 0xb7, 0x7b, 0xb4, 0x41,\r
+  0x4d, 0xb0, 0x6c, 0x83, 0x3d, 0xa6, 0x3c, 0xc1, 0x16, 0x97, 0xde, 0x9e,\r
+  0x1f, 0xcf, 0xf2, 0xf3, 0xe9, 0xf1, 0x58, 0x7c, 0x38, 0x72, 0xda, 0x8d,\r
+  0xd7, 0x83, 0x6d, 0x25, 0x95, 0xf5, 0x96, 0x83, 0x1c, 0x09, 0xf5, 0x26,\r
+  0x8d, 0xca, 0x12, 0x88, 0xe4, 0x70, 0x8a, 0xc4, 0xe9, 0x5f, 0xb2, 0xd1,\r
+  0xb4, 0x84, 0x6c, 0xe2, 0x69, 0xce, 0x33, 0x2e, 0xa5, 0xe5, 0xae, 0x50,\r
+  0x1e, 0x8e, 0x2f, 0x3c, 0x2d, 0x72, 0xdc, 0xc9, 0x02, 0x3f, 0xa1, 0x82,\r
+  0x24, 0x6f, 0x61, 0x99, 0xb7, 0x5e, 0x94, 0x97, 0xd4, 0x1b, 0x92, 0xdc,\r
+  0xc7, 0x4a, 0xcc, 0xa9, 0x0e, 0xd5, 0x63, 0xb9, 0xcc, 0x8a, 0x93, 0xe3,\r
+  0xec, 0x37, 0x32, 0x33, 0xaa, 0xc7, 0xf1, 0x89, 0xd7, 0xd7, 0x24, 0xa4,\r
+  0xc6, 0x7d, 0x8d, 0x22, 0xed, 0x32, 0x51, 0x9a, 0x1c, 0x9c, 0xe2, 0xe6,\r
+  0x4d, 0x48, 0xa6, 0x23, 0xf5, 0xc6, 0xb0, 0x29, 0x86, 0x4e, 0x1d, 0x57,\r
+  0xcc, 0xdb, 0x71, 0x30, 0x25, 0x5b, 0x18, 0x08, 0x61, 0x67, 0x4e, 0x04,\r
+  0x13, 0xfb, 0xd2, 0x21, 0x1b, 0x9b, 0x34, 0xe5, 0x26, 0x55, 0x74, 0x5e,\r
+  0x2b, 0xc3, 0x5d, 0x32, 0x2b, 0x2a, 0xbb, 0xd2, 0x49, 0x74, 0x91, 0x07,\r
+  0x60, 0x53, 0x38, 0x12, 0x59, 0x1b, 0x4b, 0x49, 0xdf, 0xcb, 0x4b, 0x62,\r
+  0xc9, 0x65, 0x82, 0x52, 0x3e, 0xa7, 0x32, 0x41, 0x09, 0xc6, 0x3c, 0x7c,\r
+  0xaa, 0x1f, 0x5c, 0x49, 0x7e, 0x12, 0x2e, 0x3d, 0x9a, 0xcc, 0x4d, 0x0e,\r
+  0x6f, 0x4b, 0xdf, 0x1c, 0x29, 0x07, 0x89, 0xa4, 0xbc, 0x68, 0x91, 0x3d,\r
+  0xa5, 0x76, 0xfb, 0x99, 0xa9, 0xec, 0x3d, 0x7e, 0xd5, 0xa9, 0x67, 0x95,\r
+  0x59, 0xe3, 0x18, 0x8c, 0x39, 0xba, 0x94, 0x8f, 0x35, 0x3a, 0xcd, 0xa9,\r
+  0xe0, 0xcc, 0x2f, 0x61, 0xc9, 0x51, 0x72, 0xc6, 0x58, 0xbb, 0xac, 0x2d,\r
+  0x7d, 0xfa, 0x58, 0xbd, 0x79, 0xff, 0x1c, 0xa7, 0x5b, 0xd9, 0xdb, 0xa9,\r
+  0xef, 0x14, 0x83, 0x8e, 0x31, 0xa1, 0x76, 0x8c, 0xc5, 0x98, 0x88, 0x7a,\r
+  0xea, 0xd0, 0xf4, 0x8c, 0xe7, 0x80, 0xa7, 0x76, 0xb8, 0xe7, 0x34, 0xce,\r
+  0x61, 0x4f, 0x0d, 0x85, 0x71, 0x77, 0xd2, 0x74, 0x2e, 0x39, 0x53, 0x31,\r
+  0x75, 0x27, 0x26, 0x0b, 0x26, 0x94, 0x4a, 0x87, 0xe3, 0x83, 0x58, 0xae,\r
+  0xe9, 0xe3, 0x5c, 0xc6, 0x55, 0x79, 0x53, 0xd2, 0x07, 0xb7, 0x0a, 0x65,\r
+  0xa2, 0x52, 0xfa, 0x68, 0xc8, 0x26, 0xea, 0xac, 0xc0, 0x86, 0x99, 0xc3,\r
+  0xe0, 0x0c, 0xb3, 0xe9, 0x38, 0xfa, 0x52, 0xb3, 0x3e, 0xab, 0xae, 0x8c,\r
+  0x89, 0x6d, 0x44, 0x6e, 0x43, 0x0e, 0x49, 0xd6, 0x6d, 0x27, 0xeb, 0x88,\r
+  0x3c, 0xfd, 0xf0, 0xd3, 0x1c, 0xce, 0xdc, 0x23, 0xa7, 0x1e, 0x47, 0x12,\r
+  0x17, 0x5f, 0xbc, 0xa2, 0xe1, 0x82, 0x32, 0x0e, 0x14, 0x38, 0xcb, 0x97,\r
+  0x2d, 0x2e, 0x83, 0x23, 0x95, 0x55, 0x97, 0x0d, 0xa0, 0xc1, 0xe1, 0x88,\r
+  0xdc, 0x96, 0x6a, 0x76, 0x61, 0x3d, 0x43, 0x91, 0x40, 0xc5, 0xc1, 0x64,\r
+  0x08, 0xca, 0xa1, 0x60, 0xb2, 0x06, 0x37, 0x14, 0x84, 0x96, 0xe1, 0x5d,\r
+  0xc9, 0xb2, 0xc5, 0xdb, 0x83, 0x91, 0x64, 0xa8, 0xba, 0x6c, 0x57, 0x38,\r
+  0x5a, 0x13, 0x8c, 0x87, 0xcb, 0x16, 0xcf, 0x5d, 0x58, 0x5d, 0x86, 0xa2,\r
+  0x93, 0xc8, 0x8b, 0x6c, 0xf3, 0x6a, 0xe7, 0xd5, 0xd6, 0xfb, 0x6b, 0x06,\r
+  0x43, 0x23, 0x55, 0xc1, 0x58, 0x32, 0xbe, 0xa0, 0xec, 0x22, 0x32, 0xea,\r
+  0xc5, 0x6b, 0xc6, 0x34, 0x67, 0x89, 0xb5, 0x64, 0x5e, 0x89, 0xbd, 0x64,\r
+  0xa0, 0x64, 0x71, 0x49, 0x1f, 0x7e, 0x73, 0x8c, 0x3a, 0x88, 0x27, 0xd5,\r
+  0x1a, 0x7e, 0xe3, 0x76, 0x61, 0x9d, 0x72, 0x8d, 0x51, 0x92, 0x3b, 0xca,\r
+  0xe6, 0xab, 0x3c, 0x76, 0xe4, 0x39, 0xa7, 0xc4, 0x83, 0x3c, 0xed, 0x25,\r
+  0x4e, 0xa5, 0xf5, 0x42, 0x3b, 0x45, 0x65, 0xad, 0x56, 0x12, 0x03, 0x92,\r
+  0x1d, 0xa3, 0xca, 0xa9, 0xc6, 0x5c, 0xce, 0x2a, 0x26, 0x55, 0x8d, 0x96,\r
+  0x91, 0xae, 0xd3, 0xa5, 0xcc, 0x72, 0x60, 0xb6, 0x3d, 0xad, 0xb5, 0x99,\r
+  0xb4, 0x32, 0xa7, 0x6d, 0x52, 0xe5, 0xa4, 0x8a, 0x49, 0xe5, 0x93, 0xaa,\r
+  0x27, 0xd5, 0x90, 0xd5, 0x6e, 0xcf, 0x35, 0x84, 0x97, 0x7f, 0x17, 0x5e,\r
+  0xb2, 0xdf, 0x7a, 0xb2, 0xc2, 0xe2, 0x7a, 0xab, 0xdc, 0xe6, 0xda, 0x5f,\r
+  0x23, 0x5c, 0x2f, 0x00, 0xef, 0x02, 0x57, 0xd6, 0x2e, 0x12, 0x07, 0x2b,\r
+  0x85, 0x38, 0x5a, 0x69, 0x88, 0x87, 0x41, 0x4f, 0x02, 0x1f, 0x73, 0xba,\r
+  0x8a, 0xac, 0xc2, 0x28, 0x34, 0x84, 0xfc, 0x5d, 0xbe, 0x7f, 0xbf, 0xf5,\r
+  0xf5, 0xba, 0x36, 0xb1, 0xdf, 0x0f, 0x8b, 0x5a, 0x32, 0x84, 0xb5, 0xe8,\r
+  0x88, 0x4f, 0x78, 0xdb, 0x51, 0xe8, 0x91, 0x79, 0x2b, 0xc5, 0xc3, 0x10,\r
+  0x7f, 0x58, 0x2f, 0xc4, 0xc3, 0x73, 0x85, 0xb8, 0xbb, 0x1e, 0x6a, 0x31,\r
+  0xc1, 0x10, 0x47, 0x7c, 0x9d, 0xc8, 0x75, 0x7c, 0xde, 0x6a, 0xf1, 0xca,\r
+  0x3c, 0xb2, 0xd8, 0xa9, 0x84, 0x73, 0x08, 0x6f, 0x17, 0xf2, 0xdc, 0xb9,\r
+  0x40, 0x1c, 0xf6, 0x9d, 0xe4, 0xc7, 0x07, 0xfc, 0x38, 0xb2, 0x40, 0x18,\r
+  0x87, 0x17, 0x0a, 0xe3, 0xf8, 0x42, 0x12, 0x22, 0x77, 0x8a, 0x77, 0x03,\r
+  0xb7, 0xb5, 0xa1, 0x47, 0x7c, 0xbc, 0x10, 0xed, 0x58, 0x84, 0x62, 0x81,\r
+  0x93, 0xc0, 0xc7, 0xcc, 0x37, 0x40, 0x06, 0x7c, 0x08, 0x9c, 0x84, 0xfe,\r
+  0x48, 0x23, 0xaa, 0x6c, 0x24, 0x47, 0xfd, 0xcc, 0xa9, 0x5e, 0xd9, 0x56,\r
+  0xaf, 0xfa, 0x3d, 0x07, 0x65, 0xbc, 0xb0, 0x0a, 0x85, 0x1f, 0x6d, 0xc2,\r
+  0xe3, 0x85, 0x15, 0x78, 0xec, 0x5f, 0x8d, 0xc7, 0x09, 0x29, 0x93, 0x1c,\r
+  0x2b, 0x5e, 0x5f, 0x89, 0xc7, 0xa7, 0xfc, 0x78, 0x89, 0x93, 0xbf, 0x67,\r
+  0xbb, 0xe3, 0xac, 0x3d, 0xca, 0x76, 0xcf, 0x32, 0x77, 0xb0, 0x1d, 0x8f,\r
+  0x9b, 0xf9, 0xf1, 0x18, 0x3f, 0x4e, 0xb6, 0xdb, 0x0f, 0x18, 0x24, 0x00,\r
+  0x8b, 0x71, 0x74, 0x05, 0x53, 0x83, 0xe1, 0xfa, 0xb0, 0xdd, 0xa1, 0xe5,\r
+  0x7f, 0x0f, 0x26, 0x00, 0xae, 0xcb, 0xc1, 0x7f, 0x59, 0xc0, 0x3e, 0x2e,\r
+  0x5e, 0x5f, 0x2d, 0xc4, 0x95, 0x5d, 0x42, 0xdc, 0x09, 0xbc, 0xdb, 0x24,\r
+  0xc4, 0xab, 0x5d, 0x16, 0xf1, 0x6c, 0xa3, 0x9d, 0xde, 0x5d, 0x3c, 0x41,\r
+  0x5c, 0xb7, 0x46, 0x88, 0xfd, 0xcd, 0x18, 0x24, 0xe0, 0x25, 0xf0, 0x6f,\r
+  0x01, 0x1f, 0x03, 0xb7, 0xae, 0x45, 0x1a, 0x78, 0x0b, 0xf8, 0x18, 0x78,\r
+  0x1d, 0x03, 0x77, 0xe5, 0x3a, 0x21, 0x1e, 0x63, 0xc0, 0xf6, 0xc8, 0x12,\r
+  0x21, 0x0e, 0x2e, 0x15, 0xe2, 0xba, 0x65, 0xc2, 0xfa, 0xee, 0x3a, 0x61,\r
+  0xdd, 0xdf, 0x2d, 0xc4, 0x0b, 0xcb, 0x6c, 0xe2, 0x38, 0xe8, 0xad, 0xeb,\r
+  0xe1, 0x1c, 0xc0, 0xab, 0xeb, 0x49, 0xfd, 0xf0, 0x67, 0x8d, 0x81, 0x55,\r
+  0xea, 0xb3, 0xc7, 0x9d, 0xa0, 0x09, 0x13, 0x7f, 0xd1, 0x2a, 0xa5, 0x3f,\r
+  0x6c, 0x92, 0xdd, 0xa8, 0xf9, 0xdb, 0x41, 0xef, 0x59, 0xa5, 0x3e, 0xdf,\r
+  0x64, 0xf9, 0xc3, 0xc0, 0x4f, 0xb5, 0xfd, 0x0b, 0x26, 0xfb, 0xd7, 0xb4,\r
+  0xec, 0x0f, 0x9a, 0xfe, 0x0d, 0x34, 0xde, 0x39, 0x5a, 0x37, 0xe9, 0xcf,\r
+  0x5d, 0x87, 0x20, 0xbb, 0x50, 0xcb, 0xd3, 0x3f, 0x47, 0x4e, 0xb1, 0xe3,\r
+  0xef, 0x1f, 0x39, 0x0c, 0xd9, 0x4d, 0xa7, 0xd8, 0xdd, 0x79, 0x4a, 0xfa,\r
+  0x89, 0x53, 0xf2, 0xf1, 0xf7, 0x8b, 0x3c, 0x0c, 0xd9, 0x2b, 0xa7, 0xc8,\r
+  0xf9, 0xff, 0x06, 0xbf, 0xd0, 0x39, 0xfa, 0xbd, 0x1c, 0xc2, 0x44, 0xd3,\r
+  0xdf, 0xa3, 0xc5, 0xfd, 0x48, 0x7f, 0x97, 0x16, 0xf7, 0x35, 0xfd, 0x7d,\r
+  0x5a, 0xfc, 0x59, 0x6c, 0xfa, 0x3b, 0xb5, 0xf8, 0x73, 0xda, 0xf4, 0xf7,\r
+  0x6a, 0xf1, 0x67, 0xd4, 0xe9, 0xef, 0xd6, 0x12, 0x3e, 0xf5, 0x1d, 0x27,\r
+  0xfc, 0xfd, 0x5a, 0x16, 0x9f, 0xfa, 0x6c, 0x98, 0xff, 0xaf, 0x9d, 0x70,\r
+  0xab, 0xef, 0x55, 0xe1, 0xff, 0x53, 0x68, 0xf8, 0x54, 0x5d, 0xbe, 0x5a,\r
+  0x94, 0xe9, 0x53, 0x7f, 0x43, 0xc3, 0xf3, 0x41, 0x3e, 0x55, 0x0e, 0xff,\r
+  0x5f, 0x43, 0x8b, 0x5b, 0xfd, 0xdd, 0xc0, 0x20, 0xda, 0x6a, 0xd7, 0x72,\r
+  0xfe, 0x7f, 0x88, 0xdc, 0x70, 0x6e, 0x2b, 0x7f, 0xef, 0xd7, 0xff, 0x05,\r
+  0xf3, 0x27, 0x9b, 0x95, 0x30, 0x4c, 0x00, 0x00\r
+};\r
 \r
 //==============================================================================\r
 #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
@@ -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)\r
 #undef JNI_CLASS_MEMBERS\r
 \r
+#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+ FIELD (first,  "first",  "Ljava/lang/Object;") \\r
+ FIELD (second, "second", "Ljava/lang/Object;") \\r
+\r
+ DECLARE_JNI_CLASS (AndroidPair, "android/util/Pair")\r
+#undef JNI_CLASS_MEMBERS\r
+\r
 //==============================================================================\r
 namespace\r
 {\r
@@ -856,30 +1522,29 @@ public:
         }\r
     }\r
 \r
-    void handleKeyDownCallback (int k, int kc, int kbFlags)\r
+    static void handleKeyDownCallback (JNIEnv*, AndroidComponentPeer& t, int k, int kc, int kbFlags)\r
     {\r
         ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons()\r
                                                                        .withFlags (translateAndroidKeyboardFlags (kbFlags));\r
-        handleKeyPress (translateAndroidKeyCode (k), static_cast<juce_wchar> (kc));\r
+        t.handleKeyPress (translateAndroidKeyCode (k), static_cast<juce_wchar> (kc));\r
     }\r
 \r
-    void handleKeyUpCallback (int /*k*/, int /*kc*/)\r
+    static void handleKeyUpCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t, [[maybe_unused]] int k, [[maybe_unused]] int kc)\r
     {\r
     }\r
 \r
-    void handleBackButtonCallback()\r
+    static void handleBackButtonCallback (JNIEnv* env, AndroidComponentPeer& t)\r
     {\r
         bool handled = false;\r
 \r
         if (auto* app = JUCEApplicationBase::getInstance())\r
             handled = app->backButtonPressed();\r
 \r
-        if (isKioskModeComponent())\r
-            setNavBarsHidden (navBarsHidden);\r
+        if (t.isKioskModeComponent())\r
+            t.setNavBarsHidden (t.navBarsHidden);\r
 \r
         if (! handled)\r
         {\r
-            auto* env = getEnv();\r
             LocalRef<jobject> activity (getCurrentActivity());\r
 \r
             if (activity != nullptr)\r
@@ -890,17 +1555,27 @@ public:
         }\r
     }\r
 \r
-    void handleKeyboardHiddenCallback()\r
+    static void handleKeyboardHiddenCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t)\r
     {\r
         Component::unfocusAllComponents();\r
     }\r
 \r
-    void handleAppPausedCallback() {}\r
+    static void handleAppPausedCallback (JNIEnv*, [[maybe_unused]] AndroidComponentPeer& t) {}\r
+\r
+    static void handleAppResumedCallback (JNIEnv*, AndroidComponentPeer& t)\r
+    {\r
+        if (t.isKioskModeComponent())\r
+            t.setNavBarsHidden (t.navBarsHidden);\r
+    }\r
+\r
+    static jlong handleGetFocusedTextInputTargetCallback (JNIEnv*, AndroidComponentPeer& t)\r
+    {\r
+        return reinterpret_cast<jlong> (t.findCurrentTextInputTarget());\r
+    }\r
 \r
-    void handleAppResumedCallback()\r
+    static void handleMovedOrResizedCallback (JNIEnv*, AndroidComponentPeer& t)\r
     {\r
-        if (isKioskModeComponent())\r
-            setNavBarsHidden (navBarsHidden);\r
+        t.handleMovedOrResized();\r
     }\r
 \r
     //==============================================================================\r
@@ -916,9 +1591,9 @@ public:
         return nullptr;\r
     }\r
 \r
-    jboolean populateAccessibilityNodeInfoCallback (jint virtualViewId, jobject info) const\r
+    static jboolean populateAccessibilityNodeInfoCallback (JNIEnv*, const AndroidComponentPeer& t, jint virtualViewId, jobject info)\r
     {\r
-        if (auto* handle = getNativeHandleForViewId (virtualViewId))\r
+        if (auto* handle = t.getNativeHandleForViewId (virtualViewId))\r
         {\r
             handle->populateNodeInfo (info);\r
             return true;\r
@@ -927,53 +1602,53 @@ public:
         return false;\r
     }\r
 \r
-    jboolean handlePerformActionCallback (jint virtualViewId, jint action, jobject arguments) const\r
+    static jboolean handlePerformActionCallback (JNIEnv*, const AndroidComponentPeer& t, jint virtualViewId, jint action, jobject arguments)\r
     {\r
-        if (auto* handle = getNativeHandleForViewId (virtualViewId))\r
+        if (auto* handle = t.getNativeHandleForViewId (virtualViewId))\r
             return handle->performAction (action, arguments);\r
 \r
         return false;\r
     }\r
 \r
-    static jobject getFocusViewIdForHandler (const AccessibilityHandler* handler)\r
+    static jobject getFocusViewIdForHandler (JNIEnv* env, const AccessibilityHandler* handler)\r
     {\r
         if (handler != nullptr)\r
-            return getEnv()->NewObject (JavaInteger,\r
-                                        JavaInteger.constructor,\r
-                                        handler->getNativeImplementation()->getVirtualViewId());\r
+            return env->NewObject (JavaInteger,\r
+                                   JavaInteger.constructor,\r
+                                   handler->getNativeImplementation()->getVirtualViewId());\r
 \r
         return nullptr;\r
     }\r
 \r
-    jobject getInputFocusViewIdCallback()\r
+    static jobject getInputFocusViewIdCallback (JNIEnv* env, AndroidComponentPeer& t)\r
     {\r
-        if (auto* comp = dynamic_cast<Component*> (findCurrentTextInputTarget()))\r
-            return getFocusViewIdForHandler (comp->getAccessibilityHandler());\r
+        if (auto* comp = dynamic_cast<Component*> (t.findCurrentTextInputTarget()))\r
+            return getFocusViewIdForHandler (env, comp->getAccessibilityHandler());\r
 \r
         return nullptr;\r
     }\r
 \r
-    jobject getAccessibilityFocusViewIdCallback() const\r
+    static jobject getAccessibilityFocusViewIdCallback (JNIEnv* env, const AndroidComponentPeer& t)\r
     {\r
-        if (auto* handler = component.getAccessibilityHandler())\r
+        if (auto* handler = t.component.getAccessibilityHandler())\r
         {\r
             if (auto* modal = Component::getCurrentlyModalComponent())\r
             {\r
-                if (! component.isParentOf (modal)\r
-                     && component.isCurrentlyBlockedByAnotherModalComponent())\r
+                if (! t.component.isParentOf (modal)\r
+                     && t.component.isCurrentlyBlockedByAnotherModalComponent())\r
                 {\r
                     if (auto* modalHandler = modal->getAccessibilityHandler())\r
                     {\r
                         if (auto* focusChild = modalHandler->getChildFocus())\r
-                            return getFocusViewIdForHandler (focusChild);\r
+                            return getFocusViewIdForHandler (env, focusChild);\r
 \r
-                        return getFocusViewIdForHandler (modalHandler);\r
+                        return getFocusViewIdForHandler (env, modalHandler);\r
                     }\r
                 }\r
             }\r
 \r
             if (auto* focusChild = handler->getChildFocus())\r
-                return getFocusViewIdForHandler (focusChild);\r
+                return getFocusViewIdForHandler (env, focusChild);\r
         }\r
 \r
         return nullptr;\r
@@ -994,59 +1669,49 @@ public:
             view.callBooleanMethod (AndroidView.requestFocus);\r
     }\r
 \r
-    void handleFocusChangeCallback (bool hasFocus)\r
+    static void handleFocusChangeCallback (JNIEnv*, AndroidComponentPeer& t, bool hasFocus)\r
     {\r
-        if (isFullScreen())\r
-            setFullScreen (true);\r
+        if (t.isFullScreen())\r
+            t.setFullScreen (true);\r
 \r
         if (hasFocus)\r
-            handleFocusGain();\r
+            t.handleFocusGain();\r
         else\r
-            handleFocusLoss();\r
+            t.handleFocusLoss();\r
     }\r
 \r
-    static const char* getVirtualKeyboardType (TextInputTarget::VirtualKeyboardType type) noexcept\r
+    void textInputRequired (Point<int>, TextInputTarget& target) override\r
     {\r
-        switch (type)\r
-        {\r
-            case TextInputTarget::textKeyboard:          return "text";\r
-            case TextInputTarget::numericKeyboard:       return "number";\r
-            case TextInputTarget::decimalKeyboard:       return "numberDecimal";\r
-            case TextInputTarget::urlKeyboard:           return "textUri";\r
-            case TextInputTarget::emailAddressKeyboard:  return "textEmailAddress";\r
-            case TextInputTarget::phoneNumberKeyboard:   return "phone";\r
-            default:                                     jassertfalse; break;\r
-        }\r
-\r
-        return "text";\r
+        const auto region = target.getHighlightedRegion();\r
+        view.callVoidMethod (ComponentPeerView.showKeyboard,\r
+                             static_cast<jint> (target.getKeyboardType()),\r
+                             static_cast<jint> (region.getStart()),\r
+                             static_cast<jint> (region.getEnd()));\r
     }\r
 \r
-    void textInputRequired (Point<int>, TextInputTarget& target) override\r
+    void closeInputMethodContext() override\r
     {\r
-        view.callVoidMethod (ComponentPeerView.showKeyboard,\r
-                             javaString (getVirtualKeyboardType (target.getKeyboardType())).get());\r
+        getEnv()->CallVoidMethod (view, ComponentPeerView.closeInputMethodContext);\r
     }\r
 \r
     void dismissPendingTextInput() override\r
     {\r
         closeInputMethodContext();\r
 \r
-        view.callVoidMethod (ComponentPeerView.showKeyboard, javaString ("").get());\r
+        view.callVoidMethod (ComponentPeerView.hideKeyboard);\r
 \r
         if (! isTimerRunning())\r
             startTimer (500);\r
     }\r
 \r
     //==============================================================================\r
-    void handleDoFrameCallback ([[maybe_unused]] int64 frameTimeNanos)\r
+    static void handleDoFrameCallback (JNIEnv*, AndroidComponentPeer& t, [[maybe_unused]] int64 frameTimeNanos)\r
     {\r
-        vBlankListeners.call ([] (auto& l) { l.onVBlank(); });\r
+        t.vBlankListeners.call ([] (auto& l) { l.onVBlank(); });\r
     }\r
 \r
-    void handlePaintCallback (jobject canvas, jobject paint)\r
+    static void handlePaintCallback (JNIEnv* env, AndroidComponentPeer& t, jobject canvas, jobject paint)\r
     {\r
-        auto* env = getEnv();\r
-\r
         jobject rect = env->CallObjectMethod (canvas, AndroidCanvas.getClipBounds);\r
         auto left   = env->GetIntField (rect, AndroidRect.left);\r
         auto top    = env->GetIntField (rect, AndroidRect.top);\r
@@ -1061,30 +1726,30 @@ public:
 \r
         auto sizeNeeded = clip.getWidth() * clip.getHeight();\r
 \r
-        if (sizeAllocated < sizeNeeded)\r
+        if (t.sizeAllocated < sizeNeeded)\r
         {\r
-            buffer.clear();\r
-            sizeAllocated = sizeNeeded;\r
-            buffer = GlobalRef (LocalRef<jobject> ((jobject) env->NewIntArray (sizeNeeded)));\r
+            t.buffer.clear();\r
+            t.sizeAllocated = sizeNeeded;\r
+            t.buffer = GlobalRef (LocalRef<jobject> ((jobject) env->NewIntArray (sizeNeeded)));\r
         }\r
 \r
-        if (jint* dest = env->GetIntArrayElements ((jintArray) buffer.get(), nullptr))\r
+        if (jint* dest = env->GetIntArrayElements ((jintArray) t.buffer.get(), nullptr))\r
         {\r
             {\r
                 Image temp (new PreallocatedImage (clip.getWidth(), clip.getHeight(),\r
-                                                   dest, ! component.isOpaque()));\r
+                                                   dest, ! t.component.isOpaque()));\r
 \r
                 {\r
                     LowLevelGraphicsSoftwareRenderer g (temp);\r
                     g.setOrigin (-clip.getPosition());\r
-                    g.addTransform (AffineTransform::scale (scale));\r
-                    handlePaint (g);\r
+                    g.addTransform (AffineTransform::scale (t.scale));\r
+                    t.handlePaint (g);\r
                 }\r
             }\r
 \r
-            env->ReleaseIntArrayElements ((jintArray) buffer.get(), dest, 0);\r
+            env->ReleaseIntArrayElements ((jintArray) t.buffer.get(), dest, 0);\r
 \r
-            env->CallVoidMethod (canvas, AndroidCanvas.drawBitmap, (jintArray) buffer.get(), 0, clip.getWidth(),\r
+            env->CallVoidMethod (canvas, AndroidCanvas.drawBitmap, (jintArray) t.buffer.get(), 0, clip.getWidth(),\r
                                  (jfloat) clip.getX(), (jfloat) clip.getY(),\r
                                  clip.getWidth(), clip.getHeight(), true, paint);\r
         }\r
@@ -1144,83 +1809,140 @@ public:
     };\r
 \r
 private:\r
+    template <auto Member>\r
+    static void mouseCallbackWrapper (JNIEnv*, AndroidComponentPeer& t, jint i, jfloat x, jfloat y, jlong time) { return (t.*Member) (i, Point<float> { x, y }, time); }\r
+\r
     //==============================================================================\r
-    #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
-     METHOD   (create,                           "<init>",                        "(Landroid/content/Context;ZJ)V") \\r
-     METHOD   (clear,                            "clear",                         "()V") \\r
-     METHOD   (setViewName,                      "setViewName",                   "(Ljava/lang/String;)V") \\r
-     METHOD   (setVisible,                       "setVisible",                    "(Z)V") \\r
-     METHOD   (isVisible,                        "isVisible",                     "()Z") \\r
-     METHOD   (containsPoint,                    "containsPoint",                 "(II)Z") \\r
-     METHOD   (showKeyboard,                     "showKeyboard",                  "(Ljava/lang/String;)V") \\r
-     METHOD   (setSystemUiVisibilityCompat,      "setSystemUiVisibilityCompat",   "(I)V")                           \\r
-     CALLBACK (handleDoFrameJni,                 "handleDoFrame",                 "(JJ)V") \\r
-     CALLBACK (handlePaintJni,                   "handlePaint",                   "(JLandroid/graphics/Canvas;Landroid/graphics/Paint;)V") \\r
-     CALLBACK (handleMouseDownJni,               "handleMouseDown",               "(JIFFJ)V") \\r
-     CALLBACK (handleMouseDragJni,               "handleMouseDrag",               "(JIFFJ)V") \\r
-     CALLBACK (handleMouseUpJni,                 "handleMouseUp",                 "(JIFFJ)V") \\r
-     CALLBACK (handleAccessibleHoverJni,         "handleAccessibilityHover",      "(JIFFJ)V") \\r
-     CALLBACK (handleKeyDownJni,                 "handleKeyDown",                 "(JIII)V") \\r
-     CALLBACK (handleKeyUpJni,                   "handleKeyUp",                   "(JII)V") \\r
-     CALLBACK (handleBackButtonJni,              "handleBackButton",              "(J)V") \\r
-     CALLBACK (handleKeyboardHiddenJni,          "handleKeyboardHidden",          "(J)V") \\r
-     CALLBACK (viewSizeChangedJni,               "viewSizeChanged",               "(J)V") \\r
-     CALLBACK (focusChangedJni,                  "focusChanged",                  "(JZ)V") \\r
-     CALLBACK (handleAppPausedJni,               "handleAppPaused",               "(J)V") \\r
-     CALLBACK (handleAppResumedJni,              "handleAppResumed",              "(J)V") \\r
-     CALLBACK (populateAccessibilityNodeInfoJni, "populateAccessibilityNodeInfo", "(JILandroid/view/accessibility/AccessibilityNodeInfo;)Z") \\r
-     CALLBACK (handlePerformActionJni,           "handlePerformAction",           "(JIILandroid/os/Bundle;)Z") \\r
-     CALLBACK (getInputFocusViewIdJni,           "getInputFocusViewId",           "(J)Ljava/lang/Integer;") \\r
-     CALLBACK (getAccessibilityFocusViewIdJni,   "getAccessibilityFocusViewId",   "(J)Ljava/lang/Integer;") \\r
-\r
-    DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/rmsl/juce/ComponentPeerView", 16, javaComponentPeerView, sizeof (javaComponentPeerView))\r
-    #undef JNI_CLASS_MEMBERS\r
-\r
-    static void JNICALL handleDoFrameJni        (JNIEnv*, jobject /*view*/, jlong host, jlong frameTimeNanos)                    { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleDoFrameCallback (frameTimeNanos); }\r
-    static void JNICALL handlePaintJni          (JNIEnv*, jobject /*view*/, jlong host, jobject canvas, jobject paint)           { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handlePaintCallback (canvas, paint); }\r
-    static void JNICALL handleMouseDownJni      (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time)  { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseDownCallback (i, Point<float> ((float) x, (float) y), (int64) time); }\r
-    static void JNICALL handleMouseDragJni      (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time)  { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseDragCallback (i, Point<float> ((float) x, (float) y), (int64) time); }\r
-    static void JNICALL handleMouseUpJni        (JNIEnv*, jobject /*view*/, jlong host, jint i, jfloat x, jfloat y, jlong time)  { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMouseUpCallback   (i, Point<float> ((float) x, (float) y), (int64) time); }\r
-    static void JNICALL handleAccessibleHoverJni(JNIEnv*, jobject /*view*/, jlong host, jint c, jfloat x, jfloat y, jlong time)  { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleAccessibilityHoverCallback ((int) c, Point<float> ((float) x, (float) y), (int64) time); }\r
-    static void JNICALL viewSizeChangedJni      (JNIEnv*, jobject /*view*/, jlong host)                                          { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleMovedOrResized(); }\r
-    static void JNICALL focusChangedJni         (JNIEnv*, jobject /*view*/, jlong host, jboolean hasFocus)                       { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleFocusChangeCallback (hasFocus); }\r
-    static void JNICALL handleKeyDownJni        (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc, jint kbFlags)           { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyDownCallback ((int) k, (int) kc, (int) kbFlags); }\r
-    static void JNICALL handleKeyUpJni          (JNIEnv*, jobject /*view*/, jlong host, jint k, jint kc)                         { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyUpCallback ((int) k, (int) kc); }\r
-    static void JNICALL handleBackButtonJni     (JNIEnv*, jobject /*view*/, jlong host)                                          { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleBackButtonCallback(); }\r
-    static void JNICALL handleKeyboardHiddenJni (JNIEnv*, jobject /*view*/, jlong host)                                          { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyboardHiddenCallback(); }\r
-    static void JNICALL handleAppPausedJni      (JNIEnv*, jobject /*view*/, jlong host)                                          { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleAppPausedCallback(); }\r
-    static void JNICALL handleAppResumedJni     (JNIEnv*, jobject /*view*/, jlong host)                                          { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleAppResumedCallback(); }\r
-\r
-    static jboolean JNICALL populateAccessibilityNodeInfoJni (JNIEnv*, jobject /*view*/, jlong host, jint virtualViewId, jobject info)\r
-    {\r
-        if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))\r
-            return myself->populateAccessibilityNodeInfoCallback (virtualViewId, info);\r
+   #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+    METHOD   (create,                           "<init>",                        "(Landroid/content/Context;ZJ)V") \\r
+    METHOD   (clear,                            "clear",                         "()V") \\r
+    METHOD   (setViewName,                      "setViewName",                   "(Ljava/lang/String;)V") \\r
+    METHOD   (setVisible,                       "setVisible",                    "(Z)V") \\r
+    METHOD   (isVisible,                        "isVisible",                     "()Z") \\r
+    METHOD   (containsPoint,                    "containsPoint",                 "(II)Z") \\r
+    METHOD   (showKeyboard,                     "showKeyboard",                  "(III)V") \\r
+    METHOD   (hideKeyboard,                     "hideKeyboard",                  "()V") \\r
+    METHOD   (closeInputMethodContext,          "closeInputMethodContext",       "()V") \\r
+    METHOD   (setSystemUiVisibilityCompat,      "setSystemUiVisibilityCompat",   "(I)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleDoFrameCallback>,                    "handleDoFrame",                                    "(JJ)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handlePaintCallback>,                      "handlePaint",                                      "(JLandroid/graphics/Canvas;Landroid/graphics/Paint;)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyDownCallback>,                    "handleKeyDown",                                    "(JIII)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyUpCallback>,                      "handleKeyUp",                                      "(JII)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleBackButtonCallback>,                 "handleBackButton",                                 "(J)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleKeyboardHiddenCallback>,             "handleKeyboardHidden",                             "(J)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleGetFocusedTextInputTargetCallback>,  "getFocusedTextInputTargetPointer",                 "(J)J") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleMovedOrResizedCallback>,             "viewSizeChanged",                                  "(J)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleFocusChangeCallback>,                "focusChanged",                                     "(JZ)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleAppPausedCallback>,                  "handleAppPaused",                                  "(J)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handleAppResumedCallback>,                 "handleAppResumed",                                 "(J)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::populateAccessibilityNodeInfoCallback>,    "populateAccessibilityNodeInfo",                    "(JILandroid/view/accessibility/AccessibilityNodeInfo;)Z") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::handlePerformActionCallback>,              "handlePerformAction",                              "(JIILandroid/os/Bundle;)Z") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::getInputFocusViewIdCallback>,              "getInputFocusViewId",                              "(J)Ljava/lang/Integer;") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::getAccessibilityFocusViewIdCallback>,      "getAccessibilityFocusViewId",                      "(J)Ljava/lang/Integer;") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetIsTextInputActive>,         "textInputTargetIsTextInputActive",                 "(J)Z") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetHighlightedRegionBegin>, "textInputTargetGetHighlightedRegionBegin",         "(J)I") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetHighlightedRegionEnd>,   "textInputTargetGetHighlightedRegionEnd",           "(J)I") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetSetHighlightedRegion>,      "textInputTargetSetHighlightedRegion",              "(JII)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetTextInRange>,            "textInputTargetGetTextInRange",                    "(JII)Ljava/lang/String;") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetInsertTextAtCaret>,         "textInputTargetInsertTextAtCaret",                 "(JLjava/lang/String;)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetCaretPosition>,          "textInputTargetGetCaretPosition",                  "(J)I") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetTotalNumChars>,          "textInputTargetGetTotalNumChars",                  "(J)I") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetCharIndexForPoint>,      "textInputTargetGetCharIndexForPoint",              "(JLandroid/graphics/Point;)I") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetGetKeyboardType>,           "textInputTargetGetKeyboardType",                   "(J)I") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::textInputTargetSetTemporaryUnderlining>,   "textInputTargetSetTemporaryUnderlining",           "(JLjava/util/List;)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseDownCallback>>,          "handleMouseDown",               "(JIFFJ)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseDragCallback>>,          "handleMouseDrag",               "(JIFFJ)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleMouseUpCallback>>,            "handleMouseUp",                 "(JIFFJ)V") \\r
+    CALLBACK (generatedCallback<&AndroidComponentPeer::mouseCallbackWrapper<&AndroidComponentPeer::handleAccessibilityHoverCallback>>, "handleAccessibilityHover",      "(JIFFJ)V") \\r
 \r
-        return false;\r
+    DECLARE_JNI_CLASS_WITH_BYTECODE (ComponentPeerView, "com/rmsl/juce/ComponentPeerView", 16, javaComponentPeerView)\r
+   #undef JNI_CLASS_MEMBERS\r
+\r
+    static jboolean textInputTargetIsTextInputActive (JNIEnv*, const TextInputTarget& t)\r
+    {\r
+        return t.isTextInputActive();\r
     }\r
 \r
-    static jboolean JNICALL handlePerformActionJni (JNIEnv*, jobject /*view*/, jlong host, jint virtualViewId, jint action, jobject arguments)\r
+    static jint textInputTargetGetHighlightedRegionBegin (JNIEnv*, const TextInputTarget& t)\r
     {\r
-        if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))\r
-            return myself->handlePerformActionCallback (virtualViewId, action, arguments);\r
+        return t.getHighlightedRegion().getStart();\r
+    }\r
 \r
-        return false;\r
+    static jint textInputTargetGetHighlightedRegionEnd (JNIEnv*, const TextInputTarget& t)\r
+    {\r
+        return t.getHighlightedRegion().getEnd();\r
     }\r
 \r
-    static jobject JNICALL getInputFocusViewIdJni (JNIEnv*, jobject /*view*/, jlong host)\r
+    static void textInputTargetSetHighlightedRegion (JNIEnv*, TextInputTarget& t, jint b, jint e)\r
     {\r
-        if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))\r
-            return myself->getInputFocusViewIdCallback();\r
+        t.setHighlightedRegion ({ b, e });\r
+    }\r
 \r
-        return nullptr;\r
+    static jstring textInputTargetGetTextInRange (JNIEnv* env, const TextInputTarget& t, jint b, jint e)\r
+    {\r
+        return env->NewStringUTF (t.getTextInRange ({ b, e }).toUTF8());\r
     }\r
 \r
-    static jobject JNICALL getAccessibilityFocusViewIdJni (JNIEnv*, jobject /*view*/, jlong host)\r
+    static void textInputTargetInsertTextAtCaret (JNIEnv*, TextInputTarget& t, jstring text)\r
     {\r
-        if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host))\r
-            return myself->getAccessibilityFocusViewIdCallback();\r
+        t.insertTextAtCaret (juceString (text));\r
+    }\r
 \r
-        return nullptr;\r
+    static jint textInputTargetGetCaretPosition (JNIEnv*, const TextInputTarget& t)\r
+    {\r
+        return t.getCaretPosition();\r
+    }\r
+\r
+    static jint textInputTargetGetTotalNumChars (JNIEnv*, const TextInputTarget& t)\r
+    {\r
+        return t.getTotalNumChars();\r
+    }\r
+\r
+    static jint textInputTargetGetCharIndexForPoint (JNIEnv* env, const TextInputTarget& t, jobject point)\r
+    {\r
+        return t.getCharIndexForPoint ({ env->GetIntField (point, AndroidPoint.x),\r
+                                         env->GetIntField (point, AndroidPoint.y) });\r
+    }\r
+\r
+    static jint textInputTargetGetKeyboardType (JNIEnv*, TextInputTarget& t)\r
+    {\r
+        return t.getKeyboardType();\r
+    }\r
+\r
+    static std::optional<Range<int>> getRangeFromPair (JNIEnv* env, jobject pair)\r
+    {\r
+        if (pair == nullptr)\r
+            return {};\r
+\r
+        const auto first  = env->GetObjectField (pair, AndroidPair.first);\r
+        const auto second = env->GetObjectField (pair, AndroidPair.second);\r
+\r
+        if (first == nullptr || second == nullptr)\r
+            return {};\r
+\r
+        const auto begin = env->CallIntMethod (first,  JavaInteger.intValue);\r
+        const auto end   = env->CallIntMethod (second, JavaInteger.intValue);\r
+\r
+        return Range<int> { begin, end };\r
+    }\r
+\r
+    static Array<Range<int>> javaListOfPairToArrayOfRange (JNIEnv* env, jobject list)\r
+    {\r
+        if (list == nullptr)\r
+            return {};\r
+\r
+        Array<Range<int>> result;\r
+\r
+        for (jint i = 0; i < env->CallIntMethod (list, JavaList.size); ++i)\r
+            if (const auto range = getRangeFromPair (env, env->CallObjectMethod (list, JavaList.get, i)))\r
+                result.add (*range);\r
+\r
+        return result;\r
+    }\r
+\r
+    static void textInputTargetSetTemporaryUnderlining (JNIEnv* env, TextInputTarget& t, jobject list)\r
+    {\r
+        t.setTemporaryUnderlining (javaListOfPairToArrayOfRange (env, list));\r
     }\r
 \r
     //==============================================================================\r
@@ -1390,7 +2112,6 @@ Point<float> AndroidComponentPeer::lastMousePos;
 int64 AndroidComponentPeer::touchesDown = 0;\r
 AndroidComponentPeer* AndroidComponentPeer::frontWindow = nullptr;\r
 GlobalRef AndroidComponentPeer::activityCallbackListener;\r
-AndroidComponentPeer::ComponentPeerView_Class AndroidComponentPeer::ComponentPeerView;\r
 \r
 //==============================================================================\r
 ComponentPeer* Component::createNewPeer (int styleFlags, void* nativeWindow)\r
@@ -1799,10 +2520,8 @@ bool Desktop::isScreenSaverEnabled()
 }\r
 \r
 //==============================================================================\r
-void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, bool allowMenusAndBars)\r
+void Desktop::setKioskComponent (Component* kioskComp, bool enableOrDisable, [[maybe_unused]] bool allowMenusAndBars)\r
 {\r
-    ignoreUnused (allowMenusAndBars);\r
-\r
     if (AndroidComponentPeer* peer = dynamic_cast<AndroidComponentPeer*> (kioskComp->getPeer()))\r
         peer->setFullScreen (enableOrDisable);\r
     else\r
@@ -1930,7 +2649,7 @@ void Displays::findDisplays (float masterScale)
 {\r
     auto* env = getEnv();\r
 \r
-    LocalRef<jobject> usableSize (env->NewObject (AndroidPoint, AndroidPoint.create, 0, 0));\r
+    LocalRef<jobject> usableSize (makeAndroidPoint ({}));\r
     LocalRef<jstring> windowServiceString (javaString ("window"));\r
     LocalRef<jobject> displayMetrics (env->NewObject (AndroidDisplayMetrics, AndroidDisplayMetrics.create));\r
     LocalRef<jobject> windowManager (env->CallObjectMethod (getAppContext().get(), AndroidContext.getSystemService, windowServiceString.get()));\r
@@ -2181,8 +2900,6 @@ const int KeyPress::rewindKey               = extendedKeyModifier + 72;
          juce_handleOnResume();\r
      }\r
  };\r
-\r
- JuceActivityNewIntentListener::JavaActivity_Class JuceActivityNewIntentListener::JavaActivity;\r
 #endif\r
 \r
 } // namespace juce\r
index 8aea94480450efa6beb68d9f8b222f58ed694fdd..04203b55b880be81e975bc08c8a69e236b2d4e9b 100644 (file)
@@ -104,12 +104,9 @@ private:
 \r
         controller.get().excludedActivityTypes = nil;\r
 \r
-        controller.get().completionWithItemsHandler = ^ (UIActivityType type, BOOL completed,\r
-                                                         NSArray* returnedItems, NSError* error)\r
+        controller.get().completionWithItemsHandler = ^([[maybe_unused]] UIActivityType type, BOOL completed,\r
+                                                        [[maybe_unused]] NSArray* returnedItems, NSError* error)\r
         {\r
-            ignoreUnused (type);\r
-            ignoreUnused (returnedItems);\r
-\r
             succeeded = completed;\r
 \r
             if (error != nil)\r
index 3f33a8b71b24fdb2e39ba00a4748cad426582f25..47b5690eddbf9e3727ee985c0bc511282bb1393f 100644 (file)
@@ -137,8 +137,7 @@ public:
         {\r
             if (err != nil)\r
             {\r
-                auto desc = [err localizedDescription];\r
-                ignoreUnused (desc);\r
+                [[maybe_unused]] auto desc = [err localizedDescription];\r
                 jassertfalse;\r
                 return;\r
             }\r
@@ -168,8 +167,7 @@ public:
                 }\r
                 else\r
                 {\r
-                    auto desc = [error localizedDescription];\r
-                    ignoreUnused (desc);\r
+                    [[maybe_unused]] auto desc = [error localizedDescription];\r
                     jassertfalse;\r
                 }\r
 \r
index aad028dae19d11cacba69d0b01a906d85ff3caac..3d40104a7fbd6a74917dd44badd148d34d9aed21 100644 (file)
  #define JUCE_HAS_IOS_POINTER_SUPPORT 0\r
 #endif\r
 \r
+#if defined (__IPHONE_13_4) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_4\r
+ #define JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT 1\r
+#else\r
+ #define JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT 0\r
+#endif\r
+\r
 namespace juce\r
 {\r
 \r
@@ -69,6 +75,30 @@ static NSArray* getContainerAccessibilityElements (AccessibilityHandler& handler
 \r
 class UIViewComponentPeer;\r
 \r
+namespace iOSGlobals\r
+{\r
+#if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT\r
+class KeysCurrentlyDown\r
+{\r
+public:\r
+    bool isDown (int x) const { return down.find (x) != down.cend(); }\r
+\r
+    void setDown (int x, bool b)\r
+    {\r
+        if (b)\r
+            down.insert (x);\r
+        else\r
+            down.erase (x);\r
+    }\r
+\r
+private:\r
+    std::set<int> down;\r
+};\r
+static KeysCurrentlyDown keysCurrentlyDown;\r
+#endif\r
+static UIViewComponentPeer* currentlyFocusedPeer = nullptr;\r
+} // namespace iOSGlobals\r
+\r
 static UIInterfaceOrientation getWindowOrientation()\r
 {\r
     UIApplication* sharedApplication = [UIApplication sharedApplication];\r
@@ -403,8 +433,6 @@ public:
     void dismissPendingTextInput() override;\r
     void closeInputMethodContext() override;\r
 \r
-    BOOL textViewReplaceCharacters (Range<int>, const String&);\r
-\r
     void updateScreenBounds();\r
 \r
     void handleTouches (UIEvent*, MouseEventFlags);\r
@@ -414,6 +442,23 @@ public:
     void onScroll (UIPanGestureRecognizer*);\r
    #endif\r
 \r
+    Range<int> getMarkedTextRange() const\r
+    {\r
+        return Range<int>::withStartAndLength (startOfMarkedTextInTextInputTarget,\r
+                                               stringBeingComposed.length());\r
+    }\r
+\r
+    void replaceMarkedRangeWithText (TextInputTarget* target, const String& text)\r
+    {\r
+        if (stringBeingComposed.isNotEmpty())\r
+            target->setHighlightedRegion (getMarkedTextRange());\r
+\r
+        target->insertTextAtCaret (text);\r
+        target->setTemporaryUnderlining ({ Range<int>::withStartAndLength (startOfMarkedTextInTextInputTarget,\r
+                                                                           text.length()) });\r
+        stringBeingComposed = text;\r
+    }\r
+\r
     //==============================================================================\r
     void repaint (const Rectangle<int>& area) override;\r
     void performAnyPendingRepaintsNow() override;\r
@@ -424,6 +469,7 @@ public:
     UIViewController* controller = nil;\r
     const bool isSharedWindow, isAppex;\r
     String stringBeingComposed;\r
+    int startOfMarkedTextInTextInputTarget = 0;\r
     bool fullScreen = false, insideDrawRect = false;\r
     NSUniquePtr<JuceTextView> hiddenTextInput { [[JuceTextView alloc] initWithOwner: this] };\r
     NSUniquePtr<JuceTextInputTokenizer> tokenizer { [[JuceTextInputTokenizer alloc] initWithPeer: this] };\r
@@ -456,9 +502,10 @@ public:
             case TextInputTarget::urlKeyboard:           return UIKeyboardTypeURL;\r
             case TextInputTarget::emailAddressKeyboard:  return UIKeyboardTypeEmailAddress;\r
             case TextInputTarget::phoneNumberKeyboard:   return UIKeyboardTypePhonePad;\r
-            default:                                     jassertfalse; break;\r
+            case TextInputTarget::passwordKeyboard:      return UIKeyboardTypeASCIICapable;\r
         }\r
 \r
+        jassertfalse;\r
         return UIKeyboardTypeDefault;\r
     }\r
 \r
@@ -746,6 +793,172 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
 }\r
 #endif\r
 \r
+static std::optional<int> getKeyCodeForSpecialCharacterString (StringRef characters)\r
+{\r
+    static const auto map = [&]\r
+    {\r
+        std::map<String, int> result { { nsStringToJuce (UIKeyInputUpArrow),       KeyPress::upKey },\r
+                                       { nsStringToJuce (UIKeyInputDownArrow),     KeyPress::downKey },\r
+                                       { nsStringToJuce (UIKeyInputLeftArrow),     KeyPress::leftKey },\r
+                                       { nsStringToJuce (UIKeyInputRightArrow),    KeyPress::rightKey },\r
+                                       { nsStringToJuce (UIKeyInputEscape),        KeyPress::escapeKey },\r
+                                       { nsStringToJuce (UIKeyInputPageUp),        KeyPress::pageUpKey },\r
+                                       { nsStringToJuce (UIKeyInputPageDown),      KeyPress::pageDownKey } };\r
+\r
+       #if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT\r
+        if (@available (iOS 13.4, *))\r
+        {\r
+            result.insert ({ { nsStringToJuce (UIKeyInputHome),          KeyPress::homeKey },\r
+                             { nsStringToJuce (UIKeyInputEnd),           KeyPress::endKey },\r
+                             { nsStringToJuce (UIKeyInputF1),            KeyPress::F1Key },\r
+                             { nsStringToJuce (UIKeyInputF2),            KeyPress::F2Key },\r
+                             { nsStringToJuce (UIKeyInputF3),            KeyPress::F3Key },\r
+                             { nsStringToJuce (UIKeyInputF4),            KeyPress::F4Key },\r
+                             { nsStringToJuce (UIKeyInputF5),            KeyPress::F5Key },\r
+                             { nsStringToJuce (UIKeyInputF6),            KeyPress::F6Key },\r
+                             { nsStringToJuce (UIKeyInputF7),            KeyPress::F7Key },\r
+                             { nsStringToJuce (UIKeyInputF8),            KeyPress::F8Key },\r
+                             { nsStringToJuce (UIKeyInputF9),            KeyPress::F9Key },\r
+                             { nsStringToJuce (UIKeyInputF10),           KeyPress::F10Key },\r
+                             { nsStringToJuce (UIKeyInputF11),           KeyPress::F11Key },\r
+                             { nsStringToJuce (UIKeyInputF12),           KeyPress::F12Key } });\r
+        }\r
+       #endif\r
+\r
+       #if defined (__IPHONE_15_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0\r
+        if (@available (iOS 15.0, *))\r
+        {\r
+            result.insert ({ { nsStringToJuce (UIKeyInputDelete),        KeyPress::deleteKey } });\r
+        }\r
+       #endif\r
+\r
+        return result;\r
+    }();\r
+\r
+    const auto iter = map.find (characters);\r
+    return iter != map.cend() ? std::make_optional (iter->second) : std::nullopt;\r
+}\r
+\r
+#if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT\r
+static int getKeyCodeForCharacters (StringRef unmodified)\r
+{\r
+    return getKeyCodeForSpecialCharacterString (unmodified).value_or (unmodified[0]);\r
+}\r
+\r
+static int getKeyCodeForCharacters (NSString* characters)\r
+{\r
+    return getKeyCodeForCharacters (nsStringToJuce (characters));\r
+}\r
+\r
+static void updateModifiers (const UIKeyModifierFlags flags)\r
+{\r
+    const auto convert = [&flags] (UIKeyModifierFlags f, int result) { return (flags & f) != 0 ? result : 0; };\r
+    const auto juceFlags = convert (UIKeyModifierAlphaShift, 0) // capslock modifier currently not implemented\r
+                         | convert (UIKeyModifierShift,      ModifierKeys::shiftModifier)\r
+                         | convert (UIKeyModifierControl,    ModifierKeys::ctrlModifier)\r
+                         | convert (UIKeyModifierAlternate,  ModifierKeys::altModifier)\r
+                         | convert (UIKeyModifierCommand,    ModifierKeys::commandModifier)\r
+                         | convert (UIKeyModifierNumericPad, 0); // numpad modifier currently not implemented\r
+\r
+    ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons().withFlags (juceFlags);\r
+}\r
+\r
+API_AVAILABLE (ios(13.4))\r
+static int getKeyCodeForKey (UIKey* key)\r
+{\r
+    return getKeyCodeForCharacters ([key charactersIgnoringModifiers]);\r
+}\r
+\r
+API_AVAILABLE (ios(13.4))\r
+static bool attemptToConsumeKeys (JuceUIView* view, NSSet<UIPress*>* presses)\r
+{\r
+    auto used = false;\r
+\r
+    for (UIPress* press in presses)\r
+    {\r
+        if (auto* key = [press key])\r
+        {\r
+            const auto code = getKeyCodeForKey (key);\r
+            const auto handleCodepoint = [view, &used, code] (juce_wchar codepoint)\r
+            {\r
+                // These both need to fire; no short-circuiting!\r
+                used |= view->owner->handleKeyUpOrDown (true);\r
+                used |= view->owner->handleKeyPress (code, codepoint);\r
+            };\r
+\r
+            if (getKeyCodeForSpecialCharacterString (nsStringToJuce ([key charactersIgnoringModifiers])).has_value())\r
+                handleCodepoint (0);\r
+            else\r
+                for (const auto codepoint : nsStringToJuce ([key characters]))\r
+                    handleCodepoint (codepoint);\r
+        }\r
+    }\r
+\r
+    return used;\r
+}\r
+\r
+- (void) pressesBegan:(NSSet<UIPress*>*) presses withEvent:(UIPressesEvent*) event\r
+{\r
+    const auto handledEvent = [&]\r
+    {\r
+        if (@available (iOS 13.4, *))\r
+        {\r
+            auto isEscape = false;\r
+\r
+            updateModifiers ([event modifierFlags]);\r
+\r
+            for (UIPress* press in presses)\r
+            {\r
+                if (auto* key = [press key])\r
+                {\r
+                    const auto code = getKeyCodeForKey (key);\r
+                    isEscape |= code == KeyPress::escapeKey;\r
+                    iOSGlobals::keysCurrentlyDown.setDown (code, true);\r
+                }\r
+            }\r
+\r
+            return ((isEscape && owner->stringBeingComposed.isEmpty())\r
+                    || owner->findCurrentTextInputTarget() == nullptr)\r
+                   && attemptToConsumeKeys (self, presses);\r
+        }\r
+\r
+        return false;\r
+    }();\r
+\r
+    if (! handledEvent)\r
+        [super pressesBegan: presses withEvent: event];\r
+}\r
+\r
+/*  Returns true if we handled the event. */\r
+static bool doKeysUp (UIViewComponentPeer* owner, NSSet<UIPress*>* presses, UIPressesEvent* event)\r
+{\r
+    if (@available (iOS 13.4, *))\r
+    {\r
+        updateModifiers ([event modifierFlags]);\r
+\r
+        for (UIPress* press in presses)\r
+            if (auto* key = [press key])\r
+                iOSGlobals::keysCurrentlyDown.setDown (getKeyCodeForKey (key), false);\r
+\r
+        return owner->findCurrentTextInputTarget() == nullptr && owner->handleKeyUpOrDown (false);\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
+- (void) pressesEnded:(NSSet<UIPress*>*) presses withEvent:(UIPressesEvent*) event\r
+{\r
+    if (! doKeysUp (owner, presses, event))\r
+        [super pressesEnded: presses withEvent: event];\r
+}\r
+\r
+- (void) pressesCancelled:(NSSet<UIPress*>*) presses withEvent:(UIPressesEvent*) event\r
+{\r
+    if (! doKeysUp (owner, presses, event))\r
+        [super pressesCancelled: presses withEvent: event];\r
+}\r
+#endif\r
+\r
 //==============================================================================\r
 - (BOOL) becomeFirstResponder\r
 {\r
@@ -932,10 +1145,48 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
     if (owner == nullptr)\r
         return;\r
 \r
-    owner->stringBeingComposed.clear();\r
-\r
     if (auto* target = owner->findCurrentTextInputTarget())\r
-        target->insertTextAtCaret (nsStringToJuce (text));\r
+    {\r
+        // If we're in insertText, it's because there's a focused TextInputTarget,\r
+        // and key presses from pressesBegan and pressesEnded have been composed\r
+        // into a string that is now ready for insertion.\r
+        // Because JUCE has been passing key events to the system for composition, it\r
+        // won't have been processing those key presses itself, so it may not have had\r
+        // a chance to process keys like return/tab/etc.\r
+        // It's not possible to filter out these keys during pressesBegan, because they\r
+        // may form part of a longer composition sequence.\r
+        // e.g. when entering Japanese text, the return key may be used to select an option\r
+        // from the IME menu, and in this situation the return key should not be propagated\r
+        // to the JUCE view.\r
+        // If we receive a special character (return/tab/etc.) in insertText, it can\r
+        // only be because the composition has finished, so we can turn the event into\r
+        // a KeyPress and trust the current TextInputTarget to process it correctly.\r
+        const auto redirectKeyPresses = [&] (juce_wchar codepoint)\r
+        {\r
+            // Simulate a key down\r
+            const auto code = getKeyCodeForCharacters (String::charToString (codepoint));\r
+            iOSGlobals::keysCurrentlyDown.setDown (code, true);\r
+            owner->handleKeyUpOrDown (true);\r
+\r
+            owner->handleKeyPress (code, codepoint);\r
+\r
+            // Simulate a key up\r
+            iOSGlobals::keysCurrentlyDown.setDown (code, false);\r
+            owner->handleKeyUpOrDown (false);\r
+        };\r
+\r
+        if ([text isEqual: @"\n"] || [text isEqual: @"\r"])\r
+            redirectKeyPresses ('\r');\r
+        else if ([text isEqual: @"\t"])\r
+            redirectKeyPresses ('\t');\r
+        else\r
+            owner->replaceMarkedRangeWithText (target, nsStringToJuce (text));\r
+\r
+        target->setTemporaryUnderlining ({});\r
+    }\r
+\r
+    owner->stringBeingComposed.clear();\r
+    owner->startOfMarkedTextInTextInputTarget = 0;\r
 }\r
 \r
 - (BOOL) hasText\r
@@ -974,7 +1225,7 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
 {\r
     if (owner != nullptr && owner->stringBeingComposed.isNotEmpty())\r
         if (auto* target = owner->findCurrentTextInputTarget())\r
-            return [JuceUITextRange withRange: target->getHighlightedRegion()];\r
+            return [JuceUITextRange withRange: owner->getMarkedTextRange()];\r
 \r
     return nil;\r
 }\r
@@ -982,22 +1233,24 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
 - (void) setMarkedText: (NSString*) markedText\r
          selectedRange: (NSRange) selectedRange\r
 {\r
-    ignoreUnused (selectedRange);\r
-\r
     if (owner == nullptr)\r
         return;\r
 \r
-    owner->stringBeingComposed = nsStringToJuce (markedText);\r
+    const auto newMarkedText = nsStringToJuce (markedText);\r
+    const ScopeGuard scope { [&] { owner->stringBeingComposed = newMarkedText; } };\r
 \r
     auto* target = owner->findCurrentTextInputTarget();\r
 \r
     if (target == nullptr)\r
         return;\r
 \r
-    const auto currentHighlight = target->getHighlightedRegion();\r
-    target->insertTextAtCaret (owner->stringBeingComposed);\r
-    target->setHighlightedRegion (currentHighlight.withLength (0));\r
-    target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
+    if (owner->stringBeingComposed.isEmpty())\r
+        owner->startOfMarkedTextInTextInputTarget = target->getHighlightedRegion().getStart();\r
+\r
+    owner->replaceMarkedRangeWithText (target, newMarkedText);\r
+\r
+    const auto newSelection = nsRangeToJuce (selectedRange) + owner->startOfMarkedTextInTextInputTarget;\r
+    target->setHighlightedRegion (newSelection);\r
 }\r
 \r
 - (void) unmarkText\r
@@ -1010,8 +1263,10 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
     if (target == nullptr)\r
         return;\r
 \r
-    target->insertTextAtCaret (owner->stringBeingComposed);\r
+    owner->replaceMarkedRangeWithText (target, owner->stringBeingComposed);\r
+    target->setTemporaryUnderlining ({});\r
     owner->stringBeingComposed.clear();\r
+    owner->startOfMarkedTextInTextInputTarget = 0;\r
 }\r
 \r
 - (NSDictionary<NSAttributedStringKey, id>*) markedTextStyle\r
@@ -1374,9 +1629,15 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
 namespace juce\r
 {\r
 \r
-bool KeyPress::isKeyCurrentlyDown (int)\r
+bool KeyPress::isKeyCurrentlyDown (int keyCode)\r
 {\r
+   #if JUCE_HAS_IOS_HARDWARE_KEYBOARD_SUPPORT\r
+    return iOSGlobals::keysCurrentlyDown.isDown (keyCode)\r
+        || ('A' <= keyCode && keyCode <= 'Z' && iOSGlobals::keysCurrentlyDown.isDown ((int) CharacterFunctions::toLowerCase ((juce_wchar) keyCode)))\r
+        || ('a' <= keyCode && keyCode <= 'z' && iOSGlobals::keysCurrentlyDown.isDown ((int) CharacterFunctions::toUpperCase ((juce_wchar) keyCode)));\r
+   #else\r
     return false;\r
+   #endif\r
 }\r
 \r
 Point<float> juce_lastMousePos;\r
@@ -1398,7 +1659,10 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags,
 \r
    #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS\r
     if (@available (iOS 13, *))\r
-        metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<UIView>> (view, comp.isOpaque());\r
+    {\r
+        metalRenderer = CoreGraphicsMetalLayerRenderer<UIView>::create (view, comp.isOpaque());\r
+        jassert (metalRenderer != nullptr);\r
+    }\r
    #endif\r
 \r
     if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0)\r
@@ -1435,12 +1699,10 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags,
     setVisible (component.isVisible());\r
 }\r
 \r
-static UIViewComponentPeer* currentlyFocusedPeer = nullptr;\r
-\r
 UIViewComponentPeer::~UIViewComponentPeer()\r
 {\r
-    if (currentlyFocusedPeer == this)\r
-        currentlyFocusedPeer = nullptr;\r
+    if (iOSGlobals::currentlyFocusedPeer == this)\r
+        iOSGlobals::currentlyFocusedPeer = nullptr;\r
 \r
     currentTouches.deleteAllTouchesForPeer (this);\r
 \r
@@ -1658,6 +1920,11 @@ void UIViewComponentPeer::handleTouches (UIEvent* event, MouseEventFlags mouseEv
     if (event == nullptr)\r
         return;\r
 \r
+    if (@available (iOS 13.4, *))\r
+    {\r
+        updateModifiers ([event modifierFlags]);\r
+    }\r
+\r
     NSArray* touches = [[event touchesForView: view] allObjects];\r
 \r
     for (unsigned int i = 0; i < [touches count]; ++i)\r
@@ -1773,12 +2040,12 @@ void UIViewComponentPeer::onScroll (UIPanGestureRecognizer* gesture)
 //==============================================================================\r
 void UIViewComponentPeer::viewFocusGain()\r
 {\r
-    if (currentlyFocusedPeer != this)\r
+    if (iOSGlobals::currentlyFocusedPeer != this)\r
     {\r
-        if (ComponentPeer::isValidPeer (currentlyFocusedPeer))\r
-            currentlyFocusedPeer->handleFocusLoss();\r
+        if (ComponentPeer::isValidPeer (iOSGlobals::currentlyFocusedPeer))\r
+            iOSGlobals::currentlyFocusedPeer->handleFocusLoss();\r
 \r
-        currentlyFocusedPeer = this;\r
+        iOSGlobals::currentlyFocusedPeer = this;\r
 \r
         handleFocusGain();\r
     }\r
@@ -1786,9 +2053,9 @@ void UIViewComponentPeer::viewFocusGain()
 \r
 void UIViewComponentPeer::viewFocusLoss()\r
 {\r
-    if (currentlyFocusedPeer == this)\r
+    if (iOSGlobals::currentlyFocusedPeer == this)\r
     {\r
-        currentlyFocusedPeer = nullptr;\r
+        iOSGlobals::currentlyFocusedPeer = nullptr;\r
         handleFocusLoss();\r
     }\r
 }\r
@@ -1798,7 +2065,7 @@ bool UIViewComponentPeer::isFocused() const
     if (isAppex)\r
         return true;\r
 \r
-    return isSharedWindow ? this == currentlyFocusedPeer\r
+    return isSharedWindow ? this == iOSGlobals::currentlyFocusedPeer\r
                           : (window != nil && [window isKeyWindow]);\r
 }\r
 \r
@@ -1813,6 +2080,10 @@ void UIViewComponentPeer::grabFocus()
 \r
 void UIViewComponentPeer::textInputRequired (Point<int>, TextInputTarget&)\r
 {\r
+    // We need to restart the text input session so that the keyboard can change types if necessary.\r
+    if ([hiddenTextInput.get() isFirstResponder])\r
+        [hiddenTextInput.get() resignFirstResponder];\r
+\r
     [hiddenTextInput.get() becomeFirstResponder];\r
 }\r
 \r
@@ -1834,27 +2105,6 @@ void UIViewComponentPeer::dismissPendingTextInput()
     [hiddenTextInput.get() resignFirstResponder];\r
 }\r
 \r
-BOOL UIViewComponentPeer::textViewReplaceCharacters (Range<int> range, const String& text)\r
-{\r
-    if (auto* target = findCurrentTextInputTarget())\r
-    {\r
-        auto currentSelection = target->getHighlightedRegion();\r
-\r
-        if (range.getLength() == 1 && text.isEmpty()) // (detect backspace)\r
-            if (currentSelection.isEmpty())\r
-                target->setHighlightedRegion (currentSelection.withStart (currentSelection.getStart() - 1));\r
-\r
-        WeakReference<Component> deletionChecker (dynamic_cast<Component*> (target));\r
-\r
-        if (text == "\r" || text == "\n" || text == "\r\n")\r
-            handleKeyPress (KeyPress::returnKey, text[0]);\r
-        else\r
-            target->insertTextAtCaret (text);\r
-    }\r
-\r
-    return NO;\r
-}\r
-\r
 //==============================================================================\r
 void UIViewComponentPeer::displayLinkCallback()\r
 {\r
index 4b254a466b21a73c1f53031749f69131a8103df0..6fffc44e701f4ee52c59cc0c1d43502930887c0c 100644 (file)
@@ -480,7 +480,7 @@ public:
         : callback (std::move (cb)),\r
           shouldDeleteThis (deleteOnCompletion)\r
     {\r
-        if (currentlyFocusedPeer != nullptr)\r
+        if (iOSGlobals::currentlyFocusedPeer != nullptr)\r
         {\r
             UIAlertController* alert = [UIAlertController alertControllerWithTitle: juceStringToNS (opts.getTitle())\r
                                                                            message: juceStringToNS (opts.getMessage())\r
@@ -490,9 +490,9 @@ public:
             addButton (alert, opts.getButtonText (1));\r
             addButton (alert, opts.getButtonText (2));\r
 \r
-            [currentlyFocusedPeer->controller presentViewController: alert\r
-                                                           animated: YES\r
-                                                         completion: nil];\r
+            [iOSGlobals::currentlyFocusedPeer->controller presentViewController: alert\r
+                                                                       animated: YES\r
+                                                                     completion: nil];\r
         }\r
         else\r
         {\r
index 29d702f4f6d9eb80a998d64728f9bc3be8a81346..f1e71c00278efa6cb5f0a20e8dcb009f60e1f8e9 100644 (file)
@@ -61,6 +61,8 @@ public:
             xSettings->addListener (this);\r
 \r
         getNativeRealtimeModifiers = []() -> ModifierKeys { return XWindowSystem::getInstance()->getNativeRealtimeModifiers(); };\r
+\r
+        updateVBlankTimer();\r
     }\r
 \r
     ~LinuxComponentPeer() override\r
@@ -392,6 +394,15 @@ public:
         }\r
     }\r
 \r
+    bool setWindowAssociation (::Window windowIn)\r
+    {\r
+        clearWindowAssociation();\r
+        association = { this, windowIn };\r
+        return association.isValid();\r
+    }\r
+\r
+    void clearWindowAssociation() { association = {}; }\r
+\r
     //==============================================================================\r
     static bool isActiveApplication;\r
     bool focused = false;\r
@@ -571,13 +582,13 @@ private:
     {\r
         if (auto* display = Desktop::getInstance().getDisplays().getDisplayForRect (bounds))\r
         {\r
-            if (display->verticalFrequencyHz)\r
-            {\r
-                const auto newIntFrequencyHz = roundToInt (*display->verticalFrequencyHz);\r
+            // Some systems fail to set an explicit refresh rate, or ask for a refresh rate of 0\r
+            // (observed on Raspbian Bullseye over VNC). In these situations, use a fallback value.\r
+            const auto newIntFrequencyHz = roundToInt (display->verticalFrequencyHz.value_or (0.0));\r
+            const auto frequencyToUse = newIntFrequencyHz != 0 ? newIntFrequencyHz : 100;\r
 \r
-                if (vBlankManager.getTimerInterval() != newIntFrequencyHz)\r
-                    vBlankManager.startTimerHz (newIntFrequencyHz);\r
-            }\r
+            if (vBlankManager.getTimerInterval() != frequencyToUse)\r
+                vBlankManager.startTimerHz (frequencyToUse);\r
         }\r
     }\r
 \r
@@ -591,6 +602,7 @@ private:
     bool fullScreen = false, isAlwaysOnTop = false;\r
     double currentScaleFactor = 1.0;\r
     Array<Component*> glRepaintListeners;\r
+    ScopedWindowAssociation association;\r
 \r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LinuxComponentPeer)\r
index 791379c771c2009be7733070924875fa13219429..bfa8f0cb8ac7429a3578e325e942cea753e41cb2 100644 (file)
@@ -35,12 +35,11 @@ class CoreGraphicsMetalLayerRenderer
 {\r
 public:\r
     //==============================================================================\r
-    CoreGraphicsMetalLayerRenderer (ViewType* view, bool isOpaque)\r
+    static auto create (ViewType* view, bool isOpaque)\r
     {\r
-        device.reset (MTLCreateSystemDefaultDevice());\r
-        commandQueue.reset ([device.get() newCommandQueue]);\r
-\r
-        attach (view, isOpaque);\r
+        ObjCObjectHandle<id<MTLDevice>> device { MTLCreateSystemDefaultDevice() };\r
+        return rawToUniquePtr (device != nullptr ? new CoreGraphicsMetalLayerRenderer (device, view, isOpaque)\r
+                                                 : nullptr);\r
     }\r
 \r
     ~CoreGraphicsMetalLayerRenderer()\r
@@ -223,6 +222,16 @@ public:
     }\r
 \r
 private:\r
+    //==============================================================================\r
+    CoreGraphicsMetalLayerRenderer (ObjCObjectHandle<id<MTLDevice>> mtlDevice,\r
+                                    ViewType* view,\r
+                                    bool isOpaque)\r
+        : device (mtlDevice),\r
+          commandQueue ([device.get() newCommandQueue])\r
+    {\r
+        attach (view, isOpaque);\r
+    }\r
+\r
     //==============================================================================\r
     static auto alignTo (size_t n, size_t alignment)\r
     {\r
index 81d8b6d7ed85123290c38067d286410d1658f751..9f6bc9dcdd69bebd89cb54ffa7eaae7ecbe9f2fa 100644 (file)
@@ -279,10 +279,9 @@ private:
                  && ! [[NSWorkspace sharedWorkspace] isFilePackageAtPath: juceStringToNS (f.getFullPathName())];\r
     }\r
 \r
-    void panelSelectionDidChange (id sender)\r
+    void panelSelectionDidChange ([[maybe_unused]] id sender)\r
     {\r
         jassert (sender == panel);\r
-        ignoreUnused (sender);\r
 \r
         // NB: would need to extend FilePreviewComponent to handle the full list rather than just the first one\r
         if (preview != nullptr)\r
index c77a92a9be47747b0cc1c28a3c21b0ea587198fc..0e6ba3e3cbf51dcaf7c818c95ee757c156da1855 100644 (file)
@@ -453,16 +453,12 @@ private:
         {\r
             ValidatorClass()  : ObjCClass ("JUCEMenuValidator_")\r
             {\r
-                addMethod (menuItemInvokedSelector,       menuItemInvoked);\r
-                addMethod (@selector (validateMenuItem:), validateMenuItem);\r
+                addMethod (menuItemInvokedSelector,       [] (id, SEL, NSMenuItem*) {});\r
+                addMethod (@selector (validateMenuItem:), [] (id, SEL, NSMenuItem*) { return YES; });\r
                 addProtocol (@protocol (NSMenuItemValidation));\r
 \r
                 registerClass();\r
             }\r
-\r
-        private:\r
-            static BOOL validateMenuItem (id, SEL, NSMenuItem*)      { return YES; }\r
-            static void menuItemInvoked  (id, SEL, NSMenuItem*)      {}\r
         };\r
 \r
         static ValidatorClass validatorClass;\r
@@ -504,7 +500,7 @@ private:
         return m;\r
     }\r
 \r
-    // Apple Bug: For some reason [NSMenu removeAllItems] seems to leak it's objects\r
+    // Apple Bug: For some reason [NSMenu removeAllItems] seems to leak its objects\r
     // on shutdown, so we need this method to release the items one-by-one manually\r
     static void removeItemRecursive (NSMenu* parentMenu, int menuItemIndex)\r
     {\r
@@ -544,9 +540,24 @@ private:
         {\r
             addIvar<JuceMainMenuHandler*> ("owner");\r
 \r
-            addMethod (menuItemInvokedSelector,       menuItemInvoked);\r
-            addMethod (@selector (menuNeedsUpdate:),  menuNeedsUpdate);\r
-            addMethod (@selector (validateMenuItem:), validateMenuItem);\r
+            addMethod (menuItemInvokedSelector, [] (id self, SEL, NSMenuItem* item)\r
+            {\r
+                if (auto* juceItem = getPopupMenuItem (item))\r
+                    getOwner (self)->invoke (*juceItem, static_cast<int> ([item tag]));\r
+            });\r
+\r
+            addMethod (@selector (menuNeedsUpdate:), [] (id self, SEL, NSMenu* menu)\r
+            {\r
+                getOwner (self)->updateTopLevelMenu (menu);\r
+            });\r
+\r
+            addMethod (@selector (validateMenuItem:), [] (id, SEL, NSMenuItem* item) -> BOOL\r
+            {\r
+                if (auto* juceItem = getPopupMenuItem (item))\r
+                    return juceItem->isEnabled;\r
+\r
+                return YES;\r
+            });\r
 \r
             addProtocol (@protocol (NSMenuDelegate));\r
             addProtocol (@protocol (NSMenuItemValidation));\r
@@ -560,34 +571,15 @@ private:
         }\r
 \r
     private:\r
-        static auto* getPopupMenuItem (NSMenuItem* item)\r
+        static PopupMenu::Item* getPopupMenuItem (NSMenuItem* item)\r
         {\r
             return getJuceClassFromNSObject<PopupMenu::Item> ([item representedObject]);\r
         }\r
 \r
-        static auto* getOwner (id self)\r
+        static JuceMainMenuHandler* getOwner (id self)\r
         {\r
             return getIvar<JuceMainMenuHandler*> (self, "owner");\r
         }\r
-\r
-        static void menuItemInvoked (id self, SEL, NSMenuItem* item)\r
-        {\r
-            if (auto* juceItem = getPopupMenuItem (item))\r
-                getOwner (self)->invoke (*juceItem, static_cast<int> ([item tag]));\r
-        }\r
-\r
-        static void menuNeedsUpdate (id self, SEL, NSMenu* menu)\r
-        {\r
-            getOwner (self)->updateTopLevelMenu (menu);\r
-        }\r
-\r
-        static BOOL validateMenuItem (id, SEL, NSMenuItem* item)\r
-        {\r
-            if (auto* juceItem = getPopupMenuItem (item))\r
-                return juceItem->isEnabled;\r
-\r
-            return YES;\r
-        }\r
     };\r
 };\r
 \r
index 65b588f92b869d4b667d58933f8c7503af1eaf0d..95321245ca99c4afc5048e9951bcd35c6b33d133 100644 (file)
@@ -151,7 +151,7 @@ public:
       #if USE_COREGRAPHICS_RENDERING\r
        #if JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS\r
         if (@available (macOS 10.14, *))\r
-            metalRenderer = std::make_unique<CoreGraphicsMetalLayerRenderer<NSView>> (view, getComponent().isOpaque());\r
+            metalRenderer = CoreGraphicsMetalLayerRenderer<NSView>::create (view, getComponent().isOpaque());\r
        #endif\r
         if ((windowStyleFlags & ComponentPeer::windowRequiresSynchronousCoreGraphicsRendering) == 0)\r
         {\r
@@ -411,12 +411,12 @@ public:
         if (forceFullScreen)\r
             return NSWindowCollectionBehaviorFullScreenPrimary;\r
 \r
-        // Some SDK versions don't define NSWindowCollectionBehaviorFullScreenNone\r
-        constexpr auto fullScreenNone = (NSUInteger) (1 << 9);\r
+        // Some SDK versions don't define NSWindowCollectionBehaviorFullScreenAuxiliary\r
+        constexpr auto fullScreenAux = (NSUInteger) (1 << 8);\r
 \r
         return (getStyleFlags() & (windowHasMaximiseButton | windowIsResizable)) == (windowHasMaximiseButton | windowIsResizable)\r
              ? NSWindowCollectionBehaviorFullScreenPrimary\r
-             : fullScreenNone;\r
+             : fullScreenAux;\r
     }\r
 \r
     void setCollectionBehaviour (bool forceFullScreen) const\r
@@ -641,7 +641,7 @@ public:
         return usingCoreGraphics ? 1 : 0;\r
     }\r
 \r
-    void setCurrentRenderingEngine (int index) override\r
+    void setCurrentRenderingEngine ([[maybe_unused]] int index) override\r
     {\r
        #if USE_COREGRAPHICS_RENDERING\r
         if (usingCoreGraphics != (index > 0))\r
@@ -649,8 +649,6 @@ public:
             usingCoreGraphics = index > 0;\r
             [view setNeedsDisplay: true];\r
         }\r
-       #else\r
-        ignoreUnused (index);\r
        #endif\r
     }\r
 \r
@@ -805,10 +803,8 @@ public:
             {\r
                 bool used = false;\r
 \r
-                for (auto u = unicode.getCharPointer(); ! u.isEmpty();)\r
+                for (auto textCharacter : unicode)\r
                 {\r
-                    auto textCharacter = u.getAndAdvance();\r
-\r
                     switch (keyCode)\r
                     {\r
                         case NSLeftArrowFunctionKey:\r
@@ -830,8 +826,8 @@ public:
                             break;\r
                     }\r
 \r
-                    used = handleKeyUpOrDown (true) || used;\r
-                    used = handleKeyPress (keyCode, textCharacter) || used;\r
+                    used |= handleKeyUpOrDown (true);\r
+                    used |= handleKeyPress (keyCode, textCharacter);\r
                 }\r
 \r
                 return used;\r
@@ -1557,9 +1553,8 @@ public:
     void closeInputMethodContext() override\r
     {\r
         stringBeingComposed.clear();\r
-        const auto* inputContext = [NSTextInputContext currentInputContext];\r
 \r
-        if (inputContext != nil)\r
+        if (const auto* inputContext = [view inputContext])\r
             [inputContext discardMarkedText];\r
     }\r
 \r
@@ -1580,6 +1575,39 @@ public:
             [window setDocumentEdited: b];\r
     }\r
 \r
+    bool sendEventToInputContextOrComponent (NSEvent* ev)\r
+    {\r
+        // We assume that the event will be handled by the IME.\r
+        // Occasionally, the inputContext may be sent key events like cmd+Q, which it will turn\r
+        // into a noop: call and forward to doCommandBySelector:.\r
+        // In this case, the event will be extracted from keyEventBeingHandled and passed to the\r
+        // focused component, and viewCannotHandleEvent will be set depending on whether the event\r
+        // was handled by the component.\r
+        // If the event was *not* handled by the component, and was also not consumed completely by\r
+        // the IME, it's important to return the event to the system for further handling, so that\r
+        // the main menu works as expected.\r
+        viewCannotHandleEvent = false;\r
+        keyEventBeingHandled.reset ([ev retain]);\r
+        const WeakReference ref { this };\r
+        // redirectKeyDown may delete this peer!\r
+        const ScopeGuard scope { [&ref] { if (ref != nullptr) ref->keyEventBeingHandled = nullptr; } };\r
+\r
+        const auto handled = [&]() -> bool\r
+        {\r
+            if (auto* target = findCurrentTextInputTarget())\r
+                if (const auto* inputContext = [view inputContext])\r
+                    return [inputContext handleEvent: ev] && ! viewCannotHandleEvent;\r
+\r
+            return false;\r
+        }();\r
+\r
+        if (handled)\r
+            return true;\r
+\r
+        stringBeingComposed.clear();\r
+        return redirectKeyDown (ev);\r
+    }\r
+\r
     //==============================================================================\r
     NSWindow* window = nil;\r
     NSView* view = nil;\r
@@ -1590,11 +1618,13 @@ public:
    #else\r
     bool usingCoreGraphics = false;\r
    #endif\r
-    bool textWasInserted = false, isFirstLiveResize = false;\r
+    NSUniquePtr<NSEvent> keyEventBeingHandled;\r
+    bool isFirstLiveResize = false, viewCannotHandleEvent = false;\r
     bool isStretchingTop = false, isStretchingLeft = false, isStretchingBottom = false, isStretchingRight = false;\r
     bool windowRepresentsFile = false;\r
     bool isAlwaysOnTop = false, wasAlwaysOnTop = false;\r
     String stringBeingComposed;\r
+    int startOfMarkedTextInTextInputTarget = 0;\r
 \r
     Rectangle<float> lastSizeBeforeZoom;\r
     RectangleList<float> deferredRepaints;\r
@@ -2005,18 +2035,16 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
 \r
         addMethod (@selector (keyDown:), [] (id self, SEL, NSEvent* ev)\r
         {\r
-            if (auto* owner = getOwner (self))\r
+            const auto handled = [&]\r
             {\r
-                owner->textWasInserted = false;\r
+                if (auto* owner = getOwner (self))\r
+                    return owner->sendEventToInputContextOrComponent (ev);\r
 \r
-                if (auto* target = owner->findCurrentTextInputTarget())\r
-                    [(NSView*) self interpretKeyEvents: [NSArray arrayWithObject: ev]];\r
-                else\r
-                    owner->stringBeingComposed.clear();\r
+                return false;\r
+            }();\r
 \r
-                if (! (owner->textWasInserted || owner->stringBeingComposed.isNotEmpty() || owner->redirectKeyDown (ev)))\r
-                    sendSuperclassMessage<void> (self, @selector (keyDown:), ev);\r
-            }\r
+            if (! handled)\r
+                sendSuperclassMessage<void> (self, @selector (keyDown:), ev);\r
         });\r
 \r
         addMethod (@selector (keyUp:), [] (id self, SEL, NSEvent* ev)\r
@@ -2027,41 +2055,160 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
                 sendSuperclassMessage<void> (self, @selector (keyUp:), ev);\r
         });\r
 \r
-        addMethod (@selector (insertText:), [] (id self, SEL, id aString)\r
+        // See "The Path of Key Events" on this page:\r
+        // https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html\r
+        // Normally, 'special' key presses (cursor keys, shortcuts, return, delete etc.) will be\r
+        // sent down the view hierarchy to this function before any of the other keyboard handling\r
+        // functions.\r
+        // If any object returns YES from performKeyEquivalent, then the event is consumed.\r
+        // If no object handles the key equivalent, then the event will be sent to the main menu.\r
+        // If the menu is also unable to respond to the event, then the event will be sent\r
+        // to keyDown:/keyUp: via sendEvent:, but this time the event will be sent to the first\r
+        // responder and propagated back up the responder chain.\r
+        // This architecture presents some issues in JUCE apps, which always expect the focused\r
+        // Component to be sent all key presses *including* special keys.\r
+        // There are also some slightly pathological cases that JUCE needs to support, for example\r
+        // the situation where one of the cursor keys is bound to a main menu item. By default,\r
+        // macOS would send the cursor event to performKeyEquivalent on each NSResponder, then send\r
+        // the event to the main menu if no responder handled it. This would mean that the focused\r
+        // Component would never see the event, which would break widgets like the TextEditor, which\r
+        // expect to take precedence over menu items when they have focus.\r
+        // Another layer of subtlety is that some IMEs require cursor key input. When long-pressing\r
+        // the 'e' key to bring up the accent menu, the popup menu should receive cursor events\r
+        // before the focused component.\r
+        // To fulfil all of these requirements, we handle special keys ('key equivalents') like any\r
+        // other key event, and send these events firstly to the NSTextInputContext (if there's an\r
+        // active TextInputTarget), and then on to the focused Component in the case that the\r
+        // input handler is unable to use the keypress. If the event still hasn't been used, then\r
+        // it will be sent to the superclass's performKeyEquivalent: function, which will give the\r
+        // OS a chance to handle events like cmd+Q, cmd+`, cmd+H etc.\r
+        addMethod (@selector (performKeyEquivalent:), [] (id self, SEL s, NSEvent* ev) -> BOOL\r
         {\r
-            // This commits multi-byte text when return is pressed, or after every keypress for western keyboards\r
             if (auto* owner = getOwner (self))\r
-            {\r
-                NSString* newText = [aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString;\r
+                return owner->sendEventToInputContextOrComponent (ev);\r
 \r
-                if ([newText length] > 0)\r
+            return sendSuperclassMessage<BOOL> (self, s, ev);\r
+        });\r
+\r
+        addMethod (@selector (insertText:replacementRange:), [] (id self, SEL, id aString, NSRange replacementRange)\r
+        {\r
+            // This commits multi-byte text when using an IME, or after every keypress for western keyboards\r
+            if (auto* owner = getOwner (self))\r
+            {\r
+                if (auto* target = owner->findCurrentTextInputTarget())\r
                 {\r
-                    if (auto* target = owner->findCurrentTextInputTarget())\r
+                    const auto newText = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString);\r
+\r
+                    if (newText.isNotEmpty())\r
                     {\r
-                        target->insertTextAtCaret (nsStringToJuce (newText));\r
-                        owner->textWasInserted = true;\r
+                        target->setHighlightedRegion ([&]\r
+                        {\r
+                            // To test this, try long-pressing 'e' to bring up the accent popup,\r
+                            // then select one of the accented options.\r
+                            if (replacementRange.location != NSNotFound)\r
+                                return nsRangeToJuce (replacementRange);\r
+\r
+                            // To test this, try entering the characters 'a b <esc>' with the 2-Set\r
+                            // Korean IME. The input client should receive three calls to setMarkedText:\r
+                            // followed by a call to insertText:\r
+                            // The final call to insertText should overwrite the currently-marked\r
+                            // text, and reset the composition string.\r
+                            if (owner->stringBeingComposed.isNotEmpty())\r
+                                return Range<int>::withStartAndLength (owner->startOfMarkedTextInTextInputTarget,\r
+                                                                       owner->stringBeingComposed.length());\r
+\r
+                            return target->getHighlightedRegion();\r
+                        }());\r
+\r
+                        target->insertTextAtCaret (newText);\r
+                        target->setTemporaryUnderlining ({});\r
                     }\r
                 }\r
+                else\r
+                    jassertfalse; // The system should not attempt to insert text when there is no active TextInputTarget\r
 \r
                 owner->stringBeingComposed.clear();\r
             }\r
         });\r
 \r
-        addMethod (@selector (doCommandBySelector:), [] (id, SEL, SEL) {});\r
+        addMethod (@selector (doCommandBySelector:), [] (id self, SEL, SEL sel)\r
+        {\r
+            const auto handled = [&]\r
+            {\r
+                // 'Special' keys, like backspace, return, tab, and escape, are converted to commands by the system.\r
+                // Components still expect to receive these events as key presses, so we send the currently-processed\r
+                // key event (if any).\r
+                if (auto* owner = getOwner (self))\r
+                {\r
+                    owner->viewCannotHandleEvent = [&]\r
+                    {\r
+                        if (auto* e = owner->keyEventBeingHandled.get())\r
+                        {\r
+                            if ([e type] != NSEventTypeKeyDown && [e type] != NSEventTypeKeyUp)\r
+                                return true;\r
+\r
+                            return ! ([e type] == NSEventTypeKeyDown ? owner->redirectKeyDown (e)\r
+                                                                     : owner->redirectKeyUp (e));\r
+                        }\r
+\r
+                        return true;\r
+                    }();\r
+\r
+                    return ! owner->viewCannotHandleEvent;\r
+                }\r
+\r
+                return false;\r
+            }();\r
+\r
+            if (! handled)\r
+                sendSuperclassMessage<void> (self, @selector (doCommandBySelector:), sel);\r
+        });\r
 \r
-        addMethod (@selector (setMarkedText:selectedRange:), [] (id self, SEL, id aString, NSRange)\r
+        addMethod (@selector (setMarkedText:selectedRange:replacementRange:), [] (id self,\r
+                                                                                  SEL,\r
+                                                                                  id aString,\r
+                                                                                  const NSRange selectedRange,\r
+                                                                                  const NSRange replacementRange)\r
         {\r
             if (auto* owner = getOwner (self))\r
             {\r
-                owner->stringBeingComposed = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]]\r
-                                                             ? [aString string] : aString);\r
-\r
                 if (auto* target = owner->findCurrentTextInputTarget())\r
                 {\r
-                    auto currentHighlight = target->getHighlightedRegion();\r
-                    target->insertTextAtCaret (owner->stringBeingComposed);\r
-                    target->setHighlightedRegion (currentHighlight.withLength (owner->stringBeingComposed.length()));\r
-                    owner->textWasInserted = true;\r
+                    const auto toInsert = nsStringToJuce ([aString isKindOfClass: [NSAttributedString class]] ? [aString string] : aString);\r
+                    const auto [initialHighlight, marked, finalHighlight] = [&]\r
+                    {\r
+                        if (owner->stringBeingComposed.isNotEmpty())\r
+                        {\r
+                            const auto toReplace = Range<int>::withStartAndLength (owner->startOfMarkedTextInTextInputTarget,\r
+                                                                                   owner->stringBeingComposed.length());\r
+\r
+                            return replacementRange.location != NSNotFound\r
+                                 // There's a composition underway, so replacementRange is relative to the marked text,\r
+                                 // and selectedRange is relative to the inserted string.\r
+                                 ? std::tuple (toReplace,\r
+                                               owner->stringBeingComposed.replaceSection (static_cast<int> (replacementRange.location),\r
+                                                                                          static_cast<int> (replacementRange.length),\r
+                                                                                          toInsert),\r
+                                               nsRangeToJuce (selectedRange) + static_cast<int> (replacementRange.location))\r
+                                 // The replacementRange is invalid, so replace all the marked text.\r
+                                 : std::tuple (toReplace, toInsert, nsRangeToJuce (selectedRange));\r
+                        }\r
+\r
+                        if (replacementRange.location != NSNotFound)\r
+                            // There's no string composition in progress, so replacementRange is relative to the start\r
+                            // of the document.\r
+                            return std::tuple (nsRangeToJuce (replacementRange), toInsert, nsRangeToJuce (selectedRange));\r
+\r
+                        return std::tuple (target->getHighlightedRegion(), toInsert, nsRangeToJuce (selectedRange));\r
+                    }();\r
+\r
+                    owner->stringBeingComposed = marked;\r
+                    owner->startOfMarkedTextInTextInputTarget = initialHighlight.getStart();\r
+\r
+                    target->setHighlightedRegion (initialHighlight);\r
+                    target->insertTextAtCaret (marked);\r
+                    target->setTemporaryUnderlining ({ Range<int>::withStartAndLength (initialHighlight.getStart(), marked.length()) });\r
+                    target->setHighlightedRegion (finalHighlight + owner->startOfMarkedTextInTextInputTarget);\r
                 }\r
             }\r
         });\r
@@ -2075,7 +2222,7 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
                     if (auto* target = owner->findCurrentTextInputTarget())\r
                     {\r
                         target->insertTextAtCaret (owner->stringBeingComposed);\r
-                        owner->textWasInserted = true;\r
+                        target->setTemporaryUnderlining ({});\r
                     }\r
 \r
                     owner->stringBeingComposed.clear();\r
@@ -2089,21 +2236,20 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
             return owner != nullptr && owner->stringBeingComposed.isNotEmpty();\r
         });\r
 \r
-        addMethod (@selector (conversationIdentifier), [] (id self, SEL)\r
+        addMethod (@selector (attributedSubstringForProposedRange:actualRange:), [] (id self, SEL, NSRange theRange, NSRangePointer actualRange) -> NSAttributedString*\r
         {\r
-            return (long) (pointer_sized_int) self;\r
-        });\r
+            jassert (theRange.location != NSNotFound);\r
 \r
-        addMethod (@selector (attributedSubstringFromRange:), [] (id self, SEL, NSRange theRange) -> NSAttributedString*\r
-        {\r
             if (auto* owner = getOwner (self))\r
             {\r
                 if (auto* target = owner->findCurrentTextInputTarget())\r
                 {\r
-                    Range<int> r ((int) theRange.location,\r
-                                  (int) (theRange.location + theRange.length));\r
+                    const auto clamped = Range<int> { 0, target->getTotalNumChars() }.constrainRange (nsRangeToJuce (theRange));\r
+\r
+                    if (actualRange != nullptr)\r
+                        *actualRange = juceRangeToNS (clamped);\r
 \r
-                    return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (r))] autorelease];\r
+                    return [[[NSAttributedString alloc] initWithString: juceStringToNS (target->getTextInRange (clamped))] autorelease];\r
                 }\r
             }\r
 \r
@@ -2114,7 +2260,8 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
         {\r
             if (auto* owner = getOwner (self))\r
                 if (owner->stringBeingComposed.isNotEmpty())\r
-                    return NSMakeRange (0, (NSUInteger) owner->stringBeingComposed.length());\r
+                    return NSMakeRange (static_cast<NSUInteger> (owner->startOfMarkedTextInTextInputTarget),\r
+                                        static_cast<NSUInteger> (owner->stringBeingComposed.length()));\r
 \r
             return NSMakeRange (NSNotFound, 0);\r
         });\r
@@ -2125,22 +2272,40 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
             {\r
                 if (auto* target = owner->findCurrentTextInputTarget())\r
                 {\r
-                    auto highlight = target->getHighlightedRegion();\r
+                    const auto highlight = target->getHighlightedRegion();\r
 \r
-                    if (! highlight.isEmpty())\r
-                        return NSMakeRange ((NSUInteger) highlight.getStart(),\r
-                                            (NSUInteger) highlight.getLength());\r
+                    // The accent-selector popup does not show if the selectedRange location is NSNotFound!\r
+                    return NSMakeRange ((NSUInteger) highlight.getStart(),\r
+                                        (NSUInteger) highlight.getLength());\r
                 }\r
             }\r
 \r
             return NSMakeRange (NSNotFound, 0);\r
         });\r
 \r
-        addMethod (@selector (firstRectForCharacterRange:), [] (id self, SEL, NSRange)\r
+        addMethod (@selector (firstRectForCharacterRange:actualRange:), [] (id self, SEL, NSRange range, NSRangePointer actualRange)\r
         {\r
             if (auto* owner = getOwner (self))\r
-                if (auto* comp = dynamic_cast<Component*> (owner->findCurrentTextInputTarget()))\r
-                    return flippedScreenRect (makeNSRect (comp->getScreenBounds()));\r
+            {\r
+                if (auto* target = owner->findCurrentTextInputTarget())\r
+                {\r
+                    if (auto* comp = dynamic_cast<Component*> (target))\r
+                    {\r
+                        const auto codePointRange = range.location == NSNotFound ? Range<int>::emptyRange (target->getCaretPosition())\r
+                                                                                 : nsRangeToJuce (range);\r
+                        const auto clamped = Range<int> { 0, target->getTotalNumChars() }.constrainRange (codePointRange);\r
+\r
+                        if (actualRange != nullptr)\r
+                            *actualRange = juceRangeToNS (clamped);\r
+\r
+                        const auto rect = codePointRange.isEmpty() ? target->getCaretRectangleForCharIndex (codePointRange.getStart())\r
+                                                                   : target->getTextBounds (codePointRange).getRectangle (0);\r
+                        const auto areaOnDesktop = comp->localAreaToGlobal (rect);\r
+\r
+                        return flippedScreenRect (makeNSRect (ScalingHelpers::scaledScreenPosToUnscaled (areaOnDesktop)));\r
+                    }\r
+                }\r
+            }\r
 \r
             return NSZeroRect;\r
         });\r
@@ -2192,47 +2357,12 @@ struct JuceNSViewClass   : public NSViewComponentPeerWrapper<ObjCClass<NSView>>
 \r
         addMethod (@selector (isFlipped), [] (id, SEL) { return true; });\r
 \r
-        addMethod (@selector (performKeyEquivalent:), [] (id self, SEL s, NSEvent* event)\r
-        {\r
-            // We try passing shortcut keys to the currently focused component first.\r
-            // If the component doesn't want the event, we'll fall back to the superclass\r
-            // implementation, which will pass the event to the main menu.\r
-            if (tryPassingKeyEventToPeer (event))\r
-                return YES;\r
-\r
-            return sendSuperclassMessage<BOOL> (self, s, event);\r
-        });\r
-\r
-        addProtocol (@protocol (NSTextInput));\r
+        addProtocol (@protocol (NSTextInputClient));\r
 \r
         registerClass();\r
     }\r
 \r
 private:\r
-    static void updateTrackingAreas (id self, SEL)\r
-    {\r
-        sendSuperclassMessage<void> (self, @selector (updateTrackingAreas));\r
-\r
-        resetTrackingArea (static_cast<NSView*> (self));\r
-    }\r
-\r
-    static bool tryPassingKeyEventToPeer (NSEvent* e)\r
-    {\r
-        if ([e type] != NSEventTypeKeyDown && [e type] != NSEventTypeKeyUp)\r
-            return false;\r
-\r
-        if (auto* focused = Component::getCurrentlyFocusedComponent())\r
-        {\r
-            if (auto* peer = dynamic_cast<NSViewComponentPeer*> (focused->getPeer()))\r
-            {\r
-                return [e type] == NSEventTypeKeyDown ? peer->redirectKeyDown (e)\r
-                                                      : peer->redirectKeyUp (e);\r
-            }\r
-        }\r
-\r
-        return false;\r
-    }\r
-\r
     template <typename Func, typename... Args>\r
     static void callOnOwner (id self, Func&& func, Args&&... args)\r
     {\r
@@ -2477,29 +2607,6 @@ struct JuceNSWindowClass   : public NSViewComponentPeerWrapper<ObjCClass<NSWindo
             return nil;\r
         });\r
 \r
-        // Key events will be processed by the peer's component.\r
-        // If the component is unable to use the event, it will be re-sent\r
-        // to performKeyEquivalent.\r
-        // performKeyEquivalent will send the event to the view's superclass,\r
-        // which will try passing the event to the main menu.\r
-        // If the event still hasn't been processed, it will be passed to the\r
-        // next responder in the chain, which will be the NSWindow for a peer\r
-        // that is on the desktop.\r
-        // If the NSWindow still doesn't handle the event, the Apple docs imply\r
-        // that the event should be sent to the NSApp for processing, but this\r
-        // doesn't seem to happen for keyDown events.\r
-        // Instead, the NSWindow attempts to process the event, fails, and\r
-        // triggers an annoying NSBeep.\r
-        // Overriding keyDown to "handle" the event seems to suppress the beep.\r
-        addMethod (@selector (keyDown:), [] (id, SEL, NSEvent* ev)\r
-        {\r
-            ignoreUnused (ev);\r
-\r
-           #if JUCE_DEBUG_UNHANDLED_KEYPRESSES\r
-            DBG ("unhandled key down event with keycode: " << [ev keyCode]);\r
-           #endif\r
-        });\r
-\r
         addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), [] (id self, SEL, id /*window*/, NSEvent*, NSPoint, NSPasteboard*)\r
         {\r
             if (auto* owner = getOwner (self))\r
index eb736ded0f6ef025a81aba1676bc6b16254fcf95..d071dc68953075a38ec2c6da086c3a6e8e1ae132 100644 (file)
@@ -446,13 +446,43 @@ Point<float> MouseInputSource::getCurrentRawMousePosition()
     }\r
 }\r
 \r
+static ComponentPeer* findPeerContainingPoint (Point<float> globalPos)\r
+{\r
+    for (int i = 0; i < juce::ComponentPeer::getNumPeers(); ++i)\r
+    {\r
+        auto* peer = juce::ComponentPeer::getPeer (i);\r
+\r
+        if (peer->contains (peer->globalToLocal (globalPos).toInt(), false))\r
+            return peer;\r
+    }\r
+\r
+    return nullptr;\r
+}\r
+\r
 void MouseInputSource::setRawMousePosition (Point<float> newPosition)\r
 {\r
+    const auto oldPosition = Desktop::getInstance().getMainMouseSource().getRawScreenPosition();\r
+\r
     // this rubbish needs to be done around the warp call, to avoid causing a\r
     // bizarre glitch..\r
     CGAssociateMouseAndMouseCursorPosition (false);\r
     CGWarpMouseCursorPosition (convertToCGPoint (newPosition));\r
     CGAssociateMouseAndMouseCursorPosition (true);\r
+\r
+    // Mouse enter and exit events seem to be always generated as a consequence of programmatically\r
+    // moving the mouse. However, when the mouse stays within the same peer no mouse move event is\r
+    // generated, and we lose track of the correct Component under the mouse. Hence, we need to\r
+    // generate this missing event here.\r
+    if (auto* peer = findPeerContainingPoint (newPosition); peer != nullptr\r
+                                                            && peer == findPeerContainingPoint (oldPosition))\r
+    {\r
+        peer->handleMouseEvent (MouseInputSource::InputSourceType::mouse,\r
+                                peer->globalToLocal (newPosition),\r
+                                ModifierKeys::currentModifiers,\r
+                                0.0f,\r
+                                0.0f,\r
+                                Time::currentTimeMillis());\r
+    }\r
 }\r
 \r
 double Desktop::getDefaultMasterScale()\r
@@ -534,11 +564,11 @@ public:
     {\r
         PMAssertion()  : assertionID (kIOPMNullAssertionID)\r
         {\r
-            IOReturn res = IOPMAssertionCreateWithName (kIOPMAssertionTypePreventUserIdleDisplaySleep,\r
-                                                        kIOPMAssertionLevelOn,\r
-                                                        CFSTR ("JUCE Playback"),\r
-                                                        &assertionID);\r
-            jassert (res == kIOReturnSuccess); ignoreUnused (res);\r
+            [[maybe_unused]] IOReturn res = IOPMAssertionCreateWithName (kIOPMAssertionTypePreventUserIdleDisplaySleep,\r
+                                                                         kIOPMAssertionLevelOn,\r
+                                                                         CFSTR ("JUCE Playback"),\r
+                                                                         &assertionID);\r
+            jassert (res == kIOReturnSuccess);\r
         }\r
 \r
         ~PMAssertion()\r
@@ -750,10 +780,9 @@ void Process::setDockIconVisible (bool isVisible)
 {\r
     ProcessSerialNumber psn { 0, kCurrentProcess };\r
 \r
-    OSStatus err = TransformProcessType (&psn, isVisible ? kProcessTransformToForegroundApplication\r
-                                                         : kProcessTransformToUIElementApplication);\r
+    [[maybe_unused]] OSStatus err = TransformProcessType (&psn, isVisible ? kProcessTransformToForegroundApplication\r
+                                                                          : kProcessTransformToUIElementApplication);\r
     jassert (err == 0);\r
-    ignoreUnused (err);\r
 }\r
 \r
 } // namespace juce\r
index e64459fa74ea25c34adfd36d8f52a82937ac9033..22432627997dfef3e9e07ea58e3490e64caaa605 100644 (file)
@@ -262,7 +262,7 @@ namespace DragAndDropHelpers
 \r
         JobStatus runJob() override\r
         {\r
-            ignoreUnused (OleInitialize (nullptr));\r
+            [[maybe_unused]] const auto result = OleInitialize (nullptr);\r
 \r
             auto* source = new JuceDropSource();\r
             auto* data = new JuceDataObject (&format, &medium);\r
index 4c3df9e46f8787787a44805886ee2d2526e37e27..3165260592280e8cbe22ad10f05c4527e569b81a 100644 (file)
@@ -515,7 +515,7 @@ private:
             struct ScopedCoInitialize\r
             {\r
                 // IUnknown_GetWindow will only succeed when instantiated in a single-thread apartment\r
-                ScopedCoInitialize() { ignoreUnused (CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE)); }\r
+                ScopedCoInitialize() { [[maybe_unused]] const auto result = CoInitializeEx (nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); }\r
                 ~ScopedCoInitialize() { CoUninitialize(); }\r
             };\r
 \r
index 9f97d07768e1ae250c05c1a9e3958ce04a408098..c7a78b54c37b1935dcd861aabcfb9fd460659e9a 100644 (file)
@@ -453,10 +453,9 @@ static bool isPerMonitorDPIAwareProcess()
    #endif\r
 }\r
 \r
-static bool isPerMonitorDPIAwareWindow (HWND nativeWindow)\r
+static bool isPerMonitorDPIAwareWindow ([[maybe_unused]] HWND nativeWindow)\r
 {\r
    #if ! JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    ignoreUnused (nativeWindow);\r
     return false;\r
    #else\r
     setDPIAwareness();\r
@@ -500,13 +499,36 @@ static double getGlobalDPI()
 }\r
 \r
 //==============================================================================\r
-class ScopedThreadDPIAwarenessSetter::NativeImpl\r
+class ScopedSuspendResumeNotificationRegistration\r
 {\r
 public:\r
-    explicit NativeImpl (HWND nativeWindow)\r
+    ScopedSuspendResumeNotificationRegistration() = default;\r
+\r
+    explicit ScopedSuspendResumeNotificationRegistration (HWND window)\r
+        : handle (SystemStats::getOperatingSystemType() >= SystemStats::Windows8_0\r
+                      ? RegisterSuspendResumeNotification (window, DEVICE_NOTIFY_WINDOW_HANDLE)\r
+                      : nullptr)\r
+    {}\r
+\r
+private:\r
+    struct Destructor\r
     {\r
-        ignoreUnused (nativeWindow);\r
+        void operator() (HPOWERNOTIFY ptr) const\r
+        {\r
+            if (ptr != nullptr)\r
+                UnregisterSuspendResumeNotification (ptr);\r
+        }\r
+    };\r
+\r
+    std::unique_ptr<std::remove_pointer_t<HPOWERNOTIFY>, Destructor> handle;\r
+};\r
 \r
+//==============================================================================\r
+class ScopedThreadDPIAwarenessSetter::NativeImpl\r
+{\r
+public:\r
+    explicit NativeImpl (HWND nativeWindow [[maybe_unused]])\r
+    {\r
        #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
         if (auto* functionSingleton = FunctionSingleton::getInstance())\r
         {\r
@@ -1619,6 +1641,31 @@ private:
 \r
 JUCE_IMPLEMENT_SINGLETON (VBlankDispatcher)\r
 \r
+//==============================================================================\r
+class SimpleTimer  : private Timer\r
+{\r
+public:\r
+    SimpleTimer (int intervalMs, std::function<void()> callbackIn)\r
+        : callback (std::move (callbackIn))\r
+    {\r
+        jassert (callback);\r
+        startTimer (intervalMs);\r
+    }\r
+\r
+    ~SimpleTimer() override\r
+    {\r
+        stopTimer();\r
+    }\r
+\r
+private:\r
+    void timerCallback() override\r
+    {\r
+        callback();\r
+    }\r
+\r
+    std::function<void()> callback;\r
+};\r
+\r
 //==============================================================================\r
 class HWNDComponentPeer  : public ComponentPeer,\r
                            private VBlankListener,\r
@@ -1660,12 +1707,18 @@ public:
             return ModifierKeys::currentModifiers;\r
         };\r
 \r
-        if (updateCurrentMonitor())\r
-            VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor);\r
+        updateCurrentMonitorAndRefreshVBlankDispatcher();\r
+\r
+        if (parentToAddTo != nullptr)\r
+            monitorUpdateTimer.emplace (1000, [this] { updateCurrentMonitorAndRefreshVBlankDispatcher(); });\r
+\r
+        suspendResumeRegistration = ScopedSuspendResumeNotificationRegistration { hwnd };\r
     }\r
 \r
     ~HWNDComponentPeer() override\r
     {\r
+        suspendResumeRegistration = {};\r
+\r
         VBlankDispatcher::getInstance()->removeListener (*this);\r
 \r
         // do this first to avoid messages arriving for this window before it's destroyed\r
@@ -2225,8 +2278,7 @@ public:
                 nameBuffer.clear();\r
                 nameBuffer.resize (bufferSize + 1, 0); // + 1 for the null terminator\r
 \r
-                const auto readCharacters = DragQueryFile (dropFiles, i, nameBuffer.data(), (UINT) nameBuffer.size());\r
-                ignoreUnused (readCharacters);\r
+                [[maybe_unused]] const auto readCharacters = DragQueryFile (dropFiles, i, nameBuffer.data(), (UINT) nameBuffer.size());\r
                 jassert (readCharacters == bufferSize);\r
 \r
                 dragInfo.files.add (String (nameBuffer.data()));\r
@@ -2912,10 +2964,8 @@ private:
     }\r
    #endif\r
 \r
-    void setCurrentRenderingEngine (int index) override\r
+    void setCurrentRenderingEngine ([[maybe_unused]] int index) override\r
     {\r
-        ignoreUnused (index);\r
-\r
        #if JUCE_DIRECT2D\r
         if (getAvailableRenderingEngines().size() > 1)\r
         {\r
@@ -3484,7 +3534,7 @@ private:
                         const UINT keyChar  = MapVirtualKey ((UINT) key, 2);\r
                         const UINT scanCode = MapVirtualKey ((UINT) key, 0);\r
                         BYTE keyState[256];\r
-                        ignoreUnused (GetKeyboardState (keyState));\r
+                        [[maybe_unused]] const auto state = GetKeyboardState (keyState);\r
 \r
                         WCHAR text[16] = { 0 };\r
                         if (ToUnicode ((UINT) key, scanCode, keyState, text, 8, 0) != 1)\r
@@ -3652,10 +3702,18 @@ private:
         return 0;\r
     }\r
 \r
-    bool updateCurrentMonitor()\r
+    enum class ForceRefreshDispatcher\r
+    {\r
+        no,\r
+        yes\r
+    };\r
+\r
+    void updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher force = ForceRefreshDispatcher::no)\r
     {\r
         auto monitor = MonitorFromWindow (hwnd, MONITOR_DEFAULTTONULL);\r
-        return std::exchange (currentMonitor, monitor) != monitor;\r
+\r
+        if (std::exchange (currentMonitor, monitor) != monitor || force == ForceRefreshDispatcher::yes)\r
+            VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor);\r
     }\r
 \r
     bool handlePositionChanged()\r
@@ -3674,9 +3732,7 @@ private:
         }\r
 \r
         handleMovedOrResized();\r
-\r
-        if (updateCurrentMonitor())\r
-            VBlankDispatcher::getInstance()->updateDisplay (*this, currentMonitor);\r
+        updateCurrentMonitorAndRefreshVBlankDispatcher();\r
 \r
         return ! dontRepaint; // to allow non-accelerated openGL windows to draw themselves correctly.\r
     }\r
@@ -3834,8 +3890,7 @@ private:
 \r
         auto* dispatcher = VBlankDispatcher::getInstance();\r
         dispatcher->reconfigureDisplays();\r
-        updateCurrentMonitor();\r
-        dispatcher->updateDisplay (*this, currentMonitor);\r
+        updateCurrentMonitorAndRefreshVBlankDispatcher (ForceRefreshDispatcher::yes);\r
     }\r
 \r
     //==============================================================================\r
@@ -4601,6 +4656,8 @@ private:
     bool shouldIgnoreModalDismiss = false;\r
 \r
     RectangleList<int> deferredRepaints;\r
+    ScopedSuspendResumeNotificationRegistration suspendResumeRegistration;\r
+    std::optional<SimpleTimer> monitorUpdateTimer;\r
 \r
     //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HWNDComponentPeer)\r
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 (file)
index 0000000..82b9038
--- /dev/null
@@ -0,0 +1,118 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+   Agreement and JUCE Privacy Policy.\r
+\r
+   End User License Agreement: www.juce.com/juce-7-licence\r
+   Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+extern XContext windowHandleXContext;\r
+\r
+/*  Attaches a pointer to a given window, so that it can be retrieved with XFindContext on\r
+    the windowHandleXContext.\r
+*/\r
+class ScopedWindowAssociation\r
+{\r
+public:\r
+    ScopedWindowAssociation() = default;\r
+\r
+    ScopedWindowAssociation (void* associatedIn, Window windowIn)\r
+        : associatedPointer ([&]() -> void*\r
+          {\r
+              if (associatedIn == nullptr)\r
+                  return nullptr;\r
+\r
+              // If you hit this, there's already a pointer associated with this window.\r
+              const auto display = XWindowSystem::getInstance()->getDisplay();\r
+              jassert (! getAssociatedPointer (display, windowIn).has_value());\r
+\r
+              if (X11Symbols::getInstance()->xSaveContext (display,\r
+                                                           static_cast<XID> (windowIn),\r
+                                                           windowHandleXContext,\r
+                                                           unalignedPointerCast<XPointer> (associatedIn)) != 0)\r
+              {\r
+                  jassertfalse;\r
+                  return nullptr;\r
+              }\r
+\r
+              return associatedIn;\r
+          }()),\r
+          window (static_cast<XID> (windowIn)) {}\r
+\r
+    ScopedWindowAssociation (const ScopedWindowAssociation&) = delete;\r
+    ScopedWindowAssociation& operator= (const ScopedWindowAssociation&) = delete;\r
+\r
+    ScopedWindowAssociation (ScopedWindowAssociation&& other) noexcept\r
+        : associatedPointer (std::exchange (other.associatedPointer, nullptr)), window (other.window) {}\r
+\r
+    ScopedWindowAssociation& operator= (ScopedWindowAssociation&& other) noexcept\r
+    {\r
+        ScopedWindowAssociation { std::move (other) }.swap (*this);\r
+        return *this;\r
+    }\r
+\r
+    ~ScopedWindowAssociation() noexcept\r
+    {\r
+        if (associatedPointer == nullptr)\r
+            return;\r
+\r
+        const auto display = XWindowSystem::getInstance()->getDisplay();\r
+        const auto ptr = getAssociatedPointer (display, window);\r
+\r
+        if (! ptr.has_value())\r
+        {\r
+            // If you hit this, something else has cleared this association before we were able to.\r
+            jassertfalse;\r
+            return;\r
+        }\r
+\r
+        jassert (unalignedPointerCast<XPointer> (associatedPointer) == *ptr);\r
+\r
+        if (X11Symbols::getInstance()->xDeleteContext (display, window, windowHandleXContext) != 0)\r
+            jassertfalse;\r
+    }\r
+\r
+    bool isValid() const { return associatedPointer != nullptr; }\r
+\r
+private:\r
+    static std::optional<XPointer> getAssociatedPointer (Display* display, Window window)\r
+    {\r
+        XPointer ptr{};\r
+\r
+        if (X11Symbols::getInstance()->xFindContext (display, window, windowHandleXContext, &ptr) != 0)\r
+            return std::nullopt;\r
+\r
+        return ptr;\r
+    }\r
+\r
+    void swap (ScopedWindowAssociation& other) noexcept\r
+    {\r
+        std::swap (other.associatedPointer, associatedPointer);\r
+        std::swap (other.window, window);\r
+    }\r
+\r
+    void* associatedPointer = nullptr;\r
+    XID window{};\r
+};\r
+\r
+} // namespace juce\r
index ec79806e4599065ae6c0d9e139b86a8e07f78910..6103b7449736ec2a162d163cf212944e2d316fa8 100644 (file)
@@ -361,10 +361,8 @@ namespace X11ErrorHandling
         return 0;\r
     }\r
 \r
-    static int errorHandler (::Display* display, XErrorEvent* event)\r
+    static int errorHandler ([[maybe_unused]] ::Display* display, [[maybe_unused]] XErrorEvent* event)\r
     {\r
-        ignoreUnused (display, event);\r
-\r
        #if JUCE_DEBUG_XERRORS\r
         char errorStr[64]   = { 0 };\r
         char requestStr[64] = { 0 };\r
@@ -1434,15 +1432,21 @@ ComponentPeer* getPeerFor (::Window windowH)
     if (windowH == 0)\r
         return nullptr;\r
 \r
-    XPointer peer = nullptr;\r
-\r
     if (auto* display = XWindowSystem::getInstance()->getDisplay())\r
     {\r
         XWindowSystemUtilities::ScopedXLock xLock;\r
-        X11Symbols::getInstance()->xFindContext (display, (XID) windowH, windowHandleXContext, &peer);\r
+\r
+        if (XPointer peer = nullptr;\r
+            X11Symbols::getInstance()->xFindContext (display,\r
+                                                     static_cast<XID> (windowH),\r
+                                                     windowHandleXContext,\r
+                                                     &peer) == 0)\r
+        {\r
+            return unalignedPointerCast<ComponentPeer*> (peer);\r
+        }\r
     }\r
 \r
-    return unalignedPointerCast<ComponentPeer*> (peer);\r
+    return nullptr;\r
 }\r
 \r
 //==============================================================================\r
@@ -1545,7 +1549,7 @@ static int getAllEventsMask (bool ignoresMouseClicks)
                                                              &swa);\r
 \r
     // Set the window context to identify the window handle object\r
-    if (X11Symbols::getInstance()->xSaveContext (display, (XID) windowH, windowHandleXContext, (XPointer) peer))\r
+    if (! peer->setWindowAssociation (windowH))\r
     {\r
         // Failed\r
         jassertfalse;\r
@@ -1627,10 +1631,7 @@ void XWindowSystem::destroyWindow (::Window windowH)
 \r
     XWindowSystemUtilities::ScopedXLock xLock;\r
 \r
-    XPointer handlePointer;\r
-\r
-    if (! X11Symbols::getInstance()->xFindContext (display, (XID) windowH, windowHandleXContext, &handlePointer))\r
-        X11Symbols::getInstance()->xDeleteContext (display, (XID) windowH, windowHandleXContext);\r
+    peer->clearWindowAssociation();\r
 \r
     X11Symbols::getInstance()->xDestroyWindow (display, windowH);\r
 \r
@@ -2682,7 +2683,7 @@ Array<Displays::Display> XWindowSystem::findDisplays (float masterScale) const
     return displays;\r
 }\r
 \r
-::Window XWindowSystem::createKeyProxy (::Window windowH) const\r
+::Window XWindowSystem::createKeyProxy (::Window windowH)\r
 {\r
     jassert (windowH != 0);\r
 \r
@@ -2696,7 +2697,6 @@ Array<Displays::Display> XWindowSystem::findDisplays (float masterScale) const
                                                               &swa);\r
 \r
     X11Symbols::getInstance()->xMapWindow (display, keyProxy);\r
-    X11Symbols::getInstance()->xSaveContext (display, (XID) keyProxy, windowHandleXContext, (XPointer) this);\r
 \r
     return keyProxy;\r
 }\r
@@ -2705,11 +2705,6 @@ void XWindowSystem::deleteKeyProxy (::Window keyProxy) const
 {\r
     jassert (keyProxy != 0);\r
 \r
-    XPointer handlePointer;\r
-\r
-    if (! X11Symbols::getInstance()->xFindContext (display, (XID) keyProxy, windowHandleXContext, &handlePointer))\r
-          X11Symbols::getInstance()->xDeleteContext (display, (XID) keyProxy, windowHandleXContext);\r
-\r
     X11Symbols::getInstance()->xDestroyWindow (display, keyProxy);\r
     X11Symbols::getInstance()->xSync (display, false);\r
 \r
index 0659adbeccbcab35969074fd39e54d6caf8dcbbc..7fd30a847388fb74376f847d18e7825f42a3bcda 100644 (file)
@@ -225,7 +225,7 @@ public:
 \r
     Array<Displays::Display> findDisplays (float masterScale) const;\r
 \r
-    ::Window createKeyProxy (::Window) const;\r
+    ::Window createKeyProxy (::Window);\r
     void deleteKeyProxy (::Window) const;\r
 \r
     bool externalDragFileInit (LinuxComponentPeer*, const StringArray& files, bool canMove, std::function<void()>&& callback) const;\r
index 082cff66067f203ee984b1f8f3cc1e6a3587fa88..43700aa34b8a0ef1eed83c665375a1a141709bb6 100644 (file)
@@ -1207,9 +1207,8 @@ std::unique_ptr<AccessibilityHandler> ListBox::createAccessibilityHandler()
 }\r
 \r
 //==============================================================================\r
-Component* ListBoxModel::refreshComponentForRow (int, bool, Component* existingComponentToUpdate)\r
+Component* ListBoxModel::refreshComponentForRow (int, bool, [[maybe_unused]] Component* existingComponentToUpdate)\r
 {\r
-    ignoreUnused (existingComponentToUpdate);\r
     jassert (existingComponentToUpdate == nullptr); // indicates a failure in the code that recycles the components\r
     return nullptr;\r
 }\r
index 4dc53dc32c4be453e9b1a5a76384a3fc2641a9ba..11075ace7ee70495e087dfecee30a2933fe2f406 100644 (file)
@@ -500,6 +500,33 @@ void TableHeaderComponent::reactToMenuItem (const int menuReturnId, const int /*
         setColumnVisible (menuReturnId, ! isColumnVisible (menuReturnId));\r
 }\r
 \r
+void TableHeaderComponent::drawColumnHeader (Graphics& g, LookAndFeel& lf, const ColumnInfo& ci)\r
+{\r
+    // Only paint columns that are visible\r
+    if (! ci.isVisible())\r
+        return;\r
+\r
+    // If this column is being dragged, it shouldn't be drawn in the table header\r
+    if (ci.id == columnIdBeingDragged && dragOverlayComp != nullptr && dragOverlayComp->isVisible())\r
+        return;\r
+\r
+    // There's no point drawing this column header if no part of it is visible\r
+    if (! g.getClipBounds()\r
+           .getHorizontalRange()\r
+           .intersects (Range<int>::withStartAndLength (ci.getX(), ci.width)))\r
+        return;\r
+\r
+    Graphics::ScopedSaveState ss (g);\r
+\r
+    g.setOrigin (ci.getX(), ci.getY());\r
+    g.reduceClipRegion (0, 0, ci.width, ci.getHeight());\r
+\r
+    lf.drawTableHeaderColumn (g, *this, ci.getTitle(), ci.id, ci.width, getHeight(),\r
+                              ci.id == columnIdUnderMouse,\r
+                              ci.id == columnIdUnderMouse && isMouseButtonDown(),\r
+                              ci.propertyFlags);\r
+}\r
+\r
 void TableHeaderComponent::paint (Graphics& g)\r
 {\r
     auto& lf = getLookAndFeel();\r
@@ -507,48 +534,18 @@ void TableHeaderComponent::paint (Graphics& g)
     lf.drawTableHeaderBackground (g, *this);\r
 \r
     for (auto* ci : columns)\r
-    {\r
-        if (ci->isVisible() && ci->getWidth() > 0)\r
-        {\r
-            Graphics::ScopedSaveState ss (g);\r
-\r
-            g.setOrigin (ci->getX(), ci->getY());\r
-            g.reduceClipRegion (0, 0, ci->getWidth(), ci->getHeight());\r
-\r
-            lf.drawTableHeaderColumn (g, *this, ci->getTitle(), ci->id, ci->width, getHeight(),\r
-                                      ci->id == columnIdUnderMouse,\r
-                                      ci->id == columnIdUnderMouse && isMouseButtonDown(),\r
-                                      ci->propertyFlags);\r
-        }\r
-    }\r
+        drawColumnHeader (g, lf, *ci);\r
 }\r
 \r
 void TableHeaderComponent::resized()\r
 {\r
-    auto clip = getBounds();\r
-\r
     int x = 0;\r
 \r
-    for (auto* ci : columns)\r
-        ci->setBounds (0, 0, 0, 0);\r
-\r
     for (auto* ci : columns)\r
     {\r
-        if (ci->isVisible())\r
-        {\r
-            if (x + ci->width > clip.getX()\r
-                && (ci->id != columnIdBeingDragged\r
-                    || dragOverlayComp == nullptr\r
-                    || ! dragOverlayComp->isVisible()))\r
-            {\r
-                ci->setBounds (x, 0, ci->width, getHeight());\r
-            }\r
-\r
-            x += ci->width;\r
-\r
-            if (x >= clip.getRight())\r
-                break;\r
-        }\r
+        const auto widthToUse = ci->isVisible() ? ci->width : 0;\r
+        ci->setBounds (x, 0, widthToUse, getHeight());\r
+        x += widthToUse;\r
     }\r
 }\r
 \r
index 3d1b017350206cc4abcdfb804cf7ec513a69d842..5afa5a3854cba4eb114f561325ed71311bb5a48a 100644 (file)
@@ -453,6 +453,7 @@ private:
     void updateColumnUnderMouse (const MouseEvent&);\r
     void setColumnUnderMouse (int columnId);\r
     void resizeColumnsToFit (int firstColumnIndex, int targetTotalWidth);\r
+    void drawColumnHeader (Graphics&, LookAndFeel&, const ColumnInfo&);\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableHeaderComponent)\r
 };\r
index b332e5dc06098943559d7b2b4af2ee5c67016dc9..00cd8c79a73bdbf552904ada83fb3daa2e085304 100644 (file)
@@ -725,9 +725,8 @@ void TableListBoxModel::listWasScrolled()                               {}
 String TableListBoxModel::getCellTooltip (int /*rowNumber*/, int /*columnId*/)    { return {}; }\r
 var TableListBoxModel::getDragSourceDescription (const SparseSet<int>&)           { return {}; }\r
 \r
-Component* TableListBoxModel::refreshComponentForCell (int, int, bool, Component* existingComponentToUpdate)\r
+Component* TableListBoxModel::refreshComponentForCell (int, int, bool, [[maybe_unused]] Component* existingComponentToUpdate)\r
 {\r
-    ignoreUnused (existingComponentToUpdate);\r
     jassert (existingComponentToUpdate == nullptr); // indicates a failure in the code that recycles the components\r
     return nullptr;\r
 }\r
index 18b35fe0e422ce65dafaa19b7f19a8d984f4b4fd..79be3ecca2bb0bea61660b95893c0faf854a0e2d 100644 (file)
@@ -948,6 +948,11 @@ TextEditor::TextEditor (const String& name, juce_wchar passwordChar)
 \r
 TextEditor::~TextEditor()\r
 {\r
+    giveAwayKeyboardFocus();\r
+\r
+    if (auto* peer = getPeer())\r
+        peer->refreshTextInputTarget();\r
+\r
     textValue.removeListener (textHolder);\r
     textValue.referTo (Value());\r
 \r
@@ -1240,7 +1245,7 @@ void TextEditor::setText (const String& newText, bool sendTextChangeMessage)
         textValue = newText;\r
 \r
         auto oldCursorPos = caretPosition;\r
-        bool cursorWasAtEnd = oldCursorPos >= getTotalNumChars();\r
+        auto cursorWasAtEnd = oldCursorPos >= getTotalNumChars();\r
 \r
         clearInternal (nullptr);\r
         insert (newText, 0, currentFont, findColour (textColourId), nullptr, caretPosition);\r
@@ -1376,26 +1381,23 @@ void TextEditor::repaintText (Range<int> range)
 }\r
 \r
 //==============================================================================\r
-void TextEditor::moveCaret (int newCaretPos)\r
+void TextEditor::moveCaret (const int newCaretPos)\r
 {\r
-    if (newCaretPos < 0)\r
-        newCaretPos = 0;\r
-    else\r
-        newCaretPos = jmin (newCaretPos, getTotalNumChars());\r
+    const auto clamped = std::clamp (newCaretPos, 0, getTotalNumChars());\r
 \r
-    if (newCaretPos != getCaretPosition())\r
-    {\r
-        caretPosition = newCaretPos;\r
+    if (clamped == getCaretPosition())\r
+        return;\r
 \r
-        if (hasKeyboardFocus (false))\r
-            textHolder->restartTimer();\r
+    caretPosition = clamped;\r
 \r
-        scrollToMakeSureCursorIsVisible();\r
-        updateCaretPosition();\r
+    if (hasKeyboardFocus (false))\r
+        textHolder->restartTimer();\r
 \r
-        if (auto* handler = getAccessibilityHandler())\r
-            handler->notifyAccessibilityEvent (AccessibilityEvent::textChanged);\r
-    }\r
+    scrollToMakeSureCursorIsVisible();\r
+    updateCaretPosition();\r
+\r
+    if (auto* handler = getAccessibilityHandler())\r
+        handler->notifyAccessibilityEvent (AccessibilityEvent::textChanged);\r
 }\r
 \r
 int TextEditor::getCaretPosition() const\r
@@ -2306,6 +2308,11 @@ void TextEditor::setTemporaryUnderlining (const Array<Range<int>>& newUnderlined
     repaint();\r
 }\r
 \r
+TextInputTarget::VirtualKeyboardType TextEditor::getKeyboardType()\r
+{\r
+    return passwordCharacter != 0 ? passwordKeyboard : keyboardType;\r
+}\r
+\r
 //==============================================================================\r
 UndoManager* TextEditor::getUndoManager() noexcept\r
 {\r
index c48425d48beb7274e789245847331bab3ef8052e..748bdcf926ba85bdee1e1ef999fb0c23f9d2ce95 100644 (file)
@@ -742,7 +742,7 @@ public:
     /** @internal */\r
     void setTemporaryUnderlining (const Array<Range<int>>&) override;\r
     /** @internal */\r
-    VirtualKeyboardType getKeyboardType() override    { return keyboardType; }\r
+    VirtualKeyboardType getKeyboardType() override;\r
 \r
 protected:\r
     //==============================================================================\r
index 3ab01734a58f828a4794aab20416e22dfbe72692..fdb36953ba5789ca17badd1312d0e0c879bc15e6 100644 (file)
@@ -182,7 +182,6 @@ bool ComponentPeer::handleKeyPress (const int keyCode, const juce_wchar textChar
                                      textCharacter));\r
 }\r
 \r
-\r
 bool ComponentPeer::handleKeyPress (const KeyPress& keyInfo)\r
 {\r
     bool keyWasUsed = false;\r
@@ -587,8 +586,8 @@ void ComponentPeer::setRepresentedFile (const File&)
 }\r
 \r
 //==============================================================================\r
-int ComponentPeer::getCurrentRenderingEngine() const            { return 0; }\r
-void ComponentPeer::setCurrentRenderingEngine (int index)       { jassert (index == 0); ignoreUnused (index); }\r
+int ComponentPeer::getCurrentRenderingEngine() const                             { return 0; }\r
+void ComponentPeer::setCurrentRenderingEngine ([[maybe_unused]] int index)       { jassert (index == 0); }\r
 \r
 //==============================================================================\r
 std::function<ModifierKeys()> ComponentPeer::getNativeRealtimeModifiers = nullptr;\r
@@ -607,7 +606,7 @@ void ComponentPeer::forceDisplayUpdate()
     Desktop::getInstance().displays->refresh();\r
 }\r
 \r
-void ComponentPeer::globalFocusChanged (Component*)\r
+void ComponentPeer::globalFocusChanged ([[maybe_unused]] Component* comp)\r
 {\r
     refreshTextInputTarget();\r
 }\r
index b0d6ed059c9def2e1d910d34059034ecd269c1c8..87bf0ef4e8bd81c9e82e38d4d861677b7efb836a 100644 (file)
@@ -125,7 +125,7 @@ public:
                           Thread::Priority for values\r
         @returns true if the thread finished normally; false if the user pressed cancel\r
     */\r
-    bool runThread (Priority Priority = Priority::normal);\r
+    bool runThread (Priority priority = Priority::normal);\r
    #endif\r
 \r
     /** Starts the thread and returns.\r
index da5b4a9a3ecd3d27671794b2845cbcb40c57b498..dd4345297d547dc15be3f79020f1df3def67f1de 100644 (file)
@@ -476,6 +476,11 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& doc, CodeTokeniser* cons
 \r
 CodeEditorComponent::~CodeEditorComponent()\r
 {\r
+    giveAwayKeyboardFocus();\r
+\r
+    if (auto* peer = getPeer())\r
+        peer->refreshTextInputTarget();\r
+\r
     document.removeListener (pimpl.get());\r
 }\r
 \r
@@ -670,10 +675,9 @@ void CodeEditorComponent::codeDocumentChanged (const int startIndex, const int e
     updateScrollBars();\r
 }\r
 \r
-void CodeEditorComponent::retokenise (int startIndex, int endIndex)\r
+void CodeEditorComponent::retokenise (int startIndex, [[maybe_unused]] int endIndex)\r
 {\r
     const CodeDocument::Position affectedTextStart (document, startIndex);\r
-    juce::ignoreUnused (endIndex); // Leave room for more efficient impl in future.\r
 \r
     clearCachedIterators (affectedTextStart.getLineNumber());\r
 \r
index 173cd09bd100eb97290b95f7d6930457e896e540..9a50b88b42e7fc39618b36a399c8d3edf851310e 100644 (file)
 #include "misc/juce_SystemTrayIconComponent.cpp"\r
 #include "misc/juce_LiveConstantEditor.cpp"\r
 #include "misc/juce_AnimatedAppComponent.cpp"\r
+#include "misc/juce_WebBrowserComponent.cpp"\r
 \r
 //==============================================================================\r
 #if JUCE_MAC || JUCE_IOS\r
 #elif JUCE_LINUX || JUCE_BSD\r
  JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wzero-as-null-pointer-constant")\r
 \r
+ #include <juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h>\r
  #include "native/juce_linux_XEmbedComponent.cpp"\r
 \r
  #if JUCE_WEB_BROWSER\r
index 9402907e7fe4d5899e16b2581a46adafa8dbfe0b..952b779848f0d604ca017396d5a25bfbce39123c 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                     juce_gui_extra\r
   vendor:                 juce\r
-  version:                7.0.3\r
+  version:                7.0.4\r
   name:                   JUCE extended GUI classes\r
   description:            Miscellaneous GUI classes for specialised tasks.\r
   website:                http://www.juce.com/juce\r
index ef1e87fb520fe6a2be8efbffe8650b7da3ea8923..18d5db10bd24a17dc7739f57ab68005a7058e5bf 100644 (file)
@@ -36,8 +36,8 @@ namespace juce
 \r
     @tags{GUI}\r
 */\r
-class AnimatedAppComponent   : public Component,\r
-                               private Timer\r
+class JUCE_API  AnimatedAppComponent   : public Component,\r
+                                         private Timer\r
 {\r
 public:\r
     AnimatedAppComponent();\r
index 5642deb8aabadbd8c3b9c9c5c92cc58176dce99d..ece6c622dafda2dad7b306f800f15848bb1ff645 100644 (file)
@@ -86,12 +86,11 @@ PushNotifications::~PushNotifications() { clearSingletonInstance(); }
 void PushNotifications::addListener (Listener* l)      { listeners.add (l); }\r
 void PushNotifications::removeListener (Listener* l)   { listeners.remove (l); }\r
 \r
-void PushNotifications::requestPermissionsWithSettings (const PushNotifications::Settings& settings)\r
+void PushNotifications::requestPermissionsWithSettings ([[maybe_unused]] const PushNotifications::Settings& settings)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS && (JUCE_IOS || JUCE_MAC)\r
     pimpl->requestPermissionsWithSettings (settings);\r
   #else\r
-    ignoreUnused (settings);\r
     listeners.call ([] (Listener& l) { l.notificationSettingsReceived ({}); });\r
   #endif\r
 }\r
@@ -137,12 +136,10 @@ String PushNotifications::getDeviceToken() const
   #endif\r
 }\r
 \r
-void PushNotifications::setupChannels (const Array<ChannelGroup>& groups, const Array<Channel>& channels)\r
+void PushNotifications::setupChannels ([[maybe_unused]] const Array<ChannelGroup>& groups, [[maybe_unused]] const Array<Channel>& channels)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS\r
     pimpl->setupChannels (groups, channels);\r
-  #else\r
-    ignoreUnused (groups, channels);\r
   #endif\r
 }\r
 \r
@@ -160,58 +157,48 @@ void PushNotifications::removeAllPendingLocalNotifications()
   #endif\r
 }\r
 \r
-void PushNotifications::subscribeToTopic (const String& topic)\r
+void PushNotifications::subscribeToTopic ([[maybe_unused]] const String& topic)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS\r
     pimpl->subscribeToTopic (topic);\r
-  #else\r
-    ignoreUnused (topic);\r
   #endif\r
 }\r
 \r
-void PushNotifications::unsubscribeFromTopic (const String& topic)\r
+void PushNotifications::unsubscribeFromTopic ([[maybe_unused]] const String& topic)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS\r
     pimpl->unsubscribeFromTopic (topic);\r
-  #else\r
-    ignoreUnused (topic);\r
   #endif\r
 }\r
 \r
 \r
-void PushNotifications::sendLocalNotification (const Notification& n)\r
+void PushNotifications::sendLocalNotification ([[maybe_unused]] const Notification& n)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS\r
     pimpl->sendLocalNotification (n);\r
-  #else\r
-    ignoreUnused (n);\r
   #endif\r
 }\r
 \r
-void PushNotifications::removeDeliveredNotification (const String& identifier)\r
+void PushNotifications::removeDeliveredNotification ([[maybe_unused]] const String& identifier)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS\r
     pimpl->removeDeliveredNotification (identifier);\r
-  #else\r
-    ignoreUnused (identifier);\r
   #endif\r
 }\r
 \r
-void PushNotifications::removePendingLocalNotification (const String& identifier)\r
+void PushNotifications::removePendingLocalNotification ([[maybe_unused]] const String& identifier)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS\r
     pimpl->removePendingLocalNotification (identifier);\r
-  #else\r
-    ignoreUnused (identifier);\r
   #endif\r
 }\r
 \r
-void PushNotifications::sendUpstreamMessage (const String& serverSenderId,\r
-                                             const String& collapseKey,\r
-                                             const String& messageId,\r
-                                             const String& messageType,\r
-                                             int timeToLive,\r
-                                             const StringPairArray& additionalData)\r
+void PushNotifications::sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId,\r
+                                             [[maybe_unused]] const String& collapseKey,\r
+                                             [[maybe_unused]] const String& messageId,\r
+                                             [[maybe_unused]] const String& messageType,\r
+                                             [[maybe_unused]] int timeToLive,\r
+                                             [[maybe_unused]] const StringPairArray& additionalData)\r
 {\r
   #if JUCE_PUSH_NOTIFICATIONS\r
     pimpl->sendUpstreamMessage (serverSenderId,\r
@@ -220,10 +207,24 @@ void PushNotifications::sendUpstreamMessage (const String& serverSenderId,
                                 messageType,\r
                                 timeToLive,\r
                                 additionalData);\r
-  #else\r
-    ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
-    ignoreUnused (timeToLive, additionalData);\r
   #endif\r
 }\r
 \r
+//==============================================================================\r
+void PushNotifications::Listener::notificationSettingsReceived ([[maybe_unused]] const Settings& settings) {}\r
+void PushNotifications::Listener::pendingLocalNotificationsListReceived ([[maybe_unused]] const Array<Notification>& notifications) {}\r
+void PushNotifications::Listener::handleNotification ([[maybe_unused]] bool isLocalNotification,\r
+                                                      [[maybe_unused]] const Notification& notification) {}\r
+void PushNotifications::Listener::handleNotificationAction ([[maybe_unused]] bool isLocalNotification,\r
+                                                            [[maybe_unused]] const Notification& notification,\r
+                                                            [[maybe_unused]] const String& actionIdentifier,\r
+                                                            [[maybe_unused]] const String& optionalResponse) {}\r
+void PushNotifications::Listener::localNotificationDismissedByUser ([[maybe_unused]] const Notification& notification) {}\r
+void PushNotifications::Listener::deliveredNotificationsListReceived ([[maybe_unused]] const Array<Notification>& notifications) {}\r
+void PushNotifications::Listener::deviceTokenRefreshed ([[maybe_unused]] const String& token) {}\r
+void PushNotifications::Listener::remoteNotificationsDeleted() {}\r
+void PushNotifications::Listener::upstreamMessageSent ([[maybe_unused]] const String& messageId) {}\r
+void PushNotifications::Listener::upstreamMessageSendingError ([[maybe_unused]] const String& messageId,\r
+                                                               [[maybe_unused]] const String& error) {}\r
+\r
 } // namespace juce\r
index 52cf1dbce2897730a04545b9619fc18d7c791dd5..384b43abfbc2d09ebe920356d262ce535f851a9e 100644 (file)
@@ -601,12 +601,12 @@ public:
             with no categories and all allow flags set to true will be received in\r
             Listener::notificationSettingsReceived().\r
         */\r
-        virtual void notificationSettingsReceived (const Settings& settings) { ignoreUnused (settings); }\r
+        virtual void notificationSettingsReceived (const Settings& settings);\r
 \r
         /** Called when the list of pending notifications, requested by calling\r
             getPendingLocalNotifications() is returned. iOS 10 or above only.\r
         */\r
-        virtual void pendingLocalNotificationsListReceived (const Array<Notification>& notifications) { ignoreUnused (notifications); }\r
+        virtual void pendingLocalNotificationsListReceived (const Array<Notification>& notifications);\r
 \r
         /** This can be called in multiple different situations, depending on the OS and the situation.\r
 \r
@@ -622,7 +622,7 @@ public:
 \r
             Note you can receive this callback on startup, if the application was launched from a notification.\r
         */\r
-        virtual void handleNotification (bool isLocalNotification, const Notification& notification) { ignoreUnused (isLocalNotification); ignoreUnused (notification); }\r
+        virtual void handleNotification (bool isLocalNotification, const Notification& notification);\r
 \r
         /** This can be called when a user performs some action on the notification such as\r
             pressing on an action button or responding with a text input.\r
@@ -641,18 +641,12 @@ public:
         virtual void handleNotificationAction (bool isLocalNotification,\r
                                                const Notification& notification,\r
                                                const String& actionIdentifier,\r
-                                               const String& optionalResponse)\r
-        {\r
-            ignoreUnused (isLocalNotification);\r
-            ignoreUnused (notification);\r
-            ignoreUnused (actionIdentifier);\r
-            ignoreUnused (optionalResponse);\r
-        }\r
+                                               const String& optionalResponse);\r
 \r
         /** For iOS10 and Android, this can be also called when a user dismissed the notification before\r
             responding to it.\r
         */\r
-        virtual void localNotificationDismissedByUser (const Notification& notification) { ignoreUnused (notification); }\r
+        virtual void localNotificationDismissedByUser (const Notification& notification);\r
 \r
         /** Called after getDeliveredNotifications() request is fulfilled. Returns notifications\r
             that are visible in the notification area on the device and that are still waiting\r
@@ -661,31 +655,31 @@ public:
             On iOS, iOS version 10 or higher is required. On Android, API level 18 or higher is required.\r
             For unsupported platforms, an empty array will be returned.\r
          */\r
-        virtual void deliveredNotificationsListReceived (const Array<Notification>& notifications) { ignoreUnused (notifications); }\r
+        virtual void deliveredNotificationsListReceived (const Array<Notification>& notifications);\r
 \r
         /** Called whenever a token gets refreshed. You should monitor any token updates, because\r
             only the last token that is assigned to device is valid and can be used.\r
         */\r
-        virtual void deviceTokenRefreshed (const String& token) { ignoreUnused (token); }\r
+        virtual void deviceTokenRefreshed (const String& token);\r
 \r
         /** Called when Firebase Cloud Messaging server deletes pending messages. This can happen when\r
             1) too many messages were sent to the server (hint: use collapsible messages).\r
             2) the devices hasn't been online in a long time (refer to Firebase documentation for\r
                the maximum time a message can be stored on FCM before expiring).\r
         */\r
-        virtual void remoteNotificationsDeleted() {}\r
+        virtual void remoteNotificationsDeleted();\r
 \r
         /** Called when an upstream message sent with PushNotifications::sendUpstreamMessage() has been\r
             sent successfully.\r
             Bear in mind that in may take several minutes or more to receive this callback.\r
         */\r
-        virtual void upstreamMessageSent (const String& messageId) { ignoreUnused (messageId); }\r
+        virtual void upstreamMessageSent (const String& messageId);\r
 \r
         /** Called when there was an error sending an upstream message with\r
             PushNotifications::sendUpstreamMessage().\r
             Bear in mind that in may take several minutes or more to receive this callback.\r
         */\r
-        virtual void upstreamMessageSendingError (const String& messageId, const String& error) {  ignoreUnused (messageId); ignoreUnused (error); }\r
+        virtual void upstreamMessageSendingError (const String& messageId, const String& error);\r
     };\r
 \r
     void addListener (Listener* l);\r
index 94fb32631352d75652347d0e6782e2169ea35f97..c5a4efb8d8c589f532c4a52a3b6a7d8c76ccdd2b 100644 (file)
@@ -132,19 +132,17 @@ void RecentlyOpenedFilesList::restoreFromString (const String& stringifiedVersio
 \r
 \r
 //==============================================================================\r
-void RecentlyOpenedFilesList::registerRecentFileNatively (const File& file)\r
+void RecentlyOpenedFilesList::registerRecentFileNatively ([[maybe_unused]] const File& file)\r
 {\r
    #if JUCE_MAC\r
     JUCE_AUTORELEASEPOOL\r
     {\r
         [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL: createNSURLFromFile (file)];\r
     }\r
-   #else\r
-    ignoreUnused (file);\r
    #endif\r
 }\r
 \r
-void RecentlyOpenedFilesList::forgetRecentFileNatively (const File& file)\r
+void RecentlyOpenedFilesList::forgetRecentFileNatively ([[maybe_unused]] const File& file)\r
 {\r
    #if JUCE_MAC\r
     JUCE_AUTORELEASEPOOL\r
@@ -166,8 +164,6 @@ void RecentlyOpenedFilesList::forgetRecentFileNatively (const File& file)
             if (! [url isEqual:nsFile])\r
                 [sharedDocController noteNewRecentDocumentURL:url];\r
     }\r
-   #else\r
-    ignoreUnused (file);\r
    #endif\r
 }\r
 \r
diff --git a/modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp b/modules/juce_gui_extra/misc/juce_WebBrowserComponent.cpp
new file mode 100644 (file)
index 0000000..ce8af6e
--- /dev/null
@@ -0,0 +1,39 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2022 - Raw Material Software Limited\r
+\r
+   JUCE is an open source library subject to commercial or open-source\r
+   licensing.\r
+\r
+   By using JUCE, you agree to the terms of both the JUCE 7 End-User License\r
+   Agreement and JUCE Privacy Policy.\r
+\r
+   End User License Agreement: www.juce.com/juce-7-licence\r
+   Privacy Policy: www.juce.com/juce-privacy-policy\r
+\r
+   Or: You may also use this code under the terms of the GPL v3 (see\r
+   www.gnu.org/licenses).\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+#if JUCE_WEB_BROWSER || DOXYGEN\r
+\r
+bool WebBrowserComponent::pageAboutToLoad ([[maybe_unused]] const String& newURL)             { return true; }\r
+void WebBrowserComponent::pageFinishedLoading ([[maybe_unused]] const String& url)            {}\r
+bool WebBrowserComponent::pageLoadHadNetworkError ([[maybe_unused]] const String& errorInfo)  { return true; }\r
+void WebBrowserComponent::windowCloseRequest()                                                {}\r
+void WebBrowserComponent::newWindowAttemptingToLoad ([[maybe_unused]] const String& newURL)   {}\r
+\r
+#endif\r
+\r
+} // namespace juce\r
index e65fbea5c267c16d4540a4594f16ca1904771ee6..758d2587ea504489b255ae504835f67d12de3f18 100644 (file)
@@ -63,7 +63,7 @@ public:
                 of IE. To change this behaviour, you either need to add the following html element into your page's\r
                 head section:\r
 \r
-                <meta http-equiv="X-UA-Compatible" content="IE=edge" />\r
+                    <meta http-equiv="X-UA-Compatible" content="IE=edge" />\r
 \r
                 or you need to change windows registry values for your application.  More infromation on the latter\r
                 can be found here:\r
@@ -179,12 +179,6 @@ public:
     /** Creates a WebBrowserComponent.\r
 \r
         Once it's created and visible, send the browser to a URL using goToURL().\r
-\r
-        @param unloadPageWhenBrowserIsHidden  if this is true, then when the browser\r
-                            component is taken offscreen, it'll clear the current page\r
-                            and replace it with a blank page - this can be handy to stop\r
-                            the browser using resources in the background when it's not\r
-                            actually being used.\r
     */\r
     explicit WebBrowserComponent (const Options& options);\r
 \r
@@ -232,10 +226,10 @@ public:
         tries to go to a particular URL. To allow the operation to carry on,\r
         return true, or return false to stop the navigation happening.\r
     */\r
-    virtual bool pageAboutToLoad (const String& newURL)             { ignoreUnused (newURL); return true; }\r
+    virtual bool pageAboutToLoad (const String& newURL);\r
 \r
     /** This callback happens when the browser has finished loading a page. */\r
-    virtual void pageFinishedLoading (const String& url)            { ignoreUnused (url); }\r
+    virtual void pageFinishedLoading (const String& url);\r
 \r
     /** This callback happens when a network error was encountered while\r
         trying to load a page.\r
@@ -247,18 +241,18 @@ public:
         The errorInfo contains some platform dependent string describing the\r
         error.\r
     */\r
-    virtual bool pageLoadHadNetworkError (const String& errorInfo)  { ignoreUnused (errorInfo); return true; }\r
+    virtual bool pageLoadHadNetworkError (const String& errorInfo);\r
 \r
     /** This callback occurs when a script or other activity in the browser asks for\r
         the window to be closed.\r
     */\r
-    virtual void windowCloseRequest()                               {}\r
+    virtual void windowCloseRequest();\r
 \r
     /** This callback occurs when the browser attempts to load a URL in a new window.\r
         This won't actually load the window but gives you a chance to either launch a\r
         new window yourself or just load the URL into the current window with goToURL().\r
      */\r
-    virtual void newWindowAttemptingToLoad (const String& newURL)   { ignoreUnused (newURL); }\r
+    virtual void newWindowAttemptingToLoad (const String& newURL);\r
 \r
     //==============================================================================\r
     /** @internal */\r
@@ -288,6 +282,7 @@ private:
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebBrowserComponent)\r
 };\r
+\r
 #endif\r
 \r
 } // namespace juce\r
index 87b461c05cb90f908e53aa36778bc88b07e29b04..b382a3b9e35734de7e7f656c649d1f687a8bc386 100644 (file)
@@ -447,20 +447,18 @@ struct PushNotifications::Pimpl
       #endif\r
     }\r
 \r
-    void notifyListenersTokenRefreshed (const String& token)\r
+    void notifyListenersTokenRefreshed ([[maybe_unused]] const String& token)\r
     {\r
       #if defined(JUCE_FIREBASE_INSTANCE_ID_SERVICE_CLASSNAME)\r
         MessageManager::callAsync ([this, token]\r
         {\r
             owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (token); });\r
         });\r
-      #else\r
-        ignoreUnused (token);\r
       #endif\r
     }\r
 \r
     //==============================================================================\r
-    void subscribeToTopic (const String& topic)\r
+    void subscribeToTopic ([[maybe_unused]] const String& topic)\r
     {\r
       #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
         auto* env = getEnv();\r
@@ -469,12 +467,10 @@ struct PushNotifications::Pimpl
                                                                                  FirebaseMessaging.getInstance));\r
 \r
         env->CallObjectMethod (firebaseMessaging, FirebaseMessaging.subscribeToTopic, javaString (topic).get());\r
-      #else\r
-        ignoreUnused (topic);\r
       #endif\r
     }\r
 \r
-    void unsubscribeFromTopic (const String& topic)\r
+    void unsubscribeFromTopic ([[maybe_unused]] const String& topic)\r
     {\r
       #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
         auto* env = getEnv();\r
@@ -483,17 +479,15 @@ struct PushNotifications::Pimpl
                                                                                  FirebaseMessaging.getInstance));\r
 \r
         env->CallObjectMethod (firebaseMessaging, FirebaseMessaging.unsubscribeFromTopic, javaString (topic).get());\r
-      #else\r
-        ignoreUnused (topic);\r
       #endif\r
     }\r
 \r
-    void sendUpstreamMessage (const String& serverSenderId,\r
-                              const String& collapseKey,\r
-                              const String& messageId,\r
-                              const String& messageType,\r
-                              int timeToLive,\r
-                              const StringPairArray& additionalData)\r
+    void sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId,\r
+                              [[maybe_unused]] const String& collapseKey,\r
+                              [[maybe_unused]] const String& messageId,\r
+                              [[maybe_unused]] const String& messageType,\r
+                              [[maybe_unused]] int timeToLive,\r
+                              [[maybe_unused]] const StringPairArray& additionalData)\r
     {\r
       #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
         auto* env = getEnv();\r
@@ -521,13 +515,10 @@ struct PushNotifications::Pimpl
                                                                                  FirebaseMessaging.getInstance));\r
 \r
         env->CallVoidMethod (firebaseMessaging, FirebaseMessaging.send, message.get());\r
-      #else\r
-        ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
-        ignoreUnused (timeToLive, additionalData);\r
       #endif\r
     }\r
 \r
-    void notifyListenersAboutRemoteNotificationFromSystemTray (const LocalRef<jobject>& intent)\r
+    void notifyListenersAboutRemoteNotificationFromSystemTray ([[maybe_unused]] const LocalRef<jobject>& intent)\r
     {\r
       #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
         auto* env = getEnv();\r
@@ -536,12 +527,10 @@ struct PushNotifications::Pimpl
         auto notification = remoteNotificationBundleToJuceNotification (bundle);\r
 \r
         owner.listeners.call ([&] (Listener& l) { l.handleNotification (false, notification); });\r
-      #else\r
-        ignoreUnused (intent);\r
       #endif\r
     }\r
 \r
-    void notifyListenersAboutRemoteNotificationFromService (const LocalRef<jobject>& remoteNotification)\r
+    void notifyListenersAboutRemoteNotificationFromService ([[maybe_unused]] const LocalRef<jobject>& remoteNotification)\r
     {\r
       #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
         GlobalRef rn (remoteNotification);\r
@@ -551,8 +540,6 @@ struct PushNotifications::Pimpl
             auto notification = firebaseRemoteNotificationToJuceNotification (rn.get());\r
             owner.listeners.call ([&] (Listener& l) { l.handleNotification (false, notification); });\r
         });\r
-      #else\r
-        ignoreUnused (remoteNotification);\r
       #endif\r
     }\r
 \r
@@ -566,7 +553,7 @@ struct PushNotifications::Pimpl
       #endif\r
     }\r
 \r
-    void notifyListenersAboutUpstreamMessageSent (const LocalRef<jstring>& messageId)\r
+    void notifyListenersAboutUpstreamMessageSent ([[maybe_unused]] const LocalRef<jstring>& messageId)\r
     {\r
       #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
         GlobalRef mid (LocalRef<jobject>(messageId.get()));\r
@@ -576,13 +563,11 @@ struct PushNotifications::Pimpl
             auto midString = juceString ((jstring) mid.get());\r
             owner.listeners.call ([&] (Listener& l) { l.upstreamMessageSent (midString); });\r
         });\r
-      #else\r
-        ignoreUnused (messageId);\r
       #endif\r
     }\r
 \r
-    void notifyListenersAboutUpstreamMessageSendingError (const LocalRef<jstring>& messageId,\r
-                                                          const LocalRef<jstring>& error)\r
+    void notifyListenersAboutUpstreamMessageSendingError ([[maybe_unused]] const LocalRef<jstring>& messageId,\r
+                                                          [[maybe_unused]] const LocalRef<jstring>& error)\r
     {\r
       #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
         GlobalRef mid (LocalRef<jobject>(messageId.get())), e (LocalRef<jobject>(error.get()));\r
@@ -594,8 +579,6 @@ struct PushNotifications::Pimpl
 \r
             owner.listeners.call ([&] (Listener& l) { l.upstreamMessageSendingError (midString, eString); });\r
         });\r
-      #else\r
-        ignoreUnused (messageId, error);\r
       #endif\r
     }\r
 \r
@@ -1566,8 +1549,6 @@ struct JuceFirebaseInstanceIdService
             instance->pimpl->notifyListenersTokenRefreshed (juceString (static_cast<jstring> (token)));\r
     }\r
 };\r
-\r
-JuceFirebaseInstanceIdService::InstanceIdService_Class JuceFirebaseInstanceIdService::InstanceIdService;\r
 #endif\r
 \r
 #if defined(JUCE_FIREBASE_MESSAGING_SERVICE_CLASSNAME)\r
@@ -1609,8 +1590,6 @@ struct JuceFirebaseMessagingService
                                                                               LocalRef<jstring> (static_cast<jstring> (error)));\r
     }\r
 };\r
-\r
-JuceFirebaseMessagingService::MessagingService_Class  JuceFirebaseMessagingService::MessagingService;\r
 #endif\r
 \r
 //==============================================================================\r
index 462bc43936ba2e901db54393a9c49580c6f182a8..b4871cd9c5807df7dc7b476bf584a66da92b37df 100644 (file)
@@ -29,7 +29,7 @@ namespace juce
 //==============================================================================\r
 // This byte-code is generated from native/java/com/rmsl/juce/JuceWebView.java with min sdk version 16\r
 // See juce_core/native/java/README.txt on how to generate this byte-code.\r
-static const unsigned char JuceWebView16ByteCode[] =\r
+static const uint8 JuceWebView16ByteCode[] =\r
 {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,\r
 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,\r
 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,\r
@@ -81,7 +81,7 @@ static const unsigned char JuceWebView16ByteCode[] =
 //==============================================================================\r
 // This byte-code is generated from native/javacore/app/com/rmsl/juce/JuceWebView21.java with min sdk version 21\r
 // See juce_core/native/java/README.txt on how to generate this byte-code.\r
-static const unsigned char JuceWebView21ByteCode[] =\r
+static const uint8 JuceWebView21ByteCode[] =\r
 {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,\r
 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,\r
 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,\r
@@ -479,82 +479,62 @@ private:
     #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
      METHOD (constructor, "<init>",      "(J)V") \\r
      METHOD (hostDeleted, "hostDeleted", "()V") \\r
-     CALLBACK (webViewReceivedHttpError, "webViewReceivedHttpError", "(JLandroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceResponse;)V") \\r
-     CALLBACK (webViewPageLoadStarted, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \\r
-     CALLBACK (webViewPageLoadFinished, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \\r
-     CALLBACK (webViewReceivedSslError, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \\r
+     CALLBACK (generatedCallback<&Pimpl::webViewReceivedHttpError>, "webViewReceivedHttpError", "(JLandroid/webkit/WebView;Landroid/webkit/WebResourceRequest;Landroid/webkit/WebResourceResponse;)V") \\r
+     CALLBACK (generatedCallback<&Pimpl::webViewPageLoadStarted>,   "webViewPageLoadStarted",   "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \\r
+     CALLBACK (generatedCallback<&Pimpl::webViewPageLoadFinished>,  "webViewPageLoadFinished",  "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \\r
+     CALLBACK (generatedCallback<&Pimpl::webViewReceivedSslError>,  "webViewReceivedSslError",  "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \\r
 \r
-     DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient21, "com/rmsl/juce/JuceWebView21$Client", 21, JuceWebView21ByteCode, sizeof (JuceWebView21ByteCode))\r
+     DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient21, "com/rmsl/juce/JuceWebView21$Client", 21, JuceWebView21ByteCode)\r
     #undef JNI_CLASS_MEMBERS\r
 \r
     #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
      METHOD (constructor, "<init>",      "(J)V") \\r
      METHOD (hostDeleted, "hostDeleted", "()V") \\r
-     CALLBACK (webViewPageLoadStarted, "webViewPageLoadStarted", "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \\r
-     CALLBACK (webViewPageLoadFinished, "webViewPageLoadFinished", "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \\r
-     CALLBACK (webViewReceivedSslError, "webViewReceivedSslError", "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \\r
+     CALLBACK (generatedCallback<&Pimpl::webViewPageLoadStarted>,   "webViewPageLoadStarted",   "(JLandroid/webkit/WebView;Ljava/lang/String;)Z") \\r
+     CALLBACK (generatedCallback<&Pimpl::webViewPageLoadFinished>,  "webViewPageLoadFinished",  "(JLandroid/webkit/WebView;Ljava/lang/String;)V") \\r
+     CALLBACK (generatedCallback<&Pimpl::webViewReceivedSslError>,  "webViewReceivedSslError",  "(JLandroid/webkit/WebView;Landroid/webkit/SslErrorHandler;Landroid/net/http/SslError;)V") \\r
 \r
-     DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient16, "com/rmsl/juce/JuceWebView$Client", 16, JuceWebView16ByteCode, sizeof (JuceWebView16ByteCode))\r
+     DECLARE_JNI_CLASS_WITH_BYTECODE (JuceWebViewClient16, "com/rmsl/juce/JuceWebView$Client", 16, JuceWebView16ByteCode)\r
     #undef JNI_CLASS_MEMBERS\r
 \r
-    static jboolean JNICALL webViewPageLoadStarted (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jstring url)\r
+    static jboolean webViewPageLoadStarted (JNIEnv*, Pimpl& t, jstring url)\r
     {\r
-        if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))\r
-            return myself->handlePageAboutToLoad (juceString (url));\r
-\r
-        return 0;\r
+        return t.handlePageAboutToLoad (juceString (url));\r
     }\r
 \r
-    static void JNICALL webViewPageLoadFinished (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jstring url)\r
+    static void webViewPageLoadFinished (JNIEnv*, Pimpl& t, jstring url)\r
     {\r
-        if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))\r
-            myself->owner.pageFinishedLoading (juceString (url));\r
+        t.owner.pageFinishedLoading (juceString (url));\r
     }\r
 \r
-    static void JNICALL webViewReceivedHttpError (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jobject /*request*/, jobject errorResponse)\r
+    static void webViewReceivedSslError (JNIEnv* env, Pimpl& t, jobject sslError)\r
     {\r
-        if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))\r
-            myself->webReceivedHttpError (errorResponse);\r
-    }\r
-\r
-    static void JNICALL webViewReceivedSslError (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/, jobject /*sslErrorHandler*/, jobject sslError)\r
-    {\r
-        auto* env = getEnv();\r
-\r
-        if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))\r
-        {\r
-            auto errorString = LocalRef<jstring> ((jstring) env->CallObjectMethod (sslError, SslError.toString));\r
-\r
-            myself->owner.pageLoadHadNetworkError (juceString (errorString));\r
-        }\r
+        const auto errorString = LocalRef<jstring> ((jstring) env->CallObjectMethod (sslError, SslError.toString));\r
+        t.owner.pageLoadHadNetworkError (juceString (errorString));\r
     }\r
 \r
     //==============================================================================\r
     #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
       METHOD (constructor, "<init>",      "(J)V") \\r
-      CALLBACK (webViewCloseWindowRequest,  "webViewCloseWindowRequest",  "(JLandroid/webkit/WebView;)V") \\r
-      CALLBACK (webViewCreateWindowRequest, "webViewCreateWindowRequest", "(JLandroid/webkit/WebView;)V") \\r
+      CALLBACK (generatedCallback<&Pimpl::webViewCloseWindowRequest>,   "webViewCloseWindowRequest",    "(JLandroid/webkit/WebView;)V") \\r
+      CALLBACK (generatedCallback<&Pimpl::webViewCreateWindowRequest>,  "webViewCreateWindowRequest",   "(JLandroid/webkit/WebView;)V") \\r
 \r
     DECLARE_JNI_CLASS (JuceWebChromeClient, "com/rmsl/juce/JuceWebView$ChromeClient")\r
     #undef JNI_CLASS_MEMBERS\r
 \r
-    static void JNICALL webViewCloseWindowRequest (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/)\r
+    static void webViewCloseWindowRequest (JNIEnv*, Pimpl& t, jobject)\r
     {\r
-        if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))\r
-            myself->owner.windowCloseRequest();\r
+        t.owner.windowCloseRequest();\r
     }\r
 \r
-    static void JNICALL webViewCreateWindowRequest (JNIEnv*, jobject /*activity*/, jlong host, jobject /*webView*/)\r
+    static void webViewCreateWindowRequest (JNIEnv*, Pimpl& t, jobject)\r
     {\r
-        if (auto* myself = reinterpret_cast<WebBrowserComponent::Pimpl*> (host))\r
-            myself->owner.newWindowAttemptingToLoad ({});\r
+        t.owner.newWindowAttemptingToLoad ({});\r
     }\r
 \r
     //==============================================================================\r
-    void webReceivedHttpError (jobject errorResponse)\r
+    static void webViewReceivedHttpError (JNIEnv* env, Pimpl& t, jobject errorResponse)\r
     {\r
-        auto* env = getEnv();\r
-\r
         LocalRef<jclass> responseClass (env->FindClass ("android/webkit/WebResourceResponse"));\r
 \r
         if (responseClass != nullptr)\r
@@ -565,14 +545,14 @@ private:
             {\r
                 auto errorString = LocalRef<jstring> ((jstring) env->CallObjectMethod (errorResponse, method));\r
 \r
-                owner.pageLoadHadNetworkError (juceString (errorString));\r
+                t.owner.pageLoadHadNetworkError (juceString (errorString));\r
                 return;\r
             }\r
         }\r
 \r
         // Should never get here!\r
         jassertfalse;\r
-        owner.pageLoadHadNetworkError ({});\r
+        t.owner.pageLoadHadNetworkError ({});\r
     }\r
 \r
     //==============================================================================\r
@@ -596,9 +576,7 @@ WebBrowserComponent::WebBrowserComponent (const Options& options)
     addAndMakeVisible (browser.get());\r
 }\r
 \r
-WebBrowserComponent::~WebBrowserComponent()\r
-{\r
-}\r
+WebBrowserComponent::~WebBrowserComponent() = default;\r
 \r
 //==============================================================================\r
 void WebBrowserComponent::goToURL (const String& url,\r
@@ -728,7 +706,4 @@ bool WebBrowserComponent::areOptionsSupported (const Options& options)
     return (options.getBackend() == Options::Backend::defaultBackend);\r
 }\r
 \r
-WebBrowserComponent::Pimpl::JuceWebViewClient16_Class   WebBrowserComponent::Pimpl::JuceWebViewClient16;\r
-WebBrowserComponent::Pimpl::JuceWebViewClient21_Class   WebBrowserComponent::Pimpl::JuceWebViewClient21;\r
-WebBrowserComponent::Pimpl::JuceWebChromeClient_Class WebBrowserComponent::Pimpl::JuceWebChromeClient;\r
 } // namespace juce\r
index ade2379dbe043d1ac290db6870182ee8f1ce5cc0..d7c85d08240e8966b54ae99710117e5ca519aec1 100644 (file)
@@ -587,7 +587,7 @@ struct PushNotifications::Pimpl
         }\r
     }\r
 \r
-    void removeDeliveredNotification (const String& identifier)\r
+    void removeDeliveredNotification ([[maybe_unused]] const String& identifier)\r
     {\r
         if (@available (iOS 10, *))\r
         {\r
@@ -598,15 +598,13 @@ struct PushNotifications::Pimpl
         }\r
         else\r
         {\r
-            ignoreUnused (identifier);\r
             // Not supported on this platform\r
             jassertfalse;\r
         }\r
     }\r
 \r
-    void setupChannels (const Array<ChannelGroup>& groups, const Array<Channel>& channels)\r
+    void setupChannels ([[maybe_unused]] const Array<ChannelGroup>& groups, [[maybe_unused]] const Array<Channel>& channels)\r
     {\r
-        ignoreUnused (groups, channels);\r
     }\r
 \r
     void getPendingLocalNotifications() const\r
@@ -679,18 +677,16 @@ struct PushNotifications::Pimpl
         return deviceToken;\r
     }\r
 \r
-    void subscribeToTopic (const String& topic)     { ignoreUnused (topic); }\r
-    void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); }\r
+    void subscribeToTopic ([[maybe_unused]] const String& topic)     {}\r
+    void unsubscribeFromTopic ([[maybe_unused]] const String& topic) {}\r
 \r
-    void sendUpstreamMessage (const String& serverSenderId,\r
-                              const String& collapseKey,\r
-                              const String& messageId,\r
-                              const String& messageType,\r
-                              int timeToLive,\r
-                              const StringPairArray& additionalData)\r
+    void sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId,\r
+                              [[maybe_unused]] const String& collapseKey,\r
+                              [[maybe_unused]] const String& messageId,\r
+                              [[maybe_unused]] const String& messageType,\r
+                              [[maybe_unused]] int timeToLive,\r
+                              [[maybe_unused]] const StringPairArray& additionalData)\r
     {\r
-        ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
-        ignoreUnused (timeToLive, additionalData);\r
     }\r
 \r
 private:\r
@@ -719,10 +715,8 @@ private:
         owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (deviceToken); });\r
     }\r
 \r
-    void failedToRegisterForRemoteNotifications (NSError* error)\r
+    void failedToRegisterForRemoteNotifications ([[maybe_unused]] NSError* error)\r
     {\r
-        ignoreUnused (error);\r
-\r
         deviceToken.clear();\r
     }\r
 \r
@@ -794,15 +788,13 @@ private:
 \r
     JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
-    void willPresentNotificationWithCompletionHandler (UNNotification* notification,\r
+    void willPresentNotificationWithCompletionHandler ([[maybe_unused]] UNNotification* notification,\r
                                                        void (^completionHandler)(UNNotificationPresentationOptions options))\r
     {\r
         NSUInteger options = NSUInteger ((int)settings.allowBadge << 0\r
                                        | (int)settings.allowSound << 1\r
                                        | (int)settings.allowAlert << 2);\r
 \r
-        ignoreUnused (notification);\r
-\r
         completionHandler (options);\r
     }\r
 \r
index 287131b51147c208cb5f450e4b4dd482bd3dec3b..6acaada9c391a3c2a91a0283150ef0796e317c2a 100644 (file)
@@ -555,10 +555,9 @@ public:
             break;\r
         case WEBKIT_POLICY_DECISION_TYPE_RESPONSE:\r
             {\r
-                auto* response = (WebKitNavigationPolicyDecision*) decision;\r
+                [[maybe_unused]] auto* response = (WebKitNavigationPolicyDecision*) decision;\r
 \r
                 // for now just always allow response requests\r
-                ignoreUnused (response);\r
                 WebKitSymbols::getInstance()->juce_webkit_policy_decision_use (decision);\r
                 return true;\r
             }\r
@@ -642,9 +641,8 @@ public:
 \r
         launchChild();\r
 \r
-        auto ret = pipe (threadControl);\r
+        [[maybe_unused]] auto ret = pipe (threadControl);\r
 \r
-        ignoreUnused (ret);\r
         jassert (ret == 0);\r
 \r
         CommandReceiver::setBlocking (inChannel,        true);\r
@@ -772,11 +770,11 @@ private:
     {\r
         int inPipe[2], outPipe[2];\r
 \r
-        auto ret = pipe (inPipe);\r
-        ignoreUnused (ret); jassert (ret == 0);\r
+        [[maybe_unused]] auto ret = pipe (inPipe);\r
+        jassert (ret == 0);\r
 \r
         ret = pipe (outPipe);\r
-        ignoreUnused (ret); jassert (ret == 0);\r
+        jassert (ret == 0);\r
 \r
         auto pid = fork();\r
         if (pid == 0)\r
index a56538de159896b39e58e14ba260c77e2cc3baf5..768015277ecc6ad7d9d5fe5ab40ef86c4a212c27 100644 (file)
@@ -73,11 +73,13 @@ public:
     {\r
         SharedKeyWindow (ComponentPeer* peerToUse)\r
             : keyPeer (peerToUse),\r
-              keyProxy (juce_createKeyProxyWindow (keyPeer))\r
+              keyProxy (juce_createKeyProxyWindow (keyPeer)),\r
+              association (peerToUse, keyProxy)\r
         {}\r
 \r
         ~SharedKeyWindow()\r
         {\r
+            association = {};\r
             juce_deleteKeyProxyWindow (keyProxy);\r
 \r
             auto& keyWindows = getKeyWindows();\r
@@ -120,6 +122,7 @@ public:
         //==============================================================================\r
         ComponentPeer* keyPeer;\r
         Window keyProxy;\r
+        ScopedWindowAssociation association;\r
 \r
         static HashMap<ComponentPeer*, SharedKeyWindow*>& getKeyWindows()\r
         {\r
index 014fa7f01324cd447a9aaf3728e3d1e9e20a49db..9dddc12a198edd3f6685fb2daf593d11f7376994 100644 (file)
@@ -85,11 +85,9 @@ namespace
                                                    &cfPlugInInterface,\r
                                                    &score) == kIOReturnSuccess)\r
             {\r
-                HRESULT hr = (*cfPlugInInterface)->QueryInterface (cfPlugInInterface,\r
-                                                                   CFUUIDGetUUIDBytes (kIOHIDDeviceInterfaceID),\r
-                                                                   device);\r
-\r
-                ignoreUnused (hr);\r
+                [[maybe_unused]] HRESULT hr = (*cfPlugInInterface)->QueryInterface (cfPlugInInterface,\r
+                                                                                    CFUUIDGetUUIDBytes (kIOHIDDeviceInterfaceID),\r
+                                                                                    device);\r
 \r
                 (*cfPlugInInterface)->Release (cfPlugInInterface);\r
             }\r
index 2043fbb14f429c129ba85c2d15c07324e2e51645..4a06ebb16720c3d5830f9dc4fda13bfc2f4e6c0b 100644 (file)
@@ -429,9 +429,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         [[NSUserNotificationCenter defaultUserNotificationCenter] removeDeliveredNotification: nsNotification];\r
     }\r
 \r
-    void setupChannels (const Array<ChannelGroup>& groups, const Array<Channel>& channels)\r
+    void setupChannels ([[maybe_unused]] const Array<ChannelGroup>& groups, [[maybe_unused]] const Array<Channel>& channels)\r
     {\r
-        ignoreUnused (groups, channels);\r
     }\r
 \r
     void getPendingLocalNotifications() const\r
@@ -494,9 +493,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         owner.listeners.call ([&] (Listener& l) { l.deviceTokenRefreshed (deviceToken); });\r
     }\r
 \r
-    void failedToRegisterForRemoteNotifications (NSError* error) override\r
+    void failedToRegisterForRemoteNotifications ([[maybe_unused]] NSError* error) override\r
     {\r
-        ignoreUnused (error);\r
         deviceToken.clear();\r
     }\r
 \r
@@ -506,9 +504,8 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
         owner.listeners.call ([&] (Listener& l) { l.handleNotification (true, n); });\r
     }\r
 \r
-    void didDeliverNotification (NSUserNotification* notification) override\r
+    void didDeliverNotification ([[maybe_unused]] NSUserNotification* notification) override\r
     {\r
-        ignoreUnused (notification);\r
     }\r
 \r
     void didActivateNotification (NSUserNotification* notification) override\r
@@ -540,18 +537,16 @@ struct PushNotifications::Pimpl : private PushNotificationsDelegate
 \r
     bool shouldPresentNotification (NSUserNotification*) override { return true; }\r
 \r
-    void subscribeToTopic (const String& topic)     { ignoreUnused (topic); }\r
-    void unsubscribeFromTopic (const String& topic) { ignoreUnused (topic); }\r
+    void subscribeToTopic ([[maybe_unused]] const String& topic)     {}\r
+    void unsubscribeFromTopic ([[maybe_unused]] const String& topic) {}\r
 \r
-    void sendUpstreamMessage (const String& serverSenderId,\r
-                              const String& collapseKey,\r
-                              const String& messageId,\r
-                              const String& messageType,\r
-                              int timeToLive,\r
-                              const StringPairArray& additionalData)\r
+    void sendUpstreamMessage ([[maybe_unused]] const String& serverSenderId,\r
+                              [[maybe_unused]] const String& collapseKey,\r
+                              [[maybe_unused]] const String& messageId,\r
+                              [[maybe_unused]] const String& messageType,\r
+                              [[maybe_unused]] int timeToLive,\r
+                              [[maybe_unused]] const StringPairArray& additionalData)\r
     {\r
-        ignoreUnused (serverSenderId, collapseKey, messageId, messageType);\r
-        ignoreUnused (timeToLive, additionalData);\r
     }\r
 \r
 private:\r
index d5f98f874d9c540f21b24848c582750a59654e40..d4d9a45e070bc0fa8c21dd61ce0c9c20d29c16af 100644 (file)
@@ -459,7 +459,7 @@ bool ActiveXControlComponent::createControl (const void* controlIID)
 \r
                 if (newControl->control->DoVerb (OLEIVERB_SHOW, nullptr, newControl->clientSite, 0, hwnd, &rect) == S_OK)\r
                 {\r
-                    control.reset (newControl.release());\r
+                    control = std::move (newControl);\r
                     control->controlHWND = ActiveXHelpers::getHWND (this);\r
 \r
                     if (control->controlHWND != nullptr)\r
index 7e4c168f4e2f9e1ebbdff830cc31f5712f878f63..7d23c7f0c3b95fbe090c5a00cfa37bf709947a24 100644 (file)
@@ -815,8 +815,9 @@ class WebBrowserComponent::Pimpl
 {\r
 public:\r
     Pimpl (WebBrowserComponent& owner,\r
-           const Options& preferences,\r
-           bool useWebView2, const String& userAgent)\r
+           [[maybe_unused]] const Options& preferences,\r
+           bool useWebView2,\r
+           const String& userAgent)\r
     {\r
         if (useWebView2)\r
         {\r
@@ -829,8 +830,6 @@ public:
            #endif\r
         }\r
 \r
-        ignoreUnused (preferences);\r
-\r
         if (internal == nullptr)\r
             internal.reset (new Win32WebView (owner, userAgent));\r
     }\r
index 3ffa2e3169855435b29d7cde8e607426d993f077..66d7be3f8b21efc5951f56acb458c86a18373e0b 100644 (file)
@@ -163,24 +163,22 @@ static bool checkPeerIsValid (OpenGLContext* context)
     {\r
         if (auto* comp = context->getTargetComponent())\r
         {\r
-            if (auto* peer = comp->getPeer())\r
+            if (auto* peer [[maybe_unused]] = comp->getPeer())\r
             {\r
                #if JUCE_MAC || JUCE_IOS\r
                 if (auto* nsView = (JUCE_IOS_MAC_VIEW*) peer->getNativeHandle())\r
                 {\r
-                    if (auto nsWindow = [nsView window])\r
+                    if ([[maybe_unused]] auto nsWindow = [nsView window])\r
                     {\r
                        #if JUCE_MAC\r
                         return ([nsWindow isVisible]\r
                                   && (! [nsWindow hidesOnDeactivate] || [NSApp isActive]));\r
                        #else\r
-                        ignoreUnused (nsWindow);\r
                         return true;\r
                        #endif\r
                     }\r
                 }\r
                #else\r
-                ignoreUnused (peer);\r
                 return true;\r
                #endif\r
             }\r
@@ -293,6 +291,7 @@ JUCE_IMPL_WGL_EXTENSION_FUNCTION (wglCreateContextAttribsARB)
 #undef JUCE_IMPL_WGL_EXTENSION_FUNCTION\r
 \r
 #elif JUCE_LINUX || JUCE_BSD\r
+ #include <juce_gui_basics/native/x11/juce_linux_ScopedWindowAssociation.h>\r
  #include "native/juce_OpenGL_linux_X11.h"\r
 \r
 #elif JUCE_ANDROID\r
index 8bf4580862222a1390f68030bbbd5dde0615b9e8..a65d203d5dcfab15117407b7b8432df44955d8b0 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_opengl\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE OpenGL classes\r
   description:        Classes for rendering OpenGL in a JUCE window.\r
   website:            http://www.juce.com/juce\r
index 4358a6d7e136428e855b4e227f4fdb2ea79bd328..dc1c2aa126c6861ad8035832539730dcc7a649c9 100644 (file)
@@ -103,26 +103,6 @@ static const uint8 javaJuceOpenGLView[] =
 };\r
 \r
 //==============================================================================\r
-struct AndroidGLCallbacks\r
-{\r
-    static void attachedToWindow   (JNIEnv*, jobject, jlong);\r
-    static void detachedFromWindow (JNIEnv*, jobject, jlong);\r
-    static void dispatchDraw       (JNIEnv*, jobject, jlong, jobject);\r
-};\r
-\r
-//==============================================================================\r
-#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
- METHOD (constructor, "<init>",    "(Landroid/content/Context;J)V") \\r
- METHOD (getParent,   "getParent", "()Landroid/view/ViewParent;") \\r
- METHOD (getHolder,   "getHolder", "()Landroid/view/SurfaceHolder;") \\r
- METHOD (layout,      "layout",    "(IIII)V" ) \\r
- CALLBACK (AndroidGLCallbacks::attachedToWindow,   "onAttchedWindowNative",      "(J)V") \\r
- CALLBACK (AndroidGLCallbacks::detachedFromWindow, "onDetachedFromWindowNative", "(J)V") \\r
- CALLBACK (AndroidGLCallbacks::dispatchDraw,       "onDrawNative",               "(JLandroid/graphics/Canvas;)V")\r
-\r
-DECLARE_JNI_CLASS_WITH_BYTECODE (JuceOpenGLViewSurface, "com/rmsl/juce/JuceOpenGLView", 16, javaJuceOpenGLView, sizeof(javaJuceOpenGLView))\r
-#undef JNI_CLASS_MEMBERS\r
-\r
 //==============================================================================\r
 class OpenGLContext::NativeContext : private SurfaceHolderCallback\r
 {\r
@@ -246,9 +226,11 @@ public:
 \r
     //==============================================================================\r
     // Android Surface Callbacks:\r
-    void surfaceChanged (LocalRef<jobject> holder, int format, int width, int height) override\r
+    void surfaceChanged ([[maybe_unused]] LocalRef<jobject> holder,\r
+                         [[maybe_unused]] int format,\r
+                         [[maybe_unused]] int width,\r
+                         [[maybe_unused]] int height) override\r
     {\r
-        ignoreUnused (holder, format, width, height);\r
     }\r
 \r
     void surfaceCreated (LocalRef<jobject>) override;\r
@@ -264,40 +246,46 @@ public:
     Component& component;\r
 \r
 private:\r
-    //==============================================================================\r
-    friend struct AndroidGLCallbacks;\r
+    #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+     METHOD (constructor, "<init>",    "(Landroid/content/Context;J)V") \\r
+     METHOD (getParent,   "getParent", "()Landroid/view/ViewParent;") \\r
+     METHOD (getHolder,   "getHolder", "()Landroid/view/SurfaceHolder;") \\r
+     METHOD (layout,      "layout",    "(IIII)V" ) \\r
+     CALLBACK (generatedCallback<&NativeContext::attachedToWindow>,   "onAttchedWindowNative",      "(J)V") \\r
+     CALLBACK (generatedCallback<&NativeContext::detachedFromWindow>, "onDetachedFromWindowNative", "(J)V") \\r
+     CALLBACK (generatedCallback<&NativeContext::dispatchDraw>,       "onDrawNative",               "(JLandroid/graphics/Canvas;)V")\r
+\r
+     DECLARE_JNI_CLASS_WITH_BYTECODE (JuceOpenGLViewSurface, "com/rmsl/juce/JuceOpenGLView", 16, javaJuceOpenGLView)\r
+    #undef JNI_CLASS_MEMBERS\r
 \r
-    void attachedToWindow()\r
+    //==============================================================================\r
+    static void attachedToWindow (JNIEnv* env, NativeContext& t)\r
     {\r
-        auto* env = getEnv();\r
-\r
-        LocalRef<jobject> holder (env->CallObjectMethod (surfaceView.get(), JuceOpenGLViewSurface.getHolder));\r
+        LocalRef<jobject> holder (env->CallObjectMethod (t.surfaceView.get(), JuceOpenGLViewSurface.getHolder));\r
 \r
-        if (surfaceHolderCallback == nullptr)\r
-            surfaceHolderCallback = GlobalRef (CreateJavaInterface (this, "android/view/SurfaceHolder$Callback"));\r
+        if (t.surfaceHolderCallback == nullptr)\r
+            t.surfaceHolderCallback = GlobalRef (CreateJavaInterface (&t, "android/view/SurfaceHolder$Callback"));\r
 \r
-        env->CallVoidMethod (holder, AndroidSurfaceHolder.addCallback, surfaceHolderCallback.get());\r
+        env->CallVoidMethod (holder, AndroidSurfaceHolder.addCallback, t.surfaceHolderCallback.get());\r
     }\r
 \r
-    void detachedFromWindow()\r
+    static void detachedFromWindow (JNIEnv* env, NativeContext& t)\r
     {\r
-        if (surfaceHolderCallback != nullptr)\r
+        if (t.surfaceHolderCallback != nullptr)\r
         {\r
-            auto* env = getEnv();\r
+            LocalRef<jobject> holder (env->CallObjectMethod (t.surfaceView.get(), JuceOpenGLViewSurface.getHolder));\r
 \r
-            LocalRef<jobject> holder (env->CallObjectMethod (surfaceView.get(), JuceOpenGLViewSurface.getHolder));\r
-\r
-            env->CallVoidMethod (holder.get(), AndroidSurfaceHolder.removeCallback, surfaceHolderCallback.get());\r
-            surfaceHolderCallback.clear();\r
+            env->CallVoidMethod (holder.get(), AndroidSurfaceHolder.removeCallback, t.surfaceHolderCallback.get());\r
+            t.surfaceHolderCallback.clear();\r
         }\r
     }\r
 \r
-    void dispatchDraw (jobject /*canvas*/)\r
+    static void dispatchDraw (JNIEnv*, NativeContext& t, jobject /*canvas*/)\r
     {\r
-        const std::lock_guard lock { nativeHandleMutex };\r
+        const std::lock_guard lock { t.nativeHandleMutex };\r
 \r
-        if (juceContext != nullptr)\r
-            juceContext->triggerRepaint();\r
+        if (t.juceContext != nullptr)\r
+            t.juceContext->triggerRepaint();\r
     }\r
 \r
     bool tryChooseConfig (const std::vector<EGLint>& optionalAttribs)\r
@@ -412,25 +400,6 @@ private:
 EGLDisplay OpenGLContext::NativeContext::display = EGL_NO_DISPLAY;\r
 EGLDisplay OpenGLContext::NativeContext::config;\r
 \r
-//==============================================================================\r
-void AndroidGLCallbacks::attachedToWindow (JNIEnv*, jobject /*this*/, jlong host)\r
-{\r
-    if (auto* nativeContext = reinterpret_cast<OpenGLContext::NativeContext*> (host))\r
-        nativeContext->attachedToWindow();\r
-}\r
-\r
-void AndroidGLCallbacks::detachedFromWindow (JNIEnv*, jobject /*this*/, jlong host)\r
-{\r
-    if (auto* nativeContext = reinterpret_cast<OpenGLContext::NativeContext*> (host))\r
-        nativeContext->detachedFromWindow();\r
-}\r
-\r
-void AndroidGLCallbacks::dispatchDraw (JNIEnv*, jobject /*this*/, jlong host, jobject canvas)\r
-{\r
-    if (auto* nativeContext = reinterpret_cast<OpenGLContext::NativeContext*> (host))\r
-        nativeContext->dispatchDraw (canvas);\r
-}\r
-\r
 //==============================================================================\r
 bool OpenGLHelpers::isContextActive()\r
 {\r
index cf29a2a5fe2cd416b85c92f13a021692d5807748..813aa7a6528daa234abeff7a45df5fd1dce574e0 100644 (file)
@@ -244,8 +244,8 @@ private:
 \r
         glFramebufferRenderbuffer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorBufferHandle);\r
 \r
-        bool ok = [context.get() renderbufferStorage: GL_RENDERBUFFER fromDrawable: glLayer];\r
-        jassert (ok); ignoreUnused (ok);\r
+        [[maybe_unused]] bool ok = [context.get() renderbufferStorage: GL_RENDERBUFFER fromDrawable: glLayer];\r
+        jassert (ok);\r
 \r
         GLint width, height;\r
         glGetRenderbufferParameteriv (GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &width);\r
index 987d32635ee6b3ad5c1c49febada81486a73b382..cd12b414f5003867c34fade8c6914658248e6066 100644 (file)
@@ -26,8 +26,6 @@
 namespace juce\r
 {\r
 \r
-extern XContext windowHandleXContext;\r
-\r
 struct XFreeDeleter\r
 {\r
     void operator() (void* ptr) const\r
@@ -45,6 +43,35 @@ std::unique_ptr<Data, XFreeDeleter> makeXFreePtr (Data* raw) { return std::uniqu
 void juce_LinuxAddRepaintListener (ComponentPeer*, Component* dummy);\r
 void juce_LinuxRemoveRepaintListener (ComponentPeer*, Component* dummy);\r
 \r
+class PeerListener : private ComponentMovementWatcher\r
+{\r
+public:\r
+    PeerListener (Component& comp, Window embeddedWindow)\r
+        : ComponentMovementWatcher (&comp),\r
+          window (embeddedWindow),\r
+          association (comp.getPeer(), window) {}\r
+\r
+private:\r
+    using ComponentMovementWatcher::componentMovedOrResized,\r
+          ComponentMovementWatcher::componentVisibilityChanged;\r
+\r
+    void componentMovedOrResized (bool, bool) override {}\r
+    void componentVisibilityChanged() override {}\r
+\r
+    void componentPeerChanged() override\r
+    {\r
+        // This should not be rewritten as a ternary expression or similar.\r
+        // The old association must be destroyed before the new one is created.\r
+        association = {};\r
+\r
+        if (auto* comp = getComponent())\r
+            association = ScopedWindowAssociation (comp->getPeer(), window);\r
+    }\r
+\r
+    Window window{};\r
+    ScopedWindowAssociation association;\r
+};\r
+\r
 //==============================================================================\r
 class OpenGLContext::NativeContext\r
 {\r
@@ -114,7 +141,7 @@ public:
                                                                    CWBorderPixel | CWColormap | CWEventMask,\r
                                                                    &swa);\r
 \r
-        X11Symbols::getInstance()->xSaveContext (display, (XID) embeddedWindow, windowHandleXContext, (XPointer) peer);\r
+        peerListener.emplace (component, embeddedWindow);\r
 \r
         X11Symbols::getInstance()->xMapWindow (display, embeddedWindow);\r
         X11Symbols::getInstance()->xFreeColormap (display, colourMap);\r
@@ -322,6 +349,8 @@ private:
     GLXContext renderContext = {};\r
     Window embeddedWindow = {};\r
 \r
+    std::optional<PeerListener> peerListener;\r
+\r
     int swapFrames = 1;\r
     Rectangle<int> bounds;\r
     std::unique_ptr<GLXFBConfig, XFreeDeleter> bestConfig;\r
index 9dbe093d11eb26a3657f6638d955479632324a24..af3a354fd7e4f1156f788864a309461e234b8843 100644 (file)
@@ -148,6 +148,8 @@ public:
             context.nativeContext = nativeContext.get();\r
         else\r
             nativeContext.reset();\r
+\r
+        refreshDisplayLinkConnection();\r
     }\r
 \r
     ~CachedImage() override\r
@@ -332,7 +334,15 @@ public:
 \r
         const auto stateToUse = state.fetch_and (StateFlags::persistent);\r
 \r
-        if (! isFlagSet (stateToUse, StateFlags::pendingRender) && ! context.continuousRepaint)\r
+       #if JUCE_MAC\r
+        // On macOS, we use a display link callback to trigger repaints, rather than\r
+        // letting them run at full throttle\r
+        const auto noAutomaticRepaint = true;\r
+       #else\r
+        const auto noAutomaticRepaint = ! context.continuousRepaint;\r
+       #endif\r
+\r
+        if (! isFlagSet (stateToUse, StateFlags::pendingRender) && noAutomaticRepaint)\r
             return RenderStatus::noWork;\r
 \r
         const auto isUpdating = isFlagSet (stateToUse, StateFlags::paintComponents);\r
@@ -916,6 +926,30 @@ public:
         } };\r
     };\r
 \r
+    void refreshDisplayLinkConnection()\r
+    {\r
+       #if JUCE_MAC\r
+        if (context.continuousRepaint)\r
+        {\r
+            connection.emplace (sharedDisplayLinks->registerFactory ([this] (CGDirectDisplayID display)\r
+            {\r
+                return [this, display]\r
+                {\r
+                    if (auto* view = nativeContext->getNSView())\r
+                        if (auto* window = [view window])\r
+                            if (auto* screen = [window screen])\r
+                                if (display == ScopedDisplayLink::getDisplayIdForScreen (screen))\r
+                                    triggerRepaint();\r
+                };\r
+            }));\r
+        }\r
+        else\r
+        {\r
+            connection.reset();\r
+        }\r
+       #endif\r
+    }\r
+\r
     //==============================================================================\r
     friend class NativeContext;\r
     std::unique_ptr<NativeContext> nativeContext;\r
@@ -1008,6 +1042,10 @@ public:
     // Note: the NSViewComponentPeer also has a SharedResourcePointer<PerScreenDisplayLinks> to\r
     // avoid unnecessarily duplicating display-link threads.\r
     SharedResourcePointer<PerScreenDisplayLinks> sharedDisplayLinks;\r
+\r
+    // On macOS, rather than letting swapBuffers block as appropriate, we use a display link\r
+    // callback to mark the view as needing to repaint.\r
+    std::optional<PerScreenDisplayLinks::Connection> connection;\r
    #endif\r
 \r
     enum StateFlags\r
@@ -1217,13 +1255,16 @@ void OpenGLContext::setContinuousRepainting (bool shouldContinuouslyRepaint) noe
 {\r
     continuousRepaint = shouldContinuouslyRepaint;\r
 \r
-    #if JUCE_MAC\r
-     if (auto* component = getTargetComponent())\r
-     {\r
-         detach();\r
-         attachment.reset (new Attachment (*this, *component));\r
-     }\r
-    #endif\r
+   #if JUCE_MAC\r
+    if (auto* component = getTargetComponent())\r
+    {\r
+        detach();\r
+        attachment.reset (new Attachment (*this, *component));\r
+    }\r
+\r
+    if (auto* cachedImage = getCachedImage())\r
+        cachedImage->refreshDisplayLinkConnection();\r
+   #endif\r
 \r
     triggerRepaint();\r
 }\r
index 499accd6f922b1b07edfc314a4039d3aed324c18..f28b81105eb03cde0dc642431842ce717d776129 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_osc\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE OSC classes\r
   description:        Open Sound Control implementation.\r
   website:            http://www.juce.com/juce\r
index 9ced7d1a237e4b4fa1222b6dd2c8bf306be231e2..7030a49f18ca124a10a20b73062dd509388efb13 100644 (file)
@@ -60,8 +60,8 @@ void InAppPurchases::getProductsInformation (const StringArray& productIdentifie
 }\r
 \r
 void InAppPurchases::purchaseProduct (const String& productIdentifier,\r
-                                      const String& upgradeProductIdentifier,\r
-                                      bool creditForUnusedSubscription)\r
+                                      [[maybe_unused]] const String& upgradeProductIdentifier,\r
+                                      [[maybe_unused]] bool creditForUnusedSubscription)\r
 {\r
    #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
     pimpl->purchaseProduct (productIdentifier, upgradeProductIdentifier, creditForUnusedSubscription);\r
@@ -69,66 +69,55 @@ void InAppPurchases::purchaseProduct (const String& productIdentifier,
     Listener::PurchaseInfo purchaseInfo { Purchase { "", productIdentifier, {}, {}, {} }, {} };\r
 \r
     listeners.call ([&] (Listener& l) { l.productPurchaseFinished (purchaseInfo, false, "In-app purchases unavailable"); });\r
-    ignoreUnused (upgradeProductIdentifier, creditForUnusedSubscription);\r
    #endif\r
 }\r
 \r
-void InAppPurchases::restoreProductsBoughtList (bool includeDownloadInfo, const String& subscriptionsSharedSecret)\r
+void InAppPurchases::restoreProductsBoughtList ([[maybe_unused]] bool includeDownloadInfo, [[maybe_unused]] const String& subscriptionsSharedSecret)\r
 {\r
    #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
     pimpl->restoreProductsBoughtList (includeDownloadInfo, subscriptionsSharedSecret);\r
    #else\r
     listeners.call ([] (Listener& l) { l.purchasesListRestored ({}, false, "In-app purchases unavailable"); });\r
-    ignoreUnused (includeDownloadInfo, subscriptionsSharedSecret);\r
    #endif\r
 }\r
 \r
-void InAppPurchases::consumePurchase (const String& productIdentifier, const String& purchaseToken)\r
+void InAppPurchases::consumePurchase (const String& productIdentifier, [[maybe_unused]] const String& purchaseToken)\r
 {\r
    #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
     pimpl->consumePurchase (productIdentifier, purchaseToken);\r
    #else\r
     listeners.call ([&] (Listener& l) { l.productConsumed (productIdentifier, false, "In-app purchases unavailable"); });\r
-    ignoreUnused (purchaseToken);\r
    #endif\r
 }\r
 \r
 void InAppPurchases::addListener (Listener* l)      { listeners.add (l); }\r
 void InAppPurchases::removeListener (Listener* l)   { listeners.remove (l); }\r
 \r
-void InAppPurchases::startDownloads  (const Array<Download*>& downloads)\r
+void InAppPurchases::startDownloads  ([[maybe_unused]] const Array<Download*>& downloads)\r
 {\r
    #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
     pimpl->startDownloads (downloads);\r
-   #else\r
-    ignoreUnused (downloads);\r
    #endif\r
 }\r
 \r
-void InAppPurchases::pauseDownloads  (const Array<Download*>& downloads)\r
+void InAppPurchases::pauseDownloads  ([[maybe_unused]] const Array<Download*>& downloads)\r
 {\r
    #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
     pimpl->pauseDownloads (downloads);\r
-   #else\r
-    ignoreUnused (downloads);\r
    #endif\r
 }\r
 \r
-void InAppPurchases::resumeDownloads (const Array<Download*>& downloads)\r
+void InAppPurchases::resumeDownloads ([[maybe_unused]] const Array<Download*>& downloads)\r
 {\r
    #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
     pimpl->resumeDownloads (downloads);\r
-   #else\r
-    ignoreUnused (downloads);\r
    #endif\r
 }\r
 \r
-void InAppPurchases::cancelDownloads (const Array<Download*>& downloads)\r
+void InAppPurchases::cancelDownloads ([[maybe_unused]] const Array<Download*>& downloads)\r
 {\r
    #if JUCE_ANDROID || JUCE_IOS || JUCE_MAC\r
     pimpl->cancelDownloads (downloads);\r
-   #else\r
-    ignoreUnused (downloads);\r
    #endif\r
 }\r
 \r
index 2f89af71d39960025041ce175bee776d84348b2e..d67755b83d02c0faf767fe1d16fc3347a4e20102 100644 (file)
@@ -261,12 +261,10 @@ public:
                   "and only a single subscription can be upgraded/downgraded. Use the updated purchaseProduct method "\r
                   "which takes a single String argument.")]]\r
     void purchaseProduct (const String& productIdentifier,\r
-                          bool isSubscription,\r
+                          [[maybe_unused]] bool isSubscription,\r
                           const StringArray& upgradeOrDowngradeFromSubscriptionsWithProductIdentifiers = {},\r
                           bool creditForUnusedSubscription = true)\r
     {\r
-\r
-        ignoreUnused (isSubscription);\r
         purchaseProduct (productIdentifier,\r
                          upgradeOrDowngradeFromSubscriptionsWithProductIdentifiers[0],\r
                          creditForUnusedSubscription);\r
index 39de8d87860a5a80810404d1510df8fd77938265..dd98ea6698685e0ded94928d0534285bc2d27fc6 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_product_unlocking\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE Online marketplace support\r
   description:        Classes for online product authentication\r
   website:            http://www.juce.com/juce\r
index b382e5a1b41304e2948de22d7c94afbfdcc4f053..bed2c811239ae95e8eb9f18dafbaa8a00c7aa6a8 100644 (file)
@@ -143,7 +143,7 @@ inline StringArray javaListOfStringToJuceStringArray (const LocalRef<jobject>& j
 }\r
 \r
 //==============================================================================\r
-constexpr unsigned char juceBillingClientCompiled[]\r
+constexpr uint8 juceBillingClientCompiled[]\r
 {\r
     0x1f, 0x8b, 0x08, 0x08, 0xa4, 0x53, 0xd0, 0x62, 0x04, 0x03, 0x63, 0x6c,\r
     0x61, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x64, 0x65, 0x78, 0x00, 0x9d, 0x5a,\r
@@ -685,31 +685,27 @@ struct InAppPurchases::Pimpl
     }\r
 \r
     //==============================================================================\r
-    void startDownloads (const Array<Download*>& downloads)\r
+    void startDownloads ([[maybe_unused]] const Array<Download*>& downloads)\r
     {\r
         // Not available on this platform.\r
-        ignoreUnused (downloads);\r
         jassertfalse;\r
     }\r
 \r
-    void pauseDownloads (const Array<Download*>& downloads)\r
+    void pauseDownloads ([[maybe_unused]] const Array<Download*>& downloads)\r
     {\r
         // Not available on this platform.\r
-        ignoreUnused (downloads);\r
         jassertfalse;\r
     }\r
 \r
-    void resumeDownloads (const Array<Download*>& downloads)\r
+    void resumeDownloads ([[maybe_unused]] const Array<Download*>& downloads)\r
     {\r
         // Not available on this platform.\r
-        ignoreUnused (downloads);\r
         jassertfalse;\r
     }\r
 \r
-    void cancelDownloads (const Array<Download*>& downloads)\r
+    void cancelDownloads ([[maybe_unused]] const Array<Download*>& downloads)\r
     {\r
         // Not available on this platform.\r
-        ignoreUnused (downloads);\r
         jassertfalse;\r
     }\r
 \r
@@ -724,42 +720,17 @@ private:
       METHOD (queryPurchases,                "queryPurchases",              "()V")                                                                        \\r
       METHOD (consumePurchase,               "consumePurchase",             "(Ljava/lang/String;Ljava/lang/String;)V")                                    \\r
                                                                                                                                                           \\r
-      CALLBACK (productDetailsQueryCallback, "productDetailsQueryCallback", "(JLjava/util/List;)V")                                                       \\r
-      CALLBACK (purchasesListQueryCallback,  "purchasesListQueryCallback",  "(JLjava/util/List;)V")                                                       \\r
-      CALLBACK (purchaseCompletedCallback,   "purchaseCompletedCallback",   "(JLcom/android/billingclient/api/Purchase;I)V")                              \\r
-      CALLBACK (purchaseConsumedCallback,    "purchaseConsumedCallback",    "(JLjava/lang/String;I)V")\r
+      CALLBACK (generatedCallback<&Pimpl::updateProductDetails>, "productDetailsQueryCallback", "(JLjava/util/List;)V")                                                       \\r
+      CALLBACK (generatedCallback<&Pimpl::updatePurchasesList>,  "purchasesListQueryCallback",  "(JLjava/util/List;)V")                                                       \\r
+      CALLBACK (generatedCallback<&Pimpl::purchaseCompleted>,    "purchaseCompletedCallback",   "(JLcom/android/billingclient/api/Purchase;I)V")                              \\r
+      CALLBACK (generatedCallback<&Pimpl::purchaseConsumed>,     "purchaseConsumedCallback",    "(JLjava/lang/String;I)V")\r
 \r
     DECLARE_JNI_CLASS_WITH_BYTECODE (JuceBillingClient,\r
                                      "com/rmsl/juce/JuceBillingClient",\r
                                      16,\r
-                                     juceBillingClientCompiled,\r
-                                     numElementsInArray (juceBillingClientCompiled))\r
+                                     juceBillingClientCompiled)\r
     #undef JNI_CLASS_MEMBERS\r
 \r
-    static void JNICALL productDetailsQueryCallback (JNIEnv*, jobject, jlong host, jobject productDetailsList)\r
-    {\r
-        if (auto* myself = reinterpret_cast<Pimpl*> (host))\r
-            myself->updateProductDetails (productDetailsList);\r
-    }\r
-\r
-    static void JNICALL purchasesListQueryCallback (JNIEnv*, jobject, jlong host, jobject purchasesList)\r
-    {\r
-        if (auto* myself = reinterpret_cast<Pimpl*> (host))\r
-            myself->updatePurchasesList (purchasesList);\r
-    }\r
-\r
-    static void JNICALL purchaseCompletedCallback (JNIEnv*, jobject, jlong host, jobject purchase, int responseCode)\r
-    {\r
-        if (auto* myself = reinterpret_cast<Pimpl*> (host))\r
-            myself->purchaseCompleted (purchase, responseCode);\r
-    }\r
-\r
-    static void JNICALL purchaseConsumedCallback (JNIEnv*, jobject, jlong host, jstring productIdentifier, int responseCode)\r
-    {\r
-        if (auto* myself = reinterpret_cast<Pimpl*> (host))\r
-            myself->purchaseConsumed (productIdentifier, responseCode);\r
-    }\r
-\r
     //==============================================================================\r
     bool isReady() const\r
     {\r
@@ -1041,32 +1012,32 @@ private:
         return responseCode == 0;\r
     }\r
 \r
-    void purchaseCompleted (jobject purchase, int responseCode)\r
+    static void purchaseCompleted (JNIEnv*, Pimpl& t, jobject purchase, int responseCode)\r
     {\r
-        notifyListenersAboutPurchase (buildPurchase (LocalRef<jobject> { purchase }),\r
-                                      wasSuccessful (responseCode),\r
-                                      getStatusDescriptionFromResponseCode (responseCode));\r
+        t.notifyListenersAboutPurchase (buildPurchase (LocalRef<jobject> { purchase }),\r
+                                        wasSuccessful (responseCode),\r
+                                        getStatusDescriptionFromResponseCode (responseCode));\r
     }\r
 \r
-    void purchaseConsumed (jstring productIdentifier, int responseCode)\r
+    static void purchaseConsumed (JNIEnv*, Pimpl& t, jstring productIdentifier, int responseCode)\r
     {\r
-        notifyListenersAboutConsume (juceString (LocalRef<jstring> { productIdentifier }),\r
-                                     wasSuccessful (responseCode),\r
-                                     getStatusDescriptionFromResponseCode (responseCode));\r
+        t.notifyListenersAboutConsume (juceString (LocalRef<jstring> { productIdentifier }),\r
+                                       wasSuccessful (responseCode),\r
+                                       getStatusDescriptionFromResponseCode (responseCode));\r
     }\r
 \r
-    void updateProductDetails (jobject productDetailsList)\r
+    static void updateProductDetails (JNIEnv*, Pimpl& t, jobject productDetailsList)\r
     {\r
-        jassert (! productDetailsQueryCallbackQueue.empty());\r
-        productDetailsQueryCallbackQueue.front() (LocalRef<jobject> { productDetailsList });\r
-        productDetailsQueryCallbackQueue.pop();\r
+        jassert (! t.productDetailsQueryCallbackQueue.empty());\r
+        t.productDetailsQueryCallbackQueue.front() (LocalRef<jobject> { productDetailsList });\r
+        t.productDetailsQueryCallbackQueue.pop();\r
     }\r
 \r
-    void updatePurchasesList (jobject purchasesList)\r
+    static void updatePurchasesList (JNIEnv*, Pimpl& t, jobject purchasesList)\r
     {\r
-        jassert (! purchasesListQueryCallbackQueue.empty());\r
-        purchasesListQueryCallbackQueue.front() (LocalRef<jobject> { purchasesList });\r
-        purchasesListQueryCallbackQueue.pop();\r
+        jassert (! t.purchasesListQueryCallbackQueue.empty());\r
+        t.purchasesListQueryCallbackQueue.front() (LocalRef<jobject> { purchasesList });\r
+        t.purchasesListQueryCallbackQueue.pop();\r
     }\r
 \r
     //==============================================================================\r
@@ -1099,7 +1070,4 @@ void juce_handleOnResume()
     });\r
 }\r
 \r
-\r
-InAppPurchases::Pimpl::JuceBillingClient_Class InAppPurchases::Pimpl::JuceBillingClient;\r
-\r
 } // namespace juce\r
index da0f3a6d33dbfa953c4e54e943ea3daa3f775a5b..5a317a725842f6df4aa3b1036560770a125f5dbc 100644 (file)
@@ -191,10 +191,10 @@ StringArray CameraDevice::getAvailableDevices()
     }\r
 }\r
 \r
-CameraDevice* CameraDevice::openDevice (int index,\r
-                                        int minWidth, int minHeight,\r
-                                        int maxWidth, int maxHeight,\r
-                                        bool useHighQuality)\r
+CameraDevice* CameraDevice::openDevice ([[maybe_unused]] int index,\r
+                                        [[maybe_unused]] int minWidth, [[maybe_unused]] int minHeight,\r
+                                        [[maybe_unused]] int maxWidth, [[maybe_unused]] int maxHeight,\r
+                                        [[maybe_unused]] bool useHighQuality)\r
 {\r
     jassert (juce::MessageManager::getInstance()->currentThreadHasLockedMessageManager());\r
 \r
@@ -204,9 +204,6 @@ CameraDevice* CameraDevice::openDevice (int index,
     if (d != nullptr && d->pimpl->openedOk())\r
         return d.release();\r
    #else\r
-    ignoreUnused (index, minWidth, minHeight);\r
-    ignoreUnused (maxWidth, maxHeight, useHighQuality);\r
-\r
     // Use openDeviceAsync to open a camera device on iOS or Android.\r
     jassertfalse;\r
    #endif\r
index 80f5a36c209e7106222460bd80e8d9429bf36a13..1af919d14e6cc436a986c8164210e01a70a19c65 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_video\r
   vendor:             juce\r
-  version:            7.0.3\r
+  version:            7.0.4\r
   name:               JUCE video playback and capture classes\r
   description:        Classes for playing video and capturing camera input.\r
   website:            http://www.juce.com/juce\r
index 45a731cc6d5efe01c42a3ef73bf4b068247654d6..fd29bfb7bd9a64fbe297da02be516c6bbb47237e 100644 (file)
@@ -400,7 +400,7 @@ class MediaRecorderOnInfoListener     : public AndroidInterfaceImplementer
 public:\r
     struct Owner\r
     {\r
-        virtual ~Owner() {}\r
+        virtual ~Owner() = default;\r
 \r
         virtual void onInfo (LocalRef<jobject>& mediaRecorder, int what, int extra) = 0;\r
     };\r
@@ -715,7 +715,7 @@ private:
         {\r
             auto key = LocalRef<jobject> (env->CallObjectMethod (keysList, JavaList.get, i));\r
             auto jKeyName = LocalRef<jstring> ((jstring) env->CallObjectMethod (key, CameraCharacteristicsKey.getName));\r
-            auto keyName = juceString (jKeyName);\r
+            [[maybe_unused]] auto keyName = juceString (jKeyName);\r
 \r
             auto keyValue = LocalRef<jobject> (env->CallObjectMethod (characteristics, CameraCharacteristics.get, key.get()));\r
             auto jKeyValueString = LocalRef<jstring> ((jstring) env->CallObjectMethod (keyValue, JavaObject.toString));\r
@@ -747,16 +747,12 @@ private:
                     JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + keyValueString);\r
                 }\r
             }\r
-\r
-            ignoreUnused (keyName);\r
         }\r
     }\r
 \r
-    static void printPrimitiveArrayElements (const LocalRef<jobject>& keyValue, const String& keyName,\r
+    static void printPrimitiveArrayElements (const LocalRef<jobject>& keyValue, [[maybe_unused]] const String& keyName,\r
                                              const String& keyValueString)\r
     {\r
-        ignoreUnused (keyName);\r
-\r
         String result = "[";\r
 \r
         auto* env = getEnv();\r
@@ -790,7 +786,7 @@ private:
         JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + result);\r
     }\r
 \r
-    static void printRangeArrayElements (const LocalRef<jobject>& rangeArray, const String& keyName)\r
+    static void printRangeArrayElements (const LocalRef<jobject>& rangeArray, [[maybe_unused]] const String& keyName)\r
     {\r
         auto* env = getEnv();\r
 \r
@@ -809,7 +805,6 @@ private:
             result << juceString (jRangeString) << " ";\r
         }\r
 \r
-        ignoreUnused (keyName);\r
         JUCE_CAMERA_LOG ("Key: " + keyName + ", value: " + result);\r
     }\r
 \r
@@ -921,10 +916,8 @@ private:
                                                                         javaString (name).get()));\r
         }\r
 \r
-        static void printSizesLog (const Array<Rectangle<int>>& sizes, const String& className)\r
+        static void printSizesLog ([[maybe_unused]] const Array<Rectangle<int>>& sizes, [[maybe_unused]] const String& className)\r
         {\r
-            ignoreUnused (sizes, className);\r
-\r
             JUCE_CAMERA_LOG ("Sizes for class " + className);\r
 \r
           #if JUCE_CAMERA_LOG_ENABLED\r
@@ -1489,18 +1482,14 @@ private:
             Desktop::getInstance().setOrientationsEnabled (orientationsEnabled);\r
         }\r
 \r
-        void onInfo (LocalRef<jobject>& recorder, int what, int extra) override\r
+        void onInfo ([[maybe_unused]] LocalRef<jobject>& recorder, [[maybe_unused]] int what, [[maybe_unused]] int extra) override\r
         {\r
-            ignoreUnused (recorder, what, extra);\r
-\r
             JUCE_CAMERA_LOG ("MediaRecorder::OnInfo: " + getInfoStringFromCode (what)\r
                                      + ", extra code = " + String (extra));\r
         }\r
 \r
-        void onError (LocalRef<jobject>& recorder, int what, int extra) override\r
+        void onError ([[maybe_unused]] LocalRef<jobject>& recorder, [[maybe_unused]] int what, [[maybe_unused]] int extra) override\r
         {\r
-            ignoreUnused (recorder, what, extra);\r
-\r
             JUCE_CAMERA_LOG ("MediaRecorder::onError: " + getErrorStringFromCode (what)\r
                                      + ", extra code = " + String (extra));\r
         }\r
@@ -1722,26 +1711,25 @@ private:
                 //==============================================================================\r
                 #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
                    METHOD (constructor, "<init>", "(JZ)V")              \\r
-                   CALLBACK (cameraCaptureSessionCaptureCompletedCallback,         "cameraCaptureSessionCaptureCompleted",         "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/TotalCaptureResult;)V") \\r
-                   CALLBACK (cameraCaptureSessionCaptureFailedCallback,            "cameraCaptureSessionCaptureFailed",            "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureFailure;)V") \\r
-                   CALLBACK (cameraCaptureSessionCaptureProgressedCallback,        "cameraCaptureSessionCaptureProgressed",        "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureResult;)V") \\r
-                   CALLBACK (cameraCaptureSessionCaptureStartedCallback,           "cameraCaptureSessionCaptureStarted",           "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;JJ)V") \\r
-                   CALLBACK (cameraCaptureSessionCaptureSequenceAbortedCallback,   "cameraCaptureSessionCaptureSequenceAborted",   "(JZLandroid/hardware/camera2/CameraCaptureSession;I)V") \\r
-                   CALLBACK (cameraCaptureSessionCaptureSequenceCompletedCallback, "cameraCaptureSessionCaptureSequenceCompleted", "(JZLandroid/hardware/camera2/CameraCaptureSession;IJ)V")\r
-\r
-                DECLARE_JNI_CLASS_WITH_BYTECODE (CameraCaptureSessionCaptureCallback, "com/rmsl/juce/CameraCaptureSessionCaptureCallback", 21, CameraSupportByteCode, sizeof(CameraSupportByteCode))\r
+                   CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureCompletedCallback>,         "cameraCaptureSessionCaptureCompleted",         "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/TotalCaptureResult;)V") \\r
+                   CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureFailedCallback>,            "cameraCaptureSessionCaptureFailed",            "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureFailure;)V") \\r
+                   CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureProgressedCallback>,        "cameraCaptureSessionCaptureProgressed",        "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;Landroid/hardware/camera2/CaptureResult;)V") \\r
+                   CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureStartedCallback>,           "cameraCaptureSessionCaptureStarted",           "(JZLandroid/hardware/camera2/CameraCaptureSession;Landroid/hardware/camera2/CaptureRequest;JJ)V") \\r
+                   CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureSequenceAbortedCallback>,   "cameraCaptureSessionCaptureSequenceAborted",   "(JZLandroid/hardware/camera2/CameraCaptureSession;I)V") \\r
+                   CALLBACK (generatedCallback<&StillPictureTaker::cameraCaptureSessionCaptureSequenceCompletedCallback>, "cameraCaptureSessionCaptureSequenceCompleted", "(JZLandroid/hardware/camera2/CameraCaptureSession;IJ)V")\r
+\r
+                DECLARE_JNI_CLASS_WITH_BYTECODE (CameraCaptureSessionCaptureCallback, "com/rmsl/juce/CameraCaptureSessionCaptureCallback", 21, CameraSupportByteCode)\r
                 #undef JNI_CLASS_MEMBERS\r
 \r
                 LocalRef<jobject> createCaptureSessionCallback (bool createPreviewSession)\r
                 {\r
-                    return LocalRef<jobject>(getEnv()->NewObject (CameraCaptureSessionCaptureCallback,\r
-                                                                  CameraCaptureSessionCaptureCallback.constructor,\r
-                                                                  reinterpret_cast<jlong> (this),\r
-                                                                  createPreviewSession ? 1 : 0));\r
+                    return LocalRef<jobject> (getEnv()->NewObject (CameraCaptureSessionCaptureCallback,\r
+                                                                   CameraCaptureSessionCaptureCallback.constructor,\r
+                                                                   reinterpret_cast<jlong> (this),\r
+                                                                   createPreviewSession ? 1 : 0));\r
                 }\r
 \r
                 //==============================================================================\r
-\r
                 enum class State\r
                 {\r
                     idle = 0,\r
@@ -1976,122 +1964,110 @@ private:
                 }\r
 \r
                 //==============================================================================\r
-                void cameraCaptureSessionCaptureCompleted (bool isPreview, jobject session, jobject request, jobject result)\r
+                void cameraCaptureSessionCaptureCompleted (bool isPreview,\r
+                                                           [[maybe_unused]] jobject session,\r
+                                                           [[maybe_unused]] jobject request,\r
+                                                           jobject result)\r
                 {\r
                     JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureCompleted()");\r
 \r
-                    ignoreUnused (session, request);\r
-\r
                     if (isPreview)\r
                         updateState (result);\r
                     else if (currentState != State::idle)\r
                         unlockFocus();\r
                 }\r
 \r
-                void cameraCaptureSessionCaptureFailed (bool isPreview, jobject session, jobject request, jobject failure)\r
+                void cameraCaptureSessionCaptureFailed ([[maybe_unused]] bool isPreview,\r
+                                                        [[maybe_unused]] jobject session,\r
+                                                        [[maybe_unused]] jobject request,\r
+                                                        [[maybe_unused]] jobject failure)\r
                 {\r
                     JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureFailed()");\r
-\r
-                    ignoreUnused (isPreview, session, request, failure);\r
                 }\r
 \r
-                void cameraCaptureSessionCaptureProgressed (bool isPreview, jobject session, jobject request, jobject partialResult)\r
+                void cameraCaptureSessionCaptureProgressed (bool isPreview,\r
+                                                            [[maybe_unused]] jobject session,\r
+                                                            [[maybe_unused]] jobject request,\r
+                                                            jobject partialResult)\r
                 {\r
                     JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureProgressed()");\r
 \r
-                    ignoreUnused (session, request);\r
-\r
                     if (isPreview)\r
                         updateState (partialResult);\r
                 }\r
 \r
-                void cameraCaptureSessionCaptureSequenceAborted (bool isPreview, jobject session, int sequenceId)\r
+                void cameraCaptureSessionCaptureSequenceAborted ([[maybe_unused]] bool isPreview,\r
+                                                                 [[maybe_unused]] jobject session,\r
+                                                                 [[maybe_unused]] int sequenceId)\r
                 {\r
                     JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureSequenceAborted()");\r
-\r
-                    ignoreUnused (isPreview, isPreview, session, sequenceId);\r
                 }\r
 \r
-                void cameraCaptureSessionCaptureSequenceCompleted (bool isPreview, jobject session, int sequenceId, int64 frameNumber)\r
+                void cameraCaptureSessionCaptureSequenceCompleted ([[maybe_unused]] bool isPreview,\r
+                                                                   [[maybe_unused]] jobject session,\r
+                                                                   [[maybe_unused]] int sequenceId,\r
+                                                                   [[maybe_unused]] int64 frameNumber)\r
                 {\r
                     JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureSequenceCompleted()");\r
-\r
-                    ignoreUnused (isPreview, session, sequenceId, frameNumber);\r
                 }\r
 \r
-                void cameraCaptureSessionCaptureStarted (bool isPreview, jobject session, jobject request, int64 timestamp, int64 frameNumber)\r
+                void cameraCaptureSessionCaptureStarted ([[maybe_unused]] bool isPreview,\r
+                                                         [[maybe_unused]] jobject session,\r
+                                                         [[maybe_unused]] jobject request,\r
+                                                         [[maybe_unused]] int64 timestamp,\r
+                                                         [[maybe_unused]] int64 frameNumber)\r
                 {\r
                     JUCE_CAMERA_LOG ("cameraCaptureSessionCaptureStarted()");\r
-\r
-                    ignoreUnused (isPreview, session, request, timestamp, frameNumber);\r
                 }\r
 \r
                 //==============================================================================\r
-                static void cameraCaptureSessionCaptureCompletedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult)\r
+                static void cameraCaptureSessionCaptureCompletedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult)\r
                 {\r
-                    if (auto* myself = reinterpret_cast<StillPictureTaker*> (host))\r
-                    {\r
-                        LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-                        LocalRef<jobject> request (getEnv()->NewLocalRef(rawRequest));\r
-                        LocalRef<jobject> result (getEnv()->NewLocalRef(rawResult));\r
+                    LocalRef<jobject> session (env->NewLocalRef (rawSession));\r
+                    LocalRef<jobject> request (env->NewLocalRef (rawRequest));\r
+                    LocalRef<jobject> result (env->NewLocalRef (rawResult));\r
 \r
-                        myself->cameraCaptureSessionCaptureCompleted (isPreview != 0, session, request, result);\r
-                    }\r
+                    t.cameraCaptureSessionCaptureCompleted (isPreview != 0, session, request, result);\r
                 }\r
 \r
-                static void cameraCaptureSessionCaptureFailedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult)\r
+                static void cameraCaptureSessionCaptureFailedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult)\r
                 {\r
-                    if (auto* myself = reinterpret_cast<StillPictureTaker*> (host))\r
-                    {\r
-                        LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-                        LocalRef<jobject> request (getEnv()->NewLocalRef(rawRequest));\r
-                        LocalRef<jobject> result (getEnv()->NewLocalRef(rawResult));\r
+                    LocalRef<jobject> session (env->NewLocalRef (rawSession));\r
+                    LocalRef<jobject> request (env->NewLocalRef (rawRequest));\r
+                    LocalRef<jobject> result (env->NewLocalRef (rawResult));\r
 \r
-                        myself->cameraCaptureSessionCaptureFailed (isPreview != 0, session, request, result);\r
-                    }\r
+                    t.cameraCaptureSessionCaptureFailed (isPreview != 0, session, request, result);\r
                 }\r
 \r
-                static void cameraCaptureSessionCaptureProgressedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult)\r
+                static void cameraCaptureSessionCaptureProgressedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jobject rawResult)\r
                 {\r
-                    if (auto* myself = reinterpret_cast<StillPictureTaker*> (host))\r
-                    {\r
-                        LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-                        LocalRef<jobject> request (getEnv()->NewLocalRef(rawRequest));\r
-                        LocalRef<jobject> result (getEnv()->NewLocalRef(rawResult));\r
+                    LocalRef<jobject> session (env->NewLocalRef (rawSession));\r
+                    LocalRef<jobject> request (env->NewLocalRef (rawRequest));\r
+                    LocalRef<jobject> result (env->NewLocalRef (rawResult));\r
 \r
-                        myself->cameraCaptureSessionCaptureProgressed (isPreview != 0, session, request, result);\r
-                    }\r
+                    t.cameraCaptureSessionCaptureProgressed (isPreview != 0, session, request, result);\r
                 }\r
 \r
-                static void cameraCaptureSessionCaptureSequenceAbortedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jint sequenceId)\r
+                static void cameraCaptureSessionCaptureSequenceAbortedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jint sequenceId)\r
                 {\r
-                    if (auto* myself = reinterpret_cast<StillPictureTaker*> (host))\r
-                    {\r
-                        LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
+                    LocalRef<jobject> session (env->NewLocalRef (rawSession));\r
 \r
-                        myself->cameraCaptureSessionCaptureSequenceAborted (isPreview != 0, session, sequenceId);\r
-                    }\r
+                    t.cameraCaptureSessionCaptureSequenceAborted (isPreview != 0, session, sequenceId);\r
                 }\r
 \r
-                static void cameraCaptureSessionCaptureSequenceCompletedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jint sequenceId, jlong frameNumber)\r
+                static void cameraCaptureSessionCaptureSequenceCompletedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jint sequenceId, jlong frameNumber)\r
                 {\r
-                    if (auto* myself = reinterpret_cast<StillPictureTaker*> (host))\r
-                    {\r
-                        LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
+                    LocalRef<jobject> session (env->NewLocalRef (rawSession));\r
 \r
-                        myself->cameraCaptureSessionCaptureSequenceCompleted (isPreview != 0, session, sequenceId, frameNumber);\r
-                    }\r
+                    t.cameraCaptureSessionCaptureSequenceCompleted (isPreview != 0, session, sequenceId, frameNumber);\r
                 }\r
 \r
-                static void cameraCaptureSessionCaptureStartedCallback (JNIEnv*, jobject /*object*/, jlong host, jboolean isPreview, jobject rawSession, jobject rawRequest, jlong timestamp, jlong frameNumber)\r
+                static void cameraCaptureSessionCaptureStartedCallback (JNIEnv* env, StillPictureTaker& t, jboolean isPreview, jobject rawSession, jobject rawRequest, jlong timestamp, jlong frameNumber)\r
                 {\r
-                    if (auto* myself = reinterpret_cast<StillPictureTaker*> (host))\r
-                    {\r
-                        LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-                        LocalRef<jobject> request (getEnv()->NewLocalRef(rawRequest));\r
+                    LocalRef<jobject> session (env->NewLocalRef (rawSession));\r
+                    LocalRef<jobject> request (env->NewLocalRef (rawRequest));\r
 \r
-                        myself->cameraCaptureSessionCaptureStarted (isPreview != 0, session, request, timestamp, frameNumber);\r
-                    }\r
+                    t.cameraCaptureSessionCaptureStarted (isPreview != 0, session, request, timestamp, frameNumber);\r
                 }\r
             };\r
 \r
@@ -2120,11 +2096,11 @@ private:
             //==============================================================================\r
             #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK)    \\r
                 METHOD (constructor, "<init>", "(J)V") \\r
-                CALLBACK(cameraCaptureSessionActiveCallback,          "cameraCaptureSessionActive",          "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
-                CALLBACK(cameraCaptureSessionClosedCallback,          "cameraCaptureSessionClosed",          "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
-                CALLBACK(cameraCaptureSessionConfigureFailedCallback, "cameraCaptureSessionConfigureFailed", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
-                CALLBACK(cameraCaptureSessionConfiguredCallback,      "cameraCaptureSessionConfigured",      "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
-                CALLBACK(cameraCaptureSessionReadyCallback,           "cameraCaptureSessionReady",           "(JLandroid/hardware/camera2/CameraCaptureSession;)V")\r
+                CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionActiveCallback>,          "cameraCaptureSessionActive",          "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
+                CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionClosedCallback>,          "cameraCaptureSessionClosed",          "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
+                CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionConfigureFailedCallback>, "cameraCaptureSessionConfigureFailed", "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
+                CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionConfiguredCallback>,      "cameraCaptureSessionConfigured",      "(JLandroid/hardware/camera2/CameraCaptureSession;)V") \\r
+                CALLBACK (generatedCallback<&CaptureSession::cameraCaptureSessionReadyCallback>,           "cameraCaptureSessionReady",           "(JLandroid/hardware/camera2/CameraCaptureSession;)V")\r
 \r
             DECLARE_JNI_CLASS_WITH_MIN_SDK (CameraCaptureSessionStateCallback, "com/rmsl/juce/CameraCaptureSessionStateCallback", 21)\r
             #undef JNI_CLASS_MEMBERS\r
@@ -2166,126 +2142,81 @@ private:
                 env->CallVoidMethod (captureRequestBuilder, CaptureRequestBuilder.set, jKey.get(), jValue.get());\r
             }\r
 \r
-            void cameraCaptureSessionActive (jobject session)\r
+            //==============================================================================\r
+            static void cameraCaptureSessionActiveCallback ([[maybe_unused]] JNIEnv* env,\r
+                                                            [[maybe_unused]] CaptureSession& t,\r
+                                                            [[maybe_unused]] jobject rawSession)\r
             {\r
                 JUCE_CAMERA_LOG ("cameraCaptureSessionActive()");\r
-                ignoreUnused (session);\r
             }\r
 \r
-            void cameraCaptureSessionClosed (jobject session)\r
+            static void cameraCaptureSessionClosedCallback ([[maybe_unused]] JNIEnv* env,\r
+                                                            CaptureSession& t,\r
+                                                            [[maybe_unused]] jobject rawSession)\r
             {\r
                 JUCE_CAMERA_LOG ("cameraCaptureSessionClosed()");\r
-                ignoreUnused (session);\r
 \r
-                closedEvent.signal();\r
+                t.closedEvent.signal();\r
             }\r
 \r
-            void cameraCaptureSessionConfigureFailed (jobject session)\r
+            static void cameraCaptureSessionConfigureFailedCallback ([[maybe_unused]] JNIEnv* env,\r
+                                                                     CaptureSession& t,\r
+                                                                     [[maybe_unused]] jobject rawSession)\r
             {\r
                 JUCE_CAMERA_LOG ("cameraCaptureSessionConfigureFailed()");\r
-                ignoreUnused (session);\r
 \r
-                MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { this }]\r
-                {\r
-                    if (weakRef != nullptr)\r
-                        weakRef->configuredCallback.captureSessionConfigured (nullptr);\r
-                });\r
+                MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { &t }]\r
+                                           {\r
+                                               if (weakRef != nullptr)\r
+                                                   weakRef->configuredCallback.captureSessionConfigured (nullptr);\r
+                                           });\r
             }\r
 \r
-            void cameraCaptureSessionConfigured (const LocalRef<jobject>& session)\r
+            static void cameraCaptureSessionConfiguredCallback (JNIEnv* env, CaptureSession& t, jobject rawSession)\r
             {\r
+                LocalRef<jobject> session (env->NewLocalRef (rawSession));\r
                 JUCE_CAMERA_LOG ("cameraCaptureSessionConfigured()");\r
 \r
-                if (pendingClose.get() == 1)\r
+                if (t.pendingClose.get() == 1)\r
                 {\r
                     // Already closing, bailout.\r
-                    closedEvent.signal();\r
+                    t.closedEvent.signal();\r
 \r
                     GlobalRef s (session);\r
 \r
                     MessageManager::callAsync ([s]()\r
-                        {\r
-                            getEnv()->CallVoidMethod (s, CameraCaptureSession.close);\r
-                        });\r
+                                               {\r
+                                                   getEnv()->CallVoidMethod (s, CameraCaptureSession.close);\r
+                                               });\r
 \r
                     return;\r
                 }\r
 \r
                 {\r
-                    const ScopedLock lock (captureSessionLock);\r
-                    captureSession = GlobalRef (session);\r
+                    const ScopedLock lock (t.captureSessionLock);\r
+                    t.captureSession = GlobalRef (session);\r
                 }\r
 \r
-                MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { this }]\r
-                {\r
-                    if (weakRef == nullptr)\r
-                        return;\r
+                MessageManager::callAsync ([weakRef = WeakReference<CaptureSession> { &t }]\r
+                                           {\r
+                                               if (weakRef == nullptr)\r
+                                                   return;\r
 \r
-                    weakRef->stillPictureTaker.reset (new StillPictureTaker (weakRef->captureSession,\r
-                                                                             weakRef->captureRequestBuilder,\r
-                                                                             weakRef->previewCaptureRequest,\r
-                                                                             weakRef->handler,\r
-                                                                             weakRef->autoFocusMode));\r
+                                               weakRef->stillPictureTaker.reset (new StillPictureTaker (weakRef->captureSession,\r
+                                                                                                        weakRef->captureRequestBuilder,\r
+                                                                                                        weakRef->previewCaptureRequest,\r
+                                                                                                        weakRef->handler,\r
+                                                                                                        weakRef->autoFocusMode));\r
 \r
-                    weakRef->configuredCallback.captureSessionConfigured (weakRef.get());\r
-                });\r
+                                               weakRef->configuredCallback.captureSessionConfigured (weakRef.get());\r
+                                           });\r
             }\r
 \r
-            void cameraCaptureSessionReady (const LocalRef<jobject>& session)\r
+            static void cameraCaptureSessionReadyCallback ([[maybe_unused]] JNIEnv* env,\r
+                                                           [[maybe_unused]] CaptureSession& t,\r
+                                                           [[maybe_unused]] jobject rawSession)\r
             {\r
                 JUCE_CAMERA_LOG ("cameraCaptureSessionReady()");\r
-                ignoreUnused (session);\r
-            }\r
-\r
-            //==============================================================================\r
-            static void cameraCaptureSessionActiveCallback (JNIEnv*, jobject, jlong host, jobject rawSession)\r
-            {\r
-                if (auto* myself = reinterpret_cast<CaptureSession*> (host))\r
-                {\r
-                    LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-\r
-                    myself->cameraCaptureSessionActive (session);\r
-                }\r
-            }\r
-\r
-            static void cameraCaptureSessionClosedCallback (JNIEnv*, jobject, jlong host, jobject rawSession)\r
-            {\r
-                if (auto* myself = reinterpret_cast<CaptureSession*> (host))\r
-                {\r
-                    LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-\r
-                    myself->cameraCaptureSessionClosed (session);\r
-                }\r
-            }\r
-\r
-            static void cameraCaptureSessionConfigureFailedCallback (JNIEnv*, jobject, jlong host, jobject rawSession)\r
-            {\r
-                if (auto* myself = reinterpret_cast<CaptureSession*> (host))\r
-                {\r
-                    LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-\r
-                    myself->cameraCaptureSessionConfigureFailed (session);\r
-                }\r
-            }\r
-\r
-            static void cameraCaptureSessionConfiguredCallback (JNIEnv*, jobject, jlong host, jobject rawSession)\r
-            {\r
-                if (auto* myself = reinterpret_cast<CaptureSession*> (host))\r
-                {\r
-                    LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-\r
-                    myself->cameraCaptureSessionConfigured (session);\r
-                }\r
-            }\r
-\r
-            static void cameraCaptureSessionReadyCallback (JNIEnv*, jobject, jlong host, jobject rawSession)\r
-            {\r
-                if (auto* myself = reinterpret_cast<CaptureSession*> (host))\r
-                {\r
-                    LocalRef<jobject> session (getEnv()->NewLocalRef(rawSession));\r
-\r
-                    myself->cameraCaptureSessionReady (session);\r
-                }\r
             }\r
 \r
             //==============================================================================\r
@@ -2383,10 +2314,10 @@ private:
         //==============================================================================\r
         #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK)    \\r
             METHOD (constructor, "<init>", "(J)V") \\r
-            CALLBACK (cameraDeviceStateClosedCallback,       "cameraDeviceStateClosed",       "(JLandroid/hardware/camera2/CameraDevice;)V")  \\r
-            CALLBACK (cameraDeviceStateDisconnectedCallback, "cameraDeviceStateDisconnected", "(JLandroid/hardware/camera2/CameraDevice;)V")  \\r
-            CALLBACK (cameraDeviceStateErrorCallback,        "cameraDeviceStateError",        "(JLandroid/hardware/camera2/CameraDevice;I)V") \\r
-            CALLBACK (cameraDeviceStateOpenedCallback,       "cameraDeviceStateOpened",       "(JLandroid/hardware/camera2/CameraDevice;)V")\r
+            CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateClosedCallback>,       "cameraDeviceStateClosed",       "(JLandroid/hardware/camera2/CameraDevice;)V")  \\r
+            CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateDisconnectedCallback>, "cameraDeviceStateDisconnected", "(JLandroid/hardware/camera2/CameraDevice;)V")  \\r
+            CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateErrorCallback>,        "cameraDeviceStateError",        "(JLandroid/hardware/camera2/CameraDevice;I)V") \\r
+            CALLBACK (generatedCallback<&ScopedCameraDevice::cameraDeviceStateOpenedCallback>,       "cameraDeviceStateOpened",       "(JLandroid/hardware/camera2/CameraDevice;)V")\r
 \r
         DECLARE_JNI_CLASS_WITH_MIN_SDK (CameraDeviceStateCallback, "com/rmsl/juce/CameraDeviceStateCallback", 21)\r
         #undef JNI_CLASS_MEMBERS\r
@@ -2399,92 +2330,66 @@ private:
         }\r
 \r
         //==============================================================================\r
-        void cameraDeviceStateClosed()\r
+        void notifyOpenResult()\r
+        {\r
+            MessageManager::callAsync ([this]() { owner.cameraOpenFinished (openError); });\r
+        }\r
+\r
+        //==============================================================================\r
+        static void cameraDeviceStateClosedCallback (JNIEnv*, ScopedCameraDevice& s, jobject)\r
         {\r
             JUCE_CAMERA_LOG ("cameraDeviceStateClosed()");\r
 \r
-            closedEvent.signal();\r
+            s.closedEvent.signal();\r
         }\r
 \r
-        void cameraDeviceStateDisconnected()\r
+        static void cameraDeviceStateDisconnectedCallback (JNIEnv*, ScopedCameraDevice& s, jobject)\r
         {\r
             JUCE_CAMERA_LOG ("cameraDeviceStateDisconnected()");\r
 \r
-            if (pendingOpen.compareAndSetBool (0, 1))\r
+            if (s.pendingOpen.compareAndSetBool (0, 1))\r
             {\r
-                openError = "Device disconnected";\r
+                s.openError = "Device disconnected";\r
 \r
-                notifyOpenResult();\r
+                s.notifyOpenResult();\r
             }\r
 \r
-            MessageManager::callAsync ([this]() { close(); });\r
+            MessageManager::callAsync ([&s] { s.close(); });\r
         }\r
 \r
-        void cameraDeviceStateError (int errorCode)\r
+        static void cameraDeviceStateErrorCallback (JNIEnv*, ScopedCameraDevice& s, jobject, jint errorCode)\r
         {\r
-            String error = cameraErrorCodeToString (errorCode);\r
+            auto error = cameraErrorCodeToString (errorCode);\r
 \r
             JUCE_CAMERA_LOG ("cameraDeviceStateError(), error: " + error);\r
 \r
-            if (pendingOpen.compareAndSetBool (0, 1))\r
+            if (s.pendingOpen.compareAndSetBool (0, 1))\r
             {\r
-                openError = error;\r
+                s.openError = error;\r
 \r
-                notifyOpenResult();\r
+                s.notifyOpenResult();\r
             }\r
 \r
-            fatalErrorOccurred.set (1);\r
+            s.fatalErrorOccurred.set (1);\r
 \r
-            MessageManager::callAsync ([this, error]()\r
+            MessageManager::callAsync ([&s, error]()\r
                                        {\r
-                                           owner.cameraDeviceError (error);\r
-                                           close();\r
+                                           s.owner.cameraDeviceError (error);\r
+                                           s.close();\r
                                        });\r
         }\r
 \r
-        void cameraDeviceStateOpened (const LocalRef<jobject>& cameraDeviceToUse)\r
+        static void cameraDeviceStateOpenedCallback (JNIEnv* env, ScopedCameraDevice& s, jobject cameraDeviceToUse)\r
         {\r
             JUCE_CAMERA_LOG ("cameraDeviceStateOpened()");\r
 \r
-            pendingOpen.set (0);\r
-\r
-            cameraDevice = GlobalRef (cameraDeviceToUse);\r
-\r
-            notifyOpenResult();\r
-        }\r
-\r
-        void notifyOpenResult()\r
-        {\r
-            MessageManager::callAsync ([this]() { owner.cameraOpenFinished (openError); });\r
-        }\r
-\r
-        //==============================================================================\r
-        static void JNICALL cameraDeviceStateClosedCallback (JNIEnv*, jobject, jlong host, jobject)\r
-        {\r
-            if (auto* myself = reinterpret_cast<ScopedCameraDevice*>(host))\r
-                myself->cameraDeviceStateClosed();\r
-        }\r
+            LocalRef<jobject> camera (env->NewLocalRef (cameraDeviceToUse));\r
 \r
-        static void JNICALL cameraDeviceStateDisconnectedCallback (JNIEnv*, jobject, jlong host, jobject)\r
-        {\r
-            if (auto* myself = reinterpret_cast<ScopedCameraDevice*>(host))\r
-                myself->cameraDeviceStateDisconnected();\r
-        }\r
-\r
-        static void JNICALL cameraDeviceStateErrorCallback (JNIEnv*, jobject, jlong host, jobject, jint error)\r
-        {\r
-            if (auto* myself = reinterpret_cast<ScopedCameraDevice*>(host))\r
-                myself->cameraDeviceStateError (error);\r
-        }\r
+            s.pendingOpen.set (0);\r
 \r
-        static void JNICALL cameraDeviceStateOpenedCallback (JNIEnv*, jobject, jlong host, jobject rawCamera)\r
-        {\r
-            if (auto* myself = reinterpret_cast<ScopedCameraDevice*>(host))\r
-            {\r
-                LocalRef<jobject> camera(getEnv()->NewLocalRef(rawCamera));\r
+            s.cameraDevice = GlobalRef (camera);\r
 \r
-                myself->cameraDeviceStateOpened (camera);\r
-            }\r
+            s.notifyOpenResult();\r
         }\r
     };\r
 \r
@@ -2824,7 +2729,7 @@ private:
             METHOD (constructor,          "<init>",               "(JLandroid/content/Context;I)V") \\r
             METHOD (disable,              "disable",              "()V") \\r
             METHOD (enable,               "enable",               "()V") \\r
-            CALLBACK (deviceOrientationChanged, "deviceOrientationChanged", "(JI)V")\r
+            CALLBACK (generatedCallback<&DeviceOrientationChangeListener::orientationChanged>, "deviceOrientationChanged", "(JI)V")\r
 \r
         DECLARE_JNI_CLASS_WITH_MIN_SDK (OrientationEventListener, "com/rmsl/juce/JuceOrientationEventListener", 21)\r
         #undef JNI_CLASS_MEMBERS\r
@@ -2839,7 +2744,7 @@ private:
         }\r
 \r
         //==============================================================================\r
-        void orientationChanged (int orientation)\r
+        static void orientationChanged (JNIEnv*, DeviceOrientationChangeListener& t, jint orientation)\r
         {\r
             jassert (orientation < 360);\r
 \r
@@ -2847,25 +2752,31 @@ private:
             if (orientation < 0)\r
                 return;\r
 \r
-            auto oldOrientation = deviceOrientation;\r
+            const auto oldOrientation = t.deviceOrientation;\r
+\r
+            t.deviceOrientation = [orientation]\r
+            {\r
+                if (orientation > (360 - 45) || orientation < 45)\r
+                    return Desktop::upright;\r
+\r
+                if (orientation < 135)\r
+                    return Desktop::rotatedClockwise;\r
+\r
+                if (orientation < 225)\r
+                    return Desktop::upsideDown;\r
+\r
+                return Desktop::rotatedAntiClockwise;\r
+            }();\r
 \r
             // NB: this assumes natural position to be portrait always, but some devices may be landscape...\r
-            if (orientation > (360 - 45) || orientation < 45)\r
-                deviceOrientation = Desktop::upright;\r
-            else if (orientation < 135)\r
-                deviceOrientation = Desktop::rotatedClockwise;\r
-            else if (orientation < 225)\r
-                deviceOrientation = Desktop::upsideDown;\r
-            else\r
-                deviceOrientation = Desktop::rotatedAntiClockwise;\r
 \r
-            if (oldOrientation != deviceOrientation)\r
+            if (oldOrientation != t.deviceOrientation)\r
             {\r
-                lastKnownScreenOrientation = Desktop::getInstance().getCurrentOrientation();\r
+                t.lastKnownScreenOrientation = Desktop::getInstance().getCurrentOrientation();\r
 \r
                 // Need to update preview transform, but screen orientation will change slightly\r
                 // later than sensor orientation.\r
-                startTimer (500);\r
+                t.startTimer (500);\r
             }\r
         }\r
 \r
@@ -2890,12 +2801,6 @@ private:
                 numChecksForOrientationChange = 10;\r
             }\r
         }\r
-\r
-        static void deviceOrientationChanged (JNIEnv*, jobject /*obj*/, jlong host, jint orientation)\r
-        {\r
-            if (auto* myself = reinterpret_cast<DeviceOrientationChangeListener*> (host))\r
-                myself->orientationChanged (orientation);\r
-        }\r
     };\r
 \r
     //==============================================================================\r
@@ -3189,7 +3094,7 @@ private:
     {\r
         auto* env = getEnv();\r
 \r
-        auto quitSafelyMethod = env->GetMethodID(AndroidHandlerThread, "quitSafely", "()Z");\r
+        auto quitSafelyMethod = env->GetMethodID (AndroidHandlerThread, "quitSafely", "()Z");\r
 \r
         // this code will only run on SDK >= 21\r
         jassert(quitSafelyMethod != nullptr);\r
@@ -3277,9 +3182,3 @@ String CameraDevice::getFileExtension()
 {\r
     return ".mp4";\r
 }\r
-\r
-//==============================================================================\r
-CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::StillPictureTaker::CameraCaptureSessionCaptureCallback_Class CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::StillPictureTaker::CameraCaptureSessionCaptureCallback;\r
-CameraDevice::Pimpl::ScopedCameraDevice::CameraDeviceStateCallback_Class CameraDevice::Pimpl::ScopedCameraDevice::CameraDeviceStateCallback;\r
-CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::CameraCaptureSessionStateCallback_Class CameraDevice::Pimpl::ScopedCameraDevice::CaptureSession::CameraCaptureSessionStateCallback;\r
-CameraDevice::Pimpl::DeviceOrientationChangeListener::OrientationEventListener_Class CameraDevice::Pimpl::DeviceOrientationChangeListener::OrientationEventListener;\r
index 101bf958fcf13b2bca8312eec664b55a35bc5b10..56d94bbb9a8856e4f84cc74dfa0a2447584478e7 100644 (file)
@@ -32,7 +32,7 @@
 //\r
 // files with min sdk version 21\r
 // See juce_core/native/java/README.txt on how to generate this byte-code.\r
-static const unsigned char MediaSessionByteCode[] =\r
+static const uint8 MediaSessionByteCode[] =\r
 { 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,\r
 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,\r
 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,\r
@@ -757,12 +757,12 @@ private:
             //==============================================================================\r
             #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
                 METHOD (constructor, "<init>", "(J)V")                  \\r
-                CALLBACK (audioInfoChanged,     "mediaControllerAudioInfoChanged",      "(JLandroid/media/session/MediaController$PlaybackInfo;)V") \\r
-                CALLBACK (metadataChanged,      "mediaControllerMetadataChanged",       "(JLandroid/media/MediaMetadata;)V") \\r
-                CALLBACK (playbackStateChanged, "mediaControllerPlaybackStateChanged",  "(JLandroid/media/session/PlaybackState;)V") \\r
-                CALLBACK (sessionDestroyed,     "mediaControllerSessionDestroyed",      "(J)V")\r
+                CALLBACK (generatedCallback<&Controller::audioInfoChanged>,     "mediaControllerAudioInfoChanged",      "(JLandroid/media/session/MediaController$PlaybackInfo;)V") \\r
+                CALLBACK (generatedCallback<&Controller::metadataChanged>,      "mediaControllerMetadataChanged",       "(JLandroid/media/MediaMetadata;)V") \\r
+                CALLBACK (generatedCallback<&Controller::playbackStateChanged>, "mediaControllerPlaybackStateChanged",  "(JLandroid/media/session/PlaybackState;)V") \\r
+                CALLBACK (generatedCallback<&Controller::sessionDestroyed>,     "mediaControllerSessionDestroyed",      "(J)V")\r
 \r
-            DECLARE_JNI_CLASS_WITH_BYTECODE (AndroidMediaControllerCallback, "com/rmsl/juce/MediaControllerCallback", 21, MediaSessionByteCode, sizeof (MediaSessionByteCode))\r
+            DECLARE_JNI_CLASS_WITH_BYTECODE (AndroidMediaControllerCallback, "com/rmsl/juce/MediaControllerCallback", 21, MediaSessionByteCode)\r
            #undef JNI_CLASS_MEMBERS\r
 \r
             LocalRef<jobject> createControllerCallbacks()\r
@@ -774,34 +774,24 @@ private:
 \r
             //==============================================================================\r
             // MediaSessionController callbacks\r
-            static void audioInfoChanged (JNIEnv*, jobject, jlong host, jobject playbackInfo)\r
+            static void audioInfoChanged (JNIEnv*, [[maybe_unused]] Controller& t, [[maybe_unused]] jobject playbackInfo)\r
             {\r
-                if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host))\r
-                {\r
-                    ignoreUnused (playbackInfo);\r
-                    JUCE_VIDEO_LOG ("MediaSessionController::audioInfoChanged()");\r
-                }\r
+                JUCE_VIDEO_LOG ("MediaSessionController::audioInfoChanged()");\r
             }\r
 \r
-            static void metadataChanged (JNIEnv*, jobject, jlong host, jobject metadata)\r
+            static void metadataChanged (JNIEnv*, [[maybe_unused]] Controller&, [[maybe_unused]] jobject metadata)\r
             {\r
-                if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host))\r
-                {\r
-                    ignoreUnused (metadata);\r
-                    JUCE_VIDEO_LOG ("MediaSessionController::metadataChanged()");\r
-                }\r
+                JUCE_VIDEO_LOG ("MediaSessionController::metadataChanged()");\r
             }\r
 \r
-            static void playbackStateChanged (JNIEnv*, jobject, jlong host, jobject state)\r
+            static void playbackStateChanged (JNIEnv*, Controller& t, [[maybe_unused]] jobject state)\r
             {\r
-                if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host))\r
-                    myself->stateChanged (state);\r
+                t.stateChanged (state);\r
             }\r
 \r
-            static void sessionDestroyed (JNIEnv*, jobject, jlong host)\r
+            static void sessionDestroyed (JNIEnv*, [[maybe_unused]] Controller& t)\r
             {\r
-                if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession::Controller*> (host))\r
-                    JUCE_VIDEO_LOG ("MediaSessionController::sessionDestroyed()");\r
+                JUCE_VIDEO_LOG ("MediaSessionController::sessionDestroyed()");\r
             }\r
         };\r
 \r
@@ -835,10 +825,8 @@ private:
                     getEnv()->CallVoidMethod (nativeMediaPlayer, AndroidMediaPlayer.setDisplay, videoSurfaceHolder.get());\r
             }\r
 \r
-            void load (const LocalRef<jstring>& mediaId, const LocalRef<jobject>& extras)\r
+            void load (const LocalRef<jstring>& mediaId, [[maybe_unused]] const LocalRef<jobject>& extras)\r
             {\r
-                ignoreUnused (extras);\r
-\r
                 closeVideo();\r
 \r
                 auto* env = getEnv();\r
@@ -1114,39 +1102,31 @@ private:
             State currentState = State::idle;\r
 \r
             //==============================================================================\r
-            void onPrepared (LocalRef<jobject>& mediaPlayer) override\r
+            void onPrepared ([[maybe_unused]] LocalRef<jobject>& mediaPlayer) override\r
             {\r
                 JUCE_VIDEO_LOG ("MediaPlayer::onPrepared()");\r
 \r
-                ignoreUnused (mediaPlayer);\r
-\r
                 currentState = State::prepared;\r
 \r
                 owner.playerPrepared();\r
             }\r
 \r
-            void onBufferingUpdate (LocalRef<jobject>& mediaPlayer, int progress) override\r
+            void onBufferingUpdate ([[maybe_unused]] LocalRef<jobject>& mediaPlayer, int progress) override\r
             {\r
-                ignoreUnused (mediaPlayer);\r
-\r
                 owner.playerBufferingUpdated (progress);\r
             }\r
 \r
-            void onSeekComplete (LocalRef<jobject>& mediaPlayer) override\r
+            void onSeekComplete ([[maybe_unused]] LocalRef<jobject>& mediaPlayer) override\r
             {\r
                 JUCE_VIDEO_LOG ("MediaPlayer::onSeekComplete()");\r
 \r
-                ignoreUnused (mediaPlayer);\r
-\r
                 owner.playerSeekCompleted();\r
             }\r
 \r
-            void onCompletion (LocalRef<jobject>& mediaPlayer) override\r
+            void onCompletion ([[maybe_unused]] LocalRef<jobject>& mediaPlayer) override\r
             {\r
                 JUCE_VIDEO_LOG ("MediaPlayer::onCompletion()");\r
 \r
-                ignoreUnused (mediaPlayer);\r
-\r
                 currentState = State::complete;\r
 \r
                 owner.playerPlaybackCompleted();\r
@@ -1169,13 +1149,11 @@ private:
                 MEDIA_INFO_SUBTITLE_TIMED_OUT    = 902\r
             };\r
 \r
-            bool onInfo (LocalRef<jobject>& mediaPlayer, int what, int extra) override\r
+            bool onInfo ([[maybe_unused]] LocalRef<jobject>& mediaPlayer, int what, [[maybe_unused]] int extra) override\r
             {\r
                 JUCE_VIDEO_LOG ("MediaPlayer::onInfo(), infoCode: " + String (what) + " (" + infoCodeToString (what) + ")"\r
                                 + ", extraCode: " + String (extra));\r
 \r
-                ignoreUnused (mediaPlayer, extra);\r
-\r
                 if (what == MEDIA_INFO_BUFFERING_START)\r
                     owner.playerBufferingStarted();\r
                 else if (what == MEDIA_INFO_BUFFERING_END)\r
@@ -1205,7 +1183,7 @@ private:
                 }\r
             }\r
 \r
-            bool onError (LocalRef<jobject>& mediaPlayer, int what, int extra) override\r
+            bool onError ([[maybe_unused]] LocalRef<jobject>& mediaPlayer, int what, int extra) override\r
             {\r
                 auto errorMessage = errorCodeToString (what);\r
                 auto extraMessage = errorCodeToString (extra);\r
@@ -1216,8 +1194,6 @@ private:
                 JUCE_VIDEO_LOG ("MediaPlayer::onError(), errorCode: " + String (what) + " (" + errorMessage + ")"\r
                                 + ", extraCode: " + String (extra) + " (" + extraMessage + ")");\r
 \r
-                ignoreUnused (mediaPlayer);\r
-\r
                 currentState = State::error;\r
 \r
                 owner.errorOccurred (errorMessage);\r
@@ -1295,11 +1271,11 @@ private:
         //==============================================================================\r
         #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
             METHOD (constructor, "<init>", "(J)V")                      \\r
-            CALLBACK (pauseCallback,           "mediaSessionPause",           "(J)V") \\r
-            CALLBACK (playCallback,            "mediaSessionPlay",            "(J)V") \\r
-            CALLBACK (playFromMediaIdCallback, "mediaSessionPlayFromMediaId", "(JLjava/lang/String;Landroid/os/Bundle;)V") \\r
-            CALLBACK (seekToCallback,          "mediaSessionSeekTo",          "(JJ)V") \\r
-            CALLBACK (stopCallback,            "mediaSessionStop",            "(J)V")\r
+            CALLBACK (generatedCallback<&MediaSession::pauseCallback>,           "mediaSessionPause",           "(J)V") \\r
+            CALLBACK (generatedCallback<&MediaSession::playCallback>,            "mediaSessionPlay",            "(J)V") \\r
+            CALLBACK (generatedCallback<&MediaSession::playFromMediaIdCallback>, "mediaSessionPlayFromMediaId", "(JLjava/lang/String;Landroid/os/Bundle;)V") \\r
+            CALLBACK (generatedCallback<&MediaSession::seekToCallback>,          "mediaSessionSeekTo",          "(JJ)V") \\r
+            CALLBACK (generatedCallback<&MediaSession::stopCallback>,            "mediaSessionStop",            "(J)V")\r
 \r
         DECLARE_JNI_CLASS_WITH_MIN_SDK (AndroidMediaSessionCallback, "com/rmsl/juce/MediaSessionCallback", 21)\r
         #undef JNI_CLASS_MEMBERS\r
@@ -1313,78 +1289,62 @@ private:
 \r
         //==============================================================================\r
         // MediaSession callbacks\r
-        static void pauseCallback (JNIEnv*, jobject, jlong host)\r
+        static void pauseCallback (JNIEnv*, MediaSession& t)\r
         {\r
-            if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host))\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSession::pauseCallback()");\r
-                myself->player.pause();\r
-                myself->updatePlaybackState();\r
-\r
-                myself->abandonAudioFocus();\r
-            }\r
+            JUCE_VIDEO_LOG ("MediaSession::pauseCallback()");\r
+            t.player.pause();\r
+            t.updatePlaybackState();\r
+            t.abandonAudioFocus();\r
         }\r
 \r
-        static void playCallback (JNIEnv*, jobject, jlong host)\r
+        static void playCallback (JNIEnv* env, MediaSession& t)\r
         {\r
-            if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host))\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSession::playCallback()");\r
+            JUCE_VIDEO_LOG ("MediaSession::playCallback()");\r
 \r
-                myself->requestAudioFocus();\r
+            t.requestAudioFocus();\r
 \r
-                if (! myself->hasAudioFocus)\r
-                {\r
-                    myself->errorOccurred ("Application has been denied audio focus. Try again later.");\r
-                    return;\r
-                }\r
+            if (! t.hasAudioFocus)\r
+            {\r
+                t.errorOccurred ("Application has been denied audio focus. Try again later.");\r
+                return;\r
+            }\r
 \r
-                getEnv()->CallVoidMethod (myself->nativeMediaSession, AndroidMediaSession.setActive, true);\r
+            env->CallVoidMethod (t.nativeMediaSession, AndroidMediaSession.setActive, true);\r
 \r
-                myself->player.play();\r
-                myself->setSpeed (myself->playSpeedMult);\r
-                myself->updatePlaybackState();\r
-            }\r
+            t.player.play();\r
+            t.setSpeed (t.playSpeedMult);\r
+            t.updatePlaybackState();\r
         }\r
 \r
-        static void playFromMediaIdCallback (JNIEnv* env, jobject, jlong host, jstring mediaId, jobject extras)\r
+        static void playFromMediaIdCallback (JNIEnv* env, MediaSession& t, jstring mediaId, jobject extras)\r
         {\r
-            if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host))\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSession::playFromMediaIdCallback()");\r
+            JUCE_VIDEO_LOG ("MediaSession::playFromMediaIdCallback()");\r
 \r
-                myself->player.load (LocalRef<jstring> ((jstring) env->NewLocalRef(mediaId)), LocalRef<jobject> (env->NewLocalRef(extras)));\r
-                myself->updatePlaybackState();\r
-            }\r
+            t.player.load (LocalRef<jstring> ((jstring) env->NewLocalRef (mediaId)), LocalRef<jobject> (env->NewLocalRef (extras)));\r
+            t.updatePlaybackState();\r
         }\r
 \r
-        static void seekToCallback (JNIEnv* /*env*/, jobject, jlong host, jlong pos)\r
+        static void seekToCallback (JNIEnv*, MediaSession& t, jlong pos)\r
         {\r
-            if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host))\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSession::seekToCallback()");\r
+            JUCE_VIDEO_LOG ("MediaSession::seekToCallback()");\r
 \r
-                myself->pendingSeekRequest = true;\r
-                myself->player.setPlayPosition ((jint) pos);\r
-                myself->updatePlaybackState();\r
-            }\r
+            t.pendingSeekRequest = true;\r
+            t.player.setPlayPosition ((jint) pos);\r
+            t.updatePlaybackState();\r
         }\r
 \r
-        static void stopCallback(JNIEnv* env, jobject, jlong host)\r
+        static void stopCallback (JNIEnv* env, MediaSession& t)\r
         {\r
-            if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::MediaSession*> (host))\r
-            {\r
-                JUCE_VIDEO_LOG ("MediaSession::stopCallback()");\r
+            JUCE_VIDEO_LOG ("MediaSession::stopCallback()");\r
 \r
-                env->CallVoidMethod (myself->nativeMediaSession, AndroidMediaSession.setActive, false);\r
+            env->CallVoidMethod (t.nativeMediaSession, AndroidMediaSession.setActive, false);\r
 \r
-                myself->player.closeVideo();\r
-                myself->updatePlaybackState();\r
+            t.player.closeVideo();\r
+            t.updatePlaybackState();\r
 \r
-                myself->abandonAudioFocus();\r
+            t.abandonAudioFocus();\r
 \r
-                myself->owner.closeVideoFinished();\r
-            }\r
+            t.owner.closeVideoFinished();\r
         }\r
 \r
         //==============================================================================\r
@@ -1689,7 +1649,7 @@ private:
         #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
             METHOD (constructor, "<init>",     "(Landroid/app/Activity;J)V") \\r
             METHOD (setEnabled,  "setEnabled", "(Z)V")                  \\r
-            CALLBACK (systemVolumeChangedCallback, "mediaSessionSystemVolumeChanged", "(J)V")\r
+            CALLBACK (generatedCallback<&SystemVolumeListener::systemVolumeChanged>, "mediaSessionSystemVolumeChanged", "(J)V")\r
 \r
         DECLARE_JNI_CLASS_WITH_MIN_SDK (SystemVolumeObserver, "com/rmsl/juce/SystemVolumeObserver", 21)\r
         #undef JNI_CLASS_MEMBERS\r
@@ -1709,14 +1669,14 @@ private:
 \r
             // Send first notification instantly to ensure sync.\r
             if (shouldBeEnabled)\r
-                systemVolumeChanged();\r
+                systemVolumeChanged (getEnv(), *this);\r
         }\r
 \r
     private:\r
         //==============================================================================\r
-        void systemVolumeChanged()\r
+        static void systemVolumeChanged (JNIEnv*, SystemVolumeListener& t)\r
         {\r
-            MessageManager::callAsync ([weakThis = WeakReference<SystemVolumeListener> { this }]() mutable\r
+            MessageManager::callAsync ([weakThis = WeakReference<SystemVolumeListener> { &t }]\r
                                        {\r
                                            if (weakThis == nullptr)\r
                                                return;\r
@@ -1727,13 +1687,6 @@ private:
 \r
         }\r
 \r
-        //==============================================================================\r
-        static void systemVolumeChangedCallback (JNIEnv*, jobject, jlong host)\r
-        {\r
-            if (auto* myself = reinterpret_cast<VideoComponent::Pimpl::SystemVolumeListener*> (host))\r
-                myself->systemVolumeChanged();\r
-        }\r
-\r
         JUCE_DECLARE_WEAK_REFERENCEABLE (SystemVolumeListener)\r
     };\r
 \r
@@ -1845,8 +1798,3 @@ private:
 \r
 //==============================================================================\r
 constexpr VideoComponent::Pimpl::MediaSession::Player::StateInfo VideoComponent::Pimpl::MediaSession::Player::stateInfos[];\r
-\r
-//==============================================================================\r
-VideoComponent::Pimpl::MediaSession::AndroidMediaSessionCallback_Class VideoComponent::Pimpl::MediaSession::AndroidMediaSessionCallback;\r
-VideoComponent::Pimpl::MediaSession::Controller::AndroidMediaControllerCallback_Class VideoComponent::Pimpl::MediaSession::Controller::AndroidMediaControllerCallback;\r
-VideoComponent::Pimpl::SystemVolumeListener::SystemVolumeObserver_Class VideoComponent::Pimpl::SystemVolumeListener::SystemVolumeObserver;\r
index 97a48c5a2a46f1fc3cbcd2192128c66fec814030..d5b8187206ef80125a149b072546646bf447e63d 100644 (file)
@@ -524,23 +524,19 @@ private:
 \r
         private:\r
             //==============================================================================\r
-            static void started (id self, SEL, NSNotification* notification)\r
+            static void started (id self, SEL, [[maybe_unused]] NSNotification* notification)\r
             {\r
                 JUCE_CAMERA_LOG (nsStringToJuce ([notification description]));\r
 \r
-                ignoreUnused (notification);\r
-\r
                 dispatch_async (dispatch_get_main_queue(),\r
                                 ^{\r
                                     getOwner (self).cameraSessionStarted();\r
                                 });\r
             }\r
 \r
-            static void stopped (id, SEL, NSNotification* notification)\r
+            static void stopped (id, SEL, [[maybe_unused]] NSNotification* notification)\r
             {\r
                 JUCE_CAMERA_LOG (nsStringToJuce ([notification description]));\r
-\r
-                ignoreUnused (notification);\r
             }\r
 \r
             static void runtimeError (id self, SEL, NSNotification* notification)\r
@@ -555,18 +551,14 @@ private:
                                 });\r
             }\r
 \r
-            static void interrupted (id, SEL, NSNotification* notification)\r
+            static void interrupted (id, SEL, [[maybe_unused]] NSNotification* notification)\r
             {\r
                 JUCE_CAMERA_LOG (nsStringToJuce ([notification description]));\r
-\r
-                ignoreUnused (notification);\r
             }\r
 \r
-            static void interruptionEnded (id, SEL, NSNotification* notification)\r
+            static void interruptionEnded (id, SEL, [[maybe_unused]] NSNotification* notification)\r
             {\r
                 JUCE_CAMERA_LOG (nsStringToJuce ([notification description]));\r
-\r
-                ignoreUnused (notification);\r
             }\r
         };\r
 \r
@@ -788,8 +780,7 @@ private:
 \r
                 static void didFinishCaptureForSettings (id, SEL, AVCapturePhotoOutput*, AVCaptureResolvedPhotoSettings*, NSError* error)\r
                 {\r
-                    String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
-                    ignoreUnused (errorString);\r
+                    [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
 \r
                     JUCE_CAMERA_LOG ("didFinishCaptureForSettings(), error = " + errorString);\r
                 }\r
@@ -799,8 +790,7 @@ private:
                 {\r
                     getOwner (self).takingPicture = false;\r
 \r
-                    String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
-                    ignoreUnused (errorString);\r
+                    [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
 \r
                     JUCE_CAMERA_LOG ("didFinishProcessingPhoto(), error = " + errorString);\r
 \r
@@ -904,8 +894,7 @@ private:
                 {\r
                     getOwner (self).takingPicture = false;\r
 \r
-                    String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
-                    ignoreUnused (errorString);\r
+                    [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
 \r
                     JUCE_CAMERA_LOG ("didFinishProcessingPhotoSampleBuffer(), error = " + errorString);\r
 \r
@@ -1019,10 +1008,8 @@ private:
             }\r
 \r
         private:\r
-            static void printVideoOutputDebugInfo (AVCaptureMovieFileOutput* output)\r
+            static void printVideoOutputDebugInfo ([[maybe_unused]] AVCaptureMovieFileOutput* output)\r
             {\r
-                ignoreUnused (output);\r
-\r
                 JUCE_CAMERA_LOG ("Available video codec types:");\r
 \r
                #if JUCE_CAMERA_LOG_ENABLED\r
index 28748f8de2eafe13456b485b6fbff90ad91f71e8..6280e56fb7d14e2c38d22092d62ee7893dbd2575 100644 (file)
@@ -306,8 +306,7 @@ private:
             {\r
                 if (error != nil)\r
                 {\r
-                    String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
-                    ignoreUnused (errorString);\r
+                    [[maybe_unused]] String errorString = error != nil ? nsStringToJuce (error.localizedDescription) : String();\r
 \r
                     JUCE_CAMERA_LOG ("Still picture capture failed, error: " + errorString);\r
                     jassertfalse;\r
index 9ba11f4e257aec26639531d9bfed5ad44cd77c78..535c6a3d300105378fc02c5483ec6f0e265a1071 100644 (file)
@@ -479,7 +479,7 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
                     auto context = []\r
                     {\r
                         IBindCtx* ptr = nullptr;\r
-                        ignoreUnused (CreateBindCtx (0, &ptr));\r
+                        [[maybe_unused]] const auto result = CreateBindCtx (0, &ptr);\r
                         return ContextPtr (ptr);\r
                     }();\r
 \r
index 6279cd1861320aa3587aa05199706453acc790e8..263b47e165ac199c8b0b255469d9b2c72833ad0c 100644 (file)
@@ -395,7 +395,7 @@ private:
     {\r
         DirectShowContext (Pimpl& c)  : component (c)\r
         {\r
-            ignoreUnused (CoInitialize (nullptr));\r
+            [[maybe_unused]] const auto result = CoInitialize (nullptr);\r
         }\r
 \r
         ~DirectShowContext() override\r
index 3eb62862bfcf62b2612ada68de63733afaa88b10..10c4138a2f3e5e693396fda7ba0c6c03f72b0f04 100644 (file)
@@ -145,7 +145,6 @@ Result VideoComponent::loadInternal (const FileOrURL& fileOrUrl, bool loadAsync)
 {\r
    #if JUCE_ANDROID || JUCE_IOS\r
     ignoreUnused (fileOrUrl, loadAsync);\r
-\r
     // You need to use loadAsync on Android & iOS.\r
     jassertfalse;\r
     return Result::fail ("load() is not supported on this platform. Use loadAsync() instead.");\r
@@ -155,7 +154,7 @@ Result VideoComponent::loadInternal (const FileOrURL& fileOrUrl, bool loadAsync)
     if (loadAsync)\r
         startTimer (50);\r
     else\r
-       resized();\r
+        resized();\r
 \r
     return result;\r
    #endif\r