New upstream version 6.1.5~ds0
authorIOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>
Mon, 31 Jan 2022 10:39:53 +0000 (11:39 +0100)
committerIOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>
Mon, 31 Jan 2022 10:39:53 +0000 (11:39 +0100)
250 files changed:
BREAKING-CHANGES.txt
CMakeLists.txt
ChangeList.txt
README.md
docs/CMake API.md
docs/JUCE Module Format.md
docs/Linux Dependencies.md
examples/Audio/MPEDemo.h
examples/DemoRunner/Builds/Android/app/CMakeLists.txt
examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml
examples/DemoRunner/Builds/LinuxMakefile/Makefile
examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/MacOSX/Info-App.plist
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj
examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters
examples/DemoRunner/Builds/VisualStudio2015/resources.rc
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/AccessibilityDemo.h
examples/GUI/WidgetsDemo.h
examples/Plugins/MidiLoggerPluginDemo.h
examples/Plugins/SamplerPluginDemo.h
extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
extras/AudioPerformanceTest/Builds/Android/app/build.gradle
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/AudioPluginHost/AudioPluginHost.jucer
extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
extras/AudioPluginHost/Builds/Android/app/build.gradle
extras/AudioPluginHost/Builds/LinuxMakefile/Makefile
extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj
extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters
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/BinaryBuilder.jucer
extras/BinaryBuilder/Builds/LinuxMakefile/Makefile
extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj
extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
extras/Build/CMake/JUCEHelperTargets.cmake
extras/Build/CMake/JUCEModuleSupport.cmake
extras/Build/juce_build_tools/juce_build_tools.h
extras/Build/juceaide/CMakeLists.txt
extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
extras/NetworkGraphicsDemo/Builds/Android/app/build.gradle
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/Projucer/Builds/LinuxMakefile/Makefile
extras/Projucer/Builds/MacOSX/Info-App.plist
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters
extras/Projucer/Builds/VisualStudio2015/resources.rc
extras/Projucer/Builds/VisualStudio2017/Projucer_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/Project/jucer_Project.cpp
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
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/buffers/juce_AudioProcessLoadMeasurer.cpp
modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp
modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h
modules/juce_audio_basics/juce_audio_basics.h
modules/juce_audio_basics/midi/ump/juce_UMPSysEx7.h
modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp
modules/juce_audio_basics/mpe/juce_MPEInstrument.h
modules/juce_audio_basics/mpe/juce_MPENote.h
modules/juce_audio_basics/mpe/juce_MPESynthesiser.cpp
modules/juce_audio_basics/mpe/juce_MPESynthesiser.h
modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.cpp
modules/juce_audio_basics/mpe/juce_MPESynthesiserBase.h
modules/juce_audio_basics/mpe/juce_MPEUtils.cpp
modules/juce_audio_basics/mpe/juce_MPEUtils.h
modules/juce_audio_basics/mpe/juce_MPEValue.cpp
modules/juce_audio_basics/mpe/juce_MPEValue.h
modules/juce_audio_basics/mpe/juce_MPEZoneLayout.cpp
modules/juce_audio_basics/mpe/juce_MPEZoneLayout.h
modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp
modules/juce_audio_devices/juce_audio_devices.h
modules/juce_audio_devices/native/juce_linux_ALSA.cpp
modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp
modules/juce_audio_devices/native/juce_win32_ASIO.cpp
modules/juce_audio_devices/native/juce_win32_WASAPI.cpp
modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp
modules/juce_audio_formats/juce_audio_formats.h
modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h
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/utility/juce_CheckSettingMacros.h
modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp
modules/juce_audio_processors/format_types/juce_AU_Shared.h
modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp
modules/juce_audio_processors/juce_audio_processors.cpp
modules/juce_audio_processors/juce_audio_processors.h
modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h
modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.h
modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.cpp
modules/juce_audio_utils/gui/juce_AudioThumbnailCache.h
modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h
modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp [new file with mode: 0644]
modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h [new file with mode: 0644]
modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp [new file with mode: 0644]
modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h [new file with mode: 0644]
modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp
modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h
modules/juce_audio_utils/juce_audio_utils.cpp
modules/juce_audio_utils/juce_audio_utils.h
modules/juce_box2d/juce_box2d.h
modules/juce_core/containers/juce_Array.h
modules/juce_core/files/juce_TemporaryFile.cpp
modules/juce_core/juce_core.h
modules/juce_core/maths/juce_Range.h
modules/juce_core/native/juce_BasicNativeHeaders.h
modules/juce_core/native/juce_mac_Network.mm
modules/juce_core/native/juce_win32_ComSmartPtr.h
modules/juce_core/native/juce_win32_Files.cpp
modules/juce_core/native/juce_win32_Threads.cpp
modules/juce_core/system/juce_PlatformDefs.h
modules/juce_core/system/juce_StandardHeader.h
modules/juce_core/text/juce_StringPairArray.cpp
modules/juce_core/text/juce_StringPairArray.h
modules/juce_core/time/juce_Time.cpp
modules/juce_core/xml/juce_XmlDocument.h
modules/juce_core/zip/juce_ZipFile.cpp
modules/juce_core/zip/juce_ZipFile.h
modules/juce_cryptography/juce_cryptography.h
modules/juce_data_structures/juce_data_structures.h
modules/juce_dsp/containers/juce_AudioBlock.h
modules/juce_dsp/frequency/juce_FFT.cpp
modules/juce_dsp/frequency/juce_FFT.h
modules/juce_dsp/frequency/juce_FFT_test.cpp
modules/juce_dsp/juce_dsp.h
modules/juce_dsp/widgets/juce_Chorus.h
modules/juce_dsp/widgets/juce_WaveShaper.h
modules/juce_events/juce_events.h
modules/juce_graphics/images/juce_ScaledImage.h
modules/juce_graphics/juce_graphics.cpp
modules/juce_graphics/juce_graphics.h
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/accessibility/interfaces/juce_AccessibilityValueInterface.h
modules/juce_gui_basics/components/juce_Component.h
modules/juce_gui_basics/desktop/juce_Desktop.cpp
modules/juce_gui_basics/desktop/juce_Desktop.h
modules/juce_gui_basics/juce_gui_basics.cpp
modules/juce_gui_basics/juce_gui_basics.h
modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h
modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V4.cpp
modules/juce_gui_basics/menus/juce_PopupMenu.cpp
modules/juce_gui_basics/menus/juce_PopupMenu.h
modules/juce_gui_basics/misc/juce_DropShadower.h
modules/juce_gui_basics/misc/juce_FocusOutline.cpp [new file with mode: 0644]
modules/juce_gui_basics/misc/juce_FocusOutline.h [new file with mode: 0644]
modules/juce_gui_basics/mouse/juce_MouseCursor.cpp
modules/juce_gui_basics/native/accessibility/juce_android_Accessibility.cpp
modules/juce_gui_basics/native/accessibility/juce_ios_Accessibility.mm
modules/juce_gui_basics/native/accessibility/juce_mac_Accessibility.mm
modules/juce_gui_basics/native/accessibility/juce_mac_AccessibilitySharedCode.mm
modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp
modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp
modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h
modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h [new file with mode: 0644]
modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAInvokeProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIARangeValueProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIASelectionProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIATextProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAToggleProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIATransformProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAValueProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_UIAWindowProvider.h
modules/juce_gui_basics/native/accessibility/juce_win32_WindowsUIAWrapper.h
modules/juce_gui_basics/native/java/app/com/rmsl/juce/ComponentPeerView.java
modules/juce_gui_basics/native/juce_android_Windowing.cpp
modules/juce_gui_basics/native/juce_common_MimeTypes.cpp
modules/juce_gui_basics/native/juce_ios_FileChooser.mm
modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm
modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm
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_XWindowSystem.cpp
modules/juce_gui_basics/native/x11/juce_linux_XWindowSystem.h
modules/juce_gui_basics/widgets/juce_Slider.h
modules/juce_gui_basics/widgets/juce_TextEditor.cpp
modules/juce_gui_basics/widgets/juce_TreeView.cpp
modules/juce_gui_basics/windows/juce_ComponentPeer.h
modules/juce_gui_basics/windows/juce_TooltipWindow.cpp
modules/juce_gui_basics/windows/juce_TooltipWindow.h
modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp
modules/juce_gui_extra/juce_gui_extra.h
modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp
modules/juce_opengl/juce_opengl.h
modules/juce_opengl/native/juce_OpenGL_osx.h
modules/juce_osc/juce_osc.h
modules/juce_product_unlocking/juce_product_unlocking.h
modules/juce_product_unlocking/marketplace/juce_KeyFileGeneration.h
modules/juce_product_unlocking/native/juce_ios_InAppPurchases.cpp
modules/juce_video/juce_video.cpp
modules/juce_video/juce_video.h
modules/juce_video/native/juce_ios_CameraDevice.h
modules/juce_video/native/juce_win32_CameraDevice.h
modules/juce_video/native/juce_win32_ComTypes.h [new file with mode: 0644]
modules/juce_video/native/juce_win32_Video.h

index 9cdbc6c910c738bf66164fe2cc4ffda19832bf0e..cffdd352d23b282390283c771d766996bfb2b8cb 100644 (file)
@@ -1,6 +1,28 @@
 JUCE breaking changes
 =====================
 
+Version 6.1.5
+=============
+
+Change
+------
+XWindowSystemUtilities::XSettings now has a private constructor.
+
+Possible Issues
+---------------
+User code that uses XSettings::XSettings() will fail to build.
+
+Workaround
+----------
+Use the XSettings::createXSettings() factory function.
+
+Rationale
+---------
+The XSETTINGS facility is not available on all Linux distributions and the old
+constructor would fail on such systems, potentially crashing the application.
+The factory function will return nullptr in such situations instead.
+
+
 Version 6.1.3
 =============
 
index 41954d48440118133b37356b9d947e76318aa95c..a82922e7d970bf8c4f6b6845712ff8395048635a 100644 (file)
@@ -23,7 +23,7 @@
 
 cmake_minimum_required(VERSION 3.15)
 
-project(JUCE VERSION 6.1.4 LANGUAGES C CXX)
+project(JUCE VERSION 6.1.5 LANGUAGES C CXX)
 
 include(CMakeDependentOption)
 
index 75c3db1faa4927c405a087db2ce726b33d38f921..355874e4a0e292d532434c7aaf40addaccbac24c 100644 (file)
@@ -3,6 +3,15 @@
 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 6.1.5\r
+  - Improved the accessibility framework\r
+  - Added handling of non-Latin virtual key codes on macOS\r
+  - Improved X11 compatibility\r
+  - Updated the iOS in-app purchases workflow\r
+  - Improved macOS windowing behaviour\r
+  - Improved MinGW-w64 compatibility\r
+  - Added an MPEKeyboardComponent class\r
+\r
 Version 6.1.4\r
   - Restored Projucer project saving behavior\r
   - Fixed a CGImage memory access violation on Monterey\r
index 89bf552b5a83b7044142fa8567d3d5b9974d373e..0f0eaa83733473e681a69ecfba829767f11dccc9 100644 (file)
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@ tool) or with CMake.
 The repository doesn't contain a pre-built Projucer so you will need to build it
 for your platform - Xcode, Visual Studio and Linux Makefile projects are located in
 [extras/Projucer/Builds](/extras/Projucer/Builds)
-(the minumum system requirements are listed in the __System Requirements__ section below).
+(the minimum system requirements are listed in the __System Requirements__ section below).
 The Projucer can then be used to create new JUCE projects, view tutorials and run examples.
 It is also possible to include the JUCE modules source code in an existing project directly,
 or build them into a static or dynamic library which can be linked into a project.
@@ -72,12 +72,7 @@ of the target you wish to build.
 
 ## Contributing
 
-For bug reports and features requests, please visit the [JUCE Forum](https://forum.juce.com/) -
-the JUCE developers are active there and will read every post and respond accordingly. When
-submitting a bug report, please ensure that it follows the
-[issue template](/.github/ISSUE_TEMPLATE.txt).
-We don't accept third party GitHub pull requests directly due to copyright restrictions
-but if you would like to contribute any changes please contact us.
+Please see our [contribution guidelines](.github/contributing.md).
 
 ## License
 
index 74e465002a056e9d442f9f05a2af44903905eb17..a2fecc77ff8feed804fadf1be2fcc7556b80d182 100644 (file)
@@ -539,7 +539,7 @@ attributes directly to these creation functions, rather than adding them later.
 `USE_LEGACY_COMPATIBILITY_PLUGIN_CODE`
 - May be either TRUE or FALSE (defaults to FALSE). If TRUE, will override the value of the
   preprocessor definition "JucePlugin_ManufacturerCode" with the hex equivalent of "proj". This
-  option exists to maintain compatiblity with a previous, buggy version of JUCE's CMake support
+  option exists to maintain compatibility with a previous, buggy version of JUCE's CMake support
   which mishandled the manufacturer code property. Most projects should leave this option set to
   its default value.
 
index c342b61d590225212935861627705ba6ffc7cdbb..60bacd4e210fb8c41643f8a96892f31bc7725d5a 100644 (file)
@@ -17,7 +17,7 @@ JUCE convention for naming modules is lower-case with underscores, e.g.
     juce_events\r
     juce_graphics\r
 \r
-But any name that is a valid C++ identifer is OK.\r
+But any name that is a valid C++ identifier is OK.\r
 \r
 Inside the root of this folder, there must be a set of public header and source files which\r
 the user's' project will include. The module may have as many other internal source files as\r
index 13528b2f95e3815f1b11b3eadfaf0e053098a1bb..3dc1502c9595efa3caa4e9a826bb5af2be6dbd3f 100644 (file)
@@ -6,7 +6,7 @@ flag used to disable it is noted.
 
 This has been tested on Ubuntu 16.04 LTS (Xenial Xerus), 18.04 LTS (Bionic
 Beaver), and 20.04 LTS (Focal Fossa). Packages may differ in name or not be
-available on other distrubutions.
+available on other distributions.
 
 ## Compiler
 A C++ compiler is required. JUCE has been tested thoroughly with Clang and GCC:
index f8f5c702d84135ffcab495493ab3511b8149b2e9..9305d465576073a751c58d8053b43d5ac1ae1781 100644 (file)
@@ -48,6 +48,7 @@
 \r
 #pragma once\r
 \r
+\r
 //==============================================================================\r
 class ZoneColourPicker\r
 {\r
@@ -94,251 +95,12 @@ private:
 };\r
 \r
 //==============================================================================\r
-class NoteComponent : public Component\r
-{\r
-public:\r
-    NoteComponent (const MPENote& n, Colour colourToUse)\r
-        : note (n), colour (colourToUse)\r
-    {}\r
-\r
-    //==============================================================================\r
-    void update (const MPENote& newNote, Point<float> newCentre)\r
-    {\r
-        note = newNote;\r
-        centre = newCentre;\r
-\r
-        setBounds (getSquareAroundCentre (jmax (getNoteOnRadius(), getNoteOffRadius(), getPressureRadius()))\r
-                     .getUnion (getTextRectangle())\r
-                     .getSmallestIntegerContainer()\r
-                     .expanded (3));\r
-\r
-        repaint();\r
-    }\r
-\r
-    //==============================================================================\r
-    void paint (Graphics& g) override\r
-    {\r
-        if (note.keyState == MPENote::keyDown || note.keyState == MPENote::keyDownAndSustained)\r
-            drawPressedNoteCircle (g, colour);\r
-        else if (note.keyState == MPENote::sustained)\r
-            drawSustainedNoteCircle (g, colour);\r
-        else\r
-            return;\r
-\r
-        drawNoteLabel (g, colour);\r
-    }\r
-\r
-    //==============================================================================\r
-    MPENote note;\r
-    Colour colour;\r
-    Point<float> centre;\r
-\r
-private:\r
-    //==============================================================================\r
-    void drawPressedNoteCircle (Graphics& g, Colour zoneColour)\r
-    {\r
-        g.setColour (zoneColour.withAlpha (0.3f));\r
-        g.fillEllipse (translateToLocalBounds (getSquareAroundCentre (getNoteOnRadius())));\r
-        g.setColour (zoneColour);\r
-        g.drawEllipse (translateToLocalBounds (getSquareAroundCentre (getPressureRadius())), 2.0f);\r
-    }\r
-\r
-    //==============================================================================\r
-    void drawSustainedNoteCircle (Graphics& g, Colour zoneColour)\r
-    {\r
-        g.setColour (zoneColour);\r
-        Path circle, dashedCircle;\r
-        circle.addEllipse (translateToLocalBounds (getSquareAroundCentre (getNoteOffRadius())));\r
-        float dashLengths[] = { 3.0f, 3.0f };\r
-        PathStrokeType (2.0, PathStrokeType::mitered).createDashedStroke (dashedCircle, circle, dashLengths, 2);\r
-        g.fillPath (dashedCircle);\r
-    }\r
-\r
-    //==============================================================================\r
-    void drawNoteLabel (Graphics& g, Colour /**zoneColour*/)\r
-    {\r
-        auto textBounds = translateToLocalBounds (getTextRectangle()).getSmallestIntegerContainer();\r
-\r
-        g.drawText ("+", textBounds, Justification::centred);\r
-        g.drawText (MidiMessage::getMidiNoteName (note.initialNote, true, true, 3), textBounds, Justification::centredBottom);\r
-        g.setFont (Font (22.0f, Font::bold));\r
-        g.drawText (String (note.midiChannel), textBounds, Justification::centredTop);\r
-    }\r
-\r
-    //==============================================================================\r
-    Rectangle<float> getSquareAroundCentre (float radius) const noexcept\r
-    {\r
-        return Rectangle<float> (radius * 2.0f, radius * 2.0f).withCentre (centre);\r
-    }\r
-\r
-    Rectangle<float> translateToLocalBounds (Rectangle<float> r) const noexcept\r
-    {\r
-        return r - getPosition().toFloat();\r
-    }\r
-\r
-    Rectangle<float> getTextRectangle() const noexcept\r
-    {\r
-        return Rectangle<float> (30.0f, 50.0f).withCentre (centre);\r
-    }\r
-\r
-    float getNoteOnRadius()   const noexcept   { return note.noteOnVelocity .asUnsignedFloat() * maxNoteRadius; }\r
-    float getNoteOffRadius()  const noexcept   { return note.noteOffVelocity.asUnsignedFloat() * maxNoteRadius; }\r
-    float getPressureRadius() const noexcept   { return note.pressure       .asUnsignedFloat() * maxNoteRadius; }\r
-\r
-    const float maxNoteRadius = 100.0f;\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NoteComponent)\r
-};\r
-\r
-//==============================================================================\r
-class Visualiser : public Component,\r
-                   public MPEInstrument::Listener,\r
-                   private AsyncUpdater\r
-{\r
-public:\r
-    //==============================================================================\r
-    Visualiser (ZoneColourPicker& zoneColourPicker)\r
-        : colourPicker (zoneColourPicker)\r
-    {}\r
-\r
-    //==============================================================================\r
-    void paint (Graphics& g) override\r
-    {\r
-        g.fillAll (Colours::black);\r
-\r
-        auto noteDistance = float (getWidth()) / 128;\r
-        for (auto i = 0; i < 128; ++i)\r
-        {\r
-            auto x = noteDistance * (float) i;\r
-            auto noteHeight = int (MidiMessage::isMidiNoteBlack (i) ? 0.7 * getHeight() : getHeight());\r
-\r
-            g.setColour (MidiMessage::isMidiNoteBlack (i) ? Colours::white : Colours::grey);\r
-            g.drawLine (x, 0.0f, x, (float) noteHeight);\r
-\r
-            if (i > 0 && i % 12 == 0)\r
-            {\r
-                g.setColour (Colours::grey);\r
-                auto octaveNumber = (i / 12) - 2;\r
-                g.drawText ("C" + String (octaveNumber), (int) x - 15, getHeight() - 30, 30, 30, Justification::centredBottom);\r
-            }\r
-        }\r
-    }\r
-\r
-    //==============================================================================\r
-    void noteAdded (MPENote newNote) override\r
-    {\r
-        const ScopedLock sl (lock);\r
-        activeNotes.add (newNote);\r
-        triggerAsyncUpdate();\r
-    }\r
-\r
-    void notePressureChanged  (MPENote note) override { noteChanged (note); }\r
-    void notePitchbendChanged (MPENote note) override { noteChanged (note); }\r
-    void noteTimbreChanged    (MPENote note) override { noteChanged (note); }\r
-    void noteKeyStateChanged  (MPENote note) override { noteChanged (note); }\r
-\r
-    void noteChanged (MPENote changedNote)\r
-    {\r
-        const ScopedLock sl (lock);\r
-\r
-        for (auto& note : activeNotes)\r
-            if (note.noteID == changedNote.noteID)\r
-                note = changedNote;\r
-\r
-        triggerAsyncUpdate();\r
-    }\r
-\r
-    void noteReleased (MPENote finishedNote) override\r
-    {\r
-        const ScopedLock sl (lock);\r
-\r
-        for (auto i = activeNotes.size(); --i >= 0;)\r
-            if (activeNotes.getReference(i).noteID == finishedNote.noteID)\r
-                activeNotes.remove (i);\r
-\r
-        triggerAsyncUpdate();\r
-    }\r
-\r
-\r
-private:\r
-    //==============================================================================\r
-    const MPENote* findActiveNote (int noteID) const noexcept\r
-    {\r
-        for (auto& note : activeNotes)\r
-            if (note.noteID == noteID)\r
-                return &note;\r
-\r
-        return nullptr;\r
-    }\r
-\r
-    NoteComponent* findNoteComponent (int noteID) const noexcept\r
-    {\r
-        for (auto& noteComp : noteComponents)\r
-            if (noteComp->note.noteID == noteID)\r
-                return noteComp;\r
-\r
-        return nullptr;\r
-    }\r
-\r
-    //==============================================================================\r
-    void handleAsyncUpdate() override\r
-    {\r
-        const ScopedLock sl (lock);\r
-\r
-        for (auto i = noteComponents.size(); --i >= 0;)\r
-            if (findActiveNote (noteComponents.getUnchecked(i)->note.noteID) == nullptr)\r
-                noteComponents.remove (i);\r
-\r
-        for (auto& note : activeNotes)\r
-            if (findNoteComponent (note.noteID) == nullptr)\r
-                addAndMakeVisible (noteComponents.add (new NoteComponent (note, colourPicker.getColourForMidiChannel(note.midiChannel))));\r
-\r
-        for (auto& noteComp : noteComponents)\r
-            if (auto* noteInfo = findActiveNote (noteComp->note.noteID))\r
-                noteComp->update (*noteInfo, getCentrePositionForNote (*noteInfo));\r
-    }\r
-\r
-    //==============================================================================\r
-    Point<float> getCentrePositionForNote (MPENote note) const\r
-    {\r
-        auto n = float (note.initialNote) + float (note.totalPitchbendInSemitones);\r
-        auto x = (float) getWidth() * n / 128;\r
-        auto y = (float) getHeight() * (1 - note.timbre.asUnsignedFloat());\r
-\r
-        return { x, y };\r
-    }\r
-\r
-    //==============================================================================\r
-    OwnedArray<NoteComponent> noteComponents;\r
-    CriticalSection lock;\r
-    Array<MPENote> activeNotes;\r
-    ZoneColourPicker& colourPicker;\r
-\r
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Visualiser)\r
-};\r
-\r
-//==============================================================================\r
-class MPESetupComponent : public Component,\r
-                          public ChangeBroadcaster\r
+class MPESetupComponent : public Component\r
 {\r
 public:\r
     //==============================================================================\r
-    class Listener\r
-    {\r
-    public:\r
-        virtual ~Listener() {}\r
-        virtual void zoneChanged (bool isLower, int numMemberChans, int perNotePb, int masterPb) = 0;\r
-        virtual void allZonesCleared() = 0;\r
-        virtual void legacyModeChanged (bool legacyModeEnabled, int pitchbendRange, Range<int> channelRange) = 0;\r
-        virtual void voiceStealingEnabledChanged (bool voiceStealingEnabled) = 0;\r
-        virtual void numberOfVoicesChanged (int numberOfVoices) = 0;\r
-    };\r
-\r
-    void addListener (Listener* listenerToAdd)         { listeners.add (listenerToAdd); }\r
-    void removeListener (Listener* listenerToRemove)   { listeners.remove (listenerToRemove); }\r
-\r
-    //==============================================================================\r
-    MPESetupComponent()\r
+    MPESetupComponent (MPEInstrument& instr)\r
+        : instrument (instr)\r
     {\r
         addAndMakeVisible (isLowerZoneButton);\r
         isLowerZoneButton.setToggleState (true, NotificationType::dontSendNotification);\r
@@ -353,10 +115,13 @@ public:
 \r
         addAndMakeVisible (setZoneButton);\r
         setZoneButton.onClick = [this] { setZoneButtonClicked(); };\r
+\r
         addAndMakeVisible (clearAllZonesButton);\r
         clearAllZonesButton.onClick = [this] { clearAllZonesButtonClicked(); };\r
+\r
         addAndMakeVisible (legacyModeEnabledToggle);\r
         legacyModeEnabledToggle.onClick = [this] { legacyModeEnabledToggleClicked(); };\r
+\r
         addAndMakeVisible (voiceStealingEnabledToggle);\r
         voiceStealingEnabledToggle.onClick = [this] { voiceStealingEnabledToggleClicked(); };\r
 \r
@@ -402,6 +167,12 @@ public:
         numberOfVoices.setBounds (r.removeFromTop (h));\r
     }\r
 \r
+    //==============================================================================\r
+    bool isVoiceStealingEnabled() const  { return voiceStealingEnabledToggle.getToggleState(); }\r
+    int getNumVoices() const             { return numberOfVoices.getText().getIntValue(); }\r
+\r
+    std::function<void()> onSynthParametersChange;\r
+\r
 private:\r
     //==============================================================================\r
     void initialiseComboBoxWithConsecutiveIntegers (ComboBox& comboBox, Label& labelToAttach,\r
@@ -435,22 +206,21 @@ private:
         auto perNotePb = notePitchbendRange.getText().getIntValue();\r
         auto masterPb = masterPitchbendRange.getText().getIntValue();\r
 \r
+        auto zoneLayout = instrument.getZoneLayout();\r
+\r
         if (isLowerZone)\r
             zoneLayout.setLowerZone (numMemberChannels, perNotePb, masterPb);\r
         else\r
             zoneLayout.setUpperZone (numMemberChannels, perNotePb, masterPb);\r
 \r
-        listeners.call ([&] (Listener& l) { l.zoneChanged (isLowerZone, numMemberChannels, perNotePb, masterPb); });\r
+        instrument.setZoneLayout (zoneLayout);\r
     }\r
 \r
-    //==============================================================================\r
     void clearAllZonesButtonClicked()\r
     {\r
-        zoneLayout.clearAllZones();\r
-        listeners.call ([] (Listener& l) { l.allZonesCleared(); });\r
+        instrument.setZoneLayout ({});\r
     }\r
 \r
-    //==============================================================================\r
     void legacyModeEnabledToggleClicked()\r
     {\r
         auto legacyModeEnabled = legacyModeEnabledToggle.getToggleState();\r
@@ -466,38 +236,32 @@ private:
         legacyEndChannel    .setVisible (legacyModeEnabled);\r
         legacyPitchbendRange.setVisible (legacyModeEnabled);\r
 \r
-        if (areLegacyModeParametersValid())\r
+        if (legacyModeEnabled)\r
         {\r
-            listeners.call ([&] (Listener& l) { l.legacyModeChanged (legacyModeEnabledToggle.getToggleState(),\r
-                                                                     legacyPitchbendRange.getText().getIntValue(),\r
-                                                                     getLegacyModeChannelRange()); });\r
+            if (areLegacyModeParametersValid())\r
+            {\r
+                instrument.enableLegacyMode();\r
+\r
+                instrument.setLegacyModeChannelRange   (getLegacyModeChannelRange());\r
+                instrument.setLegacyModePitchbendRange (getLegacyModePitchbendRange());\r
+            }\r
+            else\r
+            {\r
+                handleInvalidLegacyModeParameters();\r
+            }\r
         }\r
         else\r
         {\r
-            handleInvalidLegacyModeParameters();\r
+            instrument.setZoneLayout ({ MPEZone (MPEZone::Type::lower, 15) });\r
         }\r
     }\r
 \r
     //==============================================================================\r
-    void voiceStealingEnabledToggleClicked()\r
-    {\r
-        auto newState = voiceStealingEnabledToggle.getToggleState();\r
-        listeners.call ([=] (Listener& l) { l.voiceStealingEnabledChanged (newState); });\r
-    }\r
-\r
-    //==============================================================================\r
-    void numberOfVoicesChanged()\r
-    {\r
-        listeners.call ([this] (Listener& l) { l.numberOfVoicesChanged (numberOfVoices.getText().getIntValue()); });\r
-    }\r
-\r
     void legacyModePitchbendRangeChanged()\r
     {\r
         jassert (legacyModeEnabledToggle.getToggleState() == true);\r
 \r
-        listeners.call ([this] (Listener& l) { l.legacyModeChanged (true,\r
-                                                                    legacyPitchbendRange.getText().getIntValue(),\r
-                                                                    getLegacyModeChannelRange()); });\r
+        instrument.setLegacyModePitchbendRange (getLegacyModePitchbendRange());\r
     }\r
 \r
     void legacyModeChannelRangeChanged()\r
@@ -505,18 +269,11 @@ private:
         jassert (legacyModeEnabledToggle.getToggleState() == true);\r
 \r
         if (areLegacyModeParametersValid())\r
-        {\r
-            listeners.call ([this] (Listener& l) { l.legacyModeChanged (true,\r
-                                                                        legacyPitchbendRange.getText().getIntValue(),\r
-                                                                        getLegacyModeChannelRange()); });\r
-        }\r
+            instrument.setLegacyModeChannelRange (getLegacyModeChannelRange());\r
         else\r
-        {\r
             handleInvalidLegacyModeParameters();\r
-        }\r
     }\r
 \r
-    //==============================================================================\r
     bool areLegacyModeParametersValid() const\r
     {\r
         return legacyStartChannel.getText().getIntValue() <= legacyEndChannel.getText().getIntValue();\r
@@ -531,15 +288,32 @@ private:
                                           "Got it");\r
     }\r
 \r
-    //==============================================================================\r
     Range<int> getLegacyModeChannelRange() const\r
     {\r
         return { legacyStartChannel.getText().getIntValue(),\r
                  legacyEndChannel.getText().getIntValue() + 1 };\r
     }\r
 \r
+    int getLegacyModePitchbendRange() const\r
+    {\r
+        return legacyPitchbendRange.getText().getIntValue();\r
+    }\r
+\r
     //==============================================================================\r
-    MPEZoneLayout zoneLayout;\r
+    void voiceStealingEnabledToggleClicked()\r
+    {\r
+        jassert (onSynthParametersChange != nullptr);\r
+        onSynthParametersChange();\r
+    }\r
+\r
+    void numberOfVoicesChanged()\r
+    {\r
+        jassert (onSynthParametersChange != nullptr);\r
+        onSynthParametersChange();\r
+    }\r
+\r
+    //==============================================================================\r
+    MPEInstrument& instrument;\r
 \r
     ComboBox memberChannels, masterPitchbendRange, notePitchbendRange;\r
 \r
@@ -564,67 +338,49 @@ private:
     ComboBox numberOfVoices;\r
     Label numberOfVoicesLabel { {}, "Number of synth voices"};\r
 \r
-    ListenerList<Listener> listeners;\r
-\r
-    const int defaultMemberChannels       = 15,\r
-              defaultMasterPitchbendRange = 2,\r
-              defaultNotePitchbendRange   = 48;\r
+    static constexpr int defaultMemberChannels       = 15,\r
+                         defaultMasterPitchbendRange = 2,\r
+                         defaultNotePitchbendRange   = 48;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESetupComponent)\r
 };\r
 \r
 //==============================================================================\r
 class ZoneLayoutComponent : public Component,\r
-                            public MPESetupComponent::Listener\r
+                            private MPEInstrument::Listener\r
 {\r
 public:\r
     //==============================================================================\r
-    ZoneLayoutComponent (const ZoneColourPicker& zoneColourPicker)\r
-        : colourPicker (zoneColourPicker)\r
-    {}\r
+    ZoneLayoutComponent (MPEInstrument& instr, ZoneColourPicker& zoneColourPicker)\r
+        : instrument (instr),\r
+          colourPicker (zoneColourPicker)\r
+    {\r
+        instrument.addListener (this);\r
+    }\r
+\r
+    ~ZoneLayoutComponent() override\r
+    {\r
+        instrument.removeListener (this);\r
+    }\r
 \r
     //==============================================================================\r
     void paint (Graphics& g) override\r
     {\r
         paintBackground (g);\r
 \r
-        if (legacyModeEnabled)\r
+        if (instrument.isLegacyModeEnabled())\r
             paintLegacyMode (g);\r
         else\r
             paintZones (g);\r
     }\r
 \r
+private:\r
     //==============================================================================\r
-    void zoneChanged (bool isLowerZone, int numMemberChannels,\r
-                      int perNotePitchbendRange, int masterPitchbendRange) override\r
-    {\r
-        if (isLowerZone)\r
-            zoneLayout.setLowerZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
-        else\r
-            zoneLayout.setUpperZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
-\r
-        repaint();\r
-    }\r
-\r
-    void allZonesCleared() override\r
-    {\r
-        zoneLayout.clearAllZones();\r
-        repaint();\r
-    }\r
-\r
-    void legacyModeChanged (bool legacyModeShouldBeEnabled, int pitchbendRange, Range<int> channelRange) override\r
+    void zoneLayoutChanged() override\r
     {\r
-        legacyModeEnabled = legacyModeShouldBeEnabled;\r
-        legacyModePitchbendRange = pitchbendRange;\r
-        legacyModeChannelRange = channelRange;\r
-\r
         repaint();\r
     }\r
 \r
-    void voiceStealingEnabledChanged (bool) override   { /* not interested in this change */ }\r
-    void numberOfVoicesChanged (int) override          { /* not interested in this change */ }\r
-\r
-private:\r
     //==============================================================================\r
     void paintBackground (Graphics& g)\r
     {\r
@@ -646,6 +402,8 @@ private:
     {\r
         auto channelWidth = getChannelRectangleWidth();\r
 \r
+        auto zoneLayout = instrument.getZoneLayout();\r
+\r
         Array<MPEZoneLayout::Zone> activeZones;\r
         if (zoneLayout.getLowerZone().isActive())  activeZones.add (zoneLayout.getLowerZone());\r
         if (zoneLayout.getUpperZone().isActive())  activeZones.add (zoneLayout.getUpperZone());\r
@@ -676,9 +434,9 @@ private:
     //==============================================================================\r
     void paintLegacyMode (Graphics& g)\r
     {\r
-        auto startChannel = legacyModeChannelRange.getStart() - 1;\r
-        auto numChannels  = legacyModeChannelRange.getEnd() - startChannel - 1;\r
-\r
+        auto channelRange = instrument.getLegacyModeChannelRange();\r
+        auto startChannel = channelRange.getStart() - 1;\r
+        auto numChannels  = channelRange.getEnd() - startChannel - 1;\r
 \r
         Rectangle<int> zoneRect (int (getChannelRectangleWidth() * (float) startChannel), 0,\r
                                  int (getChannelRectangleWidth() * (float) numChannels), getHeight());\r
@@ -688,7 +446,7 @@ private:
         g.setColour (Colours::white);\r
         g.drawRect (zoneRect, 3);\r
         g.drawText ("LGCY", zoneRect.reduced (4, 4), Justification::topLeft, false);\r
-        g.drawText ("<>" + String (legacyModePitchbendRange), zoneRect.reduced (4, 4), Justification::bottomLeft, false);\r
+        g.drawText ("<>" + String (instrument.getLegacyModePitchbendRange()), zoneRect.reduced (4, 4), Justification::bottomLeft, false);\r
     }\r
 \r
     //==============================================================================\r
@@ -698,13 +456,10 @@ private:
     }\r
 \r
     //==============================================================================\r
-    MPEZoneLayout zoneLayout;\r
-    const ZoneColourPicker& colourPicker;\r
+    static constexpr int numMidiChannels = 16;\r
 \r
-    bool legacyModeEnabled = false;\r
-    int legacyModePitchbendRange = 48;\r
-    Range<int> legacyModeChannelRange = { 1, 17 };\r
-    const int numMidiChannels = 16;\r
+    MPEInstrument& instrument;\r
+    ZoneColourPicker& colourPicker;\r
 };\r
 \r
 //==============================================================================\r
@@ -867,14 +622,11 @@ private:
 class MPEDemo : public Component,\r
                 private AudioIODeviceCallback,\r
                 private MidiInputCallback,\r
-                private MPESetupComponent::Listener\r
+                private MPEInstrument::Listener\r
 {\r
 public:\r
     //==============================================================================\r
     MPEDemo()\r
-        : audioSetupComp (audioDeviceManager, 0, 0, 0, 256, true, true, true, false),\r
-          zoneLayoutComp (colourPicker),\r
-          visualiserComp (colourPicker)\r
     {\r
        #ifndef JUCE_DEMO_RUNNER\r
         audioDeviceManager.initialise (0, 2, nullptr, true, {}, nullptr);\r
@@ -884,22 +636,33 @@ public:
         audioDeviceManager.addAudioCallback (this);\r
 \r
         addAndMakeVisible (audioSetupComp);\r
-        addAndMakeVisible (MPESetupComp);\r
+        addAndMakeVisible (mpeSetupComp);\r
         addAndMakeVisible (zoneLayoutComp);\r
-        addAndMakeVisible (visualiserViewport);\r
-\r
-        visualiserViewport.setScrollBarsShown (false, true);\r
-        visualiserViewport.setViewedComponent (&visualiserComp, false);\r
-        visualiserViewport.setViewPositionProportionately (0.5, 0.0);\r
-\r
-        MPESetupComp.addListener (&zoneLayoutComp);\r
-        MPESetupComp.addListener (this);\r
-        visualiserInstrument.addListener (&visualiserComp);\r
+        addAndMakeVisible (keyboardComponent);\r
 \r
         synth.setVoiceStealingEnabled (false);\r
         for (auto i = 0; i < 15; ++i)\r
             synth.addVoice (new MPEDemoSynthVoice());\r
 \r
+        mpeSetupComp.onSynthParametersChange = [this]\r
+        {\r
+            synth.setVoiceStealingEnabled (mpeSetupComp.isVoiceStealingEnabled());\r
+\r
+            auto numVoices = mpeSetupComp.getNumVoices();\r
+\r
+            if (numVoices < synth.getNumVoices())\r
+            {\r
+                synth.reduceNumVoices (numVoices);\r
+            }\r
+            else\r
+            {\r
+                while (synth.getNumVoices() < numVoices)\r
+                    synth.addVoice (new MPEDemoSynthVoice());\r
+            }\r
+        };\r
+\r
+        instrument.addListener (this);\r
+\r
         setSize (880, 720);\r
     }\r
 \r
@@ -912,20 +675,17 @@ public:
     //==============================================================================\r
     void resized() override\r
     {\r
-        auto visualiserCompWidth  = 2800;\r
-        auto visualiserCompHeight = 300;\r
         auto zoneLayoutCompHeight = 60;\r
         auto audioSetupCompRelativeWidth = 0.55f;\r
 \r
         auto r = getLocalBounds();\r
 \r
-        visualiserViewport.setBounds (r.removeFromBottom (visualiserCompHeight));\r
-        visualiserComp    .setBounds ({ visualiserCompWidth,\r
-                                        visualiserViewport.getHeight() - visualiserViewport.getScrollBarThickness() });\r
+        keyboardComponent.setBounds (r.removeFromBottom (150));\r
+        r.reduce (10, 10);\r
 \r
         zoneLayoutComp.setBounds (r.removeFromBottom (zoneLayoutCompHeight));\r
         audioSetupComp.setBounds (r.removeFromLeft (proportionOfWidth (audioSetupCompRelativeWidth)));\r
-        MPESetupComp  .setBounds (r);\r
+        mpeSetupComp  .setBounds (r);\r
     }\r
 \r
     //==============================================================================\r
@@ -955,75 +715,34 @@ private:
     void handleIncomingMidiMessage (MidiInput* /*source*/,\r
                                     const MidiMessage& message) override\r
     {\r
-        visualiserInstrument.processNextMidiEvent (message);\r
+        instrument.processNextMidiEvent (message);\r
         midiCollector.addMessageToQueue (message);\r
     }\r
 \r
     //==============================================================================\r
-    void zoneChanged (bool isLowerZone, int numMemberChannels,\r
-                      int perNotePitchbendRange, int masterPitchbendRange) override\r
+    void zoneLayoutChanged() override\r
     {\r
-        auto* midiOutput = audioDeviceManager.getDefaultMidiOutput();\r
-        if (midiOutput != nullptr)\r
+        if (instrument.isLegacyModeEnabled())\r
         {\r
-            if (isLowerZone)\r
-                midiOutput->sendBlockOfMessagesNow (MPEMessages::setLowerZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange));\r
-            else\r
-                midiOutput->sendBlockOfMessagesNow (MPEMessages::setUpperZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange));\r
-        }\r
+            colourPicker.setLegacyModeEnabled (true);\r
 \r
-        if (isLowerZone)\r
-            zoneLayout.setLowerZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
+            synth.enableLegacyMode (instrument.getLegacyModePitchbendRange(),\r
+                                    instrument.getLegacyModeChannelRange());\r
+        }\r
         else\r
-            zoneLayout.setUpperZone (numMemberChannels, perNotePitchbendRange, masterPitchbendRange);\r
-\r
-        visualiserInstrument.setZoneLayout (zoneLayout);\r
-        synth.setZoneLayout (zoneLayout);\r
-        colourPicker.setZoneLayout (zoneLayout);\r
-    }\r
+        {\r
+            colourPicker.setLegacyModeEnabled (false);\r
 \r
-    void allZonesCleared() override\r
-    {\r
-        auto* midiOutput = audioDeviceManager.getDefaultMidiOutput();\r
-        if (midiOutput != nullptr)\r
-            midiOutput->sendBlockOfMessagesNow (MPEMessages::clearAllZones());\r
-\r
-        zoneLayout.clearAllZones();\r
-        visualiserInstrument.setZoneLayout (zoneLayout);\r
-        synth.setZoneLayout (zoneLayout);\r
-        colourPicker.setZoneLayout (zoneLayout);\r
-    }\r
+            auto zoneLayout = instrument.getZoneLayout();\r
 \r
-    void legacyModeChanged (bool legacyModeShouldBeEnabled, int pitchbendRange, Range<int> channelRange) override\r
-    {\r
-        colourPicker.setLegacyModeEnabled (legacyModeShouldBeEnabled);\r
+            if (auto* midiOutput = audioDeviceManager.getDefaultMidiOutput())\r
+                midiOutput->sendBlockOfMessagesNow (MPEMessages::setZoneLayout (zoneLayout));\r
 \r
-        if (legacyModeShouldBeEnabled)\r
-        {\r
-            synth.enableLegacyMode (pitchbendRange, channelRange);\r
-            visualiserInstrument.enableLegacyMode (pitchbendRange, channelRange);\r
-        }\r
-        else\r
-        {\r
             synth.setZoneLayout (zoneLayout);\r
-            visualiserInstrument.setZoneLayout (zoneLayout);\r
+            colourPicker.setZoneLayout (zoneLayout);\r
         }\r
     }\r
 \r
-    void voiceStealingEnabledChanged (bool voiceStealingEnabled) override\r
-    {\r
-        synth.setVoiceStealingEnabled (voiceStealingEnabled);\r
-    }\r
-\r
-    void numberOfVoicesChanged (int numberOfVoices) override\r
-    {\r
-        if (numberOfVoices < synth.getNumVoices())\r
-            synth.reduceNumVoices (numberOfVoices);\r
-        else\r
-            while (synth.getNumVoices() < numberOfVoices)\r
-                synth.addVoice (new MPEDemoSynthVoice());\r
-    }\r
-\r
     //==============================================================================\r
     // if this PIP is running inside the demo runner, we'll use the shared device manager instead\r
    #ifndef JUCE_DEMO_RUNNER\r
@@ -1032,19 +751,18 @@ private:
     AudioDeviceManager& audioDeviceManager { getSharedAudioDeviceManager (0, 2) };\r
    #endif\r
 \r
-    MPEZoneLayout zoneLayout;\r
-    ZoneColourPicker colourPicker;\r
+    AudioDeviceSelectorComponent audioSetupComp { audioDeviceManager, 0, 0, 0, 256, true, true, true, false };\r
+    MidiMessageCollector midiCollector;\r
 \r
-    AudioDeviceSelectorComponent audioSetupComp;\r
-    MPESetupComponent MPESetupComp;\r
-    ZoneLayoutComponent zoneLayoutComp;\r
+    MPEInstrument instrument  { MPEZone (MPEZone::Type::lower, 15) };\r
 \r
-    Visualiser visualiserComp;\r
-    Viewport visualiserViewport;\r
-    MPEInstrument visualiserInstrument;\r
+    ZoneColourPicker colourPicker;\r
+    MPESetupComponent mpeSetupComp      { instrument };\r
+    ZoneLayoutComponent zoneLayoutComp  { instrument, colourPicker};\r
 \r
-    MPESynthesiser synth;\r
-    MidiMessageCollector midiCollector;\r
+    MPESynthesiser synth                   { instrument };\r
+    MPEKeyboardComponent keyboardComponent { instrument, MPEKeyboardComponent::horizontalKeyboard };\r
 \r
+    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPEDemo)\r
 };\r
index bbc07f192e3072eaa9a88588d9794f6e971cb304..00cd71bfec0429987fcab31b0683091c8c0963ea 100644 (file)
@@ -12,7 +12,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=6.1.4]] [[-DJUCE_APP_VERSION_HEX=0x60104]])
+add_definitions([[-DJUCE_ANDROID=1]] [[-DJUCE_ANDROID_API_VERSION=23]] [[-DJUCE_PUSH_NOTIFICATIONS=1]] [[-DJUCE_PUSH_NOTIFICATIONS_ACTIVITY="com/rmsl/juce/JuceActivity"]] [[-DJUCE_CONTENT_SHARING=1]] [[-DJUCE_ANDROID_GL_ES_VERSION_3_0=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]])
 
 include_directories( AFTER
     "../../../JuceLibraryCode"
@@ -23,9 +23,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=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.4]] [[-DJUCE_APP_VERSION_HEX=0x60104]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.4]] [[-DJUCE_APP_VERSION_HEX=0x60104]] [[-DNDEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_analytics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_box2d=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1]] [[-DJUCE_MODULE_AVAILABLE_juce_video=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_USE_MP3AUDIOFORMAT=1]] [[-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0]] [[-DJUCE_STRICT_REFCOUNTEDPOINTER=1]] [[-DJUCE_USE_CAMERA=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEMO_RUNNER=1]] [[-DJUCE_UNIT_TESTS=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=6.1.5]] [[-DJUCE_APP_VERSION_HEX=0x60105]] [[-DNDEBUG=1]])
 else()
     message( FATAL_ERROR "No matching build-configuration found." )
 endif()
@@ -653,8 +653,12 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
     "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
     "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
     "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
     "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
@@ -1529,6 +1533,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
     "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
@@ -1559,6 +1565,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+    "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
@@ -1821,6 +1828,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"
     "../../../../../modules/juce_video/native/juce_mac_Video.h"
     "../../../../../modules/juce_video/native/juce_win32_CameraDevice.h"
+    "../../../../../modules/juce_video/native/juce_win32_ComTypes.h"
     "../../../../../modules/juce_video/native/juce_win32_Video.h"
     "../../../../../modules/juce_video/playback/juce_VideoComponent.cpp"
     "../../../../../modules/juce_video/playback/juce_VideoComponent.h"
@@ -2462,8 +2470,12 @@ set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_Au
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -3338,6 +3350,8 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_Bu
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -3368,6 +3382,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/native/acces
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -3630,6 +3645,7 @@ set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_C
 set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_ComTypes.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_video/native/juce_win32_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_video/playback/juce_VideoComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
index b11c33e01c8b8ae929351331f147e93bc35bf51c..0c1ab29600526d51de58a6b844a66585d7f14fbe 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.1.4"
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.1.5"
           package="com.rmsl.jucedemorunner">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
                     android:xlargeScreens="true"/>
index 542711f4e46dcffe930bc6362bb773544522330f..7cb5459a77b524a11714b26b3ff2c7c680c99b3b 100644 (file)
@@ -35,7 +35,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := DemoRunner
 
@@ -56,7 +56,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_box2d=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_USE_MP3AUDIOFORMAT=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_USE_CAMERA=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_DEMO_RUNNER=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := DemoRunner
 
index 0212a13fcd70422078c90f1047aea26aed132599..e539126497301219714c9ee81fff54cf929e05b9 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=6.1.4",
-                                       "JUCE_APP_VERSION_HEX=0x60104",
+                                       "JUCE_APP_VERSION=6.1.5",
+                                       "JUCE_APP_VERSION_HEX=0x60105",
                                        "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=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_MAC_F6D2F4CF=1",
-                                       "JUCE_APP_VERSION=6.1.4",
-                                       "JUCE_APP_VERSION_HEX=0x60104",
+                                       "JUCE_APP_VERSION=6.1.5",
+                                       "JUCE_APP_VERSION_HEX=0x60105",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
index 92255e020002580635f295362a00b44cc81c40f6..53459d9d1e29796d9401580ecb440db6320f0dec 100644 (file)
@@ -24,9 +24,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>6.1.4</string>\r
+    <string>6.1.5</string>\r
     <key>CFBundleVersion</key>\r
-    <string>6.1.4</string>\r
+    <string>6.1.5</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index a22108da53d21e4a1b37f1dc4f9db65ba93df2ad..bf9d778e6fa9727c145a8c076c7b7b3498269072 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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index 188c4e3a988f969d2bff7a1ab9a7d5a69a4b080d..58720860e001a976944e73deba9080a0957d04e8 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index bcd8b443fc5fa2c2b37316e1d6eb449320c09e54..9e9c7ab87b154dbb003d6856ee385b9dea5a1911 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index 61a1ab0fdb0ca4286d34e672c87521f6180931a2..728fcd1215eaf49a07a389fa546e1bffcf460fce 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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index b498ead7db1a23faf9aed72e62b3043897533097..c8693e6e3353a18427c7b382bddd2d14fdd08ed4 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index bcd8b443fc5fa2c2b37316e1d6eb449320c09e54..9e9c7ab87b154dbb003d6856ee385b9dea5a1911 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index ae9de6eccb0aad051ad72008608f74832be974cd..f682aa48c8ee66062baf506056498164895f4dbf 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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index 2ab186d8f8ac75d85388795a6ae536eb5b6e639f..0625f8546380863502ed4adaf526df28d1fa457b 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index bcd8b443fc5fa2c2b37316e1d6eb449320c09e54..9e9c7ab87b154dbb003d6856ee385b9dea5a1911 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index ab94e9458f8364302aafad23aae476d553e45512..82fbdfe48d6202c8e7540e38cbc4e83b645cdde9 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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_box2d=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_USE_MP3AUDIOFORMAT=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_USE_CAMERA=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DEMO_RUNNER=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index 01bc0b965e49840a179eb9ffe4c434dc1106076e..1cd8e513e3ce3874e3bd39c4cc8060142c6072fc 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index bcd8b443fc5fa2c2b37316e1d6eb449320c09e54..9e9c7ab87b154dbb003d6856ee385b9dea5a1911 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index 3e07daebaa68ccf78487b86db072558774cd9ac4..8bf9dc23e19572531e364a150948d36f086f93be 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_IPHONE_5BC26AE3=1",
-                                       "JUCE_APP_VERSION=6.1.4",
-                                       "JUCE_APP_VERSION_HEX=0x60104",
+                                       "JUCE_APP_VERSION=6.1.5",
+                                       "JUCE_APP_VERSION_HEX=0x60105",
                                        "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=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_DEMO_RUNNER=1",
                                        "JUCE_UNIT_TESTS=1",
                                        "JUCER_XCODE_IPHONE_5BC26AE3=1",
-                                       "JUCE_APP_VERSION=6.1.4",
-                                       "JUCE_APP_VERSION_HEX=0x60104",
+                                       "JUCE_APP_VERSION=6.1.5",
+                                       "JUCE_APP_VERSION_HEX=0x60105",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
index bf7b9a6fe0ecf0a320ee257c3676743f095e0fc9..35cdb0539ffda37885d9102722b59d7635ccf288 100644 (file)
@@ -30,9 +30,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>6.1.4</string>\r
+    <string>6.1.5</string>\r
     <key>CFBundleVersion</key>\r
-    <string>6.1.4</string>\r
+    <string>6.1.5</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index a253884584c833de349501c6ab1325ddbefd2e61..cb2c5eab78126fd8b123be93592d0a819d7e010f 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="6.1.4" companyName="Raw Material Software Limited"\r
+              bundleIdentifier="com.rmsl.jucedemorunner" version="6.1.5" 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
index 2fe0ec4af4ea2c8ee4cdaa61388a6a9b0b031b94..3cbba619ef7aebaf67ebbf210975af61b7138c14 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  = "6.1.4";\r
-    const int          versionNumber  = 0x60104;\r
+    const char* const  versionString  = "6.1.5";\r
+    const int          versionNumber  = 0x60105;\r
 }\r
 #endif\r
index 45529e6693321cb0b1ff188127b07bef4642abab..88255e982ebebecc6a05673e38993e71739c90ea 100644 (file)
@@ -190,10 +190,13 @@ private:
         ButtonsComponent()\r
         {\r
             addAndMakeVisible (radioButtons);\r
+\r
+            textButton.setHasFocusOutline (true);\r
             addAndMakeVisible (textButton);\r
 \r
             shapeButton.setShape (getJUCELogoPath(), false, true, false);\r
             shapeButton.onClick = [] { AlertWindow::showMessageBoxAsync (MessageBoxIconType::InfoIcon, "Alert", "This is an AlertWindow"); };\r
+            shapeButton.setHasFocusOutline (true);\r
             addAndMakeVisible (shapeButton);\r
         }\r
 \r
@@ -217,6 +220,7 @@ private:
                 {\r
                     b.setRadioGroupId (1);\r
                     b.setButtonText ("Button " + String (index++));\r
+                    b.setHasFocusOutline (true);\r
                     addAndMakeVisible (b);\r
                 }\r
 \r
@@ -418,6 +422,7 @@ constexpr NameAndRole accessibilityRoles[]
     { "Ignored",       AccessibilityRole::ignored },\r
     { "Unspecified",   AccessibilityRole::unspecified },\r
     { "Button",        AccessibilityRole::button },\r
+    { "Toggle",        AccessibilityRole::toggleButton },\r
     { "ComboBox",      AccessibilityRole::comboBox },\r
     { "Slider",        AccessibilityRole::slider },\r
     { "Static Text",   AccessibilityRole::staticText },\r
index 9b7f1b540c0763c8f3e5dde46ddff4c6c041a015..13cbe735813ad93296a6a49aa8d194e4a0db5dd1 100644 (file)
@@ -571,7 +571,10 @@ struct MenuPage   : public Component
             struct CustomComponent  : public PopupMenu::CustomComponent\r
             {\r
                 CustomComponent (int widthIn, int heightIn, Colour backgroundIn)\r
-                    : idealWidth (widthIn), idealHeight (heightIn), background (backgroundIn)\r
+                    : PopupMenu::CustomComponent (false),\r
+                      idealWidth (widthIn),\r
+                      idealHeight (heightIn),\r
+                      background (backgroundIn)\r
                 {}\r
 \r
                 void getIdealSize (int& width, int& height) override\r
index d65e09fca5077a78b48526d942d8f5530ce9eb64..b2e3d09147cc1534af27d703a3151578b0bd06d8 100644 (file)
@@ -125,6 +125,7 @@ public:
         {\r
             auto header = std::make_unique<TableHeaderComponent>();\r
             header->addColumn ("Message", messageColumn, 200, 30, -1, TableHeaderComponent::notSortable);\r
+            header->addColumn ("Time",    timeColumn,    100, 30, -1, TableHeaderComponent::notSortable);\r
             header->addColumn ("Channel", channelColumn, 100, 30, -1, TableHeaderComponent::notSortable);\r
             header->addColumn ("Data",    dataColumn,    200, 30, -1, TableHeaderComponent::notSortable);\r
             return header;\r
@@ -141,6 +142,7 @@ private:
     enum\r
     {\r
         messageColumn = 1,\r
+        timeColumn,\r
         channelColumn,\r
         dataColumn\r
     };\r
@@ -165,6 +167,7 @@ private:
             switch (columnId)\r
             {\r
                 case messageColumn: return getEventString (message);\r
+                case timeColumn:    return String (message.getTimeStamp());\r
                 case channelColumn: return String (message.getChannel());\r
                 case dataColumn:    return getDataString (message);\r
                 default:            break;\r
@@ -221,7 +224,7 @@ public:
     MidiLoggerPluginDemoProcessor()\r
         : AudioProcessor (getBusesLayout())\r
     {\r
-        state.addChild ({ "uiState", { { "width",  500 }, { "height", 300 } }, {} }, -1, nullptr);\r
+        state.addChild ({ "uiState", { { "width",  600 }, { "height", 300 } }, {} }, -1, nullptr);\r
         startTimerHz (60);\r
     }\r
 \r
index ca23a8b73731ea8b9435e821c00c4d48b9f76f3e..b74b0106c776a5fc7f57963453e3d847233e42e9 100644 (file)
@@ -605,22 +605,6 @@ private:
 namespace juce\r
 {\r
 \r
-bool operator== (const MPEZoneLayout& a, const MPEZoneLayout& b)\r
-{\r
-    if (a.getLowerZone() != b.getLowerZone())\r
-        return false;\r
-\r
-    if (a.getUpperZone() != b.getUpperZone())\r
-        return false;\r
-\r
-    return true;\r
-}\r
-\r
-bool operator!= (const MPEZoneLayout& a, const MPEZoneLayout& b)\r
-{\r
-    return ! (a == b);\r
-}\r
-\r
 template<>\r
 struct VariantConverter<LoopMode>\r
 {\r
index ffbab9cbb0b854f684563df952ad6a0fdcb34266..b3d271b241f8a6401ac5333fac6c325cd1da23de 100644 (file)
@@ -23,9 +23,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=0x60104]] [[-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=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-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=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
 else()
     message( FATAL_ERROR "No matching build-configuration found." )
 endif()
@@ -634,8 +634,12 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
     "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
     "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
     "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
     "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
@@ -1315,6 +1319,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
     "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
@@ -1345,6 +1351,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+    "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
@@ -2142,8 +2149,12 @@ set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_Au
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -2823,6 +2834,8 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_Bu
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -2853,6 +2866,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/native/acces
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
index 4cfe43f0bbdc39bea5ffaa50ba5cad67adf7f502..ee50f9219e2c9142e4d5ad1da58bf52069a1f07c 100644 (file)
@@ -1,7 +1,7 @@
 apply plugin: 'com.android.application'
 
 android {
-    compileSdkVersion 29
+    compileSdkVersion 30
     externalNativeBuild {
         cmake {
             path "CMakeLists.txt"
@@ -20,7 +20,7 @@ android {
     defaultConfig {
         applicationId "com.juce.audioperformancetest"
         minSdkVersion    23
-        targetSdkVersion 29
+        targetSdkVersion 30
         externalNativeBuild {
             cmake {
                 arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_CXX_STANDARD=14", "-DCMAKE_CXX_EXTENSIONS=OFF"
index 57ffa453c5a6f8f3c5c2c7348adc908d230ee693..f20fcca677fcd0ec7120c1f51a3a4586af7f351e 100644 (file)
@@ -35,7 +35,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=0x60104" "-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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := AudioPerformanceTest
 
@@ -56,7 +56,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=0x60104" "-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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := AudioPerformanceTest
 
index dcf8f1546cc0548d7274430e105c22efee32d8e9..c8aaea8622cd88e83d96ec2a6978e564bdbd185f 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index a6a9236406584174a7a5c05e633d8f0fb59b8169..a63cc3300924db063cd389ed104c2beb3a35e5ac 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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 806d4455afec98bd9c2d788aee62c1c04d188f5a..8e1afa8f487f204c300ca0186a5dbb9692edf562 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index 47a6dc8a511a3af41f739b944758b0777b406f20..5ca7242e657915220bc55e3376f3a668c6252bae 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index 6ad7146c0c969dc18f136669705ec4a9bef54859..d8961520f0ee7734da73c8dd7cd4a0933a1783ba 100644 (file)
@@ -6,9 +6,9 @@
               reportAppUsage="0" companyCopyright="Raw Material Software Limited"\r
               useAppConfig="0" addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
   <EXPORTFORMATS>\r
-    <XCODE_MAC targetFolder="Builds/MacOSX" rtasFolder="~/SDKs/PT_80_SDK" objCExtraSuffix="M73TRi"\r
-               smallIcon="c97aUr" bigIcon="c97aUr" microphonePermissionNeeded="1"\r
-               sendAppleEventsPermissionNeeded="1" sendAppleEventsPermissionText="This is required for some third-party plug-ins to function correctly."\r
+    <XCODE_MAC targetFolder="Builds/MacOSX" smallIcon="c97aUr" bigIcon="c97aUr"\r
+               microphonePermissionNeeded="1" sendAppleEventsPermissionNeeded="1"\r
+               sendAppleEventsPermissionText="This is required for some third-party plug-ins to function correctly."\r
                customXcodeResourceFolders="../../examples/Assets" applicationCategory="public.app-category.developer-tools">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="AudioPluginHost" recommendedWarnings="LLVM"/>\r
index aabb7efb9c014cde58b3cae4b11ba6727155e4a9..04cf1cdff65907e5d29273864f60f553780fb9d2 100644 (file)
@@ -24,9 +24,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=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
+    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_dsp=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_WASAPI=1]] [[-DJUCE_DIRECTSOUND=1]] [[-DJUCE_ALSA=1]] [[-DJUCE_USE_FLAC=0]] [[-DJUCE_USE_OGGVORBIS=1]] [[-DJUCE_PLUGINHOST_VST3=1]] [[-DJUCE_PLUGINHOST_AU=1]] [[-DJUCE_PLUGINHOST_LADSPA=1]] [[-DJUCE_USE_CDREADER=0]] [[-DJUCE_USE_CDBURNER=0]] [[-DJUCE_WEB_BROWSER=0]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
     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")
@@ -657,8 +657,12 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
     "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
     "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
     "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
     "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
@@ -1437,6 +1441,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
     "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
@@ -1467,6 +1473,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+    "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
@@ -2319,8 +2326,12 @@ set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_Au
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -3099,6 +3110,8 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_Bu
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -3129,6 +3142,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/native/acces
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
index 5138ef7d250fcb3054a9797c1baff423c9b2ac4c..10f55263d03a2baf914cb0a03f904904e10f2d16 100644 (file)
@@ -1,7 +1,7 @@
 apply plugin: 'com.android.application'
 
 android {
-    compileSdkVersion 29
+    compileSdkVersion 30
     externalNativeBuild {
         cmake {
             path "CMakeLists.txt"
@@ -20,7 +20,7 @@ android {
     defaultConfig {
         applicationId "com.juce.pluginhost"
         minSdkVersion    23
-        targetSdkVersion 29
+        targetSdkVersion 30
         externalNativeBuild {
             cmake {
                 arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-23", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_CXX_STANDARD=14", "-DCMAKE_CXX_EXTENSIONS=OFF"
index e1bc5944bb038d3eadebdacb0b23b78050d841d2..757a64cb66f62edae24dd5d6c69ba7a8b515c804 100644 (file)
@@ -35,7 +35,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := AudioPluginHost
 
@@ -56,7 +56,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_WASAPI=1" "-DJUCE_DIRECTSOUND=1" "-DJUCE_ALSA=1" "-DJUCE_USE_FLAC=0" "-DJUCE_USE_OGGVORBIS=1" "-DJUCE_PLUGINHOST_VST3=1" "-DJUCE_PLUGINHOST_AU=1" "-DJUCE_PLUGINHOST_LADSPA=1" "-DJUCE_USE_CDREADER=0" "-DJUCE_USE_CDBURNER=0" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl) -pthread -I../../../../modules/juce_audio_processors/format_types/VST3_SDK -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := AudioPluginHost
 
index 882383d2007c9192b6a70de4064cc250eb8c30cb..6c1e29755830cc402506b92bf38ee38b4eb91893 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index feb4083733deadf146311f46ceefc13df1df06f0..1293b09d57e2d2df7aef052bf8ff70db5c65d74a 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 4dfb9f58ff0cc69e4ec7ef1d334ace980fd85f96..5b1acf0571f2feb221787e51f503dba96b83174b 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index e4d47bc4503889d8472837a17d6d563a775953d8..5cf57bf1db9692bd9c7ae5bd137e8242e970bc09 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 2b551ef9c9fee66bd6724036acea91b0481927d8..90873cc0f40ff96d31f757d0b0d9da46897ce77a 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index f55a6758da7f94480d8835fd6dacc9fe7bff872a..f541961d4347fd0bad069e5fd7c44646f6e12373 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 6e3ec824462f8ef2a6ccdf30742f8b9f6aeb07bb..af1fc5101944a7aa54e734dd1a6b68dddce5f7aa 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index c9e77247297161ccec6e425af0837501dcacf4c0..d775d8563c6a2270f3dc6009c9228b8f629bd747 100644 (file)
@@ -64,7 +64,7 @@
       <Optimization>Disabled</Optimization>\r
       <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile>\r
       <Optimization>Full</Optimization>\r
       <AdditionalIncludeDirectories>..\..\..\..\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_WASAPI=1;JUCE_DIRECTSOUND=1;JUCE_ALSA=1;JUCE_USE_FLAC=0;JUCE_USE_OGGVORBIS=1;JUCE_PLUGINHOST_VST3=1;JUCE_PLUGINHOST_AU=1;JUCE_PLUGINHOST_LADSPA=1;JUCE_USE_CDREADER=0;JUCE_USE_CDBURNER=0;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 258219b65da30d66f320c2863f500b1a41668060..0fcd7b285c3b231d37e76a6cde53157880087121 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index ec70e9cbeb26220f3cf343408bc534851f3fa126..99935fc8b4e2c2b98b2032e6d7beab78bac9a24c 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index 72c5d39c55c0f55a023bb4ca6203dc780f72d9ee..f339a666d3a53dfac1f9a7e7cf56cbc415c077cc 100644 (file)
@@ -6,8 +6,7 @@
               companyCopyright="Raw Material Software Limited" useAppConfig="0"\r
               addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
   <EXPORTFORMATS>\r
-    <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"\r
-               objCExtraSuffix="OeJtJb" applicationCategory="public.app-category.developer-tools">\r
+    <XCODE_MAC targetFolder="Builds/MacOSX" applicationCategory="public.app-category.developer-tools">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="BinaryBuilder"/>\r
         <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder"/>\r
@@ -16,7 +15,7 @@
         <MODULEPATH id="juce_core" path="../../modules"/>\r
       </MODULEPATHS>\r
     </XCODE_MAC>\r
-    <LINUX_MAKE targetFolder="Builds/LinuxMakefile" vstFolder="~/SDKs/vstsdk2.4">\r
+    <LINUX_MAKE targetFolder="Builds/LinuxMakefile">\r
       <CONFIGURATIONS>\r
         <CONFIGURATION name="Debug" isDebug="1" targetName="BinaryBuilder"/>\r
         <CONFIGURATION name="Release" isDebug="0" optimisation="2" targetName="BinaryBuilder"/>\r
index 10a92b7f03a43c348fcf185ce9990276029ea783..7df3dbc180ad2030c034eacfcb7fe2957daf62bd 100644 (file)
@@ -35,7 +35,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=0x60104" "-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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_CONSOLEAPP := BinaryBuilder
 
@@ -56,7 +56,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=0x60104" "-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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags libcurl) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_CONSOLEAPP := BinaryBuilder
 
index 950cd2d20698a1de85d3c8eeff91f9155d854d3e..62f404f3466cf5f8fec962f3d7ded9ac9f50805a 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "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=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_core=1",
                                        "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
                                        "JUCE_STANDALONE_APPLICATION=1",
index 811ca8baf52db3fb38d3cffefd277053364defa2..4d20d07de12f59fe0f2321dd4fdb9c351c10f396 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=0x60104;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
index 47085b1736db77437df344f6d7466c421d93065a..4d145ebf38c91fb723dfa76a39dd77bd484ed3d9 100644 (file)
@@ -53,9 +53,9 @@ if((CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") OR (CMAKE_CXX_COMPILER_FRONTEND_VARIA
         $<$<CONFIG:Release>:$<IF:$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">,-GL,-flto>>)
     target_link_libraries(juce_recommended_lto_flags INTERFACE
         $<$<CONFIG:Release>:$<$<STREQUAL:"${CMAKE_CXX_COMPILER_ID}","MSVC">:-LTCG>>)
-elseif((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
-       OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
-       OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU"))
+elseif((NOT MINGW) AND ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
+                     OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
+                     OR (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")))
     target_compile_options(juce_recommended_lto_flags INTERFACE $<$<CONFIG:Release>:-flto>)
     target_link_libraries(juce_recommended_lto_flags INTERFACE $<$<CONFIG:Release>:-flto>)
 endif()
index 785c6fcbe78079f0f6abe07a8d2e0007a4ee78df..5f5f1de8cdc6dc9c4b621bf0a7abb149edc0b790 100644 (file)
@@ -497,6 +497,25 @@ function(juce_add_module module_path)
         target_compile_definitions(${module_name} INTERFACE LINUX=1)
     endif()
 
+    if((${module_name} STREQUAL "juce_audio_devices") AND (CMAKE_SYSTEM_NAME STREQUAL "Android"))
+        add_subdirectory("${module_path}/native/oboe")
+        target_link_libraries(${module_name} INTERFACE oboe)
+    endif()
+
+    if((${module_name} STREQUAL "juce_opengl") AND (CMAKE_SYSTEM_NAME STREQUAL "Android"))
+        set(platform_supports_gl3 0)
+
+        if(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 18)
+            set(platform_supports_gl3 1)
+        endif()
+
+        if(platform_supports_gl3)
+            target_compile_definitions(${module_name} INTERFACE JUCE_ANDROID_GL_ES_VERSION_3_0=1)
+        endif()
+
+        target_link_libraries(${module_name} INTERFACE EGL $<IF:${platform_supports_gl3},GLESv3,GLESv2>)
+    endif()
+
     _juce_extract_metadata_block(JUCE_MODULE_DECLARATION "${module_path}/${module_header_name}" metadata_dict)
 
     _juce_get_metadata("${metadata_dict}" minimumCppStandard module_cpp_standard)
index 1d41d5d66e3d20454c4f2e1378b637e7460d60fe..03db74ba03aa413b3e05313704f8edfd0cb9d5c8 100644 (file)
@@ -34,7 +34,7 @@
 \r
   ID:                 juce_build_tools\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE Build Tools\r
   description:        Classes for generating intermediate files for JUCE projects.\r
   website:            http://www.juce.com/juce\r
index e1a26c1ae937167f58f4d58162f9b6d1cbe163da..dd680eae54b3198286d7c35aa38755e3a9c2147a 100644 (file)
@@ -53,17 +53,20 @@ else()
     # environment variables, which is unfortunate because we really don't want to cross-compile
     # juceaide. If you really want to set the compilers for juceaide, pass the appropriate
     # CMAKE_<lang>_COMPILER flags when configuring CMake.
-    unset(ENV{ASM})
-    unset(ENV{CC})
-    unset(ENV{CXX})
+    if((CMAKE_SYSTEM_NAME STREQUAL "Android") OR (CMAKE_SYSTEM_NAME STREQUAL "iOS"))
+        unset(ENV{ASM})
+        unset(ENV{CC})
+        unset(ENV{CXX})
+    endif()
 
     message(STATUS "Configuring juceaide")
 
-    # Looks like we're boostrapping, reinvoke CMake
+    # Looks like we're bootstrapping, reinvoke CMake
     execute_process(COMMAND "${CMAKE_COMMAND}"
             "."
             "-B${JUCE_BINARY_DIR}/tools"
             "-G${CMAKE_GENERATOR}"
+            "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}"
             "-DCMAKE_BUILD_TYPE=Debug"
             "-DJUCE_BUILD_HELPER_TOOLS=ON"
             "-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"
index b37e40f1656f9d6e88aef03e1750867708de5193..e2b9a8172525edb0fbc4760fb422048c8d490a4e 100644 (file)
@@ -23,9 +23,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=0x60104]] [[-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=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCE_DEBUG=0]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DDEBUG=1]] [[-D_DEBUG=1]])
 elseif(JUCE_BUILD_CONFIGURATION MATCHES "RELEASE")
-    add_definitions([[-DJUCE_DISPLAY_SPLASH_SCREEN=0]] [[-DJUCE_USE_DARK_SPLASH_SCREEN=1]] [[-DJUCE_PROJUCER_VERSION=0x60104]] [[-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=0x60105]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1]] [[-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1]] [[-DJUCE_MODULE_AVAILABLE_juce_core=1]] [[-DJUCE_MODULE_AVAILABLE_juce_cryptography=1]] [[-DJUCE_MODULE_AVAILABLE_juce_data_structures=1]] [[-DJUCE_MODULE_AVAILABLE_juce_events=1]] [[-DJUCE_MODULE_AVAILABLE_juce_graphics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1]] [[-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1]] [[-DJUCE_MODULE_AVAILABLE_juce_opengl=1]] [[-DJUCE_MODULE_AVAILABLE_juce_osc=1]] [[-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1]] [[-DJUCE_STANDALONE_APPLICATION=1]] [[-DJUCER_ANDROIDSTUDIO_7F0E4A25=1]] [[-DJUCE_APP_VERSION=1.0.0]] [[-DJUCE_APP_VERSION_HEX=0x10000]] [[-DNDEBUG=1]])
 else()
     message( FATAL_ERROR "No matching build-configuration found." )
 endif()
@@ -638,8 +638,12 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h"
     "../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"
     "../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp"
+    "../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h"
     "../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp"
     "../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm"
     "../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp"
@@ -1334,6 +1338,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp"
+    "../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp"
     "../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h"
     "../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp"
@@ -1364,6 +1370,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h"
+    "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h"
     "../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h"
@@ -2226,8 +2233,12 @@ set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_Au
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_AudioVisualiserComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_BluetoothMidiDevicePairingDialogue.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_android_BluetoothMidiDevicePairingDialogue.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_ios_BluetoothMidiDevicePairingDialogue.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_utils/native/juce_linux_AudioCDReader.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -2922,6 +2933,8 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_Bu
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_DropShadower.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_FocusOutline.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/misc/juce_JUCESplashScreen.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -2952,6 +2965,7 @@ set_source_files_properties("../../../../../modules/juce_gui_basics/native/acces
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_Accessibility.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_AccessibilityElement.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAExpandCollapseProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridItemProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_gui_basics/native/accessibility/juce_win32_UIAGridProvider.h" PROPERTIES HEADER_FILE_ONLY TRUE)
index e403ef4f2219ba83bf683bbf6f3b419e0599418c..16896ee5f333061f502239ee0702ebac063b91a8 100644 (file)
@@ -1,7 +1,7 @@
 apply plugin: 'com.android.application'
 
 android {
-    compileSdkVersion 29
+    compileSdkVersion 30
     externalNativeBuild {
         cmake {
             path "CMakeLists.txt"
@@ -20,7 +20,7 @@ android {
     defaultConfig {
         applicationId "com.juce.networkgraphicsdemo"
         minSdkVersion    16
-        targetSdkVersion 29
+        targetSdkVersion 30
         externalNativeBuild {
             cmake {
                 arguments "-DANDROID_TOOLCHAIN=clang", "-DANDROID_PLATFORM=android-16", "-DANDROID_STL=c++_static", "-DANDROID_CPP_FEATURES=exceptions rtti", "-DANDROID_ARM_MODE=arm", "-DANDROID_ARM_NEON=TRUE", "-DCMAKE_CXX_STANDARD=14", "-DCMAKE_CXX_EXTENSIONS=OFF"
index b3c5113ce50b1a0402faef8e0ab5080f0bb26c3f..3ad21c8909ab7b7828ee418d27ea063a1a4110c8 100644 (file)
@@ -35,7 +35,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=0x60104" "-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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo
 
@@ -56,7 +56,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=0x60104" "-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=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := JUCE\ Network\ Graphics\ Demo
 
index fa862c683c5daaddc3166d7cc4c63f25edafe3f8..c53bae38d12b0c5843939b21cf50ec0a6e17b53a 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index d596556d30b0043403b6f064a6a835572d1d2db2..cc36f559fbf2edeea46a0270cc36e834d6c1f4d5 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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 66241588936cbb08f74a8eb87c09d84836055a27..38fa4896c842e66e3d55679e1a63d488898868cf 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index c32637f4a81cee80b0afca29dac8d67c53b2dbfb..047082899a5a0332bae1173b227c870925cf9d38 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
index 7b331c51e6cf01e3a8029b95bc4aa2186494aaa1..9b120486e4e95be5dccd2afbea90e83a78120ceb 100644 (file)
@@ -35,7 +35,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := Projucer
 
@@ -56,7 +56,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.4" "-DJUCE_APP_VERSION_HEX=0x60104" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_build_tools=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_LOG_ASSERTIONS=1" "-DJUCE_USE_CURL=1" "-DJUCE_LOAD_CURL_SYMBOLS_LAZILY=1" "-DJUCE_ALLOW_STATIC_NULL_VARIABLES=0" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_WEB_BROWSER=0" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=6.1.5" "-DJUCE_APP_VERSION_HEX=0x60105" $(shell pkg-config --cflags freetype2) -pthread -I../../JuceLibraryCode -I../../../Build -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_APP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_APP := Projucer
 
index 784128401c0543c4f0ccca95c54410e7a10c9696..7679227a64d0f1425aace0eeaeb55122da9a7387 100644 (file)
@@ -22,9 +22,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>6.1.4</string>\r
+    <string>6.1.5</string>\r
     <key>CFBundleVersion</key>\r
-    <string>6.1.4</string>\r
+    <string>6.1.5</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index 8d4cea9136eac8df91411f7565a34ea02684b75e..04d087953466b0076988b5fbf388a7b60b07eb38 100644 (file)
                210CD22F25F2C22F9CEEB025 /* AVFoundation.framework */ /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
                21F4833C5B5C17B159B956F3 /* juce_events */ /* juce_events */ = {isa = PBXFileReference; lastKnownFileType = folder; name = juce_events; path = ../../../../modules/juce_events; sourceTree = SOURCE_ROOT; };
                233C7FC5157176DB33FE2F27 /* RecentFilesMenuTemplate.nib */ /* RecentFilesMenuTemplate.nib */ = {isa = PBXFileReference; lastKnownFileType = file.nib; name = RecentFilesMenuTemplate.nib; path = ../../../Build/CMake/RecentFilesMenuTemplate.nib; sourceTree = SOURCE_ROOT; };
-               234251407CD1A499D8A816BB /* jucer_ValueWithDefaultWrapper.h */ /* jucer_ValueWithDefaultWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_ValueWithDefaultWrapper.h; path = ../../Source/Utility/Helpers/jucer_ValueWithDefaultWrapper.h; sourceTree = SOURCE_ROOT; };
                23A8DE16C0CDB8EED18B008B /* jucer_CommandIDs.h */ /* jucer_CommandIDs.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CommandIDs.h; path = ../../Source/Application/jucer_CommandIDs.h; sourceTree = SOURCE_ROOT; };
                23D79A22569BEDF63B57DD36 /* jucer_CodeHelpers.h */ /* jucer_CodeHelpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_CodeHelpers.h; path = ../../Source/Utility/Helpers/jucer_CodeHelpers.h; sourceTree = SOURCE_ROOT; };
                247768B490B9D759DDA79359 /* jucer_UserAvatarComponent.h */ /* jucer_UserAvatarComponent.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jucer_UserAvatarComponent.h; path = ../../Source/Project/UI/jucer_UserAvatarComponent.h; sourceTree = SOURCE_ROOT; };
                                58F1FF52E887887A93E84FC2,
                                6FD8DBC0FF42C87D8BEE2452,
                                00515BA4EC5A7D4DC078ED37,
-                               234251407CD1A499D8A816BB,
                                FF3A6A384D536E1AEF47CD54,
                                C16F9F479A3A5F6DAD7647A2,
                        );
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "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=6.1.4",
-                                       "JUCE_APP_VERSION_HEX=0x60104",
+                                       "JUCE_APP_VERSION=6.1.5",
+                                       "JUCE_APP_VERSION_HEX=0x60105",
                                        "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=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "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=6.1.4",
-                                       "JUCE_APP_VERSION_HEX=0x60104",
+                                       "JUCE_APP_VERSION=6.1.5",
+                                       "JUCE_APP_VERSION_HEX=0x60105",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
index 2f8c00b0230c7367bc5a1c29271b47c98ea09fe8..9412df3f12da9c1436978c95fa329046dc7da80d 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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2015_78A5022=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
     <ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 116dd3077f0dfdf1c393848e3dd425b8d3d6fb69..da0dedf9cc298efc95814a5cfab7280d27831039 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
-      <Filter>Projucer\Utility\Helpers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index 39ed7bfbe4bf404e7408510e9dd180f7be526dd9..421842fdd8752f9bc14303fc1b25a8ea2f015fdc 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index d864d3b5d0e4bc9502e1876b42837281e086bc62..c138918bec0856a6302a373c86941f2faad20233 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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
     <ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index db97de55cb8b4b7d1fbe8ac73adbaddd1a35b45b..8f5bd1b238f009cebeaa5331c7cad7cad4d54734 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
-      <Filter>Projucer\Utility\Helpers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index 39ed7bfbe4bf404e7408510e9dd180f7be526dd9..421842fdd8752f9bc14303fc1b25a8ea2f015fdc 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index 5d14959e4a535933d6f7f7c10e5192d0cc1ca3b1..78d54220715ce0176a233a00d93778ed5fb80455 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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
     <ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index 6493e5ef28e058efcd45c974a8c2eae2c9cc8f09..87d1846d024fae788f0d3ef98ca5a5407db5889c 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
-      <Filter>Projucer\Utility\Helpers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index 39ed7bfbe4bf404e7408510e9dd180f7be526dd9..421842fdd8752f9bc14303fc1b25a8ea2f015fdc 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index 11ada9e0d95fec954c255628a4a882983ea5e068..2e63c16af70330913cbde24818f528aca4b9aa00 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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.4;JUCE_APP_VERSION_HEX=0x60104;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_build_tools=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_LOG_ASSERTIONS=1;JUCE_USE_CURL=1;JUCE_LOAD_CURL_SYMBOLS_LAZILY=1;JUCE_ALLOW_STATIC_NULL_VARIABLES=0;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_WEB_BROWSER=0;JUCE_STANDALONE_APPLICATION=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=6.1.5;JUCE_APP_VERSION_HEX=0x60105;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_PresetIDs.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_TranslationHelpers.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h"/>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h"/>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h"/>\r
     <ClInclude Include="..\..\Source\Utility\PIPs\jucer_PIPGenerator.h"/>\r
     <ClInclude Include="..\..\Source\Utility\UI\PropertyComponents\jucer_ColourPropertyComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
index ce59e42728c8514b322857b80595ade3fe0022d2..034c23cfb402c0db44cc4be6a50950d92cf881ac 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueSourceHelpers.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\Source\Utility\Helpers\jucer_ValueWithDefaultWrapper.h">\r
-      <Filter>Projucer\Utility\Helpers</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\Source\Utility\Helpers\jucer_VersionInfo.h">\r
       <Filter>Projucer\Utility\Helpers</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
index 39ed7bfbe4bf404e7408510e9dd180f7be526dd9..421842fdd8752f9bc14303fc1b25a8ea2f015fdc 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,1,4,0\r
+FILEVERSION  6,1,5,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",  "6.1.4\0"\r
+      VALUE "FileVersion",  "6.1.5\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "6.1.4\0"\r
+      VALUE "ProductVersion",  "6.1.5\0"\r
     END\r
   END\r
 \r
index 754ce22706fef76ec9d63a097b9f02451769afd3..e164b35e42b51bcc13d675e44468a868c8c8cc98 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  = "6.1.4";\r
-    const int          versionNumber  = 0x60104;\r
+    const char* const  versionString  = "6.1.5";\r
+    const int          versionNumber  = 0x60105;\r
 }\r
 #endif\r
index db2f8db71e0785e9cad116a28c8c55848f8cfb6b..72c2f91539df9d5dc253740c9d60fc1f7b73af22 100644 (file)
@@ -1,13 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
-              version="6.1.4" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
+              version="6.1.5" 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
   <EXPORTFORMATS>\r
-    <XCODE_MAC targetFolder="Builds/MacOSX" vstFolder="~/SDKs/vstsdk2.4" rtasFolder="~/SDKs/PT_80_SDK"\r
-               documentExtensions=".jucer" objCExtraSuffix="zkVtji" bigIcon="Zrx1Gl"\r
+    <XCODE_MAC targetFolder="Builds/MacOSX" documentExtensions=".jucer" bigIcon="Zrx1Gl"\r
                extraFrameworks="AudioUnit; Accelerate; AVFoundation; CoreAudio; CoreAudioKit; CoreMIDI; DiscRecording; QuartzCore; AudioToolbox; OpenGL; QTKit; QuickTime"\r
                microphonePermissionNeeded="1" cameraPermissionNeeded="1" smallIcon="Zrx1Gl"\r
                applicationCategory="public.app-category.developer-tools">\r
               file="Source/Utility/Helpers/jucer_TranslationHelpers.h"/>\r
         <FILE id="EuC4K4" name="jucer_ValueSourceHelpers.h" compile="0" resource="0"\r
               file="Source/Utility/Helpers/jucer_ValueSourceHelpers.h"/>\r
-        <FILE id="W5a5Fy" name="jucer_ValueWithDefaultWrapper.h" compile="0"\r
-              resource="0" file="Source/Utility/Helpers/jucer_ValueWithDefaultWrapper.h"/>\r
         <FILE id="BPCoKV" name="jucer_VersionInfo.cpp" compile="1" resource="0"\r
               file="Source/Utility/Helpers/jucer_VersionInfo.cpp"/>\r
         <FILE id="TnBQtv" name="jucer_VersionInfo.h" compile="0" resource="0"\r
index a31e68c8412d9ad497ab380c6b0e24edcff25212..fd69c0985c72b3ea245c74a91085dffa01e0136f 100644 (file)
@@ -1314,7 +1314,7 @@ void Project::createPropertyEditors (PropertyListBuilder& props)
                "which may simplify the includes in the project.");\r
 \r
     props.add (new ChoicePropertyComponent (addUsingNamespaceToJuceHeader, "Add \"using namespace juce\" to JuceHeader.h"),\r
-               "If enabled, the JuceHeader.h will include a \"using namepace juce\" statement. If disabled, "\r
+               "If enabled, the JuceHeader.h will include a \"using namespace juce\" statement. If disabled, "\r
                "no such statement will be included. This setting used to be enabled by default, but it "\r
                "is recommended to leave it disabled for new projects.");\r
 \r
index 93bab3d59dd700d53004de469a41a78abb00b863..9b08423857528deb64b1cc9724e3b20d204e30e8 100644 (file)
@@ -117,7 +117,7 @@ public:
           androidGradleSettingsContent         (settings, Ids::androidGradleSettingsContent,         getUndoManager()),\r
           androidVersionCode                   (settings, Ids::androidVersionCode,                   getUndoManager(), "1"),\r
           androidMinimumSDK                    (settings, Ids::androidMinimumSDK,                    getUndoManager(), "16"),\r
-          androidTargetSDK                     (settings, Ids::androidTargetSDK,                     getUndoManager(), "29"),\r
+          androidTargetSDK                     (settings, Ids::androidTargetSDK,                     getUndoManager(), "30"),\r
           androidTheme                         (settings, Ids::androidTheme,                         getUndoManager()),\r
           androidExtraAssetsFolder             (settings, Ids::androidExtraAssetsFolder,             getUndoManager()),\r
           androidOboeRepositoryPath            (settings, Ids::androidOboeRepositoryPath,            getUndoManager()),\r
index eaa20f9f148a3b21a9ebb3078df687b45a4e47bd..f5333e283a450945c08eb55eeea053833f6c61e5 100644 (file)
@@ -359,7 +359,7 @@ public:
                 { "Developer Tools",      "developer-tools" },\r
                 { "Education",            "education" },\r
                 { "Entertainment",        "entertainment" },\r
-                { "Finace",               "finance" },\r
+                { "Finance",              "finance" },\r
                 { "Games",                "games" },\r
                 { "Games - Action",       "action-games" },\r
                 { "Games - Adventure",    "adventure-games" },\r
index 6145fdf370841f13f00e2ef0062296b883d8abf5..6f42ffcea34a38131885534902ef49b881e9dedf 100644 (file)
@@ -35,7 +35,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DDEBUG=1" "-D_DEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_CONSOLEAPP := UnitTestRunner
 
@@ -56,7 +56,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=0x60104" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
+  JUCE_CPPFLAGS := $(DEPFLAGS) "-DLINUX=1" "-DNDEBUG=1" "-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60105" "-DJUCE_MODULE_AVAILABLE_juce_analytics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_devices=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_formats=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_processors=1" "-DJUCE_MODULE_AVAILABLE_juce_audio_utils=1" "-DJUCE_MODULE_AVAILABLE_juce_core=1" "-DJUCE_MODULE_AVAILABLE_juce_cryptography=1" "-DJUCE_MODULE_AVAILABLE_juce_data_structures=1" "-DJUCE_MODULE_AVAILABLE_juce_dsp=1" "-DJUCE_MODULE_AVAILABLE_juce_events=1" "-DJUCE_MODULE_AVAILABLE_juce_graphics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_basics=1" "-DJUCE_MODULE_AVAILABLE_juce_gui_extra=1" "-DJUCE_MODULE_AVAILABLE_juce_opengl=1" "-DJUCE_MODULE_AVAILABLE_juce_osc=1" "-DJUCE_MODULE_AVAILABLE_juce_product_unlocking=1" "-DJUCE_MODULE_AVAILABLE_juce_video=1" "-DJUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1" "-DJUCE_STRICT_REFCOUNTEDPOINTER=1" "-DJUCE_STANDALONE_APPLICATION=1" "-DJUCE_UNIT_TESTS=1" "-DJUCER_LINUX_MAKE_6D53C8B4=1" "-DJUCE_APP_VERSION=1.0.0" "-DJUCE_APP_VERSION_HEX=0x10000" $(shell pkg-config --cflags alsa freetype2 libcurl webkit2gtk-4.0 gtk+-x11-3.0) -pthread -I../../JuceLibraryCode -I../../../../modules $(CPPFLAGS)
   JUCE_CPPFLAGS_CONSOLEAPP :=  "-DJucePlugin_Build_VST=0" "-DJucePlugin_Build_VST3=0" "-DJucePlugin_Build_AU=0" "-DJucePlugin_Build_AUv3=0" "-DJucePlugin_Build_RTAS=0" "-DJucePlugin_Build_AAX=0" "-DJucePlugin_Build_Standalone=0" "-DJucePlugin_Build_Unity=0"
   JUCE_TARGET_CONSOLEAPP := UnitTestRunner
 
index b0335cee8b7c24f258ca29a6dd471ca777d7fe22..e88f582e05f3f4849897837f3753f18bcc48b4a6 100644 (file)
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "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=0x60104",
+                                       "JUCE_PROJUCER_VERSION=0x60105",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
index 49c4a0a03c29f991a44e50e3951c9ddf2e2597ab..78e0e4ced5a9d7fd530d08612dbfba284892ce1b 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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2017_78A5024=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index 4cb2fc18287fd5b60b219ffa0bd0a6225aa66176..8d471c3f24c6b4c0a8ad92c15e15f59374421324 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index 928843fb525b255cbefdb03a3814cfa1037adafa..db1c0bf12f51b218e49af8109195ade9ec9f81ee 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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2019_78A5026=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index 7b72a17ab0b83d71ea086f41ef2ead47ad2969bb..c8054d4c137f01dfe0917105190675608a7501aa 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index 900b724fbca4995f45c6752d785740e561127514..6a6b540700c1ab950b2684de1bb0ba59172c3e88 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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_analytics=1;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_dsp=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_osc=1;JUCE_MODULE_AVAILABLE_juce_product_unlocking=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STRICT_REFCOUNTEDPOINTER=1;JUCE_STANDALONE_APPLICATION=1;JUCE_UNIT_TESTS=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index 67ebd34f98cc7f3eac86c695e3e41321ae733bb7..e0e8c3fe4b1d786a482922f1b53f6510ce28accb 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index 10fe1396e86e7c872e7ce4f2128ce6089f0feb75..c657eda5d1021c488f9471e146c38732c599b981 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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</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=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\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=0x60104;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60105;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_MODULE_AVAILABLE_juce_audio_formats=1;JUCE_MODULE_AVAILABLE_juce_audio_processors=1;JUCE_MODULE_AVAILABLE_juce_audio_utils=1;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_MODULE_AVAILABLE_juce_cryptography=1;JUCE_MODULE_AVAILABLE_juce_data_structures=1;JUCE_MODULE_AVAILABLE_juce_events=1;JUCE_MODULE_AVAILABLE_juce_graphics=1;JUCE_MODULE_AVAILABLE_juce_gui_basics=1;JUCE_MODULE_AVAILABLE_juce_gui_extra=1;JUCE_MODULE_AVAILABLE_juce_opengl=1;JUCE_MODULE_AVAILABLE_juce_video=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;JUCE_STANDALONE_APPLICATION=1;JUCE_DLL_BUILD=1;JUCER_VS2022_78A503E=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;JucePlugin_Build_VST=0;JucePlugin_Build_VST3=0;JucePlugin_Build_AU=0;JucePlugin_Build_AUv3=0;JucePlugin_Build_RTAS=0;JucePlugin_Build_AAX=0;JucePlugin_Build_Standalone=0;JucePlugin_Build_Unity=0;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioThumbnailCache.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_SoundPlayer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\juce_audio_utils.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\menus\juce_PopupMenu.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_BubbleComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_ComponentDragger.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_DragAndDropContainer.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\mouse\juce_TooltipClient.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_AccessibilityTextHelpers.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridItemProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAGridProvider.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\playback\juce_VideoComponent.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\juce_video.h"/>\r
index 34eba2f5abbfb9a2ec0658a67d4f1fc4b883b243..67a686fb4e4fa1059948942536cf8705a5bcc49d 100644 (file)
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_AudioVisualiserComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.cpp">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_utils\native\juce_android_BluetoothMidiDevicePairingDialogue.cpp">\r
       <Filter>JUCE Modules\juce_audio_utils\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.cpp">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.cpp">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_BluetoothMidiDevicePairingDialogue.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_KeyboardComponentBase.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MidiKeyboardComponent.h">\r
       <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_utils\gui\juce_MPEKeyboardComponent.h">\r
+      <Filter>JUCE Modules\juce_audio_utils\gui</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_utils\players\juce_AudioProcessorPlayer.h">\r
       <Filter>JUCE Modules\juce_audio_utils\players</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_DropShadower.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_FocusOutline.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\misc\juce_JUCESplashScreen.h">\r
       <Filter>JUCE Modules\juce_gui_basics\misc</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_AccessibilityElement.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_ComInterfaces.h">\r
+      <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_gui_basics\native\accessibility\juce_win32_UIAExpandCollapseProvider.h">\r
       <Filter>JUCE Modules\juce_gui_basics\native\accessibility</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_CameraDevice.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_ComTypes.h">\r
+      <Filter>JUCE Modules\juce_video\native</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_video\native\juce_win32_Video.h">\r
       <Filter>JUCE Modules\juce_video\native</Filter>\r
     </ClInclude>\r
index 5a49273b43442ed0f9cde45f1e58ad253ab9ccde..eb7e43889c572b4364467248f6697a3d6c32dc65 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_analytics\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE analytics classes\r
   description:        Classes to collect analytics and send to destinations\r
   website:            http://www.juce.com/juce\r
index ee778098dbd173a2a3de6a78a789bc1d8ea30940..52697cfac0d9a3539e0db7497b3a5b3b37ca0305 100644 (file)
@@ -36,6 +36,8 @@ void AudioProcessLoadMeasurer::reset (double sampleRate, int blockSize)
     cpuUsageProportion = 0;\r
     xruns = 0;\r
 \r
+    samplesPerBlock = blockSize;\r
+\r
     if (sampleRate > 0.0 && blockSize > 0)\r
     {\r
         msPerSample = 1000.0 / sampleRate;\r
@@ -77,6 +79,9 @@ AudioProcessLoadMeasurer::ScopedTimer::ScopedTimer (AudioProcessLoadMeasurer& p)
 AudioProcessLoadMeasurer::ScopedTimer::ScopedTimer (AudioProcessLoadMeasurer& p, int numSamplesInBlock)\r
     : owner (p), startTime (Time::getMillisecondCounterHiRes()), samplesInBlock (numSamplesInBlock)\r
 {\r
+    // numSamplesInBlock should never be zero. Did you remember to call AudioProcessLoadMeasurer::reset(),\r
+    // passing the expected samples per block?\r
+    jassert (numSamplesInBlock);\r
 }\r
 \r
 AudioProcessLoadMeasurer::ScopedTimer::~ScopedTimer()\r
index c39b52bd561cb85d33e2f99f2c9c49ca179df182..47eb058f9990baeb265d0d1bce17aa27c2a72e9b 100644 (file)
@@ -104,13 +104,13 @@ namespace FloatVectorHelpers
     #define JUCE_BEGIN_VEC_OP \\r
         using Mode = FloatVectorHelpers::ModeType<sizeof(*dest)>::Mode; \\r
         { \\r
-            const int numLongOps = num / Mode::numParallel;\r
+            const auto numLongOps = num / Mode::numParallel;\r
 \r
     #define JUCE_FINISH_VEC_OP(normalOp) \\r
             num &= (Mode::numParallel - 1); \\r
             if (num == 0) return; \\r
         } \\r
-        for (int i = 0; i < num; ++i) normalOp;\r
+        for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
 \r
     #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \\r
         JUCE_BEGIN_VEC_OP \\r
@@ -268,13 +268,13 @@ namespace FloatVectorHelpers
         using Mode = FloatVectorHelpers::ModeType<sizeof(*dest)>::Mode; \\r
         if (Mode::numParallel > 1) \\r
         { \\r
-            const int numLongOps = num / Mode::numParallel;\r
+            const auto numLongOps = num / Mode::numParallel;\r
 \r
     #define JUCE_FINISH_VEC_OP(normalOp) \\r
             num &= (Mode::numParallel - 1); \\r
             if (num == 0) return; \\r
         } \\r
-        for (int i = 0; i < num; ++i) normalOp;\r
+        for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
 \r
     #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \\r
         JUCE_BEGIN_VEC_OP \\r
@@ -304,22 +304,22 @@ namespace FloatVectorHelpers
     //==============================================================================\r
    #else\r
     #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \\r
-        for (int i = 0; i < num; ++i) normalOp;\r
+        for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
 \r
     #define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \\r
-        for (int i = 0; i < num; ++i) normalOp;\r
+        for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
 \r
     #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \\r
-        for (int i = 0; i < num; ++i) normalOp;\r
+        for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
 \r
     #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \\r
-        for (int i = 0; i < num; ++i) normalOp;\r
+        for (auto i = (decltype (num)) 0; i < num; ++i) normalOp;\r
 \r
    #endif\r
 \r
     //==============================================================================\r
     #define JUCE_VEC_LOOP(vecOp, srcLoad, dstLoad, dstStore, locals, increment) \\r
-        for (int i = 0; i < numLongOps; ++i) \\r
+        for (auto i = (decltype (numLongOps)) 0; i < numLongOps; ++i) \\r
         { \\r
             locals (srcLoad, dstLoad); \\r
             dstStore (dest, vecOp); \\r
@@ -327,7 +327,7 @@ namespace FloatVectorHelpers
         }\r
 \r
     #define JUCE_VEC_LOOP_TWO_SOURCES(vecOp, src1Load, src2Load, dstStore, locals, increment) \\r
-        for (int i = 0; i < numLongOps; ++i) \\r
+        for (auto i = (decltype (numLongOps)) 0; i < numLongOps; ++i) \\r
         { \\r
             locals (src1Load, src2Load); \\r
             dstStore (dest, vecOp); \\r
@@ -335,7 +335,7 @@ namespace FloatVectorHelpers
         }\r
 \r
     #define JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD(vecOp, src1Load, src2Load, dstLoad, dstStore, locals, increment) \\r
-        for (int i = 0; i < numLongOps; ++i) \\r
+        for (auto i = (decltype (numLongOps)) 0; i < numLongOps; ++i) \\r
         { \\r
             locals (src1Load, src2Load, dstLoad); \\r
             dstStore (dest, vecOp); \\r
@@ -362,9 +362,10 @@ namespace FloatVectorHelpers
         using Type = typename Mode::Type;\r
         using ParallelType = typename Mode::ParallelType;\r
 \r
-        static Type findMinOrMax (const Type* src, int num, const bool isMinimum) noexcept\r
+        template <typename Size>\r
+        static Type findMinOrMax (const Type* src, Size num, const bool isMinimum) noexcept\r
         {\r
-            int numLongOps = num / Mode::numParallel;\r
+            auto numLongOps = num / Mode::numParallel;\r
 \r
             if (numLongOps > 1)\r
             {\r
@@ -421,20 +422,24 @@ namespace FloatVectorHelpers
                 num &= (Mode::numParallel - 1);\r
                 src += Mode::numParallel;\r
 \r
-                for (int i = 0; i < num; ++i)\r
+                for (auto i = (decltype (num)) 0; i < num; ++i)\r
                     result = isMinimum ? jmin (result, src[i])\r
                                        : jmax (result, src[i]);\r
 \r
                 return result;\r
             }\r
 \r
-            return isMinimum ? juce::findMinimum (src, num)\r
-                             : juce::findMaximum (src, num);\r
+            if (num <= 0)\r
+                return 0;\r
+\r
+            return isMinimum ? *std::min_element (src, src + num)\r
+                             : *std::max_element (src, src + num);\r
         }\r
 \r
-        static Range<Type> findMinAndMax (const Type* src, int num) noexcept\r
+        template <typename Size>\r
+        static Range<Type> findMinAndMax (const Type* src, Size num) noexcept\r
         {\r
-            int numLongOps = num / Mode::numParallel;\r
+            auto numLongOps = num / Mode::numParallel;\r
 \r
             if (numLongOps > 1)\r
             {\r
@@ -475,7 +480,7 @@ namespace FloatVectorHelpers
                 num &= (Mode::numParallel - 1);\r
                 src += Mode::numParallel;\r
 \r
-                for (int i = 0; i < num; ++i)\r
+                for (auto i = (decltype (num)) 0; i < num; ++i)\r
                     result = result.getUnionWith (src[i]);\r
 \r
                 return result;\r
@@ -485,547 +490,941 @@ namespace FloatVectorHelpers
         }\r
     };\r
    #endif\r
-}\r
 \r
 //==============================================================================\r
 namespace\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    // This casts away constness to account for slightly different vDSP function signatures\r
-    // in OSX 10.8 SDK and below. Can be safely removed once those SDKs are obsolete.\r
-    template <typename ValueType>\r
-    ValueType* osx108sdkCompatibilityCast (const ValueType* arg) noexcept { return const_cast<ValueType*> (arg); }\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void clear (float* dest, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vclr (dest, 1, (vDSP_Length) num);\r
+       #else\r
+        zeromem (dest, (size_t) num * sizeof (float));\r
+       #endif\r
+    }\r
 \r
-//==============================================================================\r
-void JUCE_CALLTYPE FloatVectorOperations::clear (float* dest, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vclr (dest, 1, (size_t) num);\r
-   #else\r
-    zeromem (dest, (size_t) num * sizeof (float));\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void clear (double* dest, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vclrD (dest, 1, (vDSP_Length) num);\r
+       #else\r
+        zeromem (dest, (size_t) num * sizeof (double));\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::clear (double* dest, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vclrD (dest, 1, (size_t) num);\r
-   #else\r
-    zeromem (dest, (size_t) num * sizeof (double));\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void fill (float* dest, float valueToFill, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vfill (&valueToFill, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill,\r
+                                  val,\r
+                                  JUCE_LOAD_NONE,\r
+                                  const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::fill (float* dest, float valueToFill, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vfill (&valueToFill, dest, 1, (size_t) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE,\r
-                              const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void fill (double* dest, double valueToFill, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vfillD (&valueToFill, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill,\r
+                                  val,\r
+                                  JUCE_LOAD_NONE,\r
+                                  const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::fill (double* dest, double valueToFill, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vfillD (&valueToFill, dest, 1, (size_t) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE,\r
-                              const Mode::ParallelType val = Mode::load1 (valueToFill);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void copyWithMultiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsmul (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+                                      Mode::mul (mult, s),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::copy (float* dest, const float* src, int num) noexcept\r
-{\r
-    memcpy (dest, src, (size_t) num * sizeof (float));\r
-}\r
+    template <typename Size>\r
+    void copyWithMultiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsmulD (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+                                      Mode::mul (mult, s),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::copy (double* dest, const double* src, int num) noexcept\r
-{\r
-    memcpy (dest, src, (size_t) num * sizeof (double));\r
-}\r
+    template <typename Size>\r
+    void add (float* dest, float amount, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsadd (dest, 1, &amount, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount,\r
+                                  Mode::add (d, amountToAdd),\r
+                                  JUCE_LOAD_DEST,\r
+                                  const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsmul (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void add (double* dest, double amount, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount,\r
+                                  Mode::add (d, amountToAdd),\r
+                                  JUCE_LOAD_DEST,\r
+                                  const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsmulD (src, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void add (float* dest, const float* src, float amount, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsadd (src, 1, &amount, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount,\r
+                                      Mode::add (am, s),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType am = Mode::load1 (amount);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, float amount, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsadd (dest, 1, &amount, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST,\r
-                              const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void add (double* dest, const double* src, double amount, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsaddD (src, 1, &amount, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount,\r
+                                      Mode::add (am, s),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType am = Mode::load1 (amount);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, double amount, int num) noexcept\r
-{\r
-    JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST,\r
-                              const Mode::ParallelType amountToAdd = Mode::load1 (amount);)\r
-}\r
+    template <typename Size>\r
+    void add (float* dest, const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vadd (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i],\r
+                                      Mode::add (d, s),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src, float amount, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsadd (osx108sdkCompatibilityCast (src), 1, &amount, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType am = Mode::load1 (amount);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void add (double* dest, const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vaddD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i],\r
+                                      Mode::add (d, s),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src, double amount, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsaddD (osx108sdkCompatibilityCast (src), 1, &amount, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType am = Mode::load1 (amount);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void add (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vadd (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i],\r
+                                            Mode::add (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vadd (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void add (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vaddD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i],\r
+                                            Mode::add (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vaddD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void subtract (float* dest, const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsub (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i],\r
+                                      Mode::sub (d, s),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vadd (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void subtract (double* dest, const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsubD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i],\r
+                                      Mode::sub (d, s),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src1, const double* src2, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vaddD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void subtract (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsub (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i],\r
+                                            Mode::sub (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsub (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void subtract (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsubD (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i],\r
+                                            Mode::sub (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsubD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void addWithMultiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsma (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier,\r
+                                      Mode::add (d, Mode::mul (mult, s)),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsub (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void addWithMultiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsmaD (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier,\r
+                                      Mode::add (d, Mode::mul (mult, s)),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src1, const double* src2, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsubD (src2, 1, src1, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void addWithMultiply (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vma ((float*) src1, 1, (float*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i],\r
+                                                 Mode::add (d, Mode::mul (s1, s2)),\r
+                                                 JUCE_LOAD_SRC1_SRC2_DEST,\r
+                                                 JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsma (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)),\r
-                                  JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void addWithMultiply (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmaD ((double*) src1, 1, (double*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i],\r
+                                                 Mode::add (d, Mode::mul (s1, s2)),\r
+                                                 JUCE_LOAD_SRC1_SRC2_DEST,\r
+                                                 JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsmaD (src, 1, &multiplier, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)),\r
-                                  JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void subtractWithMultiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier,\r
+                                      Mode::sub (d, Mode::mul (mult, s)),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vma ((float*) src1, 1, (float*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)),\r
-                                             JUCE_LOAD_SRC1_SRC2_DEST,\r
-                                             JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void subtractWithMultiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier,\r
+                                      Mode::sub (d, Mode::mul (mult, s)),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept\r
-{\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmaD ((double*) src1, 1, (double*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)),\r
-                                             JUCE_LOAD_SRC1_SRC2_DEST,\r
-                                             JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
-}\r
+    template <typename Size>\r
+    void subtractWithMultiply (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i],\r
+                                                 Mode::sub (d, Mode::mul (s1, s2)),\r
+                                                 JUCE_LOAD_SRC1_SRC2_DEST,\r
+                                                 JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept\r
-{\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier, Mode::sub (d, Mode::mul (mult, s)),\r
-                                  JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
+    template <typename Size>\r
+    void subtractWithMultiply (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i],\r
+                                                 Mode::sub (d, Mode::mul (s1, s2)),\r
+                                                 JUCE_LOAD_SRC1_SRC2_DEST,\r
+                                                 JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+    }\r
+\r
+    template <typename Size>\r
+    void multiply (float* dest, const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmul (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i],\r
+                                      Mode::mul (d, s),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void multiply (double* dest, const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmulD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i],\r
+                                      Mode::mul (d, s),\r
+                                      JUCE_LOAD_SRC_DEST,\r
+                                      JUCE_INCREMENT_SRC_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void multiply (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmul (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i],\r
+                                            Mode::mul (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void multiply (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmulD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i],\r
+                                            Mode::mul (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void multiply (float* dest, float multiplier, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsmul (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier,\r
+                                  Mode::mul (d, mult),\r
+                                  JUCE_LOAD_DEST,\r
                                   const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-}\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept\r
-{\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i] * multiplier, Mode::sub (d, Mode::mul (mult, s)),\r
-                                  JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST,\r
+    template <typename Size>\r
+    void multiply (double* dest, double multiplier, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vsmulD (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier,\r
+                                  Mode::mul (d, mult),\r
+                                  JUCE_LOAD_DEST,\r
                                   const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-}\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept\r
-{\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i], Mode::sub (d, Mode::mul (s1, s2)),\r
-                                             JUCE_LOAD_SRC1_SRC2_DEST,\r
-                                             JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-}\r
+    template <typename Size>\r
+    void multiply (float* dest, const float* src, float multiplier, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+                                      Mode::mul (mult, s),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+    }\r
+\r
+    template <typename Size>\r
+    void multiply (double* dest, const double* src, double multiplier, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier,\r
+                                      Mode::mul (mult, s),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+    }\r
+\r
+    template <typename Size>\r
+    void negate (float* dest, const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vneg ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        copyWithMultiply (dest, src, -1.0f, num);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void negate (double* dest, const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vnegD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        copyWithMultiply (dest, src, -1.0f, num);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void abs (float* dest, const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        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
+    template <typename Size>\r
+    void abs (double* dest, const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        FloatVectorHelpers::signMask64 signMask;\r
+        signMask.i = 0x7fffffffffffffffULL;\r
+\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.d);)\r
+\r
+        ignoreUnused (signMask);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void min (float* dest, const float* src, float comp, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp),\r
+                                      Mode::min (s, cmp),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    }\r
+\r
+    template <typename Size>\r
+    void min (double* dest, const double* src, double comp, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp),\r
+                                      Mode::min (s, cmp),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    }\r
+\r
+    template <typename Size>\r
+    void min (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmin ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]),\r
+                                            Mode::min (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void min (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vminD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]),\r
+                                            Mode::min (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void max (float* dest, const float* src, float comp, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp),\r
+                                      Mode::max (s, cmp),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    }\r
+\r
+    template <typename Size>\r
+    void max (double* dest, const double* src, double comp, Size num) noexcept\r
+    {\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp),\r
+                                      Mode::max (s, cmp),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    }\r
+\r
+    template <typename Size>\r
+    void max (float* dest, const float* src1, const float* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmax ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]),\r
+                                            Mode::max (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void max (double* dest, const double* src1, const double* src2, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vmaxD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]),\r
+                                            Mode::max (s1, s2),\r
+                                            JUCE_LOAD_SRC1_SRC2,\r
+                                            JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void clip (float* dest, const float* src, float low, float high, Size num) noexcept\r
+    {\r
+        jassert (high >= low);\r
+\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vclip ((float*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low),\r
+                                      Mode::max (Mode::min (s, hi), lo),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType lo = Mode::load1 (low);\r
+                                      const Mode::ParallelType hi = Mode::load1 (high);)\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void clip (double* dest, const double* src, double low, double high, Size num) noexcept\r
+    {\r
+        jassert (high >= low);\r
+\r
+       #if JUCE_USE_VDSP_FRAMEWORK\r
+        vDSP_vclipD ((double*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low),\r
+                                      Mode::max (Mode::min (s, hi), lo),\r
+                                      JUCE_LOAD_SRC,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType lo = Mode::load1 (low);\r
+                                      const Mode::ParallelType hi = Mode::load1 (high);)\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    Range<float> findMinAndMax (const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+        return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinAndMax (src, num);\r
+       #else\r
+        return Range<float>::findMinAndMax (src, num);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    Range<double> findMinAndMax (const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+        return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinAndMax (src, num);\r
+       #else\r
+        return Range<double>::findMinAndMax (src, num);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    float findMinimum (const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+        return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, true);\r
+       #else\r
+        return juce::findMinimum (src, num);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    double findMinimum (const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+        return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, true);\r
+       #else\r
+        return juce::findMinimum (src, num);\r
+       #endif\r
+    }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::subtractWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept\r
+    template <typename Size>\r
+    float findMaximum (const float* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+        return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, false);\r
+       #else\r
+        return juce::findMaximum (src, num);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    double findMaximum (const double* src, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
+        return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, false);\r
+       #else\r
+        return juce::findMaximum (src, num);\r
+       #endif\r
+    }\r
+\r
+    template <typename Size>\r
+    void convertFixedToFloat (float* dest, const int* src, float multiplier, Size num) noexcept\r
+    {\r
+       #if JUCE_USE_ARM_NEON\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
+                                  vmulq_n_f32 (vcvtq_f32_s32 (vld1q_s32 (src)), multiplier),\r
+                                  JUCE_LOAD_NONE,\r
+                                  JUCE_INCREMENT_SRC_DEST, )\r
+       #else\r
+        JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
+                                      Mode::mul (mult, _mm_cvtepi32_ps (_mm_loadu_si128 (reinterpret_cast<const __m128i*> (src)))),\r
+                                      JUCE_LOAD_NONE,\r
+                                      JUCE_INCREMENT_SRC_DEST,\r
+                                      const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+       #endif\r
+    }\r
+\r
+} // namespace\r
+} // namespace FloatVectorHelpers\r
+\r
+//==============================================================================\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::clear (FloatType* dest,\r
+                                                                                   CountType numValues) noexcept\r
 {\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] -= src1[i] * src2[i], Mode::sub (d, Mode::mul (s1, s2)),\r
-                                             JUCE_LOAD_SRC1_SRC2_DEST,\r
-                                             JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
+    FloatVectorHelpers::clear (dest, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::fill (FloatType* dest,\r
+                                                                                  FloatType valueToFill,\r
+                                                                                  CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmul (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
-   #endif\r
+    FloatVectorHelpers::fill (dest, valueToFill, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::copy (FloatType* dest,\r
+                                                                                  const FloatType* src,\r
+                                                                                  CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmulD (src, 1, dest, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, )\r
-   #endif\r
+    memcpy (dest, src, (size_t) numValues * sizeof (FloatType));\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src1, const float* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::copyWithMultiply (FloatType* dest,\r
+                                                                                              const FloatType* src,\r
+                                                                                              FloatType multiplier,\r
+                                                                                              CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmul (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
+    FloatVectorHelpers::copyWithMultiply (dest, src, multiplier, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src1, const double* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+                                                                                 FloatType amountToAdd,\r
+                                                                                 CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmulD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
+    FloatVectorHelpers::add (dest, amountToAdd, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, float multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+                                                                                 const FloatType* src,\r
+                                                                                 FloatType amount,\r
+                                                                                 CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsmul (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST,\r
-                              const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-   #endif\r
+    FloatVectorHelpers::add (dest, src, amount, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, double multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+                                                                                 const FloatType* src,\r
+                                                                                 CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vsmulD (dest, 1, &multiplier, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST,\r
-                              const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-   #endif\r
+    FloatVectorHelpers::add (dest, src, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, float multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::add (FloatType* dest,\r
+                                                                                 const FloatType* src1,\r
+                                                                                 const FloatType* src2,\r
+                                                                                 CountType num) noexcept\r
 {\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+    FloatVectorHelpers::add (dest, src1, src2, num);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, double multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtract (FloatType* dest,\r
+                                                                                      const FloatType* src,\r
+                                                                                      CountType numValues) noexcept\r
 {\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
+    FloatVectorHelpers::subtract (dest, src, numValues);\r
 }\r
 \r
-void FloatVectorOperations::negate (float* dest, const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtract (FloatType* dest,\r
+                                                                                      const FloatType* src1,\r
+                                                                                      const FloatType* src2,\r
+                                                                                      CountType num) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vneg ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    copyWithMultiply (dest, src, -1.0f, num);\r
-   #endif\r
+    FloatVectorHelpers::subtract (dest, src1, src2, num);\r
 }\r
 \r
-void FloatVectorOperations::negate (double* dest, const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::addWithMultiply (FloatType* dest,\r
+                                                                                             const FloatType* src,\r
+                                                                                             FloatType multiplier,\r
+                                                                                             CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vnegD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    copyWithMultiply (dest, src, -1.0f, num);\r
-   #endif\r
+    FloatVectorHelpers::addWithMultiply (dest, src, multiplier, numValues);\r
 }\r
 \r
-void FloatVectorOperations::abs (float* dest, const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::addWithMultiply (FloatType* dest,\r
+                                                                                             const FloatType* src1,\r
+                                                                                             const FloatType* src2,\r
+                                                                                             CountType num) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vabs ((float*) src, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    FloatVectorHelpers::signMask32 signMask;\r
-    signMask.i = 0x7fffffffUL;\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]), Mode::bit_and (s, mask),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mask = Mode::load1 (signMask.f);)\r
-\r
-    ignoreUnused (signMask);\r
-   #endif\r
+    FloatVectorHelpers::addWithMultiply (dest, src1, src2, num);\r
 }\r
 \r
-void FloatVectorOperations::abs (double* dest, const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtractWithMultiply (FloatType* dest,\r
+                                                                                                  const FloatType* src,\r
+                                                                                                  FloatType multiplier,\r
+                                                                                                  CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vabsD ((double*) src, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    FloatVectorHelpers::signMask64 signMask;\r
-    signMask.i = 0x7fffffffffffffffULL;\r
-\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = std::abs (src[i]), Mode::bit_and (s, mask),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mask = Mode::load1 (signMask.d);)\r
-\r
-    ignoreUnused (signMask);\r
-   #endif\r
+    FloatVectorHelpers::subtractWithMultiply (dest, src, multiplier, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::subtractWithMultiply (FloatType* dest,\r
+                                                                                                  const FloatType* src1,\r
+                                                                                                  const FloatType* src2,\r
+                                                                                                  CountType num) noexcept\r
 {\r
-   #if JUCE_USE_ARM_NEON\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
-                                  vmulq_n_f32 (vcvtq_f32_s32 (vld1q_s32 (src)), multiplier),\r
-                                  JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST, )\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = (float) src[i] * multiplier,\r
-                                  Mode::mul (mult, _mm_cvtepi32_ps (_mm_loadu_si128 (reinterpret_cast<const __m128i*> (src)))),\r
-                                  JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType mult = Mode::load1 (multiplier);)\r
-   #endif\r
+    FloatVectorHelpers::subtractWithMultiply (dest, src1, src2, num);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src, float comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+                                                                                      const FloatType* src,\r
+                                                                                      CountType numValues) noexcept\r
 {\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    FloatVectorHelpers::multiply (dest, src, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src, double comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+                                                                                      const FloatType* src1,\r
+                                                                                      const FloatType* src2,\r
+                                                                                      CountType numValues) noexcept\r
 {\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    FloatVectorHelpers::multiply (dest, src1, src2, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src1, const float* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+                                                                                      FloatType multiplier,\r
+                                                                                      CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmin ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
+    FloatVectorHelpers::multiply (dest, multiplier, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src1, const double* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::multiply (FloatType* dest,\r
+                                                                                      const FloatType* src,\r
+                                                                                      FloatType multiplier,\r
+                                                                                      CountType num) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vminD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
+    FloatVectorHelpers::multiply (dest, src, multiplier, num);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src, float comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::negate (FloatType* dest,\r
+                                                                                    const FloatType* src,\r
+                                                                                    CountType numValues) noexcept\r
 {\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    FloatVectorHelpers::negate (dest, src, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src, double comp, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::abs (FloatType* dest,\r
+                                                                                 const FloatType* src,\r
+                                                                                 CountType numValues) noexcept\r
 {\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType cmp = Mode::load1 (comp);)\r
+    FloatVectorHelpers::abs (dest, src, numValues);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src1, const float* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::min (FloatType* dest,\r
+                                                                                 const FloatType* src,\r
+                                                                                 FloatType comp,\r
+                                                                                 CountType num) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmax ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
+    FloatVectorHelpers::min (dest, src, comp, num);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src1, const double* src2, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::min (FloatType* dest,\r
+                                                                                 const FloatType* src1,\r
+                                                                                 const FloatType* src2,\r
+                                                                                 CountType num) noexcept\r
 {\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vmaxD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, )\r
-   #endif\r
+    FloatVectorHelpers::min (dest, src1, src2, num);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::clip (float* dest, const float* src, float low, float high, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::max (FloatType* dest,\r
+                                                                                 const FloatType* src,\r
+                                                                                 FloatType comp,\r
+                                                                                 CountType num) noexcept\r
 {\r
-    jassert(high >= low);\r
-\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vclip ((float*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);)\r
-   #endif\r
+    FloatVectorHelpers::max (dest, src, comp, num);\r
 }\r
 \r
-void JUCE_CALLTYPE FloatVectorOperations::clip (double* dest, const double* src, double low, double high, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::max (FloatType* dest,\r
+                                                                                 const FloatType* src1,\r
+                                                                                 const FloatType* src2,\r
+                                                                                 CountType num) noexcept\r
 {\r
-    jassert(high >= low);\r
-\r
-   #if JUCE_USE_VDSP_FRAMEWORK\r
-    vDSP_vclipD ((double*) src, 1, &low, &high, dest, 1, (vDSP_Length) num);\r
-   #else\r
-    JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo),\r
-                                  JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST,\r
-                                  const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);)\r
-   #endif\r
+    FloatVectorHelpers::max (dest, src1, src2, num);\r
 }\r
 \r
-Range<float> JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+void JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::clip (FloatType* dest,\r
+                                                                                  const FloatType* src,\r
+                                                                                  FloatType low,\r
+                                                                                  FloatType high,\r
+                                                                                  CountType num) noexcept\r
 {\r
-   #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
-    return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinAndMax (src, num);\r
-   #else\r
-    return Range<float>::findMinAndMax (src, num);\r
-   #endif\r
+    FloatVectorHelpers::clip (dest, src, low, high, num);\r
 }\r
 \r
-Range<double> JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+Range<FloatType> JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::findMinAndMax (const FloatType* src,\r
+                                                                                                       CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
-    return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinAndMax (src, num);\r
-   #else\r
-    return Range<double>::findMinAndMax (src, num);\r
-   #endif\r
+    return FloatVectorHelpers::findMinAndMax (src, numValues);\r
 }\r
 \r
-float JUCE_CALLTYPE FloatVectorOperations::findMinimum (const float* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::findMinimum (const FloatType* src,\r
+                                                                                              CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
-    return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, true);\r
-   #else\r
-    return juce::findMinimum (src, num);\r
-   #endif\r
+    return FloatVectorHelpers::findMinimum (src, numValues);\r
 }\r
 \r
-double JUCE_CALLTYPE FloatVectorOperations::findMinimum (const double* src, int num) noexcept\r
+template <typename FloatType, typename CountType>\r
+FloatType JUCE_CALLTYPE detail::FloatVectorOperationsBase<FloatType, CountType>::findMaximum (const FloatType* src,\r
+                                                                                              CountType numValues) noexcept\r
 {\r
-   #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
-    return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, true);\r
-   #else\r
-    return juce::findMinimum (src, num);\r
-   #endif\r
+    return FloatVectorHelpers::findMaximum (src, numValues);\r
 }\r
 \r
-float JUCE_CALLTYPE FloatVectorOperations::findMaximum (const float* src, int num) noexcept\r
+template struct detail::FloatVectorOperationsBase<float, int>;\r
+template struct detail::FloatVectorOperationsBase<float, size_t>;\r
+template struct detail::FloatVectorOperationsBase<double, int>;\r
+template struct detail::FloatVectorOperationsBase<double, size_t>;\r
+\r
+void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, size_t num) noexcept\r
 {\r
-   #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
-    return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps32>::findMinOrMax (src, num, false);\r
-   #else\r
-    return juce::findMaximum (src, num);\r
-   #endif\r
+   FloatVectorHelpers::convertFixedToFloat (dest, src, multiplier, num);\r
 }\r
 \r
-double JUCE_CALLTYPE FloatVectorOperations::findMaximum (const double* src, int num) noexcept\r
+void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept\r
 {\r
-   #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON\r
-    return FloatVectorHelpers::MinMax<FloatVectorHelpers::BasicOps64>::findMinOrMax (src, num, false);\r
-   #else\r
-    return juce::findMaximum (src, num);\r
-   #endif\r
+    FloatVectorHelpers::convertFixedToFloat (dest, src, multiplier, num);\r
 }\r
 \r
 intptr_t JUCE_CALLTYPE FloatVectorOperations::getFpStatusRegister() noexcept\r
@@ -1033,14 +1432,16 @@ intptr_t JUCE_CALLTYPE FloatVectorOperations::getFpStatusRegister() noexcept
     intptr_t fpsr = 0;\r
   #if JUCE_INTEL && JUCE_USE_SSE_INTRINSICS\r
     fpsr = static_cast<intptr_t> (_mm_getcsr());\r
-  #elif defined (__arm64__) || defined (__aarch64__) || JUCE_USE_ARM_NEON\r
-   #if defined (__arm64__) || defined (__aarch64__)\r
-    asm volatile("mrs %0, fpcr" : "=r" (fpsr));\r
+  #elif defined(__arm64__) || defined(__aarch64__) || JUCE_USE_ARM_NEON\r
+   #if defined(__arm64__) || defined(__aarch64__)\r
+    asm volatile("mrs %0, fpcr"\r
+                 : "=r"(fpsr));\r
    #elif JUCE_USE_ARM_NEON\r
-    asm volatile("vmrs %0, fpscr" : "=r" (fpsr));\r
+    asm volatile("vmrs %0, fpscr"\r
+                 : "=r"(fpsr));\r
    #endif\r
   #else\r
-   #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+   #if ! (defined(JUCE_INTEL) || defined(JUCE_ARM))\r
     jassertfalse; // No support for getting the floating point status register for your platform\r
    #endif\r
   #endif\r
@@ -1055,14 +1456,18 @@ void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister (intptr_t fpsr) no
     // which aggressively optimises away the variable otherwise\r
     volatile auto fpsr_w = static_cast<uint32_t> (fpsr);\r
     _mm_setcsr (fpsr_w);\r
-  #elif defined (__arm64__) || defined (__aarch64__) || JUCE_USE_ARM_NEON\r
-   #if defined (__arm64__) || defined (__aarch64__)\r
-    asm volatile("msr fpcr, %0" : : "ri" (fpsr));\r
+  #elif defined(__arm64__) || defined(__aarch64__) || JUCE_USE_ARM_NEON\r
+   #if defined(__arm64__) || defined(__aarch64__)\r
+    asm volatile("msr fpcr, %0"\r
+                 :\r
+                 : "ri"(fpsr));\r
    #elif JUCE_USE_ARM_NEON\r
-    asm volatile("vmsr fpscr, %0" : : "ri" (fpsr));\r
+    asm volatile("vmsr fpscr, %0"\r
+                 :\r
+                 : "ri"(fpsr));\r
    #endif\r
   #else\r
-   #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+   #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
@@ -1071,7 +1476,7 @@ void JUCE_CALLTYPE FloatVectorOperations::setFpStatusRegister (intptr_t fpsr) no
 \r
 void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnable) noexcept\r
 {\r
-  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
    #if JUCE_USE_SSE_INTRINSICS\r
     intptr_t mask = _MM_FLUSH_ZERO_MASK;\r
    #else /*JUCE_USE_ARM_NEON*/\r
@@ -1079,7 +1484,7 @@ void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnab
    #endif\r
     setFpStatusRegister ((getFpStatusRegister() & (~mask)) | (shouldEnable ? mask : 0));\r
   #else\r
-   #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+   #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
@@ -1088,7 +1493,7 @@ void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnab
 \r
 void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool shouldDisable) noexcept\r
 {\r
-  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
    #if JUCE_USE_SSE_INTRINSICS\r
     intptr_t mask = 0x8040;\r
    #else /*JUCE_USE_ARM_NEON*/\r
@@ -1099,7 +1504,7 @@ void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool
   #else\r
     ignoreUnused (shouldDisable);\r
 \r
-   #if ! (defined (JUCE_INTEL) || defined (JUCE_ARM))\r
+   #if ! (defined(JUCE_INTEL) || defined(JUCE_ARM))\r
     jassertfalse; // No support for disable denormals mode on your platform\r
    #endif\r
   #endif\r
@@ -1107,7 +1512,7 @@ void JUCE_CALLTYPE FloatVectorOperations::disableDenormalisedNumberSupport (bool
 \r
 bool JUCE_CALLTYPE FloatVectorOperations::areDenormalsDisabled() noexcept\r
 {\r
-  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
    #if JUCE_USE_SSE_INTRINSICS\r
     intptr_t mask = 0x8040;\r
    #else /*JUCE_USE_ARM_NEON*/\r
@@ -1122,7 +1527,7 @@ bool JUCE_CALLTYPE FloatVectorOperations::areDenormalsDisabled() noexcept
 \r
 ScopedNoDenormals::ScopedNoDenormals() noexcept\r
 {\r
-  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
    #if JUCE_USE_SSE_INTRINSICS\r
     intptr_t mask = 0x8040;\r
    #else /*JUCE_USE_ARM_NEON*/\r
@@ -1136,9 +1541,9 @@ ScopedNoDenormals::ScopedNoDenormals() noexcept
 \r
 ScopedNoDenormals::~ScopedNoDenormals() noexcept\r
 {\r
-  #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined (__arm64__) || defined (__aarch64__))\r
+   #if JUCE_USE_SSE_INTRINSICS || (JUCE_USE_ARM_NEON || defined(__arm64__) || defined(__aarch64__))\r
     FloatVectorOperations::setFpStatusRegister (fpsr);\r
-  #endif\r
+   #endif\r
 }\r
 \r
 \r
index 928815a63077c39883fafaebf78fa3e164a96887..2bdcef7a1d7e9d0563753efc42d1ab922b82584e 100644 (file)
@@ -32,187 +32,123 @@ namespace juce
 #endif\r
 class ScopedNoDenormals;\r
 \r
-//==============================================================================\r
-/**\r
-    A collection of simple vector operations on arrays of floats, accelerated with\r
-    SIMD instructions where possible.\r
-\r
-    @tags{Audio}\r
-*/\r
-class JUCE_API  FloatVectorOperations\r
+#if ! DOXYGEN\r
+namespace detail\r
 {\r
-public:\r
-    //==============================================================================\r
-    /** Clears a vector of floats. */\r
-    static void JUCE_CALLTYPE clear (float* dest, int numValues) noexcept;\r
-\r
-    /** Clears a vector of doubles. */\r
-    static void JUCE_CALLTYPE clear (double* dest, int numValues) noexcept;\r
-\r
-    /** Copies a repeated value into a vector of floats. */\r
-    static void JUCE_CALLTYPE fill (float* dest, float valueToFill, int numValues) noexcept;\r
-\r
-    /** Copies a repeated value into a vector of doubles. */\r
-    static void JUCE_CALLTYPE fill (double* dest, double valueToFill, int numValues) noexcept;\r
-\r
-    /** Copies a vector of floats. */\r
-    static void JUCE_CALLTYPE copy (float* dest, const float* src, int numValues) noexcept;\r
-\r
-    /** Copies a vector of doubles. */\r
-    static void JUCE_CALLTYPE copy (double* dest, const double* src, int numValues) noexcept;\r
-\r
-    /** Copies a vector of floats, multiplying each value by a given multiplier */\r
-    static void JUCE_CALLTYPE copyWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept;\r
-\r
-    /** Copies a vector of doubles, multiplying each value by a given multiplier */\r
-    static void JUCE_CALLTYPE copyWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept;\r
-\r
-    /** Adds a fixed value to the destination values. */\r
-    static void JUCE_CALLTYPE add (float* dest, float amountToAdd, int numValues) noexcept;\r
-\r
-    /** Adds a fixed value to the destination values. */\r
-    static void JUCE_CALLTYPE add (double* dest, double amountToAdd, int numValues) noexcept;\r
-\r
-    /** Adds a fixed value to each source value and stores it in the destination array. */\r
-    static void JUCE_CALLTYPE add (float* dest, const float* src, float amount, int numValues) noexcept;\r
-\r
-    /** Adds a fixed value to each source value and stores it in the destination array. */\r
-    static void JUCE_CALLTYPE add (double* dest, const double* src, double amount, int numValues) noexcept;\r
-\r
-    /** Adds the source values to the destination values. */\r
-    static void JUCE_CALLTYPE add (float* dest, const float* src, int numValues) noexcept;\r
-\r
-    /** Adds the source values to the destination values. */\r
-    static void JUCE_CALLTYPE add (double* dest, const double* src, int numValues) noexcept;\r
-\r
-    /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */\r
-    static void JUCE_CALLTYPE add (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
-    /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */\r
-    static void JUCE_CALLTYPE add (double* dest, const double* src1, const double* src2, int num) noexcept;\r
-\r
-    /** Subtracts the source values from the destination values. */\r
-    static void JUCE_CALLTYPE subtract (float* dest, const float* src, int numValues) noexcept;\r
-\r
-    /** Subtracts the source values from the destination values. */\r
-    static void JUCE_CALLTYPE subtract (double* dest, const double* src, int numValues) noexcept;\r
-\r
-    /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */\r
-    static void JUCE_CALLTYPE subtract (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
-    /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */\r
-    static void JUCE_CALLTYPE subtract (double* dest, const double* src1, const double* src2, int num) noexcept;\r
 \r
-    /** Multiplies each source value by the given multiplier, then adds it to the destination value. */\r
-    static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept;\r
-\r
-    /** Multiplies each source value by the given multiplier, then adds it to the destination value. */\r
-    static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept;\r
-\r
-    /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */\r
-    static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
-    /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */\r
-    static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept;\r
-\r
-    /** Multiplies each source value by the given multiplier, then subtracts it to the destination value. */\r
-    static void JUCE_CALLTYPE subtractWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept;\r
-\r
-    /** Multiplies each source value by the given multiplier, then subtracts it to the destination value. */\r
-    static void JUCE_CALLTYPE subtractWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept;\r
-\r
-    /** Multiplies each source1 value by the corresponding source2 value, then subtracts it to the destination value. */\r
-    static void JUCE_CALLTYPE subtractWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept;\r
-\r
-    /** Multiplies each source1 value by the corresponding source2 value, then subtracts it to the destination value. */\r
-    static void JUCE_CALLTYPE subtractWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept;\r
-\r
-    /** Multiplies the destination values by the source values. */\r
-    static void JUCE_CALLTYPE multiply (float* dest, const float* src, int numValues) noexcept;\r
-\r
-    /** Multiplies the destination values by the source values. */\r
-    static void JUCE_CALLTYPE multiply (double* dest, const double* src, int numValues) noexcept;\r
-\r
-    /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */\r
-    static void JUCE_CALLTYPE multiply (float* dest, const float* src1, const float* src2, int numValues) noexcept;\r
-\r
-    /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */\r
-    static void JUCE_CALLTYPE multiply (double* dest, const double* src1, const double* src2, int numValues) noexcept;\r
-\r
-    /** Multiplies each of the destination values by a fixed multiplier. */\r
-    static void JUCE_CALLTYPE multiply (float* dest, float multiplier, int numValues) noexcept;\r
-\r
-    /** Multiplies each of the destination values by a fixed multiplier. */\r
-    static void JUCE_CALLTYPE multiply (double* dest, double multiplier, int numValues) noexcept;\r
+template <typename FloatType, typename CountType>\r
+struct FloatVectorOperationsBase\r
+{\r
+    static void JUCE_CALLTYPE clear (FloatType* dest, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE fill (FloatType* dest, FloatType valueToFill, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE copy (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE copyWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE add (FloatType* dest, FloatType amountToAdd, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, FloatType amount, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE add (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE subtract (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE addWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE subtractWithMultiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE multiply (FloatType* dest, FloatType multiplier, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE multiply (FloatType* dest, const FloatType* src, FloatType multiplier, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE negate (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE abs (FloatType* dest, const FloatType* src, CountType numValues) noexcept;\r
+    static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE min (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src, FloatType comp, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE max (FloatType* dest, const FloatType* src1, const FloatType* src2, CountType num) noexcept;\r
+    static void JUCE_CALLTYPE clip (FloatType* dest, const FloatType* src, FloatType low, FloatType high, CountType num) noexcept;\r
+    static Range<FloatType> JUCE_CALLTYPE findMinAndMax (const FloatType* src, CountType numValues) noexcept;\r
+    static FloatType JUCE_CALLTYPE findMinimum (const FloatType* src, CountType numValues) noexcept;\r
+    static FloatType JUCE_CALLTYPE findMaximum (const FloatType* src, CountType numValues) noexcept;\r
+};\r
 \r
-    /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */\r
-    static void JUCE_CALLTYPE multiply (float* dest, const float* src, float multiplier, int num) noexcept;\r
+template <typename...>\r
+struct NameForwarder;\r
 \r
-    /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */\r
-    static void JUCE_CALLTYPE multiply (double* dest, const double* src, double multiplier, int num) noexcept;\r
+template <typename Head>\r
+struct NameForwarder<Head> : Head {};\r
 \r
-    /** Copies a source vector to a destination, negating each value. */\r
-    static void JUCE_CALLTYPE negate (float* dest, const float* src, int numValues) noexcept;\r
+template <typename Head, typename... Tail>\r
+struct NameForwarder<Head, Tail...> : Head, NameForwarder<Tail...>\r
+{\r
+    using Head::clear;\r
+    using NameForwarder<Tail...>::clear;\r
 \r
-    /** Copies a source vector to a destination, negating each value. */\r
-    static void JUCE_CALLTYPE negate (double* dest, const double* src, int numValues) noexcept;\r
+    using Head::fill;\r
+    using NameForwarder<Tail...>::fill;\r
 \r
-    /** Copies a source vector to a destination, taking the absolute of each value. */\r
-    static void JUCE_CALLTYPE abs (float* dest, const float* src, int numValues) noexcept;\r
+    using Head::copy;\r
+    using NameForwarder<Tail...>::copy;\r
 \r
-    /** Copies a source vector to a destination, taking the absolute of each value. */\r
-    static void JUCE_CALLTYPE abs (double* dest, const double* src, int numValues) noexcept;\r
+    using Head::copyWithMultiply;\r
+    using NameForwarder<Tail...>::copyWithMultiply;\r
 \r
-    /** Converts a stream of integers to floats, multiplying each one by the given multiplier. */\r
-    static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int numValues) noexcept;\r
+    using Head::add;\r
+    using NameForwarder<Tail...>::add;\r
 \r
-    /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */\r
-    static void JUCE_CALLTYPE min (float* dest, const float* src, float comp, int num) noexcept;\r
+    using Head::subtract;\r
+    using NameForwarder<Tail...>::subtract;\r
 \r
-    /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */\r
-    static void JUCE_CALLTYPE min (double* dest, const double* src, double comp, int num) noexcept;\r
+    using Head::addWithMultiply;\r
+    using NameForwarder<Tail...>::addWithMultiply;\r
 \r
-    /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */\r
-    static void JUCE_CALLTYPE min (float* dest, const float* src1, const float* src2, int num) noexcept;\r
+    using Head::subtractWithMultiply;\r
+    using NameForwarder<Tail...>::subtractWithMultiply;\r
 \r
-    /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */\r
-    static void JUCE_CALLTYPE min (double* dest, const double* src1, const double* src2, int num) noexcept;\r
+    using Head::multiply;\r
+    using NameForwarder<Tail...>::multiply;\r
 \r
-    /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */\r
-    static void JUCE_CALLTYPE max (float* dest, const float* src, float comp, int num) noexcept;\r
+    using Head::negate;\r
+    using NameForwarder<Tail...>::negate;\r
 \r
-    /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */\r
-    static void JUCE_CALLTYPE max (double* dest, const double* src, double comp, int num) noexcept;\r
+    using Head::abs;\r
+    using NameForwarder<Tail...>::abs;\r
 \r
-    /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */\r
-    static void JUCE_CALLTYPE max (float* dest, const float* src1, const float* src2, int num) noexcept;\r
+    using Head::min;\r
+    using NameForwarder<Tail...>::min;\r
 \r
-    /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */\r
-    static void JUCE_CALLTYPE max (double* dest, const double* src1, const double* src2, int num) noexcept;\r
+    using Head::max;\r
+    using NameForwarder<Tail...>::max;\r
 \r
-    /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */\r
-    static void JUCE_CALLTYPE clip (float* dest, const float* src, float low, float high, int num) noexcept;\r
+    using Head::clip;\r
+    using NameForwarder<Tail...>::clip;\r
 \r
-    /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */\r
-    static void JUCE_CALLTYPE clip (double* dest, const double* src, double low, double high, int num) noexcept;\r
+    using Head::findMinAndMax;\r
+    using NameForwarder<Tail...>::findMinAndMax;\r
 \r
-    /** Finds the minimum and maximum values in the given array. */\r
-    static Range<float> JUCE_CALLTYPE findMinAndMax (const float* src, int numValues) noexcept;\r
+    using Head::findMinimum;\r
+    using NameForwarder<Tail...>::findMinimum;\r
 \r
-    /** Finds the minimum and maximum values in the given array. */\r
-    static Range<double> JUCE_CALLTYPE findMinAndMax (const double* src, int numValues) noexcept;\r
+    using Head::findMaximum;\r
+    using NameForwarder<Tail...>::findMaximum;\r
+};\r
 \r
-    /** Finds the minimum value in the given array. */\r
-    static float JUCE_CALLTYPE findMinimum (const float* src, int numValues) noexcept;\r
+} // namespace detail\r
+#endif\r
 \r
-    /** Finds the minimum value in the given array. */\r
-    static double JUCE_CALLTYPE findMinimum (const double* src, int numValues) noexcept;\r
+//==============================================================================\r
+/**\r
+    A collection of simple vector operations on arrays of floats, accelerated with\r
+    SIMD instructions where possible.\r
 \r
-    /** Finds the maximum value in the given array. */\r
-    static float JUCE_CALLTYPE findMaximum (const float* src, int numValues) noexcept;\r
+    @tags{Audio}\r
+*/\r
+class JUCE_API  FloatVectorOperations : public detail::NameForwarder<detail::FloatVectorOperationsBase<float, int>,\r
+                                                                     detail::FloatVectorOperationsBase<float, size_t>,\r
+                                                                     detail::FloatVectorOperationsBase<double, int>,\r
+                                                                     detail::FloatVectorOperationsBase<double, size_t>>\r
+{\r
+public:\r
+    static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept;\r
 \r
-    /** Finds the maximum value in the given array. */\r
-    static double JUCE_CALLTYPE findMaximum (const double* src, int numValues) noexcept;\r
+    static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, size_t num) noexcept;\r
 \r
     /** This method enables or disables the SSE/NEON flush-to-zero mode. */\r
     static void JUCE_CALLTYPE enableFlushToZeroMode (bool shouldEnable) noexcept;\r
index 5a85ed2ea68c810c3f955d59b227bb4d2ca17d70..1db887e9d7d4f74829eda69eeacb5400356e2d16 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_basics\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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
index 2a264bbdbaafa59c53383f80792e0ef333d5b18d..be73c1725ff121027970f9e8ae0d2149f52f8998 100644 (file)
@@ -28,7 +28,7 @@ namespace universal_midi_packets
 {\r
 \r
 /**\r
-    This struct acts as a single-file namespace for Univeral MIDI Packet\r
+    This struct acts as a single-file namespace for Universal MIDI Packet\r
     functionality related to 7-bit SysEx.\r
 \r
     @tags{Audio}\r
index e7d30be6af3877f575cad8473c13b71f5a525b42..7e0a33f92b6283b87612bcfc694a3a9382eb104d 100644 (file)
@@ -43,16 +43,20 @@ MPEInstrument::MPEInstrument() noexcept
     mpeInstrumentFill (isMemberChannelSustained, false);\r
 \r
     pitchbendDimension.value = &MPENote::pitchbend;\r
-    pressureDimension.value = &MPENote::pressure;\r
-    timbreDimension.value = &MPENote::timbre;\r
+    pressureDimension.value  = &MPENote::pressure;\r
+    timbreDimension.value    = &MPENote::timbre;\r
 \r
     resetLastReceivedValues();\r
 \r
-    legacyMode.isEnabled = false;\r
-    legacyMode.pitchbendRange = 2;\r
     legacyMode.channelRange = allChannels;\r
 }\r
 \r
+MPEInstrument::MPEInstrument (MPEZoneLayout layout)\r
+    : MPEInstrument()\r
+{\r
+    setZoneLayout (layout);\r
+}\r
+\r
 MPEInstrument::~MPEInstrument() = default;\r
 \r
 //==============================================================================\r
@@ -84,21 +88,30 @@ void MPEInstrument::setZoneLayout (MPEZoneLayout newLayout)
 \r
     const ScopedLock sl (lock);\r
     legacyMode.isEnabled = false;\r
-    zoneLayout = newLayout;\r
 \r
-    resetLastReceivedValues();\r
+    if (zoneLayout != newLayout)\r
+    {\r
+        zoneLayout = newLayout;\r
+        listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
+    }\r
 }\r
 \r
 //==============================================================================\r
 void MPEInstrument::enableLegacyMode (int pitchbendRange, Range<int> channelRange)\r
 {\r
+    if (legacyMode.isEnabled)\r
+        return;\r
+\r
     releaseAllNotes();\r
 \r
     const ScopedLock sl (lock);\r
+\r
     legacyMode.isEnabled = true;\r
     legacyMode.pitchbendRange = pitchbendRange;\r
     legacyMode.channelRange = channelRange;\r
+\r
     zoneLayout.clearAllZones();\r
+    listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
 }\r
 \r
 bool MPEInstrument::isLegacyModeEnabled() const noexcept\r
@@ -117,7 +130,12 @@ void MPEInstrument::setLegacyModeChannelRange (Range<int> channelRange)
 \r
     releaseAllNotes();\r
     const ScopedLock sl (lock);\r
-    legacyMode.channelRange = channelRange;\r
+\r
+    if (legacyMode.channelRange != channelRange)\r
+    {\r
+        legacyMode.channelRange = channelRange;\r
+        listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
+    }\r
 }\r
 \r
 int MPEInstrument::getLegacyModePitchbendRange() const noexcept\r
@@ -131,7 +149,12 @@ void MPEInstrument::setLegacyModePitchbendRange (int pitchbendRange)
 \r
     releaseAllNotes();\r
     const ScopedLock sl (lock);\r
-    legacyMode.pitchbendRange = pitchbendRange;\r
+\r
+    if (legacyMode.pitchbendRange != pitchbendRange)\r
+    {\r
+        legacyMode.pitchbendRange = pitchbendRange;\r
+        listeners.call ([=] (Listener& l) { l.zoneLayoutChanged(); });\r
+    }\r
 }\r
 \r
 //==============================================================================\r
@@ -242,7 +265,7 @@ void MPEInstrument::processMidiResetAllControllersMessage (const MidiMessage& me
 \r
     if (legacyMode.isEnabled && legacyMode.channelRange.contains (message.getChannel()))\r
     {\r
-        for (auto i = notes.size(); --i >= 0;)\r
+        for (int i = notes.size(); --i >= 0;)\r
         {\r
             auto& note = notes.getReference (i);\r
 \r
@@ -260,7 +283,7 @@ void MPEInstrument::processMidiResetAllControllersMessage (const MidiMessage& me
         auto zone = (message.getChannel() == 1 ? zoneLayout.getLowerZone()\r
                                                : zoneLayout.getUpperZone());\r
 \r
-        for (auto i = notes.size(); --i >= 0;)\r
+        for (int i = notes.size(); --i >= 0;)\r
         {\r
             auto& note = notes.getReference (i);\r
 \r
@@ -348,11 +371,11 @@ void MPEInstrument::noteOff (int midiChannel,
                              int midiNoteNumber,\r
                              MPEValue midiNoteOffVelocity)\r
 {\r
+    const ScopedLock sl (lock);\r
+\r
     if (notes.isEmpty() || ! isUsingChannel (midiChannel))\r
         return;\r
 \r
-    const ScopedLock sl (lock);\r
-\r
     if (auto* note = getNotePtr (midiChannel, midiNoteNumber))\r
     {\r
         note->keyState = (note->keyState == MPENote::keyDownAndSustained) ? MPENote::sustained : MPENote::off;\r
@@ -401,7 +424,7 @@ void MPEInstrument::polyAftertouch (int midiChannel, int midiNoteNumber, MPEValu
 {\r
     const ScopedLock sl (lock);\r
 \r
-    for (auto i = notes.size(); --i >= 0;)\r
+    for (int i = notes.size(); --i >= 0;)\r
     {\r
         auto& note = notes.getReference (i);\r
 \r
@@ -435,7 +458,7 @@ void MPEInstrument::updateDimension (int midiChannel, MPEDimension& dimension, M
     {\r
         if (dimension.trackingMode == allNotesOnChannel)\r
         {\r
-            for (auto i = notes.size(); --i >= 0;)\r
+            for (int i = notes.size(); --i >= 0;)\r
             {\r
                 auto& note = notes.getReference (i);\r
 \r
@@ -464,7 +487,7 @@ void MPEInstrument::updateDimensionMaster (bool isLowerZone, MPEDimension& dimen
     if (! zone.isActive())\r
         return;\r
 \r
-    for (auto i = notes.size(); --i >= 0;)\r
+    for (int i = notes.size(); --i >= 0;)\r
     {\r
         auto& note = notes.getReference (i);\r
 \r
@@ -573,7 +596,7 @@ void MPEInstrument::handleSustainOrSostenuto (int midiChannel, bool isDown, bool
     auto zone = (midiChannel == 1 ? zoneLayout.getLowerZone()\r
                                   : zoneLayout.getUpperZone());\r
 \r
-    for (auto i = notes.size(); --i >= 0;)\r
+    for (int i = notes.size(); --i >= 0;)\r
     {\r
         auto& note = notes.getReference (i);\r
 \r
@@ -605,11 +628,15 @@ void MPEInstrument::handleSustainOrSostenuto (int midiChannel, bool isDown, bool
         if (! legacyMode.isEnabled)\r
         {\r
             if (zone.isLowerZone())\r
-                for (auto i = zone.getFirstMemberChannel(); i <= zone.getLastMemberChannel(); ++i)\r
+            {\r
+                for (int i = zone.getFirstMemberChannel(); i <= zone.getLastMemberChannel(); ++i)\r
                     isMemberChannelSustained[i - 1] = isDown;\r
+            }\r
             else\r
-                for (auto i = zone.getFirstMemberChannel(); i >= zone.getLastMemberChannel(); --i)\r
+            {\r
+                for (int i = zone.getFirstMemberChannel(); i >= zone.getLastMemberChannel(); --i)\r
                     isMemberChannelSustained[i - 1] = isDown;\r
+            }\r
         }\r
     }\r
 }\r
@@ -664,6 +691,17 @@ MPENote MPEInstrument::getNote (int index) const noexcept
     return notes[index];\r
 }\r
 \r
+MPENote MPEInstrument::getNoteWithID (uint16 noteID) const noexcept\r
+{\r
+    const ScopedLock sl (lock);\r
+\r
+    for (auto& note : notes)\r
+        if (note.noteID == noteID)\r
+            return note;\r
+\r
+    return {};\r
+}\r
+\r
 //==============================================================================\r
 MPENote MPEInstrument::getMostRecentNote (int midiChannel) const noexcept\r
 {\r
@@ -727,6 +765,8 @@ MPENote* MPEInstrument::getNotePtr (int midiChannel, TrackingMode mode) noexcept
 //==============================================================================\r
 const MPENote* MPEInstrument::getLastNotePlayedPtr (int midiChannel) const noexcept\r
 {\r
+    const ScopedLock sl (lock);\r
+\r
     for (auto i = notes.size(); --i >= 0;)\r
     {\r
         auto& note = notes.getReference (i);\r
index 3db823f5f579b09ced761ac87dc8884674d5d0ef..e4b3cabd29240fbf08c48a636b2140bdbdcd03b7 100644 (file)
@@ -38,10 +38,8 @@ namespace juce
     MPE. If you pass it a message, it will know what notes on what\r
     channels (if any) should be affected by that message.\r
 \r
-    The class has a Listener class with the three callbacks MPENoteAdded,\r
-    MPENoteChanged, and MPENoteFinished. Implement such a\r
-    Listener class to react to note changes and trigger some functionality for\r
-    your application that depends on the MPE note state.\r
+    The class has a Listener class that can be used to react to note and\r
+    state changes and trigger some functionality for your application.\r
     For example, you can use this class to write an MPE visualiser.\r
 \r
     If you want to write a real-time audio synth with MPE functionality,\r
@@ -59,11 +57,14 @@ public:
 \r
         This will construct an MPE instrument with inactive lower and upper zones.\r
 \r
-        In order to process incoming MIDI, call setZoneLayout, define the layout\r
-        via MIDI RPN messages, or set the instrument to legacy mode.\r
+        In order to process incoming MIDI messages call setZoneLayout, use the MPEZoneLayout\r
+        constructor, define the layout via MIDI RPN messages, or set the instrument to legacy mode.\r
     */\r
     MPEInstrument() noexcept;\r
 \r
+    /** Constructs an MPE instrument with the specified zone layout. */\r
+    MPEInstrument (MPEZoneLayout layout);\r
+\r
     /** Destructor. */\r
     virtual ~MPEInstrument();\r
 \r
@@ -229,6 +230,9 @@ public:
     */\r
     MPENote getNote (int midiChannel, int midiNoteNumber) const noexcept;\r
 \r
+    /** Returns the note with a given ID. */\r
+    MPENote getNoteWithID (uint16 noteID) const noexcept;\r
+\r
     /** Returns the most recent note that is playing on the given midiChannel\r
         (this will be the note which has received the most recent note-on without\r
         a corresponding note-off), if there is such a note. Otherwise, this returns an\r
@@ -244,8 +248,8 @@ public:
     MPENote getMostRecentNoteOtherThan (MPENote otherThanThisNote) const noexcept;\r
 \r
     //==============================================================================\r
-    /** Derive from this class to be informed about any changes in the expressive\r
-        MIDI notes played by this instrument.\r
+    /** Derive from this class to be informed about any changes in the MPE notes played\r
+        by this instrument, and any changes to its zone layout.\r
 \r
         Note: This listener type receives its callbacks immediately, and not\r
         via the message thread (so you might be for example in the MIDI thread).\r
@@ -297,6 +301,11 @@ public:
             and should therefore stop playing.\r
         */\r
         virtual void noteReleased (MPENote finishedNote)         { ignoreUnused (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
     };\r
 \r
     //==============================================================================\r
@@ -307,7 +316,9 @@ public:
     void removeListener (Listener* listenerToRemove);\r
 \r
     //==============================================================================\r
-    /** Puts the instrument into legacy mode.\r
+    /** Puts the instrument into legacy mode. If legacy mode is already enabled this method\r
+        does nothing.\r
+\r
         As a side effect, this will discard all currently playing notes,\r
         and call noteReleased for all of them.\r
 \r
@@ -360,9 +371,9 @@ private:
 \r
     struct LegacyMode\r
     {\r
-        bool isEnabled;\r
+        bool isEnabled = false;\r
         Range<int> channelRange;\r
-        int pitchbendRange;\r
+        int pitchbendRange = 2;\r
     };\r
 \r
     struct MPEDimension\r
index baaba0fa8044a921df81512d9a8c219eecdb57bb..05a96893f786d731355cf9c50872106feae13fbe 100644 (file)
@@ -115,7 +115,7 @@ struct JUCE_API  MPENote
     */\r
     MPEValue noteOnVelocity  { MPEValue::minValue() };\r
 \r
-    /** Current per-note pitchbend of the note  (in units of MIDI pitchwheel\r
+    /** Current per-note pitchbend of the note (in units of MIDI pitchwheel\r
         position). This dimension can be modulated while the note sounds.\r
 \r
         Note: This value is not aware of the currently used pitchbend range,\r
index d892adfe9bc1a34de18339790a865bb5e9c1c5fa..fdd19ba4f7b2c12d7cf0740088341fab2194ec99 100644 (file)
@@ -25,12 +25,10 @@ namespace juce
 \r
 MPESynthesiser::MPESynthesiser()\r
 {\r
-    MPEZoneLayout zoneLayout;\r
-    zoneLayout.setLowerZone (15);\r
-    setZoneLayout (zoneLayout);\r
 }\r
 \r
-MPESynthesiser::MPESynthesiser (MPEInstrument* mpeInstrument)  : MPESynthesiserBase (mpeInstrument)\r
+MPESynthesiser::MPESynthesiser (MPEInstrument& mpeInstrument)\r
+    : MPESynthesiserBase (mpeInstrument)\r
 {\r
 }\r
 \r
@@ -314,7 +312,7 @@ void MPESynthesiser::turnOffAllVoices (bool allowTailOff)
     }\r
 \r
     // finally make sure the MPE Instrument also doesn't have any notes anymore.\r
-    instrument->releaseAllNotes();\r
+    instrument.releaseAllNotes();\r
 }\r
 \r
 //==============================================================================\r
index f3b0696d5fac7631f9e32d366cda3f0f73b5cdaf..57862c81167b971718297114eec867be77cda036 100644 (file)
@@ -65,11 +65,10 @@ public:
     /** Constructor to pass to the synthesiser a custom MPEInstrument object\r
         to handle the MPE note state, MIDI channel assignment etc.\r
         (in case you need custom logic for this that goes beyond MIDI and MPE).\r
-        The synthesiser will take ownership of this object.\r
 \r
         @see MPESynthesiserBase, MPEInstrument\r
     */\r
-    MPESynthesiser (MPEInstrument* instrumentToUse);\r
+    MPESynthesiser (MPEInstrument& instrumentToUse);\r
 \r
     /** Destructor. */\r
     ~MPESynthesiser() override;\r
@@ -303,7 +302,7 @@ protected:
 \r
 private:\r
     //==============================================================================\r
-    bool shouldStealVoices = false;\r
+    std::atomic<bool> shouldStealVoices { false };\r
     uint32 lastNoteOnCounter = 0;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPESynthesiser)\r
index acd03984b01d95f800ad6c018c2ad5f4e4eeb4ca..b96319024b21d50c0ae86359b4325fe35803490c 100644 (file)
@@ -24,80 +24,79 @@ namespace juce
 {\r
 \r
 MPESynthesiserBase::MPESynthesiserBase()\r
-    : instrument (new MPEInstrument)\r
+    : instrument (defaultInstrument)\r
 {\r
-    instrument->addListener (this);\r
+    instrument.addListener (this);\r
 }\r
 \r
-MPESynthesiserBase::MPESynthesiserBase (MPEInstrument* inst)\r
+MPESynthesiserBase::MPESynthesiserBase (MPEInstrument& inst)\r
     : instrument (inst)\r
 {\r
-    jassert (instrument != nullptr);\r
-    instrument->addListener (this);\r
+    instrument.addListener (this);\r
 }\r
 \r
 //==============================================================================\r
 MPEZoneLayout MPESynthesiserBase::getZoneLayout() const noexcept\r
 {\r
-    return instrument->getZoneLayout();\r
+    return instrument.getZoneLayout();\r
 }\r
 \r
 void MPESynthesiserBase::setZoneLayout (MPEZoneLayout newLayout)\r
 {\r
-    instrument->setZoneLayout (newLayout);\r
+    instrument.setZoneLayout (newLayout);\r
 }\r
 \r
 //==============================================================================\r
 void MPESynthesiserBase::enableLegacyMode (int pitchbendRange, Range<int> channelRange)\r
 {\r
-    instrument->enableLegacyMode (pitchbendRange, channelRange);\r
+    instrument.enableLegacyMode (pitchbendRange, channelRange);\r
 }\r
 \r
 bool MPESynthesiserBase::isLegacyModeEnabled() const noexcept\r
 {\r
-    return instrument->isLegacyModeEnabled();\r
+    return instrument.isLegacyModeEnabled();\r
 }\r
 \r
 Range<int> MPESynthesiserBase::getLegacyModeChannelRange() const noexcept\r
 {\r
-    return instrument->getLegacyModeChannelRange();\r
+    return instrument.getLegacyModeChannelRange();\r
 }\r
 \r
 void MPESynthesiserBase::setLegacyModeChannelRange (Range<int> channelRange)\r
 {\r
-    instrument->setLegacyModeChannelRange (channelRange);\r
+    instrument.setLegacyModeChannelRange (channelRange);\r
 }\r
 \r
 int MPESynthesiserBase::getLegacyModePitchbendRange() const noexcept\r
 {\r
-    return instrument->getLegacyModePitchbendRange();\r
+    return instrument.getLegacyModePitchbendRange();\r
 }\r
 \r
 void MPESynthesiserBase::setLegacyModePitchbendRange (int pitchbendRange)\r
 {\r
-    instrument->setLegacyModePitchbendRange (pitchbendRange);\r
+    instrument.setLegacyModePitchbendRange (pitchbendRange);\r
 }\r
 \r
 //==============================================================================\r
 void MPESynthesiserBase::setPressureTrackingMode (TrackingMode modeToUse)\r
 {\r
-    instrument->setPressureTrackingMode (modeToUse);\r
+    instrument.setPressureTrackingMode (modeToUse);\r
 }\r
 \r
 void MPESynthesiserBase::setPitchbendTrackingMode (TrackingMode modeToUse)\r
 {\r
-    instrument->setPitchbendTrackingMode (modeToUse);\r
+    instrument.setPitchbendTrackingMode (modeToUse);\r
 }\r
 \r
 void MPESynthesiserBase::setTimbreTrackingMode (TrackingMode modeToUse)\r
 {\r
-    instrument->setTimbreTrackingMode (modeToUse);\r
+    instrument.setTimbreTrackingMode (modeToUse);\r
 }\r
 \r
 //==============================================================================\r
 void MPESynthesiserBase::handleMidiEvent (const MidiMessage& m)\r
 {\r
-    instrument->processNextMidiEvent (m);\r
+    instrument.processNextMidiEvent (m);\r
 }\r
 \r
 //==============================================================================\r
@@ -148,7 +147,7 @@ void MPESynthesiserBase::setCurrentPlaybackSampleRate (const double newRate)
     if (sampleRate != newRate)\r
     {\r
         const ScopedLock sl (noteStateLock);\r
-        instrument->releaseAllNotes();\r
+        instrument.releaseAllNotes();\r
         sampleRate = newRate;\r
     }\r
 }\r
index 3f5d3efa949cef290a8560406abad85b9d6b37b3..fd030ef652d3cb441fe55c4c88223438ccb72569 100644 (file)
@@ -52,13 +52,12 @@ public:
 \r
     /** Constructor.\r
 \r
-        If you use this constructor, the synthesiser will take ownership of the\r
-        provided instrument object, and will use it internally to handle the\r
-        MPE note state logic.\r
+        If you use this constructor, the synthesiser will use the provided instrument\r
+        object to handle the MPE note state logic.\r
         This is useful if you want to use an instance of your own class derived\r
         from MPEInstrument for the MPE logic.\r
     */\r
-    MPESynthesiserBase (MPEInstrument* instrument);\r
+    MPESynthesiserBase (MPEInstrument& instrument);\r
 \r
     //==============================================================================\r
     /** Returns the synthesiser's internal MPE zone layout.\r
@@ -200,10 +199,12 @@ protected:
 protected:\r
     //==============================================================================\r
     /** @internal */\r
-    std::unique_ptr<MPEInstrument> instrument;\r
+    MPEInstrument& instrument;\r
 \r
 private:\r
     //==============================================================================\r
+    MPEInstrument defaultInstrument { MPEZone (MPEZone::Type::lower, 15) };\r
+\r
     CriticalSection noteStateLock;\r
     double sampleRate = 0.0;\r
     int minimumSubBlockSize = 32;\r
index a8a75a92229b139a0023ed2352f18fce38fc2b51..4081ad00d000039f7ef23ee25c668833c21bf76f 100644 (file)
@@ -52,25 +52,25 @@ int MPEChannelAssigner::findMidiChannelForNewNote (int noteNumber) noexcept
     if (numChannels <= 1)\r
         return firstChannel;\r
 \r
-    for (auto ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
+    for (int ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
     {\r
-        if (midiChannels[ch].isFree() && midiChannels[ch].lastNotePlayed == noteNumber)\r
+        if (midiChannels[(size_t) ch].isFree() && midiChannels[(size_t) ch].lastNotePlayed == noteNumber)\r
         {\r
             midiChannelLastAssigned = ch;\r
-            midiChannels[ch].notes.add (noteNumber);\r
+            midiChannels[(size_t) ch].notes.add (noteNumber);\r
             return ch;\r
         }\r
     }\r
 \r
-    for (auto ch = midiChannelLastAssigned + channelIncrement; ; ch += channelIncrement)\r
+    for (int ch = midiChannelLastAssigned + channelIncrement; ; ch += channelIncrement)\r
     {\r
         if (ch == lastChannel + channelIncrement)  // loop wrap-around\r
             ch = firstChannel;\r
 \r
-        if (midiChannels[ch].isFree())\r
+        if (midiChannels[(size_t) ch].isFree())\r
         {\r
             midiChannelLastAssigned = ch;\r
-            midiChannels[ch].notes.add (noteNumber);\r
+            midiChannels[(size_t) ch].notes.add (noteNumber);\r
             return ch;\r
         }\r
 \r
@@ -79,11 +79,21 @@ int MPEChannelAssigner::findMidiChannelForNewNote (int noteNumber) noexcept
     }\r
 \r
     midiChannelLastAssigned = findMidiChannelPlayingClosestNonequalNote (noteNumber);\r
-    midiChannels[midiChannelLastAssigned].notes.add (noteNumber);\r
+    midiChannels[(size_t) midiChannelLastAssigned].notes.add (noteNumber);\r
 \r
     return midiChannelLastAssigned;\r
 }\r
 \r
+int MPEChannelAssigner::findMidiChannelForExistingNote (int noteNumber) noexcept\r
+{\r
+    const auto iter = std::find_if (midiChannels.cbegin(), midiChannels.cend(), [&] (auto& ch)\r
+    {\r
+        return std::find (ch.notes.begin(), ch.notes.end(), noteNumber) != ch.notes.end();\r
+    });\r
+\r
+    return iter != midiChannels.cend() ? (int) std::distance (midiChannels.cbegin(), iter) : -1;\r
+}\r
+\r
 void MPEChannelAssigner::noteOff (int noteNumber, int midiChannel)\r
 {\r
     const auto removeNote = [] (MidiChannel& ch, int noteNum)\r
@@ -99,7 +109,7 @@ void MPEChannelAssigner::noteOff (int noteNumber, int midiChannel)
 \r
     if (midiChannel >= 0 && midiChannel <= 16)\r
     {\r
-        removeNote (midiChannels[midiChannel], noteNumber);\r
+        removeNote (midiChannels[(size_t) midiChannel], noteNumber);\r
         return;\r
     }\r
 \r
@@ -126,9 +136,9 @@ int MPEChannelAssigner::findMidiChannelPlayingClosestNonequalNote (int noteNumbe
     auto channelWithClosestNote = firstChannel;\r
     int closestNoteDistance = 127;\r
 \r
-    for (auto ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
+    for (int ch = firstChannel; (isLegacy || zone->isLowerZone() ? ch <= lastChannel : ch >= lastChannel); ch += channelIncrement)\r
     {\r
-        for (auto note : midiChannels[ch].notes)\r
+        for (auto note : midiChannels[(size_t) ch].notes)\r
         {\r
             auto noteDistance = std::abs (note - noteNumber);\r
 \r
@@ -296,24 +306,35 @@ struct MPEUtilsUnitTests  : public UnitTest
                 // check that channels are assigned in correct order\r
                 int noteNum = 60;\r
                 for (int ch = 2; ch <= 16; ++ch)\r
-                    expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum++), ch);\r
+                {\r
+                    expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum), ch);\r
+                    expectEquals (channelAssigner.findMidiChannelForExistingNote (noteNum), ch);\r
+\r
+                    ++noteNum;\r
+                }\r
 \r
                 // check that note-offs are processed\r
                 channelAssigner.noteOff (60);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (60), 2);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (60), 2);\r
 \r
                 channelAssigner.noteOff (61);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (61), 3);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (61), 3);\r
 \r
                 // check that assigned channel was last to play note\r
                 channelAssigner.noteOff (65);\r
                 channelAssigner.noteOff (66);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (66), 8);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (65), 7);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 8);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 7);\r
 \r
                 // find closest channel playing nonequal note\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (55), 2);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 2);\r
 \r
                 // all notes off\r
                 channelAssigner.allNotesOff();\r
@@ -323,10 +344,16 @@ struct MPEUtilsUnitTests  : public UnitTest
                 expectEquals (channelAssigner.findMidiChannelForNewNote (65), 7);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (55), 2);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 8);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 7);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 2);\r
 \r
                 // normal assignment\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (101), 3);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (20), 4);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (101), 3);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (20), 4);\r
             }\r
 \r
             // upper\r
@@ -339,24 +366,35 @@ struct MPEUtilsUnitTests  : public UnitTest
                 // check that channels are assigned in correct order\r
                 int noteNum = 60;\r
                 for (int ch = 15; ch >= 1; --ch)\r
-                    expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum++), ch);\r
+                {\r
+                    expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum), ch);\r
+                    expectEquals (channelAssigner.findMidiChannelForExistingNote (noteNum), ch);\r
+\r
+                    ++noteNum;\r
+                }\r
 \r
                 // check that note-offs are processed\r
                 channelAssigner.noteOff (60);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (60), 15);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (60), 15);\r
 \r
                 channelAssigner.noteOff (61);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (61), 14);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (61), 14);\r
 \r
                 // check that assigned channel was last to play note\r
                 channelAssigner.noteOff (65);\r
                 channelAssigner.noteOff (66);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (66), 9);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (65), 10);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 9);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 10);\r
 \r
                 // find closest channel playing nonequal note\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (80), 1);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (55), 15);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 1);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 15);\r
 \r
                 // all notes off\r
                 channelAssigner.allNotesOff();\r
@@ -366,10 +404,16 @@ struct MPEUtilsUnitTests  : public UnitTest
                 expectEquals (channelAssigner.findMidiChannelForNewNote (65), 10);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (80), 1);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (55), 15);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 9);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 10);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 1);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 15);\r
 \r
                 // normal assignment\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (101), 14);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (20), 13);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (101), 14);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (20), 13);\r
             }\r
 \r
             // legacy\r
@@ -379,24 +423,35 @@ struct MPEUtilsUnitTests  : public UnitTest
                 // check that channels are assigned in correct order\r
                 int noteNum = 60;\r
                 for (int ch = 1; ch <= 16; ++ch)\r
-                    expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum++), ch);\r
+                {\r
+                    expectEquals (channelAssigner.findMidiChannelForNewNote (noteNum), ch);\r
+                    expectEquals (channelAssigner.findMidiChannelForExistingNote (noteNum), ch);\r
+\r
+                    ++noteNum;\r
+                }\r
 \r
                 // check that note-offs are processed\r
                 channelAssigner.noteOff (60);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (60), 1);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (60), 1);\r
 \r
                 channelAssigner.noteOff (61);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (61), 2);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (61), 2);\r
 \r
                 // check that assigned channel was last to play note\r
                 channelAssigner.noteOff (65);\r
                 channelAssigner.noteOff (66);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (66), 7);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (65), 6);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 7);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 6);\r
 \r
                 // find closest channel playing nonequal note\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (55), 1);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 1);\r
 \r
                 // all notes off\r
                 channelAssigner.allNotesOff();\r
@@ -406,10 +461,16 @@ struct MPEUtilsUnitTests  : public UnitTest
                 expectEquals (channelAssigner.findMidiChannelForNewNote (65), 6);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (80), 16);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (55), 1);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (66), 7);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (65), 6);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (80), 16);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (55), 1);\r
 \r
                 // normal assignment\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (101), 2);\r
                 expectEquals (channelAssigner.findMidiChannelForNewNote (20), 3);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (101), 2);\r
+                expectEquals (channelAssigner.findMidiChannelForExistingNote (20), 3);\r
             }\r
         }\r
 \r
index 672bdafc7075314503754e1b2deac339a2252c40..be503bfb2e4e4247d25a3b0d9929c54d7bfa7ad7 100644 (file)
@@ -63,6 +63,11 @@ public:
     */\r
     int findMidiChannelForNewNote (int noteNumber) noexcept;\r
 \r
+    /** If a note has been added using findMidiChannelForNewNote() this will return the channel\r
+        to which it was assigned, otherwise it will return -1.\r
+    */\r
+    int findMidiChannelForExistingNote (int initialNoteOnNumber) noexcept;\r
+\r
     /** You must call this method for all note-offs that you receive so that this class\r
         can keep track of the currently playing notes internally.\r
 \r
@@ -86,7 +91,7 @@ private:
         int lastNotePlayed = -1;\r
         bool isFree() const noexcept  { return notes.isEmpty(); }\r
     };\r
-    MidiChannel midiChannels[17];\r
+    std::array<MidiChannel, 17> midiChannels;\r
 \r
     //==============================================================================\r
     int findMidiChannelPlayingClosestNonequalNote (int noteNumber) noexcept;\r
index 193d7fd2f261b1a9d29fb9cfc18e74e7e9540f9c..9f16fa3a05ffb1854a69ab19d4094696c8bb3821 100644 (file)
@@ -43,6 +43,18 @@ MPEValue MPEValue::from14BitInt (int value) noexcept
     return { value };\r
 }\r
 \r
+MPEValue MPEValue::fromUnsignedFloat (float value) noexcept\r
+{\r
+    jassert (0.0f <= value && value <= 1.0f);\r
+    return { roundToInt (value * 16383.0f) };\r
+}\r
+\r
+MPEValue MPEValue::fromSignedFloat (float value) noexcept\r
+{\r
+    jassert (-1.0f <= value && value <= 1.0f);\r
+    return { roundToInt (((value + 1.0f) * 16383.0f) / 2.0f) };\r
+}\r
+\r
 //==============================================================================\r
 MPEValue MPEValue::minValue() noexcept      { return MPEValue::from7BitInt (0); }\r
 MPEValue MPEValue::centreValue() noexcept   { return MPEValue::from7BitInt (64); }\r
@@ -121,26 +133,34 @@ public:
 \r
         beginTest ("zero/minimum value");\r
         {\r
-            expectValuesConsistent (MPEValue::from7BitInt (0),  0, 0, -1.0f, 0.0f);\r
-            expectValuesConsistent (MPEValue::from14BitInt (0), 0, 0, -1.0f, 0.0f);\r
+            expectValuesConsistent (MPEValue::from7BitInt       (0),     0, 0, -1.0f, 0.0f);\r
+            expectValuesConsistent (MPEValue::from14BitInt      (0),     0, 0, -1.0f, 0.0f);\r
+            expectValuesConsistent (MPEValue::fromUnsignedFloat (0.0f),  0, 0, -1.0f, 0.0f);\r
+            expectValuesConsistent (MPEValue::fromSignedFloat   (-1.0f), 0, 0, -1.0f, 0.0f);\r
         }\r
 \r
         beginTest ("maximum value");\r
         {\r
-            expectValuesConsistent (MPEValue::from7BitInt (127),    127, 16383, 1.0f, 1.0f);\r
-            expectValuesConsistent (MPEValue::from14BitInt (16383), 127, 16383, 1.0f, 1.0f);\r
+            expectValuesConsistent (MPEValue::from7BitInt       (127),   127, 16383, 1.0f, 1.0f);\r
+            expectValuesConsistent (MPEValue::from14BitInt      (16383), 127, 16383, 1.0f, 1.0f);\r
+            expectValuesConsistent (MPEValue::fromUnsignedFloat (1.0f),  127, 16383, 1.0f, 1.0f);\r
+            expectValuesConsistent (MPEValue::fromSignedFloat   (1.0f),  127, 16383, 1.0f, 1.0f);\r
         }\r
 \r
         beginTest ("centre value");\r
         {\r
-            expectValuesConsistent (MPEValue::from7BitInt (64),    64, 8192, 0.0f, 0.5f);\r
-            expectValuesConsistent (MPEValue::from14BitInt (8192), 64, 8192, 0.0f, 0.5f);\r
+            expectValuesConsistent (MPEValue::from7BitInt       (64),   64, 8192, 0.0f, 0.5f);\r
+            expectValuesConsistent (MPEValue::from14BitInt      (8192), 64, 8192, 0.0f, 0.5f);\r
+            expectValuesConsistent (MPEValue::fromUnsignedFloat (0.5f), 64, 8192, 0.0f, 0.5f);\r
+            expectValuesConsistent (MPEValue::fromSignedFloat   (0.0f), 64, 8192, 0.0f, 0.5f);\r
         }\r
 \r
         beginTest ("value halfway between min and centre");\r
         {\r
-            expectValuesConsistent (MPEValue::from7BitInt (32),    32, 4096, -0.5f, 0.25f);\r
-            expectValuesConsistent (MPEValue::from14BitInt (4096), 32, 4096, -0.5f, 0.25f);\r
+            expectValuesConsistent (MPEValue::from7BitInt       (32),    32, 4096, -0.5f, 0.25f);\r
+            expectValuesConsistent (MPEValue::from14BitInt      (4096),  32, 4096, -0.5f, 0.25f);\r
+            expectValuesConsistent (MPEValue::fromUnsignedFloat (0.25f), 32, 4096, -0.5f, 0.25f);\r
+            expectValuesConsistent (MPEValue::fromSignedFloat   (-0.5f), 32, 4096, -0.5f, 0.25f);\r
         }\r
     }\r
 \r
index cadad5e208431f0e1869547531c5f1b508b13f51..5c05ca003069998bfe9fa06b758f416bce0702c2 100644 (file)
@@ -53,6 +53,12 @@ public:
     */\r
     static MPEValue from14BitInt (int value) noexcept;\r
 \r
+    /** Constructs an MPEValue from a float between 0.0f and 1.0f. */\r
+    static MPEValue fromUnsignedFloat (float value) noexcept;\r
+\r
+    /** Constructs an MPEValue from a float between -1.0f and 1.0f. */\r
+    static MPEValue fromSignedFloat (float value) noexcept;\r
+\r
     /** Constructs an MPEValue corresponding to the centre value. */\r
     static MPEValue centreValue() noexcept;\r
 \r
index 0d43464eaa75287e016fb11ff403565ad12b2ef4..07d41a4c0356f3586f231f9f917fb52fa7ecaac5 100644 (file)
 namespace juce\r
 {\r
 \r
-MPEZoneLayout::MPEZoneLayout() noexcept {}\r
+MPEZoneLayout::MPEZoneLayout (MPEZone lower, MPEZone upper)\r
+    : lowerZone (lower), upperZone (upper)\r
+{\r
+}\r
+\r
+MPEZoneLayout::MPEZoneLayout (MPEZone zone)\r
+    : lowerZone (zone.isLowerZone() ? zone : MPEZone()),\r
+      upperZone (! zone.isLowerZone() ? zone : MPEZone())\r
+{\r
+}\r
+\r
 \r
 MPEZoneLayout::MPEZoneLayout (const MPEZoneLayout& other)\r
     : lowerZone (other.lowerZone),\r
@@ -54,9 +64,9 @@ void MPEZoneLayout::setZone (bool isLower, int numMemberChannels, int perNotePit
     checkAndLimitZoneParameters (0, 96,  masterPitchbendRange);\r
 \r
     if (isLower)\r
-        lowerZone = { true, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
+        lowerZone = { MPEZone::Type::lower, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
     else\r
-        upperZone = { false, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
+        upperZone = { MPEZone::Type::upper, numMemberChannels, perNotePitchbendRange, masterPitchbendRange };\r
 \r
     if (numMemberChannels > 0)\r
     {\r
@@ -86,8 +96,8 @@ void MPEZoneLayout::setUpperZone (int numMemberChannels, int perNotePitchbendRan
 \r
 void MPEZoneLayout::clearAllZones()\r
 {\r
-    lowerZone = { true, 0 };\r
-    upperZone = { false, 0 };\r
+    lowerZone = { MPEZone::Type::lower, 0 };\r
+    upperZone = { MPEZone::Type::upper, 0 };\r
 \r
     sendLayoutChangeMessage();\r
 }\r
@@ -128,7 +138,7 @@ void MPEZoneLayout::processZoneLayoutRpnMessage (MidiRPNMessage rpn)
     }\r
 }\r
 \r
-void MPEZoneLayout::updateMasterPitchbend (Zone& zone, int value)\r
+void MPEZoneLayout::updateMasterPitchbend (MPEZone& zone, int value)\r
 {\r
     if (zone.masterPitchbendRange != value)\r
     {\r
@@ -138,7 +148,7 @@ void MPEZoneLayout::updateMasterPitchbend (Zone& zone, int value)
     }\r
 }\r
 \r
-void MPEZoneLayout::updatePerNotePitchbendRange (Zone& zone, int value)\r
+void MPEZoneLayout::updatePerNotePitchbendRange (MPEZone& zone, int value)\r
 {\r
     if (zone.perNotePitchbendRange != value)\r
     {\r
index e378456f8f951b6049b7e256b29a30063fb2c3a7..3da24ce7308e7dc8d9f929cfbb13b211d2bd65bd 100644 (file)
 namespace juce\r
 {\r
 \r
+//==============================================================================\r
+/**\r
+    This struct represents an MPE zone.\r
+\r
+    It can either be a lower or an upper zone, where:\r
+      - A lower zone encompasses master channel 1 and an arbitrary number of ascending\r
+        MIDI channels, increasing from channel 2.\r
+      - An upper zone encompasses master channel 16 and an arbitrary number of descending\r
+        MIDI channels, decreasing from channel 15.\r
+\r
+    It also defines a pitchbend range (in semitones) to be applied for per-note pitchbends and\r
+    master pitchbends, respectively.\r
+*/\r
+struct MPEZone\r
+{\r
+    enum class Type { lower, upper };\r
+\r
+    MPEZone() = default;\r
+    MPEZone (const MPEZone& other) = default;\r
+\r
+    MPEZone (Type type, int memberChannels = 0, int perNotePitchbend = 48, int masterPitchbend = 2)\r
+        : zoneType (type),\r
+          numMemberChannels (memberChannels),\r
+          perNotePitchbendRange (perNotePitchbend),\r
+          masterPitchbendRange (masterPitchbend)\r
+    {}\r
+\r
+    bool isLowerZone() const noexcept             { return zoneType == Type::lower; }\r
+    bool isUpperZone() const noexcept             { return zoneType == Type::upper; }\r
+\r
+    bool isActive() const noexcept                { return numMemberChannels > 0; }\r
+\r
+    int getMasterChannel() const noexcept         { return isLowerZone() ? lowerZoneMasterChannel : upperZoneMasterChannel; }\r
+    int getFirstMemberChannel() const noexcept    { return isLowerZone() ? lowerZoneMasterChannel + 1 : upperZoneMasterChannel - 1; }\r
+    int getLastMemberChannel() const noexcept     { return isLowerZone() ? (lowerZoneMasterChannel + numMemberChannels)\r
+                                                                         : (upperZoneMasterChannel - numMemberChannels); }\r
+\r
+    bool isUsingChannelAsMemberChannel (int channel) const noexcept\r
+    {\r
+        return isLowerZone() ? (lowerZoneMasterChannel < channel && channel <= getLastMemberChannel())\r
+                             : (channel < upperZoneMasterChannel && getLastMemberChannel() <= channel);\r
+    }\r
+\r
+    bool isUsing (int channel) const noexcept\r
+    {\r
+        return isUsingChannelAsMemberChannel (channel) || channel == getMasterChannel();\r
+    }\r
+\r
+    static auto tie (const MPEZone& z)\r
+    {\r
+        return std::tie (z.zoneType,\r
+                         z.numMemberChannels,\r
+                         z.perNotePitchbendRange,\r
+                         z.masterPitchbendRange);\r
+    }\r
+\r
+    bool operator== (const MPEZone& other) const\r
+    {\r
+        return tie (*this) == tie (other);\r
+    }\r
+\r
+    bool operator!= (const MPEZone& other) const\r
+    {\r
+        return tie (*this) != tie (other);\r
+    }\r
+\r
+    //==============================================================================\r
+    static constexpr int lowerZoneMasterChannel = 1,\r
+                         upperZoneMasterChannel = 16;\r
+\r
+    Type zoneType = Type::lower;\r
+\r
+    int numMemberChannels     = 0;\r
+    int perNotePitchbendRange = 48;\r
+    int masterPitchbendRange  = 2;\r
+};\r
+\r
 //==============================================================================\r
 /**\r
     This class represents the current MPE zone layout of a device capable of handling MPE.\r
@@ -44,89 +121,28 @@ namespace juce
 class JUCE_API  MPEZoneLayout\r
 {\r
 public:\r
-    /** Default constructor.\r
+    //==============================================================================\r
+    /** Creates a layout with inactive upper and lower zones. */\r
+    MPEZoneLayout() = default;\r
 \r
-        This will create a layout with inactive lower and upper zones, representing\r
-        a device with MPE mode disabled.\r
+    /** Creates a layout with the given upper and lower zones. */\r
+    MPEZoneLayout (MPEZone lower, MPEZone upper);\r
 \r
-        You can set the lower or upper MPE zones using the setZone() method.\r
+    /** Creates a layout with a single upper or lower zone, leaving the other zone uninitialised. */\r
+    MPEZoneLayout (MPEZone singleZone);\r
 \r
-        @see setZone\r
-    */\r
-    MPEZoneLayout() noexcept;\r
-\r
-    /** Copy constuctor.\r
-        This will not copy the listeners registered to the MPEZoneLayout.\r
-    */\r
     MPEZoneLayout (const MPEZoneLayout& other);\r
-\r
-    /** Copy assignment operator.\r
-        This will not copy the listeners registered to the MPEZoneLayout.\r
-    */\r
     MPEZoneLayout& operator= (const MPEZoneLayout& other);\r
 \r
-    //==============================================================================\r
-    /**\r
-        This struct represents an MPE zone.\r
-\r
-        It can either be a lower or an upper zone, where:\r
-          - A lower zone encompasses master channel 1 and an arbitrary number of ascending\r
-            MIDI channels, increasing from channel 2.\r
-          - An upper zone encompasses master channel 16 and an arbitrary number of descending\r
-            MIDI channels, decreasing from channel 15.\r
-\r
-        It also defines a pitchbend range (in semitones) to be applied for per-note pitchbends and\r
-        master pitchbends, respectively.\r
-    */\r
-    struct Zone\r
-    {\r
-        Zone (const Zone& other) = default;\r
-\r
-        bool isLowerZone() const noexcept             { return lowerZone; }\r
-        bool isUpperZone() const noexcept             { return ! lowerZone; }\r
-\r
-        bool isActive() const noexcept                { return numMemberChannels > 0; }\r
-\r
-        int getMasterChannel() const noexcept         { return lowerZone ? 1 : 16; }\r
-        int getFirstMemberChannel() const noexcept    { return lowerZone ? 2 : 15; }\r
-        int getLastMemberChannel() const noexcept     { return lowerZone ? (1 + numMemberChannels)\r
-                                                                         : (16 - numMemberChannels); }\r
-\r
-        bool isUsingChannelAsMemberChannel (int channel) const noexcept\r
-        {\r
-            return lowerZone ? (channel > 1 && channel <= 1 + numMemberChannels)\r
-                             : (channel < 16 && channel >= 16 - numMemberChannels);\r
-        }\r
-\r
-        bool isUsing (int channel) const noexcept\r
-        {\r
-            return isUsingChannelAsMemberChannel (channel) || channel == getMasterChannel();\r
-        }\r
+    bool operator== (const MPEZoneLayout& other) const { return lowerZone == other.lowerZone && upperZone == other.upperZone; }\r
+    bool operator!= (const MPEZoneLayout& other) const { return ! operator== (other); }\r
 \r
-        bool operator== (const Zone& other) const noexcept    { return lowerZone == other.lowerZone\r
-                                                                    && numMemberChannels == other.numMemberChannels\r
-                                                                    && perNotePitchbendRange == other.perNotePitchbendRange\r
-                                                                    && masterPitchbendRange == other.masterPitchbendRange; }\r
-\r
-        bool operator!= (const Zone& other) const noexcept    { return ! operator== (other); }\r
-\r
-        int numMemberChannels;\r
-        int perNotePitchbendRange;\r
-        int masterPitchbendRange;\r
-\r
-    private:\r
-        friend class MPEZoneLayout;\r
-\r
-        Zone (bool lower, int memberChans = 0, int perNotePb = 48, int masterPb = 2) noexcept\r
-            : numMemberChannels (memberChans),\r
-              perNotePitchbendRange (perNotePb),\r
-              masterPitchbendRange (masterPb),\r
-              lowerZone (lower)\r
-        {\r
-        }\r
+    //==============================================================================\r
+    /** Returns a struct representing the lower MPE zone. */\r
+    MPEZone getLowerZone() const noexcept    { return lowerZone; }\r
 \r
-        bool lowerZone;\r
-    };\r
+    /** Returns a struct representing the upper MPE zone. */\r
+    MPEZone getUpperZone() const noexcept    { return upperZone; }\r
 \r
     /** Sets the lower zone of this layout. */\r
     void setLowerZone (int numMemberChannels = 0,\r
@@ -138,17 +154,14 @@ public:
                        int perNotePitchbendRange = 48,\r
                        int masterPitchbendRange = 2) noexcept;\r
 \r
-    /** Returns a struct representing the lower MPE zone. */\r
-    const Zone getLowerZone() const noexcept    { return lowerZone; }\r
-\r
-    /** Returns a struct representing the upper MPE zone. */\r
-    const Zone getUpperZone() const noexcept    { return upperZone; }\r
-\r
     /** Clears the lower and upper zones of this layout, making them both inactive\r
         and disabling MPE mode.\r
     */\r
     void clearAllZones();\r
 \r
+    /** Returns true if either of the zones are active. */\r
+    bool isActive() const  { return lowerZone.isActive() || upperZone.isActive(); }\r
+\r
     //==============================================================================\r
     /** Pass incoming MIDI messages to an object of this class if you want the\r
         zone layout to properly react to MPE RPN messages like an\r
@@ -200,10 +213,14 @@ public:
     /** Removes a listener. */\r
     void removeListener (Listener* const listenerToRemove) noexcept;\r
 \r
+   #ifndef DOXYGEN\r
+    using Zone = MPEZone;\r
+   #endif\r
+\r
 private:\r
     //==============================================================================\r
-    Zone lowerZone { true, 0 };\r
-    Zone upperZone { false, 0 };\r
+    MPEZone lowerZone { MPEZone::Type::lower, 0 };\r
+    MPEZone upperZone { MPEZone::Type::upper, 0 };\r
 \r
     MidiRPNDetector rpnDetector;\r
     ListenerList<Listener> listeners;\r
@@ -215,8 +232,8 @@ private:
     void processZoneLayoutRpnMessage (MidiRPNMessage);\r
     void processPitchbendRangeRpnMessage (MidiRPNMessage);\r
 \r
-    void updateMasterPitchbend (Zone&, int);\r
-    void updatePerNotePitchbendRange (Zone&, int);\r
+    void updateMasterPitchbend (MPEZone&, int);\r
+    void updatePerNotePitchbendRange (MPEZone&, int);\r
 \r
     void sendLayoutChangeMessage();\r
     void checkAndLimitZoneParameters (int, int, int&) noexcept;\r
index 3ffbc3ca25b34190fec89c4c722516e359a3e4b5..c6b87f32cc5a09b8cae5271a9829b55b28049a70 100644 (file)
@@ -715,11 +715,7 @@ String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& newSetup
         currentDeviceType = currentAudioDevice->getTypeName();\r
 \r
         currentAudioDevice->start (callbackHandler.get());\r
-\r
-        currentSetup.sampleRate     = currentAudioDevice->getCurrentSampleRate();\r
-        currentSetup.bufferSize     = currentAudioDevice->getCurrentBufferSizeSamples();\r
-        currentSetup.inputChannels  = currentAudioDevice->getActiveInputChannels();\r
-        currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels();\r
+        updateCurrentSetup();\r
 \r
         for (int i = 0; i < availableDeviceTypes.size(); ++i)\r
             if (availableDeviceTypes.getUnchecked (i)->getTypeName() == currentDeviceType)\r
@@ -965,6 +961,8 @@ void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device
     loadMeasurer.reset (device->getCurrentSampleRate(),\r
                         device->getCurrentBufferSizeSamples());\r
 \r
+    updateCurrentSetup();\r
+\r
     {\r
         const ScopedLock sl (audioCallbackLock);\r
 \r
@@ -972,7 +970,6 @@ void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device
             callbacks.getUnchecked(i)->audioDeviceAboutToStart (device);\r
     }\r
 \r
-    updateCurrentSetup();\r
     sendChangeMessage();\r
 }\r
 \r
@@ -1444,6 +1441,48 @@ public:
             enableInputChannels                     (manager);\r
             closeDeviceByRequestingEmptyNames       (manager);\r
         }\r
+\r
+        beginTest ("AudioDeviceManager updates its current settings before notifying callbacks when device restarts itself");\r
+        {\r
+            AudioDeviceManager manager;\r
+            auto deviceType = std::make_unique<MockDeviceType> ("foo",\r
+                                                                StringArray { "foo in a", "foo in b" },\r
+                                                                StringArray { "foo out a", "foo out b" });\r
+            auto* ptr = deviceType.get();\r
+            manager.addAudioDeviceType (std::move (deviceType));\r
+\r
+            AudioDeviceManager::AudioDeviceSetup setup;\r
+            setup.sampleRate = 48000.0;\r
+            setup.bufferSize = 256;\r
+            setup.inputDeviceName = "foo in a";\r
+            setup.outputDeviceName = "foo out a";\r
+            setup.useDefaultInputChannels = true;\r
+            setup.useDefaultOutputChannels = true;\r
+            manager.setAudioDeviceSetup (setup, true);\r
+\r
+            const auto currentSetup = manager.getAudioDeviceSetup();\r
+            expectEquals (currentSetup.sampleRate, setup.sampleRate);\r
+            expectEquals (currentSetup.bufferSize, setup.bufferSize);\r
+\r
+            MockCallback callback;\r
+            manager.addAudioCallback (&callback);\r
+\r
+            constexpr auto newSr = 10000.0;\r
+            constexpr auto newBs = 1024;\r
+            auto numCalls = 0;\r
+\r
+            // Compilers disagree about whether newSr and newBs need to be captured\r
+            callback.aboutToStart = [&]\r
+            {\r
+                ++numCalls;\r
+                const auto current = manager.getAudioDeviceSetup();\r
+                expectEquals (current.sampleRate, newSr);\r
+                expectEquals (current.bufferSize, newBs);\r
+            };\r
+\r
+            ptr->restartDevices (newSr, newBs);\r
+            expectEquals (numCalls, 1);\r
+        }\r
     }\r
 \r
 private:\r
@@ -1608,11 +1647,26 @@ private:
     const String mockBName = "mockB";\r
     const String emptyName = "empty";\r
 \r
-    class MockDevice : public AudioIODevice\r
+    struct Restartable\r
+    {\r
+        virtual ~Restartable() = default;\r
+        virtual void restart (double newSr, int newBs) = 0;\r
+    };\r
+\r
+    class MockDevice : public AudioIODevice,\r
+                       private Restartable\r
     {\r
     public:\r
-        MockDevice (String typeNameIn, String outNameIn, String inNameIn)\r
-            : AudioIODevice ("mock", typeNameIn), outName (outNameIn), inName (inNameIn) {}\r
+        MockDevice (ListenerList<Restartable>& l, String typeNameIn, String outNameIn, String inNameIn)\r
+            : AudioIODevice ("mock", typeNameIn), listeners (l), outName (outNameIn), inName (inNameIn)\r
+        {\r
+            listeners.add (this);\r
+        }\r
+\r
+        ~MockDevice() override\r
+        {\r
+            listeners.remove (this);\r
+        }\r
 \r
         StringArray getOutputChannelNames() override { return { "o1", "o2", "o3" }; }\r
         StringArray getInputChannelNames()  override { return { "i1", "i2", "i3" }; }\r
@@ -1634,8 +1688,19 @@ private:
         void close() override { on = false; }\r
         bool isOpen() override { return on; }\r
 \r
-        void start (AudioIODeviceCallback*) override { playing = true; }\r
-        void stop() override { playing = false; }\r
+        void start (AudioIODeviceCallback* c) override\r
+        {\r
+            callback = c;\r
+            callback->audioDeviceAboutToStart (this);\r
+            playing = true;\r
+        }\r
+\r
+        void stop() override\r
+        {\r
+            playing = false;\r
+            callback->audioDeviceStopped();\r
+        }\r
+\r
         bool isPlaying() override { return playing; }\r
 \r
         String getLastError() override { return {}; }\r
@@ -1650,6 +1715,16 @@ private:
         int getInputLatencyInSamples() override { return 0; }\r
 \r
     private:\r
+        void restart (double newSr, int newBs) override\r
+        {\r
+            stop();\r
+            close();\r
+            open (inChannels, outChannels, newSr, newBs);\r
+            start (callback);\r
+        }\r
+\r
+        ListenerList<Restartable>& listeners;\r
+        AudioIODeviceCallback* callback = nullptr;\r
         String outName, inName;\r
         BigInteger outChannels, inChannels;\r
         double sampleRate = 0.0;\r
@@ -1668,6 +1743,12 @@ private:
               inNames (std::move (inputNames)),\r
               outNames (std::move (outputNames)) {}\r
 \r
+        ~MockDeviceType() override\r
+        {\r
+            // A Device outlived its DeviceType!\r
+            jassert (listeners.isEmpty());\r
+        }\r
+\r
         void scanForDevices() override {}\r
 \r
         StringArray getDeviceNames (bool isInput) const override\r
@@ -1687,15 +1768,37 @@ private:
         AudioIODevice* createDevice (const String& outputName, const String& inputName) override\r
         {\r
             if (inNames.contains (inputName) || outNames.contains (outputName))\r
-                return new MockDevice (getTypeName(), outputName, inputName);\r
+                return new MockDevice (listeners, getTypeName(), outputName, inputName);\r
 \r
             return nullptr;\r
         }\r
 \r
+        // Call this to emulate the device restarting itself with new settings.\r
+        // This might happen e.g. when a user changes the ASIO settings.\r
+        void restartDevices (double newSr, int newBs)\r
+        {\r
+            listeners.call ([&] (auto& l) { return l.restart (newSr, newBs); });\r
+        }\r
+\r
     private:\r
         const StringArray& getNames (bool isInput) const { return isInput ? inNames : outNames; }\r
 \r
         const StringArray inNames, outNames;\r
+        ListenerList<Restartable> listeners;\r
+    };\r
+\r
+    class MockCallback : public AudioIODeviceCallback\r
+    {\r
+    public:\r
+        std::function<void()> callback;\r
+        std::function<void()> aboutToStart;\r
+        std::function<void()> stopped;\r
+        std::function<void()> error;\r
+\r
+        void audioDeviceIOCallback (const float**, int, float**, int, int) override { NullCheckedInvocation::invoke (callback); }\r
+        void audioDeviceAboutToStart (AudioIODevice*)                      override { NullCheckedInvocation::invoke (aboutToStart); }\r
+        void audioDeviceStopped()                                          override { NullCheckedInvocation::invoke (stopped); }\r
+        void audioDeviceError (const String&)                              override { NullCheckedInvocation::invoke (error); }\r
     };\r
 \r
     void initialiseManager (AudioDeviceManager& manager)\r
index 86d32336788ba428fd2a47a783a8a61ab6a33652..96179a76fdafaddcb7cdd66f3687c50a0c20fcb3 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_devices\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 323fe13e40024c6bef640b5b631aec9c8315d87d..1b010c3e866de9ab3b1e510634d97c901be27b2a 100644 (file)
@@ -50,7 +50,7 @@ namespace
 \r
 static void getDeviceSampleRates (snd_pcm_t* handle, Array<double>& rates)\r
 {\r
-    const int ratesToTry[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 };\r
+    const int ratesToTry[] = { 22050, 24000, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 };\r
 \r
     snd_pcm_hw_params_t* hwParams;\r
     snd_pcm_hw_params_alloca (&hwParams);\r
index 205d61f65e58532fd03a5a7662a6171a847100cf..8cb3f367f7cb358f640ab80e0cdb1f0e99b1ab41 100644 (file)
@@ -294,7 +294,7 @@ public:
 \r
             if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges)))\r
             {\r
-                for (auto r : { 8000, 11025, 16000, 22050, 32000,\r
+                for (auto r : { 8000, 11025, 16000, 22050, 24000, 32000,\r
                                 44100, 48000, 88200, 96000, 176400,\r
                                 192000, 352800, 384000, 705600, 768000 })\r
                 {\r
@@ -683,10 +683,14 @@ public:
     {\r
         const ScopedLock sl (callbackLock);\r
 \r
-        if (! started)\r
+        if (callback == nullptr && callbackToNotify != nullptr)\r
         {\r
-            callback = nullptr;\r
+            callback = callbackToNotify;\r
+            callback->audioDeviceAboutToStart (&owner);\r
+        }\r
 \r
+        if (! started)\r
+        {\r
             if (deviceID != 0)\r
             {\r
                 if (OK (AudioDeviceCreateIOProcID (deviceID, audioIOProc, this, &audioProcID)))\r
@@ -702,14 +706,6 @@ public:
                     }\r
                 }\r
             }\r
-\r
-            if (started)\r
-            {\r
-                callback = callbackToNotify;\r
-\r
-                if (callback != nullptr)\r
-                    callback->audioDeviceAboutToStart (&owner);\r
-            }\r
         }\r
 \r
         playing = started && callback != nullptr;\r
index 6ac705e02132a348fc8e8c56605d691c73febc8a..904c7f4baf67c19b25da844ce229be3ee8214841 100644 (file)
@@ -350,7 +350,7 @@ public:
 \r
         if (asioObject != nullptr)\r
         {\r
-            for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
+            for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000,\r
                                44100, 48000, 88200, 96000, 176400,\r
                                192000, 352800, 384000, 705600, 768000 })\r
                 if (asioObject->canSampleRate ((double) rate) == 0)\r
index 2ef57d8a37edfcdf4bf79dfe297c06dc5157caac..ae927e08c6af903354c2e67d8440b728faaedcff 100644 (file)
@@ -336,7 +336,28 @@ JUCE_IUNKNOWNCLASS (IAudioSessionControl, "F4B1A599-7266-4319-A8CA-E70ACB11E8CD"
     JUCE_COMCALL UnregisterAudioSessionNotification (IAudioSessionEvents*) = 0;\r
 };\r
 \r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::IPropertyStore,        0x886d8eeb, 0x8cf2, 0x4446, 0x8d, 0x02, 0xcd, 0xba, 0x1d, 0xbd, 0xcf, 0x99)\r
+__CRT_UUID_DECL (juce::IMMDevice,             0xD666063F, 0x1587, 0x4E43, 0x81, 0xF1, 0xB9, 0x48, 0xE8, 0x07, 0x36, 0x3F)\r
+__CRT_UUID_DECL (juce::IMMEndpoint,           0x1BE09788, 0x6894, 0x4089, 0x85, 0x86, 0x9A, 0x2A, 0x6C, 0x26, 0x5A, 0xC5)\r
+__CRT_UUID_DECL (juce::IMMNotificationClient, 0x7991EEC9, 0x7E89, 0x4D85, 0x83, 0x90, 0x6C, 0x70, 0x3C, 0xEC, 0x60, 0xC0)\r
+__CRT_UUID_DECL (juce::IMMDeviceEnumerator,   0xA95664D2, 0x9614, 0x4F35, 0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6)\r
+__CRT_UUID_DECL (juce::MMDeviceEnumerator,    0xBCDE0395, 0xE52F, 0x467C, 0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E)\r
+__CRT_UUID_DECL (juce::IAudioClient,          0x1CB9AD4C, 0xDBFA, 0x4c32, 0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2)\r
+__CRT_UUID_DECL (juce::IAudioClient2,         0x726778CD, 0xF60A, 0x4eda, 0x82, 0xDE, 0xE4, 0x76, 0x10, 0xCD, 0x78, 0xAA)\r
+__CRT_UUID_DECL (juce::IAudioClient3,         0x1CB9AD4C, 0xDBFA, 0x4c32, 0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2)\r
+__CRT_UUID_DECL (juce::IAudioCaptureClient,   0xC8ADBD64, 0xE71E, 0x48a0, 0xA4, 0xDE, 0x18, 0x5C, 0x39, 0x5C, 0xD3, 0x17)\r
+__CRT_UUID_DECL (juce::IAudioRenderClient,    0xF294ACFC, 0x3146, 0x4483, 0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2)\r
+__CRT_UUID_DECL (juce::IAudioEndpointVolume,  0x5CDF2C82, 0x841E, 0x4546, 0x97, 0x22, 0x0C, 0xF7, 0x40, 0x78, 0x22, 0x9A)\r
+__CRT_UUID_DECL (juce::IAudioSessionEvents,   0x24918ACC, 0x64B3, 0x37C1, 0x8C, 0xA9, 0x74, 0xA6, 0x6E, 0x99, 0x57, 0xA8)\r
+__CRT_UUID_DECL (juce::IAudioSessionControl,  0xF4B1A599, 0x7266, 0x4319, 0xA8, 0xCA, 0xE7, 0x0A, 0xCB, 0x11, 0xE8, 0xCD)\r
+#endif\r
+\r
 //==============================================================================\r
+namespace juce\r
+{\r
 namespace WasapiClasses\r
 {\r
 \r
@@ -655,7 +676,7 @@ private:
 \r
     void querySupportedSampleRates (WAVEFORMATEXTENSIBLE format, ComSmartPtr<IAudioClient>& audioClient)\r
     {\r
-        for (auto rate : { 8000, 11025, 16000, 22050, 32000,\r
+        for (auto rate : { 8000, 11025, 16000, 22050, 24000, 32000,\r
                            44100, 48000, 88200, 96000, 176400,\r
                            192000, 352800, 384000, 705600, 768000 })\r
         {\r
index eddc9d3cf593453317a646ceb4bfc2b82c9761b0..8414d5c87311034cc975239df71c711de3617c99 100644 (file)
 namespace juce\r
 {\r
 \r
+using StringMap = std::unordered_map<String, String>;\r
+\r
+static auto toMap (const StringPairArray& array)\r
+{\r
+    StringMap result;\r
+\r
+    for (auto i = 0; i < array.size(); ++i)\r
+        result[array.getAllKeys()[i]] = array.getAllValues()[i];\r
+\r
+    return result;\r
+}\r
+\r
+static auto getValueWithDefault (const StringMap& m, const String& key, const String& fallback = {})\r
+{\r
+    const auto iter = m.find (key);\r
+    return iter != m.cend() ? iter->second : fallback;\r
+}\r
+\r
 static const char* const wavFormatName = "WAV file";\r
 \r
 //==============================================================================\r
@@ -177,43 +195,42 @@ namespace WavFileHelpers
         uint8 reserved[190];\r
         char codingHistory[1];\r
 \r
-        void copyTo (StringPairArray& values, const int totalSize) const\r
+        void copyTo (StringMap& values, const int totalSize) const\r
         {\r
-            values.set (WavAudioFormat::bwavDescription,     String::fromUTF8 (description,     sizeof (description)));\r
-            values.set (WavAudioFormat::bwavOriginator,      String::fromUTF8 (originator,      sizeof (originator)));\r
-            values.set (WavAudioFormat::bwavOriginatorRef,   String::fromUTF8 (originatorRef,   sizeof (originatorRef)));\r
-            values.set (WavAudioFormat::bwavOriginationDate, String::fromUTF8 (originationDate, sizeof (originationDate)));\r
-            values.set (WavAudioFormat::bwavOriginationTime, String::fromUTF8 (originationTime, sizeof (originationTime)));\r
+            values[WavAudioFormat::bwavDescription]     = String::fromUTF8 (description,     sizeof (description));\r
+            values[WavAudioFormat::bwavOriginator]      = String::fromUTF8 (originator,      sizeof (originator));\r
+            values[WavAudioFormat::bwavOriginatorRef]   = String::fromUTF8 (originatorRef,   sizeof (originatorRef));\r
+            values[WavAudioFormat::bwavOriginationDate] = String::fromUTF8 (originationDate, sizeof (originationDate));\r
+            values[WavAudioFormat::bwavOriginationTime] = String::fromUTF8 (originationTime, sizeof (originationTime));\r
 \r
             auto timeLow  = ByteOrder::swapIfBigEndian (timeRefLow);\r
             auto timeHigh = ByteOrder::swapIfBigEndian (timeRefHigh);\r
             auto time = (((int64) timeHigh) << 32) + timeLow;\r
 \r
-            values.set (WavAudioFormat::bwavTimeReference, String (time));\r
-            values.set (WavAudioFormat::bwavCodingHistory,\r
-                        String::fromUTF8 (codingHistory, totalSize - (int) offsetof (BWAVChunk, codingHistory)));\r
+            values[WavAudioFormat::bwavTimeReference] = String (time);\r
+            values[WavAudioFormat::bwavCodingHistory] = String::fromUTF8 (codingHistory, totalSize - (int) offsetof (BWAVChunk, codingHistory));\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
-            MemoryBlock data (roundUpSize (sizeof (BWAVChunk) + values[WavAudioFormat::bwavCodingHistory].getNumBytesAsUTF8()));\r
+            MemoryBlock data (roundUpSize (sizeof (BWAVChunk) + getValueWithDefault (values, WavAudioFormat::bwavCodingHistory).getNumBytesAsUTF8()));\r
             data.fillWith (0);\r
 \r
             auto* b = (BWAVChunk*) data.getData();\r
 \r
             // Allow these calls to overwrite an extra byte at the end, which is fine as long\r
-            // as they get called in the right order..\r
-            values[WavAudioFormat::bwavDescription]    .copyToUTF8 (b->description, 257);\r
-            values[WavAudioFormat::bwavOriginator]     .copyToUTF8 (b->originator, 33);\r
-            values[WavAudioFormat::bwavOriginatorRef]  .copyToUTF8 (b->originatorRef, 33);\r
-            values[WavAudioFormat::bwavOriginationDate].copyToUTF8 (b->originationDate, 11);\r
-            values[WavAudioFormat::bwavOriginationTime].copyToUTF8 (b->originationTime, 9);\r
-\r
-            auto time = values[WavAudioFormat::bwavTimeReference].getLargeIntValue();\r
+            // as they get called in the right order.\r
+            getValueWithDefault (values, WavAudioFormat::bwavDescription)    .copyToUTF8 (b->description, 257);\r
+            getValueWithDefault (values, WavAudioFormat::bwavOriginator)     .copyToUTF8 (b->originator, 33);\r
+            getValueWithDefault (values, WavAudioFormat::bwavOriginatorRef)  .copyToUTF8 (b->originatorRef, 33);\r
+            getValueWithDefault (values, WavAudioFormat::bwavOriginationDate).copyToUTF8 (b->originationDate, 11);\r
+            getValueWithDefault (values, WavAudioFormat::bwavOriginationTime).copyToUTF8 (b->originationTime, 9);\r
+\r
+            auto time = getValueWithDefault (values, WavAudioFormat::bwavTimeReference).getLargeIntValue();\r
             b->timeRefLow = ByteOrder::swapIfBigEndian ((uint32) (time & 0xffffffff));\r
             b->timeRefHigh = ByteOrder::swapIfBigEndian ((uint32) (time >> 32));\r
 \r
-            values[WavAudioFormat::bwavCodingHistory].copyToUTF8 (b->codingHistory, 0x7fffffff);\r
+            getValueWithDefault (values, WavAudioFormat::bwavCodingHistory).copyToUTF8 (b->codingHistory, 0x7fffffff);\r
 \r
             if (b->description[0] != 0\r
                 || b->originator[0] != 0\r
@@ -270,17 +287,17 @@ namespace WavFileHelpers
         SampleLoop loops[1];\r
 \r
         template <typename NameType>\r
-        static void setValue (StringPairArray& values, NameType name, uint32 val)\r
+        static void setValue (StringMap& values, NameType name, uint32 val)\r
         {\r
-            values.set (name, String (ByteOrder::swapIfBigEndian (val)));\r
+            values[name] = String (ByteOrder::swapIfBigEndian (val));\r
         }\r
 \r
-        static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val)\r
+        static void setValue (StringMap& values, int prefix, const char* name, uint32 val)\r
         {\r
             setValue (values, "Loop" + String (prefix) + name, val);\r
         }\r
 \r
-        void copyTo (StringPairArray& values, const int totalSize) const\r
+        void copyTo (StringMap& values, const int totalSize) const\r
         {\r
             setValue (values, "Manufacturer",      manufacturer);\r
             setValue (values, "Product",           product);\r
@@ -307,20 +324,20 @@ namespace WavFileHelpers
         }\r
 \r
         template <typename NameType>\r
-        static uint32 getValue (const StringPairArray& values, NameType name, const char* def)\r
+        static uint32 getValue (const StringMap& values, NameType name, const char* def)\r
         {\r
-            return ByteOrder::swapIfBigEndian ((uint32) values.getValue (name, def).getIntValue());\r
+            return ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, name, def).getIntValue());\r
         }\r
 \r
-        static uint32 getValue (const StringPairArray& values, int prefix, const char* name, const char* def)\r
+        static uint32 getValue (const StringMap& values, int prefix, const char* name, const char* def)\r
         {\r
             return getValue (values, "Loop" + String (prefix) + name, def);\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
             MemoryBlock data;\r
-            auto numLoops = jmin (64, values.getValue ("NumSampleLoops", "0").getIntValue());\r
+            auto numLoops = jmin (64, getValueWithDefault (values, "NumSampleLoops", "0").getIntValue());\r
 \r
             data.setSize (roundUpSize (sizeof (SMPLChunk) + (size_t) (jmax (0, numLoops - 1)) * sizeof (SampleLoop)), true);\r
 \r
@@ -362,12 +379,12 @@ namespace WavFileHelpers
         int8 lowVelocity;\r
         int8 highVelocity;\r
 \r
-        static void setValue (StringPairArray& values, const char* name, int val)\r
+        static void setValue (StringMap& values, const char* name, int val)\r
         {\r
-            values.set (name, String (val));\r
+            values[name] = String (val);\r
         }\r
 \r
-        void copyTo (StringPairArray& values) const\r
+        void copyTo (StringMap& values) const\r
         {\r
             setValue (values, "MidiUnityNote",  baseNote);\r
             setValue (values, "Detune",         detune);\r
@@ -378,17 +395,17 @@ namespace WavFileHelpers
             setValue (values, "HighVelocity",   highVelocity);\r
         }\r
 \r
-        static int8 getValue (const StringPairArray& values, const char* name, const char* def)\r
+        static int8 getValue (const StringMap& values, const char* name, const char* def)\r
         {\r
-            return (int8) values.getValue (name, def).getIntValue();\r
+            return (int8) getValueWithDefault (values, name, def).getIntValue();\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
             MemoryBlock data;\r
-            auto& keys = values.getAllKeys();\r
 \r
-            if (keys.contains ("LowNote", true) && keys.contains ("HighNote", true))\r
+            if (   values.find ("LowNote")  != values.cend()\r
+                && values.find ("HighNote") != values.cend())\r
             {\r
                 data.setSize (8, true);\r
                 auto* inst = static_cast<InstChunk*> (data.getData());\r
@@ -422,14 +439,14 @@ namespace WavFileHelpers
         uint32 numCues;\r
         Cue cues[1];\r
 \r
-        static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val)\r
+        static void setValue (StringMap& values, int prefix, const char* name, uint32 val)\r
         {\r
-            values.set ("Cue" + String (prefix) + name, String (ByteOrder::swapIfBigEndian (val)));\r
+            values["Cue" + String (prefix) + name] = String (ByteOrder::swapIfBigEndian (val));\r
         }\r
 \r
-        void copyTo (StringPairArray& values, const int totalSize) const\r
+        void copyTo (StringMap& values, const int totalSize) const\r
         {\r
-            values.set ("NumCuePoints", String (ByteOrder::swapIfBigEndian (numCues)));\r
+            values["NumCuePoints"] = String (ByteOrder::swapIfBigEndian (numCues));\r
 \r
             for (int i = 0; i < (int) numCues; ++i)\r
             {\r
@@ -445,10 +462,10 @@ namespace WavFileHelpers
             }\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
             MemoryBlock data;\r
-            const int numCues = values.getValue ("NumCuePoints", "0").getIntValue();\r
+            const int numCues = getValueWithDefault (values, "NumCuePoints", "0").getIntValue();\r
 \r
             if (numCues > 0)\r
             {\r
@@ -468,23 +485,23 @@ namespace WavFileHelpers
                 for (int i = 0; i < numCues; ++i)\r
                 {\r
                     auto prefix = "Cue" + String (i);\r
-                    auto identifier = (uint32) values.getValue (prefix + "Identifier", "0").getIntValue();\r
+                    auto identifier = (uint32) getValueWithDefault (values, prefix + "Identifier", "0").getIntValue();\r
 \r
                    #if JUCE_DEBUG\r
                     jassert (! identifiers.contains (identifier));\r
                     identifiers.add (identifier);\r
                    #endif\r
 \r
-                    auto order = values.getValue (prefix + "Order", String (nextOrder)).getIntValue();\r
+                    auto order = getValueWithDefault (values, prefix + "Order", String (nextOrder)).getIntValue();\r
                     nextOrder = jmax (nextOrder, order) + 1;\r
 \r
                     auto& cue = c->cues[i];\r
                     cue.identifier   = ByteOrder::swapIfBigEndian ((uint32) identifier);\r
                     cue.order        = ByteOrder::swapIfBigEndian ((uint32) order);\r
-                    cue.chunkID      = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkID", dataChunkID).getIntValue());\r
-                    cue.chunkStart   = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkStart", "0").getIntValue());\r
-                    cue.blockStart   = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "BlockStart", "0").getIntValue());\r
-                    cue.offset       = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Offset", "0").getIntValue());\r
+                    cue.chunkID      = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "ChunkID", dataChunkID).getIntValue());\r
+                    cue.chunkStart   = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "ChunkStart", "0").getIntValue());\r
+                    cue.blockStart   = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "BlockStart", "0").getIntValue());\r
+                    cue.offset       = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, prefix + "Offset", "0").getIntValue());\r
                 }\r
             }\r
 \r
@@ -496,20 +513,20 @@ namespace WavFileHelpers
     //==============================================================================\r
     namespace ListChunk\r
     {\r
-        static int getValue (const StringPairArray& values, const String& name)\r
+        static int getValue (const StringMap& values, const String& name)\r
         {\r
-            return values.getValue (name, "0").getIntValue();\r
+            return getValueWithDefault (values, name, "0").getIntValue();\r
         }\r
 \r
-        static int getValue (const StringPairArray& values, const String& prefix, const char* name)\r
+        static int getValue (const StringMap& values, const String& prefix, const char* name)\r
         {\r
             return getValue (values, prefix + name);\r
         }\r
 \r
-        static void appendLabelOrNoteChunk (const StringPairArray& values, const String& prefix,\r
+        static void appendLabelOrNoteChunk (const StringMap& values, const String& prefix,\r
                                             const int chunkType, MemoryOutputStream& out)\r
         {\r
-            auto label = values.getValue (prefix + "Text", prefix);\r
+            auto label = getValueWithDefault (values, prefix + "Text", prefix);\r
             auto labelLength = (int) label.getNumBytesAsUTF8() + 1;\r
             auto chunkLength = 4 + labelLength + (labelLength & 1);\r
 \r
@@ -522,9 +539,9 @@ namespace WavFileHelpers
                 out.writeByte (0);\r
         }\r
 \r
-        static void appendExtraChunk (const StringPairArray& values, const String& prefix, MemoryOutputStream& out)\r
+        static void appendExtraChunk (const StringMap& values, const String& prefix, MemoryOutputStream& out)\r
         {\r
-            auto text = values.getValue (prefix + "Text", prefix);\r
+            auto text = getValueWithDefault (values, prefix + "Text", prefix);\r
 \r
             auto textLength = (int) text.getNumBytesAsUTF8() + 1; // include null terminator\r
             auto chunkLength = textLength + 20 + (textLength & 1);\r
@@ -544,7 +561,7 @@ namespace WavFileHelpers
                 out.writeByte (0);\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
             auto numCueLabels  = getValue (values, "NumCueLabels");\r
             auto numCueNotes   = getValue (values, "NumCueNotes");\r
@@ -668,7 +685,7 @@ namespace WavFileHelpers
             return true;\r
         }\r
 \r
-        static void addToMetadata (StringPairArray& values, InputStream& input, int64 chunkEnd)\r
+        static void addToMetadata (StringMap& values, InputStream& input, int64 chunkEnd)\r
         {\r
             while (input.getPosition() < chunkEnd)\r
             {\r
@@ -688,8 +705,8 @@ namespace WavFileHelpers
                         {\r
                             MemoryBlock mb;\r
                             input.readIntoMemoryBlock (mb, (ssize_t) infoLength);\r
-                            values.set (type, String::createStringFromData ((const char*) mb.getData(),\r
-                                                                            (int) mb.getSize()));\r
+                            values[type] = String::createStringFromData ((const char*) mb.getData(),\r
+                                                                         (int) mb.getSize());\r
                             break;\r
                         }\r
                     }\r
@@ -697,9 +714,9 @@ namespace WavFileHelpers
             }\r
         }\r
 \r
-        static bool writeValue (const StringPairArray& values, MemoryOutputStream& out, const char* paramName)\r
+        static bool writeValue (const StringMap& values, MemoryOutputStream& out, const char* paramName)\r
         {\r
-            auto value = values.getValue (paramName, {});\r
+            auto value = getValueWithDefault (values, paramName, {});\r
 \r
             if (value.isEmpty())\r
                 return false;\r
@@ -717,7 +734,7 @@ namespace WavFileHelpers
             return true;\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
             MemoryOutputStream out;\r
             out.writeInt (chunkName ("INFO"));\r
@@ -741,7 +758,7 @@ namespace WavFileHelpers
             input.read (this, (int) jmin (sizeof (*this), length));\r
         }\r
 \r
-        AcidChunk (const StringPairArray& values)\r
+        AcidChunk (const StringMap& values)\r
         {\r
             zerostruct (*this);\r
 \r
@@ -751,18 +768,20 @@ namespace WavFileHelpers
                   | getFlagIfPresent (values, WavAudioFormat::acidDiskBased, 0x08)\r
                   | getFlagIfPresent (values, WavAudioFormat::acidizerFlag,  0x10);\r
 \r
-            if (values[WavAudioFormat::acidRootSet].getIntValue() != 0)\r
-                rootNote = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidRootNote].getIntValue());\r
+            if (getValueWithDefault (values, WavAudioFormat::acidRootSet).getIntValue() != 0)\r
+                rootNote = ByteOrder::swapIfBigEndian ((uint16) getValueWithDefault (values, WavAudioFormat::acidRootNote).getIntValue());\r
+\r
+            numBeats          = ByteOrder::swapIfBigEndian ((uint32) getValueWithDefault (values, WavAudioFormat::acidBeats).getIntValue());\r
+            meterDenominator  = ByteOrder::swapIfBigEndian ((uint16) getValueWithDefault (values, WavAudioFormat::acidDenominator).getIntValue());\r
+            meterNumerator    = ByteOrder::swapIfBigEndian ((uint16) getValueWithDefault (values, WavAudioFormat::acidNumerator).getIntValue());\r
 \r
-            numBeats          = ByteOrder::swapIfBigEndian ((uint32) values[WavAudioFormat::acidBeats].getIntValue());\r
-            meterDenominator  = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidDenominator].getIntValue());\r
-            meterNumerator    = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidNumerator].getIntValue());\r
+            const auto iter = values.find (WavAudioFormat::acidTempo);\r
 \r
-            if (values.containsKey (WavAudioFormat::acidTempo))\r
-                tempo = swapFloatByteOrder (values[WavAudioFormat::acidTempo].getFloatValue());\r
+            if (iter != values.cend())\r
+                tempo = swapFloatByteOrder (iter->second.getFloatValue());\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
             return AcidChunk (values).toMemoryBlock();\r
         }\r
@@ -773,7 +792,7 @@ namespace WavFileHelpers
                       ? MemoryBlock (this, sizeof (*this)) : MemoryBlock();\r
         }\r
 \r
-        void addToMetadata (StringPairArray& values) const\r
+        void addToMetadata (StringMap& values) const\r
         {\r
             setBoolFlag (values, WavAudioFormat::acidOneShot,   0x01);\r
             setBoolFlag (values, WavAudioFormat::acidRootSet,   0x02);\r
@@ -782,22 +801,22 @@ namespace WavFileHelpers
             setBoolFlag (values, WavAudioFormat::acidizerFlag,  0x10);\r
 \r
             if (flags & 0x02) // root note set\r
-                values.set (WavAudioFormat::acidRootNote, String (ByteOrder::swapIfBigEndian (rootNote)));\r
+                values[WavAudioFormat::acidRootNote] = String (ByteOrder::swapIfBigEndian (rootNote));\r
 \r
-            values.set (WavAudioFormat::acidBeats,       String (ByteOrder::swapIfBigEndian (numBeats)));\r
-            values.set (WavAudioFormat::acidDenominator, String (ByteOrder::swapIfBigEndian (meterDenominator)));\r
-            values.set (WavAudioFormat::acidNumerator,   String (ByteOrder::swapIfBigEndian (meterNumerator)));\r
-            values.set (WavAudioFormat::acidTempo,       String (swapFloatByteOrder (tempo)));\r
+            values[WavAudioFormat::acidBeats]       = String (ByteOrder::swapIfBigEndian (numBeats));\r
+            values[WavAudioFormat::acidDenominator] = String (ByteOrder::swapIfBigEndian (meterDenominator));\r
+            values[WavAudioFormat::acidNumerator]   = String (ByteOrder::swapIfBigEndian (meterNumerator));\r
+            values[WavAudioFormat::acidTempo]       = String (swapFloatByteOrder (tempo));\r
         }\r
 \r
-        void setBoolFlag (StringPairArray& values, const char* name, uint32 mask) const\r
+        void setBoolFlag (StringMap& values, const char* name, uint32 mask) const\r
         {\r
-            values.set (name, (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0");\r
+            values[name] = (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0";\r
         }\r
 \r
-        static uint32 getFlagIfPresent (const StringPairArray& values, const char* name, uint32 flag)\r
+        static uint32 getFlagIfPresent (const StringMap& values, const char* name, uint32 flag)\r
         {\r
-            return values[name].getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0;\r
+            return getValueWithDefault (values, name).getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0;\r
         }\r
 \r
         static float swapFloatByteOrder (const float x) noexcept\r
@@ -826,10 +845,10 @@ namespace WavFileHelpers
     //==============================================================================\r
     struct TracktionChunk\r
     {\r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
             MemoryOutputStream out;\r
-            auto s = values[WavAudioFormat::tracktionLoopInfo];\r
+            auto s = getValueWithDefault (values, WavAudioFormat::tracktionLoopInfo);\r
 \r
             if (s.isNotEmpty())\r
             {\r
@@ -846,7 +865,7 @@ namespace WavFileHelpers
     //==============================================================================\r
     namespace AXMLChunk\r
     {\r
-        static void addToMetadata (StringPairArray& destValues, const String& source)\r
+        static void addToMetadata (StringMap& destValues, const String& source)\r
         {\r
             if (auto xml = parseXML (source))\r
             {\r
@@ -861,7 +880,7 @@ namespace WavFileHelpers
                                 auto ISRCCode = xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true);\r
 \r
                                 if (ISRCCode.isNotEmpty())\r
-                                    destValues.set (WavAudioFormat::ISRC, ISRCCode);\r
+                                    destValues[WavAudioFormat::ISRC] = ISRCCode;\r
                             }\r
                         }\r
                     }\r
@@ -869,9 +888,9 @@ namespace WavFileHelpers
             }\r
         }\r
 \r
-        static MemoryBlock createFrom (const StringPairArray& values)\r
+        static MemoryBlock createFrom (const StringMap& values)\r
         {\r
-            auto ISRC = values.getValue (WavAudioFormat::ISRC, {});\r
+            auto ISRC = getValueWithDefault (values, WavAudioFormat::ISRC);\r
             MemoryOutputStream xml;\r
 \r
             if (ISRC.isNotEmpty())\r
@@ -941,6 +960,8 @@ public:
         int cueLabelIndex = 0;\r
         int cueRegionIndex = 0;\r
 \r
+        StringMap dict;\r
+\r
         auto streamStartPos = input->getPosition();\r
         auto firstChunkType = input->readInt();\r
 \r
@@ -1019,7 +1040,7 @@ public:
                         {\r
                             input->skipNextBytes (4); // skip over size and bitsPerSample\r
                             auto channelMask = input->readInt();\r
-                            metadataValues.set ("ChannelMask", String (channelMask));\r
+                            dict["ChannelMask"] = String (channelMask);\r
                             channelLayout = getChannelLayoutFromMask (channelMask, numChannels);\r
 \r
                             ExtensibleWavSubFormat subFormat;\r
@@ -1074,34 +1095,34 @@ public:
                     HeapBlock<BWAVChunk> bwav;\r
                     bwav.calloc (jmax ((size_t) length + 1, sizeof (BWAVChunk)), 1);\r
                     input->read (bwav, (int) length);\r
-                    bwav->copyTo (metadataValues, (int) length);\r
+                    bwav->copyTo (dict, (int) length);\r
                 }\r
                 else if (chunkType == chunkName ("smpl"))\r
                 {\r
                     HeapBlock<SMPLChunk> smpl;\r
                     smpl.calloc (jmax ((size_t) length + 1, sizeof (SMPLChunk)), 1);\r
                     input->read (smpl, (int) length);\r
-                    smpl->copyTo (metadataValues, (int) length);\r
+                    smpl->copyTo (dict, (int) length);\r
                 }\r
                 else if (chunkType == chunkName ("inst") || chunkType == chunkName ("INST")) // need to check which...\r
                 {\r
                     HeapBlock<InstChunk> inst;\r
                     inst.calloc (jmax ((size_t) length + 1, sizeof (InstChunk)), 1);\r
                     input->read (inst, (int) length);\r
-                    inst->copyTo (metadataValues);\r
+                    inst->copyTo (dict);\r
                 }\r
                 else if (chunkType == chunkName ("cue "))\r
                 {\r
                     HeapBlock<CueChunk> cue;\r
                     cue.calloc (jmax ((size_t) length + 1, sizeof (CueChunk)), 1);\r
                     input->read (cue, (int) length);\r
-                    cue->copyTo (metadataValues, (int) length);\r
+                    cue->copyTo (dict, (int) length);\r
                 }\r
                 else if (chunkType == chunkName ("axml"))\r
                 {\r
                     MemoryBlock axml;\r
                     input->readIntoMemoryBlock (axml, (ssize_t) length);\r
-                    AXMLChunk::addToMetadata (metadataValues, axml.toString());\r
+                    AXMLChunk::addToMetadata (dict, axml.toString());\r
                 }\r
                 else if (chunkType == chunkName ("LIST"))\r
                 {\r
@@ -1109,7 +1130,7 @@ public:
 \r
                     if (subChunkType == chunkName ("info") || subChunkType == chunkName ("INFO"))\r
                     {\r
-                        ListInfoChunk::addToMetadata (metadataValues, *input, chunkEnd);\r
+                        ListInfoChunk::addToMetadata (dict, *input, chunkEnd);\r
                     }\r
                     else if (subChunkType == chunkName ("adtl"))\r
                     {\r
@@ -1134,8 +1155,8 @@ public:
                                 MemoryBlock textBlock;\r
                                 input->readIntoMemoryBlock (textBlock, stringLength);\r
 \r
-                                metadataValues.set (prefix + "Identifier", String (identifier));\r
-                                metadataValues.set (prefix + "Text", textBlock.toString());\r
+                                dict[prefix + "Identifier"] = String (identifier);\r
+                                dict[prefix + "Text"] = textBlock.toString();\r
                             }\r
                             else if (adtlChunkType == chunkName ("ltxt"))\r
                             {\r
@@ -1152,14 +1173,14 @@ public:
                                 MemoryBlock textBlock;\r
                                 input->readIntoMemoryBlock (textBlock, (int) stringLength);\r
 \r
-                                metadataValues.set (prefix + "Identifier",   String (identifier));\r
-                                metadataValues.set (prefix + "SampleLength", String (sampleLength));\r
-                                metadataValues.set (prefix + "Purpose",      String (purpose));\r
-                                metadataValues.set (prefix + "Country",      String (country));\r
-                                metadataValues.set (prefix + "Language",     String (language));\r
-                                metadataValues.set (prefix + "Dialect",      String (dialect));\r
-                                metadataValues.set (prefix + "CodePage",     String (codePage));\r
-                                metadataValues.set (prefix + "Text",         textBlock.toString());\r
+                                dict[prefix + "Identifier"]   = String (identifier);\r
+                                dict[prefix + "SampleLength"] = String (sampleLength);\r
+                                dict[prefix + "Purpose"]      = String (purpose);\r
+                                dict[prefix + "Country"]      = String (country);\r
+                                dict[prefix + "Language"]     = String (language);\r
+                                dict[prefix + "Dialect"]      = String (dialect);\r
+                                dict[prefix + "CodePage"]     = String (codePage);\r
+                                dict[prefix + "Text"]         = textBlock.toString();\r
                             }\r
 \r
                             input->setPosition (adtlChunkEnd);\r
@@ -1168,13 +1189,13 @@ public:
                 }\r
                 else if (chunkType == chunkName ("acid"))\r
                 {\r
-                    AcidChunk (*input, length).addToMetadata (metadataValues);\r
+                    AcidChunk (*input, length).addToMetadata (dict);\r
                 }\r
                 else if (chunkType == chunkName ("Trkn"))\r
                 {\r
                     MemoryBlock tracktion;\r
                     input->readIntoMemoryBlock (tracktion, (ssize_t) length);\r
-                    metadataValues.set (WavAudioFormat::tracktionLoopInfo, tracktion.toString());\r
+                    dict[WavAudioFormat::tracktionLoopInfo] = tracktion.toString();\r
                 }\r
                 else if (chunkEnd <= input->getPosition())\r
                 {\r
@@ -1185,10 +1206,12 @@ public:
             }\r
         }\r
 \r
-        if (cueLabelIndex > 0)          metadataValues.set ("NumCueLabels",    String (cueLabelIndex));\r
-        if (cueNoteIndex > 0)           metadataValues.set ("NumCueNotes",     String (cueNoteIndex));\r
-        if (cueRegionIndex > 0)         metadataValues.set ("NumCueRegions",   String (cueRegionIndex));\r
-        if (metadataValues.size() > 0)  metadataValues.set ("MetaDataSource",  "WAV");\r
+        if (cueLabelIndex > 0)          dict["NumCueLabels"]    = String (cueLabelIndex);\r
+        if (cueNoteIndex > 0)           dict["NumCueNotes"]     = String (cueNoteIndex);\r
+        if (cueRegionIndex > 0)         dict["NumCueRegions"]   = String (cueRegionIndex);\r
+        if (dict.size() > 0)            dict["MetaDataSource"]  = "WAV";\r
+\r
+        metadataValues.addUnorderedMap (dict);\r
     }\r
 \r
     //==============================================================================\r
@@ -1312,15 +1335,17 @@ public:
             // key should be removed (or set to "WAV") once this has been done\r
             jassert (metadataValues.getValue ("MetaDataSource", "None") != "AIFF");\r
 \r
-            bwavChunk     = BWAVChunk::createFrom (metadataValues);\r
-            axmlChunk     = AXMLChunk::createFrom (metadataValues);\r
-            smplChunk     = SMPLChunk::createFrom (metadataValues);\r
-            instChunk     = InstChunk::createFrom (metadataValues);\r
-            cueChunk      = CueChunk ::createFrom (metadataValues);\r
-            listChunk     = ListChunk::createFrom (metadataValues);\r
-            listInfoChunk = ListInfoChunk::createFrom (metadataValues);\r
-            acidChunk     = AcidChunk::createFrom (metadataValues);\r
-            trckChunk     = TracktionChunk::createFrom (metadataValues);\r
+            const auto map = toMap (metadataValues);\r
+\r
+            bwavChunk     = BWAVChunk::createFrom (map);\r
+            axmlChunk     = AXMLChunk::createFrom (map);\r
+            smplChunk     = SMPLChunk::createFrom (map);\r
+            instChunk     = InstChunk::createFrom (map);\r
+            cueChunk      = CueChunk ::createFrom (map);\r
+            listChunk     = ListChunk::createFrom (map);\r
+            listInfoChunk = ListInfoChunk::createFrom (map);\r
+            acidChunk     = AcidChunk::createFrom (map);\r
+            trckChunk     = TracktionChunk::createFrom (map);\r
         }\r
 \r
         headerPosition = out->getPosition();\r
@@ -1792,7 +1817,7 @@ bool WavAudioFormat::replaceMetadataInFile (const File& wavFile, const StringPai
 \r
         if (bwavSize > 0)\r
         {\r
-            auto chunk = BWAVChunk::createFrom (newMetadata);\r
+            auto chunk = BWAVChunk::createFrom (toMap (newMetadata));\r
 \r
             if (chunk.getSize() <= (size_t) bwavSize)\r
             {\r
@@ -1834,31 +1859,34 @@ struct WaveAudioFormatTests : public UnitTest
     {\r
         beginTest ("Setting up metadata");\r
 \r
-        StringPairArray metadataValues = WavAudioFormat::createBWAVMetadata ("description",\r
-                                                                             "originator",\r
-                                                                             "originatorRef",\r
-                                                                             Time::getCurrentTime(),\r
-                                                                             numTestAudioBufferSamples,\r
-                                                                             "codingHistory");\r
+        auto metadataValues = toMap (WavAudioFormat::createBWAVMetadata ("description",\r
+                                                                         "originator",\r
+                                                                         "originatorRef",\r
+                                                                         Time::getCurrentTime(),\r
+                                                                         numTestAudioBufferSamples,\r
+                                                                         "codingHistory"));\r
 \r
         for (int i = numElementsInArray (WavFileHelpers::ListInfoChunk::types); --i >= 0;)\r
-            metadataValues.set (WavFileHelpers::ListInfoChunk::types[i],\r
-                                WavFileHelpers::ListInfoChunk::types[i]);\r
+            metadataValues[WavFileHelpers::ListInfoChunk::types[i]] = WavFileHelpers::ListInfoChunk::types[i];\r
 \r
         if (metadataValues.size() > 0)\r
-            metadataValues.set ("MetaDataSource", "WAV");\r
+            metadataValues["MetaDataSource"] = "WAV";\r
 \r
-        metadataValues.addArray (createDefaultSMPLMetadata());\r
+        const auto smplMetadata = createDefaultSMPLMetadata();\r
+        metadataValues.insert (smplMetadata.cbegin(), smplMetadata.cend());\r
 \r
         WavAudioFormat format;\r
         MemoryBlock memoryBlock;\r
 \r
+        StringPairArray metadataArray;\r
+        metadataArray.addUnorderedMap (metadataValues);\r
+\r
         {\r
             beginTest ("Creating a basic wave writer");\r
 \r
             std::unique_ptr<AudioFormatWriter> writer (format.createWriterFor (new MemoryOutputStream (memoryBlock, false),\r
                                                                                44100.0, numTestAudioBufferChannels,\r
-                                                                               32, metadataValues, 0));\r
+                                                                               32, metadataArray, 0));\r
             expect (writer != nullptr);\r
 \r
             AudioBuffer<float> buffer (numTestAudioBufferChannels, numTestAudioBufferSamples);\r
@@ -1873,7 +1901,7 @@ struct WaveAudioFormatTests : public UnitTest
 \r
             std::unique_ptr<AudioFormatReader> reader (format.createReaderFor (new MemoryInputStream (memoryBlock, false), false));\r
             expect (reader != nullptr);\r
-            expect (reader->metadataValues == metadataValues, "Somehow, the metadata is different!");\r
+            expect (reader->metadataValues == metadataArray, "Somehow, the metadata is different!");\r
         }\r
     }\r
 \r
@@ -1884,19 +1912,19 @@ private:
         numTestAudioBufferSamples = 256\r
     };\r
 \r
-    StringPairArray createDefaultSMPLMetadata() const\r
+    static StringMap createDefaultSMPLMetadata()\r
     {\r
-        StringPairArray m;\r
-\r
-        m.set ("Manufacturer", "0");\r
-        m.set ("Product", "0");\r
-        m.set ("SamplePeriod", "0");\r
-        m.set ("MidiUnityNote", "60");\r
-        m.set ("MidiPitchFraction", "0");\r
-        m.set ("SmpteFormat", "0");\r
-        m.set ("SmpteOffset", "0");\r
-        m.set ("NumSampleLoops", "0");\r
-        m.set ("SamplerData", "0");\r
+        StringMap m;\r
+\r
+        m["Manufacturer"] = "0";\r
+        m["Product"] = "0";\r
+        m["SamplePeriod"] = "0";\r
+        m["MidiUnityNote"] = "60";\r
+        m["MidiPitchFraction"] = "0";\r
+        m["SmpteFormat"] = "0";\r
+        m["SmpteOffset"] = "0";\r
+        m["NumSampleLoops"] = "0";\r
+        m["SamplerData"] = "0";\r
 \r
         return m;\r
     }\r
index 060ae739889264037677840fbbbcd2934f2bceae..a2b9cb7e5e00001d40b1c750e8c67ff223537d76 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_formats\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 85ebc27d42e62a859cd7fa22b41f4eabe9385b00..58b458da9fed598ece7a3b5c453c48ff21c02945 100644 (file)
@@ -979,8 +979,17 @@ private:
                 if (auto* editorConstrainer = editor->getConstrainer())\r
                 {\r
                     const auto borders = owner.getContentComponentBorder();\r
-                    const auto extraWindowWidth = borders.getLeftAndRight();\r
-                    const auto extraWindowHeight = extraHeight + borders.getTopAndBottom();\r
+\r
+                    const auto windowBorders = [&]() -> BorderSize<int>\r
+                    {\r
+                        if (auto* peer = owner.getPeer())\r
+                            return peer->getFrameSize();\r
+\r
+                        return {};\r
+                    }();\r
+\r
+                    const auto extraWindowWidth = borders.getLeftAndRight() + windowBorders.getLeftAndRight();\r
+                    const auto extraWindowHeight = extraHeight + borders.getTopAndBottom() + windowBorders.getTopAndBottom();\r
 \r
                     owner.setResizeLimits (jmax (10, editorConstrainer->getMinimumWidth()  + extraWindowWidth),\r
                                            jmax (10, editorConstrainer->getMinimumHeight() + extraWindowHeight),\r
index e5eac010e51ebaa532cbe02b6536a4635ec64628..ded1cf1a7a97231c7e6a2122c2a51be69ed45d8f 100644 (file)
@@ -58,7 +58,7 @@ JUCE_BEGIN_NO_SANITIZE ("vptr")
 \r
 #if JUCE_VST3_CAN_REPLACE_VST2\r
 \r
- #if ! JUCE_MSVC\r
+ #if ! JUCE_MSVC && ! defined (__cdecl)\r
   #define __cdecl\r
  #endif\r
 \r
@@ -3155,9 +3155,27 @@ public:
                 return kResultFalse;\r
         }\r
 \r
-        if      (processSetup.symbolicSampleSize == Vst::kSample32) processAudio<float>  (data, channelListFloat);\r
-        else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio<double> (data, channelListDouble);\r
-        else jassertfalse;\r
+        // If all of these are zero, the host is attempting to flush parameters without processing audio.\r
+        if (data.numSamples != 0 || data.numInputs != 0 || data.numOutputs != 0)\r
+        {\r
+            if      (processSetup.symbolicSampleSize == Vst::kSample32) processAudio<float>  (data, channelListFloat);\r
+            else if (processSetup.symbolicSampleSize == Vst::kSample64) processAudio<double> (data, channelListDouble);\r
+            else jassertfalse;\r
+        }\r
+\r
+        if (auto* changes = data.outputParameterChanges)\r
+        {\r
+            comPluginInstance->forAllChangedParameters ([&] (Vst::ParamID paramID, float value)\r
+                                                        {\r
+                                                            Steinberg::int32 queueIndex = 0;\r
+\r
+                                                            if (auto* queue = changes->addParameterData (paramID, queueIndex))\r
+                                                            {\r
+                                                                Steinberg::int32 pointIndex = 0;\r
+                                                                queue->addPoint (0, value, pointIndex);\r
+                                                            }\r
+                                                        });\r
+        }\r
 \r
        #if JucePlugin_ProducesMidiOutput\r
         if (isMidiOutputBusEnabled && data.outputEvents != nullptr)\r
@@ -3381,20 +3399,6 @@ private:
             jassert (midiBuffer.getNumEvents() <= numMidiEventsComingIn);\r
            #endif\r
         }\r
-\r
-        if (auto* changes = data.outputParameterChanges)\r
-        {\r
-            comPluginInstance->forAllChangedParameters ([&] (Vst::ParamID paramID, float value)\r
-            {\r
-                Steinberg::int32 queueIndex = 0;\r
-\r
-                if (auto* queue = changes->addParameterData (paramID, queueIndex))\r
-                {\r
-                    Steinberg::int32 pointIndex = 0;\r
-                    queue->addPoint (0, value, pointIndex);\r
-                }\r
-            });\r
-        }\r
     }\r
 \r
     //==============================================================================\r
@@ -3541,10 +3545,12 @@ DECLARE_CLASS_IID (JuceAudioProcessor, 0x0101ABAB, 0xABCDEF01, JucePlugin_Manufa
 DEF_CLASS_IID (JuceAudioProcessor)\r
 \r
 #if JUCE_VST3_CAN_REPLACE_VST2\r
+ // Defined in PluginUtilities.cpp\r
+ void getUUIDForVST2ID (bool, uint8[16]);\r
+\r
  FUID getFUIDForVST2ID (bool forControllerUID)\r
  {\r
      TUID uuid;\r
-     extern JUCE_API void getUUIDForVST2ID (bool, uint8[16]);\r
      getUUIDForVST2ID (forControllerUID, (uint8*) uuid);\r
      return FUID (uuid);\r
  }\r
index 4157b5bb1628305d053c67b876fb90a88269b50c..e178dfffca4f990b338f2e8b2f2e1d00979e8360 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_plugin_client\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE audio plugin wrapper classes\r
   description:        Classes for building VST, VST3, AudioUnit, AAX and RTAS plugins.\r
   website:            http://www.juce.com/juce\r
index 6bea84307586874c7e16e35134f0842a385ccce7..baaa59f061a461a7f90a93fd253be4e491cde770 100644 (file)
  #define JucePlugin_Build_RTAS 0\r
 #endif\r
 \r
-#if ! (defined (_MSC_VER) || defined (__APPLE_CPP__) || defined (__APPLE_CC__) || defined (LINUX) || defined (__linux__))\r
- #undef JucePlugin_Build_VST3\r
- #define JucePlugin_Build_VST3 0\r
-#endif\r
-\r
 //==============================================================================\r
 #if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI)\r
  #error "You need to define the JucePlugin_LV2URI value!"\r
index 4144fc4383bd79e7b9c37776786cd8290e7aad82..23236a6978c1af2ec8468924df631cafc3caa6c5 100644 (file)
@@ -46,7 +46,7 @@ namespace juce
  #define VST3_REPLACEMENT_AVAILABLE 1\r
 \r
  // NB: Nasty old-fashioned code in here because it's copied from the Steinberg example code.\r
- void JUCE_API getUUIDForVST2ID (bool forControllerUID, uint8 uuid[16])\r
+ void getUUIDForVST2ID (bool forControllerUID, uint8 uuid[16])\r
  {\r
      #if JUCE_MSVC\r
       const auto juce_sprintf = [] (auto&& head, auto&&... tail) { sprintf_s (head, numElementsInArray (head), tail...); };\r
index 5a907e7c35ce101be68d080e88b17e9777c32199..aad9a4f407c2ae7148f03c53e27390d4636f5900 100644 (file)
@@ -38,22 +38,19 @@ struct AudioUnitHelpers
     class ChannelRemapper\r
     {\r
     public:\r
-        ChannelRemapper (AudioProcessor& p) : processor (p), inputLayoutMap (nullptr), outputLayoutMap (nullptr) {}\r
-        ~ChannelRemapper() {}\r
-\r
-        void alloc()\r
+        void alloc (AudioProcessor& processor)\r
         {\r
             const int numInputBuses  = AudioUnitHelpers::getBusCount (processor, true);\r
             const int numOutputBuses = AudioUnitHelpers::getBusCount (processor, false);\r
 \r
-            initializeChannelMapArray (true, numInputBuses);\r
-            initializeChannelMapArray (false, numOutputBuses);\r
+            initializeChannelMapArray (processor, true, numInputBuses);\r
+            initializeChannelMapArray (processor, false, numOutputBuses);\r
 \r
             for (int busIdx = 0; busIdx < numInputBuses; ++busIdx)\r
-                fillLayoutChannelMaps (true, busIdx);\r
+                fillLayoutChannelMaps (processor, true, busIdx);\r
 \r
             for (int busIdx = 0; busIdx < numOutputBuses; ++busIdx)\r
-                fillLayoutChannelMaps (false, busIdx);\r
+                fillLayoutChannelMaps (processor, false, busIdx);\r
         }\r
 \r
         void release()\r
@@ -69,14 +66,13 @@ struct AudioUnitHelpers
 \r
     private:\r
         //==============================================================================\r
-        AudioProcessor& processor;\r
         HeapBlock<int*> inputLayoutMapPtrStorage, outputLayoutMapPtrStorage;\r
         HeapBlock<int>  inputLayoutMapStorage, outputLayoutMapStorage;\r
-        int** inputLayoutMap;\r
-        int** outputLayoutMap;\r
+        int** inputLayoutMap  = nullptr;\r
+        int** outputLayoutMap = nullptr;\r
 \r
         //==============================================================================\r
-        void initializeChannelMapArray (bool isInput, const int numBuses)\r
+        void initializeChannelMapArray (AudioProcessor& processor, bool isInput, const int numBuses)\r
         {\r
             HeapBlock<int*>& layoutMapPtrStorage = isInput ? inputLayoutMapPtrStorage : outputLayoutMapPtrStorage;\r
             HeapBlock<int>& layoutMapStorage = isInput ? inputLayoutMapStorage : outputLayoutMapStorage;\r
@@ -88,7 +84,7 @@ struct AudioUnitHelpers
             layoutMapPtrStorage.calloc (static_cast<size_t> (numBuses));\r
             layoutMapStorage.calloc (static_cast<size_t> (isInput ? totalInChannels : totalOutChannels));\r
 \r
-            layoutMap  = layoutMapPtrStorage. get();\r
+            layoutMap = layoutMapPtrStorage.get();\r
 \r
             int ch = 0;\r
             for (int busIdx = 0; busIdx < numBuses; ++busIdx)\r
@@ -98,7 +94,7 @@ struct AudioUnitHelpers
             }\r
         }\r
 \r
-        void fillLayoutChannelMaps (bool isInput, int busNr)\r
+        void fillLayoutChannelMaps (AudioProcessor& processor, bool isInput, int busNr)\r
         {\r
             int* layoutMap = (isInput ? inputLayoutMap : outputLayoutMap)[busNr];\r
             auto channelFormat = processor.getChannelLayoutOfBus (isInput, busNr);\r
@@ -166,7 +162,9 @@ struct AudioUnitHelpers
                 jassert (channels[(size_t) i] != nullptr);\r
            #endif\r
 \r
-            mutableBuffer.setDataToReferTo (channels.data(), (int) channels.size(), static_cast<int> (frames));\r
+            if (! channels.empty())\r
+                mutableBuffer.setDataToReferTo (channels.data(), (int) channels.size(), static_cast<int> (frames));\r
+\r
             return mutableBuffer;\r
         }\r
 \r
index 59298c4cbdaf45f3194bedad638292ae46badf73..e566f7cc8a4855f2a8255a0e9d76e12f17779b38 100644 (file)
@@ -581,7 +581,7 @@ private:
 \r
         tresult getInt (Steinberg::int64& result) const\r
         {\r
-            if (kind != Kind::Int)\r
+            if (kind != Kind::tagInt)\r
                 return kResultFalse;\r
 \r
             result = storage.storedInt;\r
@@ -590,7 +590,7 @@ private:
 \r
         tresult getFloat (double& result) const\r
         {\r
-            if (kind != Kind::Float)\r
+            if (kind != Kind::tagFloat)\r
                 return kResultFalse;\r
 \r
             result = storage.storedFloat;\r
@@ -599,7 +599,7 @@ private:
 \r
         tresult getString (Vst::TChar* data, Steinberg::uint32 numBytes) const\r
         {\r
-            if (kind != Kind::String)\r
+            if (kind != Kind::tagString)\r
                 return kResultFalse;\r
 \r
             std::memcpy (data,\r
@@ -610,7 +610,7 @@ private:
 \r
         tresult getBinary (const void*& data, Steinberg::uint32& numBytes) const\r
         {\r
-            if (kind != Kind::Binary)\r
+            if (kind != Kind::tagBinary)\r
                 return kResultFalse;\r
 \r
             data = storage.storedBinary.data();\r
@@ -619,19 +619,19 @@ private:
         }\r
 \r
     private:\r
-        void constructFrom (Int    x) noexcept { kind = Kind::Int;    new (&storage.storedInt)    Int    (std::move (x)); }\r
-        void constructFrom (Float  x) noexcept { kind = Kind::Float;  new (&storage.storedFloat)  Float  (std::move (x)); }\r
-        void constructFrom (String x) noexcept { kind = Kind::String; new (&storage.storedString) String (std::move (x)); }\r
-        void constructFrom (Binary x) noexcept { kind = Kind::Binary; new (&storage.storedBinary) Binary (std::move (x)); }\r
+        void constructFrom (Int    x) noexcept { kind = Kind::tagInt;    new (&storage.storedInt)    Int    (std::move (x)); }\r
+        void constructFrom (Float  x) noexcept { kind = Kind::tagFloat;  new (&storage.storedFloat)  Float  (std::move (x)); }\r
+        void constructFrom (String x) noexcept { kind = Kind::tagString; new (&storage.storedString) String (std::move (x)); }\r
+        void constructFrom (Binary x) noexcept { kind = Kind::tagBinary; new (&storage.storedBinary) Binary (std::move (x)); }\r
 \r
         void reset() noexcept\r
         {\r
             switch (kind)\r
             {\r
-                case Kind::Int:                                    break;\r
-                case Kind::Float:                                  break;\r
-                case Kind::String: storage.storedString.~vector(); break;\r
-                case Kind::Binary: storage.storedBinary.~vector(); break;\r
+                case Kind::tagInt:                                    break;\r
+                case Kind::tagFloat:                                  break;\r
+                case Kind::tagString: storage.storedString.~vector(); break;\r
+                case Kind::tagBinary: storage.storedBinary.~vector(); break;\r
             }\r
         }\r
 \r
@@ -639,14 +639,14 @@ private:
         {\r
             switch (other.kind)\r
             {\r
-                case Kind::Int:    constructFrom (std::move (other.storage.storedInt));    break;\r
-                case Kind::Float:  constructFrom (std::move (other.storage.storedFloat));  break;\r
-                case Kind::String: constructFrom (std::move (other.storage.storedString)); break;\r
-                case Kind::Binary: constructFrom (std::move (other.storage.storedBinary)); break;\r
+                case Kind::tagInt:    constructFrom (std::move (other.storage.storedInt));    break;\r
+                case Kind::tagFloat:  constructFrom (std::move (other.storage.storedFloat));  break;\r
+                case Kind::tagString: constructFrom (std::move (other.storage.storedString)); break;\r
+                case Kind::tagBinary: constructFrom (std::move (other.storage.storedBinary)); break;\r
             }\r
         }\r
 \r
-        enum class Kind { Int, Float, String, Binary };\r
+        enum class Kind { tagInt, tagFloat, tagString, tagBinary };\r
 \r
         union Storage\r
         {\r
index da7ff8154b04b4c75bf5e3a50686e8d086abca34..49c6e390e2d1731622fd9481d0a2fcfce8225fb2 100644 (file)
@@ -40,7 +40,6 @@
 \r
 #include "juce_audio_processors.h"\r
 #include <juce_gui_extra/juce_gui_extra.h>\r
-#include <set>\r
 \r
 //==============================================================================\r
 #if JUCE_MAC\r
index 344e96d8657dee7bc671f378e43a8eebadde580a..026b05adea218e8492b9290f5d0f2d843fb5b4bc 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_processors\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 3d0450d0f59c00f9918ae233c8441a566385830a..896d018c79a1fe94a8e4ba4c41c67c3713f1a738 100644 (file)
@@ -174,7 +174,7 @@ public:
         A pointer to the object you pass in will be kept, but it won't be deleted\r
         by this object, so it's the caller's responsibility to manage it.\r
 \r
-        If you pass a nullptr, then no contraints will be placed on the positioning of the window.\r
+        If you pass a nullptr, then no constraints will be placed on the positioning of the window.\r
     */\r
     void setConstrainer (ComponentBoundsConstrainer* newConstrainer);\r
 \r
index e9b999992764ad3da5451c0272ac2fc602820455..e1125680f29bcc99ad6106eef84b8872fcd8a812 100644 (file)
@@ -175,7 +175,7 @@ public:
                        std::make_unique<AudioParameterInt> ("b", "Parameter B", 0, 5, 2) })\r
         @endcode\r
 \r
-        To add parameters programatically you can call `add` repeatedly on a\r
+        To add parameters programmatically you can call `add` repeatedly on a\r
         ParameterLayout instance:\r
 \r
         @code\r
index 90ca7483e9ba9a7e258b79712477b3120fe1c394..2e8227f5ed83e2c58a6d8282d2cd7da92d52058f 100644 (file)
@@ -35,10 +35,6 @@ struct SimpleDeviceManagerInputLevelMeter  : public Component,
         inputLevelGetter = manager.getInputLevelGetter();\r
     }\r
 \r
-    ~SimpleDeviceManagerInputLevelMeter() override\r
-    {\r
-    }\r
-\r
     void timerCallback() override\r
     {\r
         if (isShowing())\r
index 71a3d1afea13e663a5422e6f3e7343b63eed570c..0a5743149dcb184a90496779c2431e798ce4f918 100644 (file)
@@ -64,7 +64,7 @@ public:
     */\r
     bool loadThumb (AudioThumbnailBase& thumb, int64 hashCode);\r
 \r
-    /** Stores the cachable data from the specified thumb in this cache.\r
+    /** Stores the cacheable data from the specified thumb in this cache.\r
 \r
         This is called automatically by the AudioThumbnail class, so you shouldn't\r
         normally need to call it directly.\r
index f56b19d0f24ee15ca3a3b0ea718254d188c3d198..57e628971813f9b3361e001ba664a6c3538cf044 100644 (file)
@@ -36,7 +36,7 @@ namespace juce
     Only after a Bluetooth MIDI device has been paired will its MIDI ports\r
     be available through JUCE's MidiInput and MidiOutput classes.\r
 \r
-    This dialogue is currently only available on macOS targetting versions 10.11+,\r
+    This dialogue is currently only available on macOS targeting versions 10.11+,\r
     iOS and Android. When targeting older versions of macOS you should instead\r
     pair Bluetooth MIDI devices using the "Audio MIDI Setup" app (located in\r
     /Applications/Utilities). On Windows, you should use the system settings. On\r
diff --git a/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp b/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.cpp
new file mode 100644 (file)
index 0000000..2f69beb
--- /dev/null
@@ -0,0 +1,462 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+constexpr uint8 whiteNotes[] = { 0, 2, 4, 5, 7, 9, 11 };\r
+constexpr uint8 blackNotes[] = { 1, 3, 6, 8, 10 };\r
+\r
+//==============================================================================\r
+struct KeyboardComponentBase::UpDownButton  : public Button\r
+{\r
+    UpDownButton (KeyboardComponentBase& c, int d)\r
+        : Button ({}), owner (c), delta (d)\r
+    {\r
+    }\r
+\r
+    void clicked() override\r
+    {\r
+        auto note = owner.getLowestVisibleKey();\r
+\r
+        note = delta < 0 ? (note - 1) / 12 : note / 12 + 1;\r
+\r
+        owner.setLowestVisibleKey (note * 12);\r
+    }\r
+\r
+    using Button::clicked;\r
+\r
+    void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
+    {\r
+        owner.drawUpDownButton (g, getWidth(), getHeight(),\r
+                                shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown,\r
+                                delta > 0);\r
+    }\r
+\r
+private:\r
+    KeyboardComponentBase& owner;\r
+    int delta;\r
+\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UpDownButton)\r
+};\r
+\r
+//==============================================================================\r
+KeyboardComponentBase::KeyboardComponentBase (Orientation o)  : orientation (o)\r
+{\r
+    scrollDown = std::make_unique<UpDownButton> (*this, -1);\r
+    scrollUp   = std::make_unique<UpDownButton> (*this, 1);\r
+\r
+    addChildComponent (*scrollDown);\r
+    addChildComponent (*scrollUp);\r
+\r
+    colourChanged();\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::setKeyWidth (float widthInPixels)\r
+{\r
+    jassert (widthInPixels > 0);\r
+\r
+    if (keyWidth != widthInPixels) // Prevent infinite recursion if the width is being computed in a 'resized()' callback\r
+    {\r
+        keyWidth = widthInPixels;\r
+        resized();\r
+    }\r
+}\r
+\r
+void KeyboardComponentBase::setScrollButtonWidth (int widthInPixels)\r
+{\r
+    jassert (widthInPixels > 0);\r
+\r
+    if (scrollButtonWidth != widthInPixels)\r
+    {\r
+        scrollButtonWidth = widthInPixels;\r
+        resized();\r
+    }\r
+}\r
+\r
+void KeyboardComponentBase::setOrientation (Orientation newOrientation)\r
+{\r
+    if (orientation != newOrientation)\r
+    {\r
+        orientation = newOrientation;\r
+        resized();\r
+    }\r
+}\r
+\r
+void KeyboardComponentBase::setAvailableRange (int lowestNote, int highestNote)\r
+{\r
+    jassert (lowestNote >= 0 && lowestNote <= 127);\r
+    jassert (highestNote >= 0 && highestNote <= 127);\r
+    jassert (lowestNote <= highestNote);\r
+\r
+    if (rangeStart != lowestNote || rangeEnd != highestNote)\r
+    {\r
+        rangeStart = jlimit (0, 127, lowestNote);\r
+        rangeEnd = jlimit (0, 127, highestNote);\r
+        firstKey = jlimit ((float) rangeStart, (float) rangeEnd, firstKey);\r
+        resized();\r
+    }\r
+}\r
+\r
+void KeyboardComponentBase::setLowestVisibleKey (int noteNumber)\r
+{\r
+    setLowestVisibleKeyFloat ((float) noteNumber);\r
+}\r
+\r
+void KeyboardComponentBase::setLowestVisibleKeyFloat (float noteNumber)\r
+{\r
+    noteNumber = jlimit ((float) rangeStart, (float) rangeEnd, noteNumber);\r
+\r
+    if (noteNumber != firstKey)\r
+    {\r
+        bool hasMoved = (((int) firstKey) != (int) noteNumber);\r
+        firstKey = noteNumber;\r
+\r
+        if (hasMoved)\r
+            sendChangeMessage();\r
+\r
+        resized();\r
+    }\r
+}\r
+\r
+float KeyboardComponentBase::getWhiteNoteLength() const noexcept\r
+{\r
+    return (orientation == horizontalKeyboard) ? (float) getHeight() : (float) getWidth();\r
+}\r
+\r
+void KeyboardComponentBase::setBlackNoteLengthProportion (float ratio) noexcept\r
+{\r
+    jassert (ratio >= 0.0f && ratio <= 1.0f);\r
+\r
+    if (blackNoteLengthRatio != ratio)\r
+    {\r
+        blackNoteLengthRatio = ratio;\r
+        resized();\r
+    }\r
+}\r
+\r
+float KeyboardComponentBase::getBlackNoteLength() const noexcept\r
+{\r
+    auto whiteNoteLength = orientation == horizontalKeyboard ? getHeight() : getWidth();\r
+    return (float) whiteNoteLength * blackNoteLengthRatio;\r
+}\r
+\r
+void KeyboardComponentBase::setBlackNoteWidthProportion (float ratio) noexcept\r
+{\r
+    jassert (ratio >= 0.0f && ratio <= 1.0f);\r
+\r
+    if (blackNoteWidthRatio != ratio)\r
+    {\r
+        blackNoteWidthRatio = ratio;\r
+        resized();\r
+    }\r
+}\r
+\r
+void KeyboardComponentBase::setScrollButtonsVisible (bool newCanScroll)\r
+{\r
+    if (canScroll != newCanScroll)\r
+    {\r
+        canScroll = newCanScroll;\r
+        resized();\r
+    }\r
+}\r
+\r
+//==============================================================================\r
+Range<float> KeyboardComponentBase::getKeyPos (int midiNoteNumber) const\r
+{\r
+    return getKeyPosition (midiNoteNumber, keyWidth)\r
+             - xOffset\r
+             - getKeyPosition (rangeStart, keyWidth).getStart();\r
+}\r
+\r
+float KeyboardComponentBase::getKeyStartPosition (int midiNoteNumber) const\r
+{\r
+    return getKeyPos (midiNoteNumber).getStart();\r
+}\r
+\r
+float KeyboardComponentBase::getTotalKeyboardWidth() const noexcept\r
+{\r
+    return getKeyPos (rangeEnd).getEnd();\r
+}\r
+\r
+KeyboardComponentBase::NoteAndVelocity KeyboardComponentBase::getNoteAndVelocityAtPosition (Point<float> pos, bool children)\r
+{\r
+    if (! reallyContains (pos, children))\r
+        return { -1, 0.0f };\r
+\r
+    auto p = pos;\r
+\r
+    if (orientation != horizontalKeyboard)\r
+    {\r
+        p = { p.y, p.x };\r
+\r
+        if (orientation == verticalKeyboardFacingLeft)\r
+            p = { p.x, (float) getWidth() - p.y };\r
+        else\r
+            p = { (float) getHeight() - p.x, p.y };\r
+    }\r
+\r
+    return remappedXYToNote (p + Point<float> (xOffset, 0));\r
+}\r
+\r
+KeyboardComponentBase::NoteAndVelocity KeyboardComponentBase::remappedXYToNote (Point<float> pos) const\r
+{\r
+    auto blackNoteLength = getBlackNoteLength();\r
+\r
+    if (pos.getY() < blackNoteLength)\r
+    {\r
+        for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
+        {\r
+            for (int i = 0; i < 5; ++i)\r
+            {\r
+                auto note = octaveStart + blackNotes[i];\r
+\r
+                if (rangeStart <= note && note <= rangeEnd)\r
+                {\r
+                    if (getKeyPos (note).contains (pos.x - xOffset))\r
+                    {\r
+                        return { note, jmax (0.0f, pos.y / blackNoteLength) };\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
+    {\r
+        for (int i = 0; i < 7; ++i)\r
+        {\r
+            auto note = octaveStart + whiteNotes[i];\r
+\r
+            if (note >= rangeStart && note <= rangeEnd)\r
+            {\r
+                if (getKeyPos (note).contains (pos.x - xOffset))\r
+                {\r
+                    auto whiteNoteLength = (orientation == horizontalKeyboard) ? getHeight() : getWidth();\r
+                    return { note, jmax (0.0f, pos.y / (float) whiteNoteLength) };\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    return { -1, 0 };\r
+}\r
+\r
+Rectangle<float> KeyboardComponentBase::getRectangleForKey (int note) const\r
+{\r
+    jassert (note >= rangeStart && note <= rangeEnd);\r
+\r
+    auto pos = getKeyPos (note);\r
+    auto x = pos.getStart();\r
+    auto w = pos.getLength();\r
+\r
+    if (MidiMessage::isMidiNoteBlack (note))\r
+    {\r
+        auto blackNoteLength = getBlackNoteLength();\r
+\r
+        switch (orientation)\r
+        {\r
+            case horizontalKeyboard:            return { x, 0, w, blackNoteLength };\r
+            case verticalKeyboardFacingLeft:    return { (float) getWidth() - blackNoteLength, x, blackNoteLength, w };\r
+            case verticalKeyboardFacingRight:   return { 0, (float) getHeight() - x - w, blackNoteLength, w };\r
+            default:                            jassertfalse; break;\r
+        }\r
+    }\r
+    else\r
+    {\r
+        switch (orientation)\r
+        {\r
+            case horizontalKeyboard:            return { x, 0, w, (float) getHeight() };\r
+            case verticalKeyboardFacingLeft:    return { 0, x, (float) getWidth(), w };\r
+            case verticalKeyboardFacingRight:   return { 0, (float) getHeight() - x - w, (float) getWidth(), w };\r
+            default:                            jassertfalse; break;\r
+        }\r
+    }\r
+\r
+    return {};\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::setOctaveForMiddleC (int octaveNum)\r
+{\r
+    octaveNumForMiddleC = octaveNum;\r
+    repaint();\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::drawUpDownButton (Graphics& g, int w, int h, bool mouseOver, bool buttonDown, bool movesOctavesUp)\r
+{\r
+    g.fillAll (findColour (upDownButtonBackgroundColourId));\r
+\r
+    float angle = 0;\r
+\r
+    switch (getOrientation())\r
+    {\r
+        case horizontalKeyboard:            angle = movesOctavesUp ? 0.0f  : 0.5f;  break;\r
+        case verticalKeyboardFacingLeft:    angle = movesOctavesUp ? 0.25f : 0.75f; break;\r
+        case verticalKeyboardFacingRight:   angle = movesOctavesUp ? 0.75f : 0.25f; break;\r
+        default:                            jassertfalse; break;\r
+    }\r
+\r
+    Path path;\r
+    path.addTriangle (0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);\r
+    path.applyTransform (AffineTransform::rotation (MathConstants<float>::twoPi * angle, 0.5f, 0.5f));\r
+\r
+    g.setColour (findColour (upDownButtonArrowColourId)\r
+                  .withAlpha (buttonDown ? 1.0f : (mouseOver ? 0.6f : 0.4f)));\r
+\r
+    g.fillPath (path, path.getTransformToScaleToFit (1.0f, 1.0f, (float) w - 2.0f, (float) h - 2.0f, true));\r
+}\r
+\r
+Range<float> KeyboardComponentBase::getKeyPosition (int midiNoteNumber, float targetKeyWidth) const\r
+{\r
+    auto ratio = getBlackNoteWidthProportion();\r
+\r
+    static const float notePos[] = { 0.0f, 1 - ratio * 0.6f,\r
+                                     1.0f, 2 - ratio * 0.4f,\r
+                                     2.0f,\r
+                                     3.0f, 4 - ratio * 0.7f,\r
+                                     4.0f, 5 - ratio * 0.5f,\r
+                                     5.0f, 6 - ratio * 0.3f,\r
+                                     6.0f };\r
+\r
+    auto octave = midiNoteNumber / 12;\r
+    auto note   = midiNoteNumber % 12;\r
+\r
+    auto start = (float) octave * 7.0f * targetKeyWidth + notePos[note] * targetKeyWidth;\r
+    auto width = MidiMessage::isMidiNoteBlack (note) ? blackNoteWidthRatio * targetKeyWidth : targetKeyWidth;\r
+\r
+    return { start, start + width };\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::paint (Graphics& g)\r
+{\r
+    drawKeyboardBackground (g, getLocalBounds().toFloat());\r
+\r
+    for (int octaveBase = 0; octaveBase < 128; octaveBase += 12)\r
+    {\r
+        for (auto noteNum : whiteNotes)\r
+        {\r
+            const auto key = octaveBase + noteNum;\r
+\r
+            if (rangeStart <= key && key <= rangeEnd)\r
+                drawWhiteKey (key, g, getRectangleForKey (key));\r
+        }\r
+\r
+        for (auto noteNum : blackNotes)\r
+        {\r
+            const auto key = octaveBase + noteNum;\r
+\r
+            if (rangeStart <= key && key <= rangeEnd)\r
+                drawBlackKey (key, g, getRectangleForKey (key));\r
+        }\r
+    }\r
+}\r
+\r
+void KeyboardComponentBase::resized()\r
+{\r
+    auto w = getWidth();\r
+    auto h = getHeight();\r
+\r
+    if (w > 0 && h > 0)\r
+    {\r
+        if (orientation != horizontalKeyboard)\r
+            std::swap (w, h);\r
+\r
+        auto kx2 = getKeyPos (rangeEnd).getEnd();\r
+\r
+        if ((int) firstKey != rangeStart)\r
+        {\r
+            auto kx1 = getKeyPos (rangeStart).getStart();\r
+\r
+            if (kx2 - kx1 <= (float) w)\r
+            {\r
+                firstKey = (float) rangeStart;\r
+                sendChangeMessage();\r
+                repaint();\r
+            }\r
+        }\r
+\r
+        scrollDown->setVisible (canScroll && firstKey > (float) rangeStart);\r
+\r
+        xOffset = 0;\r
+\r
+        if (canScroll)\r
+        {\r
+            auto scrollButtonW = jmin (scrollButtonWidth, w / 2);\r
+            auto r = getLocalBounds();\r
+\r
+            if (orientation == horizontalKeyboard)\r
+            {\r
+                scrollDown->setBounds (r.removeFromLeft  (scrollButtonW));\r
+                scrollUp  ->setBounds (r.removeFromRight (scrollButtonW));\r
+            }\r
+            else if (orientation == verticalKeyboardFacingLeft)\r
+            {\r
+                scrollDown->setBounds (r.removeFromTop    (scrollButtonW));\r
+                scrollUp  ->setBounds (r.removeFromBottom (scrollButtonW));\r
+            }\r
+            else\r
+            {\r
+                scrollDown->setBounds (r.removeFromBottom (scrollButtonW));\r
+                scrollUp  ->setBounds (r.removeFromTop    (scrollButtonW));\r
+            }\r
+\r
+            auto endOfLastKey = getKeyPos (rangeEnd).getEnd();\r
+\r
+            auto spaceAvailable = w;\r
+            auto lastStartKey = remappedXYToNote ({ endOfLastKey - (float) spaceAvailable, 0 }).note + 1;\r
+\r
+            if (lastStartKey >= 0 && ((int) firstKey) > lastStartKey)\r
+            {\r
+                firstKey = (float) jlimit (rangeStart, rangeEnd, lastStartKey);\r
+                sendChangeMessage();\r
+            }\r
+\r
+            xOffset = getKeyPos ((int) firstKey).getStart();\r
+        }\r
+        else\r
+        {\r
+            firstKey = (float) rangeStart;\r
+        }\r
+\r
+        scrollUp->setVisible (canScroll && getKeyPos (rangeEnd).getStart() > (float) w);\r
+        repaint();\r
+    }\r
+}\r
+\r
+//==============================================================================\r
+void KeyboardComponentBase::mouseWheelMove (const MouseEvent&, const MouseWheelDetails& wheel)\r
+{\r
+    auto amount = (orientation == horizontalKeyboard && wheel.deltaX != 0)\r
+                       ? wheel.deltaX : (orientation == verticalKeyboardFacingLeft ? wheel.deltaY\r
+                                                                                   : -wheel.deltaY);\r
+\r
+    setLowestVisibleKeyFloat (firstKey - amount * keyWidth);\r
+}\r
+\r
+} // namespace juce\r
diff --git a/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h b/modules/juce_audio_utils/gui/juce_KeyboardComponentBase.h
new file mode 100644 (file)
index 0000000..0dd0424
--- /dev/null
@@ -0,0 +1,295 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+//==============================================================================\r
+/**\r
+    A base class for drawing a custom MIDI keyboard component.\r
+\r
+    Implement the drawKeyboardBackground(), drawWhiteKey(), and drawBlackKey() methods\r
+    to draw your content and this class will handle the underlying keyboard logic.\r
+\r
+    The component is a ChangeBroadcaster, so if you want to be informed when the\r
+    keyboard is scrolled, you can register a ChangeListener for callbacks.\r
+\r
+    @tags{Audio}\r
+*/\r
+class JUCE_API  KeyboardComponentBase  : public Component,\r
+                                         public ChangeBroadcaster\r
+{\r
+public:\r
+    //==============================================================================\r
+    /** The direction of the keyboard.\r
+\r
+        @see setOrientation\r
+    */\r
+    enum Orientation\r
+    {\r
+        horizontalKeyboard,\r
+        verticalKeyboardFacingLeft,\r
+        verticalKeyboardFacingRight,\r
+    };\r
+\r
+    //==============================================================================\r
+    /** Constructor.\r
+\r
+        @param orientation  whether the keyboard is horizontal or vertical\r
+    */\r
+    explicit KeyboardComponentBase (Orientation orientation);\r
+\r
+    /** Destructor. */\r
+    ~KeyboardComponentBase() override = default;\r
+\r
+    //==============================================================================\r
+    /** Changes the width used to draw the white keys. */\r
+    void setKeyWidth (float widthInPixels);\r
+\r
+    /** Returns the width that was set by setKeyWidth(). */\r
+    float getKeyWidth() const noexcept                              { return keyWidth; }\r
+\r
+    /** Changes the width used to draw the buttons that scroll the keyboard up/down in octaves. */\r
+    void setScrollButtonWidth (int widthInPixels);\r
+\r
+    /** Returns the width that was set by setScrollButtonWidth(). */\r
+    int getScrollButtonWidth() const noexcept                       { return scrollButtonWidth; }\r
+\r
+    /** Changes the keyboard's current direction. */\r
+    void setOrientation (Orientation newOrientation);\r
+\r
+    /** Returns the keyboard's current direction. */\r
+    Orientation getOrientation() const noexcept                     { return orientation; }\r
+\r
+    /** Returns true if the keyboard's orientation is horizontal. */\r
+    bool isHorizontal() const noexcept                              { return orientation == horizontalKeyboard; }\r
+\r
+    /** Sets the range of midi notes that the keyboard will be limited to.\r
+\r
+        By default the range is 0 to 127 (inclusive), but you can limit this if you\r
+        only want a restricted set of the keys to be shown.\r
+\r
+        Note that the values here are inclusive and must be between 0 and 127.\r
+    */\r
+    void setAvailableRange (int lowestNote, int highestNote);\r
+\r
+    /** Returns the first note in the available range.\r
+\r
+        @see setAvailableRange\r
+    */\r
+    int getRangeStart() const noexcept                              { return rangeStart; }\r
+\r
+    /** Returns the last note in the available range.\r
+\r
+        @see setAvailableRange\r
+    */\r
+    int getRangeEnd() const noexcept                                { return rangeEnd; }\r
+\r
+    /** If the keyboard extends beyond the size of the component, this will scroll\r
+        it to show the given key at the start.\r
+\r
+        Whenever the keyboard's position is changed, this will use the ChangeBroadcaster\r
+        base class to send a callback to any ChangeListeners that have been registered.\r
+    */\r
+    void setLowestVisibleKey (int noteNumber);\r
+\r
+    /** Returns the number of the first key shown in the component.\r
+\r
+        @see setLowestVisibleKey\r
+    */\r
+    int getLowestVisibleKey() const noexcept                        { return (int) firstKey; }\r
+\r
+    /** Returns the absolute length of the white notes.\r
+\r
+        This will be their vertical or horizontal length, depending on the keyboard's orientation.\r
+    */\r
+    float getWhiteNoteLength() const noexcept;\r
+\r
+    /** Sets the length of the black notes as a proportion of the white note length. */\r
+    void setBlackNoteLengthProportion (float ratio) noexcept;\r
+\r
+    /** Returns the length of the black notes as a proportion of the white note length. */\r
+    float getBlackNoteLengthProportion() const noexcept             { return blackNoteLengthRatio; }\r
+\r
+    /** Returns the absolute length of the black notes.\r
+\r
+        This will be their vertical or horizontal length, depending on the keyboard's orientation.\r
+    */\r
+    float getBlackNoteLength() const noexcept;\r
+\r
+    /** Sets the width of the black notes as a proportion of the white note width. */\r
+    void setBlackNoteWidthProportion (float ratio) noexcept;\r
+\r
+    /** Returns the width of the black notes as a proportion of the white note width. */\r
+    float getBlackNoteWidthProportion() const noexcept             { return blackNoteWidthRatio; }\r
+\r
+    /** Returns the absolute width of the black notes.\r
+\r
+        This will be their vertical or horizontal width, depending on the keyboard's orientation.\r
+    */\r
+    float getBlackNoteWidth() const noexcept                       { return keyWidth * blackNoteWidthRatio; }\r
+\r
+    /** If set to true, then scroll buttons will appear at either end of the keyboard\r
+        if there are too many notes to fit them all in the component at once.\r
+    */\r
+    void setScrollButtonsVisible (bool canScroll);\r
+\r
+    //==============================================================================\r
+    /** Colour IDs to use to change the colour of the octave scroll buttons.\r
+\r
+        These constants can be used either via the Component::setColour(), or LookAndFeel::setColour()\r
+        methods.\r
+\r
+        @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour\r
+    */\r
+    enum ColourIds\r
+    {\r
+        upDownButtonBackgroundColourId  = 0x1004000,\r
+        upDownButtonArrowColourId       = 0x1004001\r
+    };\r
+\r
+    /** Returns the position within the component of the left-hand edge of a key.\r
+\r
+        Depending on the keyboard's orientation, this may be a horizontal or vertical\r
+        distance, in either direction.\r
+    */\r
+    float getKeyStartPosition (int midiNoteNumber) const;\r
+\r
+    /** Returns the total width needed to fit all the keys in the available range. */\r
+    float getTotalKeyboardWidth() const noexcept;\r
+\r
+    /** This structure is returned by the getNoteAndVelocityAtPosition() method.\r
+    */\r
+    struct JUCE_API  NoteAndVelocity\r
+    {\r
+        int note;\r
+        float velocity;\r
+    };\r
+\r
+    /** Returns the note number and velocity for a given position within the component.\r
+\r
+        If includeChildComponents is true then this will return a key obscured by any child\r
+        components.\r
+    */\r
+    NoteAndVelocity getNoteAndVelocityAtPosition (Point<float> position, bool includeChildComponents = false);\r
+\r
+   #ifndef DOXYGEN\r
+    /** Returns the key at a given coordinate, or -1 if the position does not intersect a key. */\r
+    [[deprecated ("This method has been deprecated in favour of getNoteAndVelocityAtPosition.")]]\r
+    int getNoteAtPosition (Point<float> p)  { return getNoteAndVelocityAtPosition (p).note; }\r
+   #endif\r
+\r
+    /** Returns the rectangle for a given key. */\r
+    Rectangle<float> getRectangleForKey (int midiNoteNumber) const;\r
+\r
+    //==============================================================================\r
+    /** This sets the octave number which is shown as the octave number for middle C.\r
+\r
+        This affects only the default implementation of getWhiteNoteText(), which\r
+        passes this octave number to MidiMessage::getMidiNoteName() in order to\r
+        get the note text. See MidiMessage::getMidiNoteName() for more info about\r
+        the parameter.\r
+\r
+        By default this value is set to 3.\r
+\r
+        @see getOctaveForMiddleC\r
+    */\r
+    void setOctaveForMiddleC (int octaveNumForMiddleC);\r
+\r
+    /** This returns the value set by setOctaveForMiddleC().\r
+\r
+        @see setOctaveForMiddleC\r
+    */\r
+    int getOctaveForMiddleC() const noexcept            { return octaveNumForMiddleC; }\r
+\r
+    //==============================================================================\r
+    /** Use this method to draw the background of the keyboard that will be drawn under\r
+        the white and black notes. This can also be used to draw any shadow or outline effects.\r
+    */\r
+    virtual void drawKeyboardBackground (Graphics& g, Rectangle<float> area) = 0;\r
+\r
+    /** Use this method to draw a white key of the keyboard in a given rectangle.\r
+\r
+        When doing this, be sure to note the keyboard's orientation.\r
+    */\r
+    virtual void drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) = 0;\r
+\r
+    /** Use this method to draw a black key of the keyboard in a given rectangle.\r
+\r
+        When doing this, be sure to note the keyboard's orientation.\r
+    */\r
+    virtual void drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) = 0;\r
+\r
+    /** This can be overridden to draw the up and down buttons that scroll the keyboard\r
+        up/down in octaves.\r
+    */\r
+    virtual void drawUpDownButton (Graphics& g, int w, int h, bool isMouseOver, bool isButtonPressed, bool movesOctavesUp);\r
+\r
+    /** Calculates the position of a given midi-note.\r
+\r
+        This can be overridden to create layouts with custom key-widths.\r
+\r
+        @param midiNoteNumber   the note to find\r
+        @param keyWidth         the desired width in pixels of one key - see setKeyWidth()\r
+        @returns                the start and length of the key along the axis of the keyboard\r
+    */\r
+    virtual Range<float> getKeyPosition (int midiNoteNumber, float keyWidth) const;\r
+\r
+    //==============================================================================\r
+    /** @internal */\r
+    void paint (Graphics&) override;\r
+    /** @internal */\r
+    void resized() override;\r
+    /** @internal */\r
+    void mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) override;\r
+\r
+private:\r
+    //==============================================================================\r
+    struct UpDownButton;\r
+\r
+    Range<float> getKeyPos (int midiNoteNumber) const;\r
+    NoteAndVelocity remappedXYToNote (Point<float>) const;\r
+    void setLowestVisibleKeyFloat (float noteNumber);\r
+\r
+    //==============================================================================\r
+    Orientation orientation;\r
+\r
+    float blackNoteLengthRatio = 0.7f, blackNoteWidthRatio = 0.7f;\r
+    float xOffset = 0.0f;\r
+    float keyWidth = 16.0f;\r
+    float firstKey = 12 * 4.0f;\r
+\r
+    int scrollButtonWidth = 12;\r
+    int rangeStart = 0, rangeEnd = 127;\r
+    int octaveNumForMiddleC = 3;\r
+\r
+    bool canScroll = true;\r
+    std::unique_ptr<Button> scrollDown, scrollUp;\r
+\r
+    //==============================================================================\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KeyboardComponentBase)\r
+};\r
+\r
+} // namespace juce\r
diff --git a/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp b/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.cpp
new file mode 100644 (file)
index 0000000..4fd8621
--- /dev/null
@@ -0,0 +1,507 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+struct MPEKeyboardComponent::MPENoteComponent : public Component\r
+{\r
+    MPENoteComponent (MPEKeyboardComponent& o, uint16 sID, uint8 initial, float noteOnVel, float press)\r
+       : owner (o),\r
+         radiusScale (owner.getKeyWidth() / 1.5f),\r
+         noteOnVelocity (noteOnVel),\r
+         pressure (press),\r
+         sourceID (sID),\r
+         initialNote (initial)\r
+    {\r
+    }\r
+\r
+    float getStrikeRadius() const      { return 5.0f + getNoteOnVelocity() * radiusScale * 2.0f; }\r
+    float getPressureRadius() const    { return 5.0f + getPressure() * radiusScale * 2.0f; }\r
+\r
+    float getNoteOnVelocity() const    { return noteOnVelocity; }\r
+    float getPressure() const          { return pressure; }\r
+\r
+    Point<float> getCentrePos() const  { return getBounds().toFloat().getCentre(); }\r
+\r
+    void paint (Graphics& g) override\r
+    {\r
+        auto strikeSize = getStrikeRadius() * 2.0f;\r
+        auto pressSize = getPressureRadius() * 2.0f;\r
+        auto bounds = getLocalBounds().toFloat();\r
+\r
+        g.setColour (owner.findColour (noteCircleFillColourId));\r
+        g.fillEllipse (bounds.withSizeKeepingCentre (strikeSize, strikeSize));\r
+\r
+        g.setColour (owner.findColour (noteCircleOutlineColourId));\r
+        g.drawEllipse (bounds.withSizeKeepingCentre (pressSize, pressSize), 1.0f);\r
+    }\r
+\r
+    //==========================================================================\r
+    MPEKeyboardComponent& owner;\r
+\r
+    float radiusScale = 0.0f, noteOnVelocity = 0.0f, pressure = 0.5f;\r
+    uint16 sourceID = 0;\r
+    uint8 initialNote = 0;\r
+    bool isLatched = true;\r
+};\r
+\r
+//==============================================================================\r
+MPEKeyboardComponent::MPEKeyboardComponent (MPEInstrument& instr, Orientation orientationToUse)\r
+    : KeyboardComponentBase (orientationToUse),\r
+      instrument (instr)\r
+{\r
+    updateZoneLayout();\r
+    colourChanged();\r
+    setKeyWidth (25.0f);\r
+\r
+    instrument.addListener (this);\r
+}\r
+\r
+MPEKeyboardComponent::~MPEKeyboardComponent()\r
+{\r
+    instrument.removeListener (this);\r
+}\r
+\r
+//==============================================================================\r
+void MPEKeyboardComponent::drawKeyboardBackground (Graphics& g, Rectangle<float> area)\r
+{\r
+    g.setColour (findColour (whiteNoteColourId));\r
+    g.fillRect (area);\r
+}\r
+\r
+void MPEKeyboardComponent::drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area)\r
+{\r
+    if (midiNoteNumber % 12 == 0)\r
+    {\r
+        auto fontHeight = jmin (12.0f, getKeyWidth() * 0.9f);\r
+        auto text = MidiMessage::getMidiNoteName (midiNoteNumber, true, true, getOctaveForMiddleC());\r
+\r
+        g.setColour (findColour (textLabelColourId));\r
+        g.setFont (Font (fontHeight).withHorizontalScale (0.8f));\r
+\r
+        switch (getOrientation())\r
+        {\r
+            case horizontalKeyboard:\r
+                g.drawText (text, area.withTrimmedLeft (1.0f).withTrimmedBottom (2.0f),\r
+                            Justification::centredBottom, false);\r
+                break;\r
+            case verticalKeyboardFacingLeft:\r
+                g.drawText (text, area.reduced (2.0f), Justification::centredLeft, false);\r
+                break;\r
+            case verticalKeyboardFacingRight:\r
+                g.drawText (text, area.reduced (2.0f), Justification::centredRight, false);\r
+                break;\r
+            default:\r
+                break;\r
+        }\r
+    }\r
+}\r
+\r
+void MPEKeyboardComponent::drawBlackKey (int /*midiNoteNumber*/, Graphics& g, Rectangle<float> area)\r
+{\r
+    g.setColour (findColour (whiteNoteColourId));\r
+    g.fillRect (area);\r
+\r
+    g.setColour (findColour (blackNoteColourId));\r
+\r
+    if (isHorizontal())\r
+    {\r
+        g.fillRoundedRectangle (area.toFloat().reduced ((area.getWidth() / 2.0f) - (getBlackNoteWidth() / 12.0f),\r
+                                                        area.getHeight() / 4.0f), 1.0f);\r
+    }\r
+    else\r
+    {\r
+        g.fillRoundedRectangle (area.toFloat().reduced (area.getWidth() / 4.0f,\r
+                                                        (area.getHeight() / 2.0f) - (getBlackNoteWidth() / 12.0f)), 1.0f);\r
+    }\r
+}\r
+\r
+void MPEKeyboardComponent::colourChanged()\r
+{\r
+    setOpaque (findColour (whiteNoteColourId).isOpaque());\r
+    repaint();\r
+}\r
+\r
+//==========================================================================\r
+MPEValue MPEKeyboardComponent::mousePositionToPitchbend (int initialNote, Point<float> mousePos)\r
+{\r
+    auto constrainedMousePos = [&]\r
+    {\r
+        auto horizontal = isHorizontal();\r
+\r
+        auto posToCheck = jlimit (0.0f,\r
+                                  horizontal ? (float) getWidth() - 1.0f : (float) getHeight(),\r
+                                  horizontal ? mousePos.x : mousePos.y);\r
+\r
+        auto bottomKeyRange = getRectangleForKey (jmax (getRangeStart(), initialNote - perNotePitchbendRange));\r
+        auto topKeyRange    = getRectangleForKey (jmin (getRangeEnd(),   initialNote + perNotePitchbendRange));\r
+\r
+        auto lowerLimit = horizontal ? bottomKeyRange.getCentreX()\r
+                                     : getOrientation() == Orientation::verticalKeyboardFacingRight ? topKeyRange.getCentreY()\r
+                                                                                                    : bottomKeyRange.getCentreY();\r
+\r
+        auto upperLimit = horizontal ? topKeyRange.getCentreX()\r
+                                     : getOrientation() == Orientation::verticalKeyboardFacingRight ? bottomKeyRange.getCentreY()\r
+                                                                                                    : topKeyRange.getCentreY();\r
+\r
+        posToCheck = jlimit (lowerLimit, upperLimit, posToCheck);\r
+\r
+        return horizontal ? Point<float> (posToCheck, 0.0f)\r
+                          : Point<float> (0.0f, posToCheck);\r
+    }();\r
+\r
+    auto note = getNoteAndVelocityAtPosition (constrainedMousePos, true).note;\r
+\r
+    if (note == -1)\r
+    {\r
+        jassertfalse;\r
+        return {};\r
+    }\r
+\r
+    auto fractionalSemitoneBend = [&]\r
+    {\r
+        auto noteRect = getRectangleForKey (note);\r
+\r
+        switch (getOrientation())\r
+        {\r
+            case horizontalKeyboard:          return (constrainedMousePos.x - noteRect.getCentreX()) / noteRect.getWidth();\r
+            case verticalKeyboardFacingRight: return (noteRect.getCentreY() - constrainedMousePos.y) / noteRect.getHeight();\r
+            case verticalKeyboardFacingLeft:  return (constrainedMousePos.y - noteRect.getCentreY()) / noteRect.getHeight();\r
+        }\r
+\r
+        jassertfalse;\r
+        return 0.0f;\r
+    }();\r
+\r
+    auto totalNumSemitones = ((float) note + fractionalSemitoneBend) - (float) initialNote;\r
+\r
+    return MPEValue::fromUnsignedFloat (jmap (totalNumSemitones, (float) -perNotePitchbendRange, (float) perNotePitchbendRange, 0.0f, 1.0f));\r
+}\r
+\r
+MPEValue MPEKeyboardComponent::mousePositionToTimbre (Point<float> mousePos)\r
+{\r
+    auto delta = [mousePos, this]\r
+    {\r
+        switch (getOrientation())\r
+        {\r
+            case horizontalKeyboard:          return mousePos.y;\r
+            case verticalKeyboardFacingLeft:  return (float) getWidth() - mousePos.x;\r
+            case verticalKeyboardFacingRight: return mousePos.x;\r
+        }\r
+\r
+        jassertfalse;\r
+        return 0.0f;\r
+    }();\r
+\r
+    return MPEValue::fromUnsignedFloat (jlimit (0.0f, 1.0f, 1.0f - (delta / getWhiteNoteLength())));\r
+}\r
+\r
+void MPEKeyboardComponent::mouseDown (const MouseEvent& e)\r
+{\r
+    auto newNote = getNoteAndVelocityAtPosition (e.position).note;\r
+\r
+    if (newNote >= 0)\r
+    {\r
+        auto channel = channelAssigner->findMidiChannelForNewNote (newNote);\r
+\r
+        instrument.noteOn (channel, newNote, MPEValue::fromUnsignedFloat (velocity));\r
+        sourceIDMap[e.source.getIndex()] = instrument.getNote (instrument.getNumPlayingNotes() - 1).noteID;\r
+\r
+        instrument.pitchbend (channel, MPEValue::centreValue());\r
+        instrument.timbre    (channel, mousePositionToTimbre (e.position));\r
+        instrument.pressure  (channel, MPEValue::fromUnsignedFloat (e.isPressureValid()\r
+                                                                    && useMouseSourcePressureForStrike ? e.pressure\r
+                                                                                                       : pressure));\r
+    }\r
+}\r
+\r
+void MPEKeyboardComponent::mouseDrag (const MouseEvent& e)\r
+{\r
+    auto noteID = sourceIDMap[e.source.getIndex()];\r
+    auto note = instrument.getNoteWithID (noteID);\r
+\r
+    if (! note.isValid())\r
+        return;\r
+\r
+    auto noteComponent = std::find_if (noteComponents.begin(),\r
+                                       noteComponents.end(),\r
+                                       [noteID] (auto& comp) { return comp->sourceID == noteID; });\r
+\r
+    if (noteComponent == noteComponents.end())\r
+        return;\r
+\r
+    if ((*noteComponent)->isLatched && std::abs (isHorizontal() ? e.getDistanceFromDragStartX()\r
+                                                                : e.getDistanceFromDragStartY()) > roundToInt (getKeyWidth() / 4.0f))\r
+    {\r
+        (*noteComponent)->isLatched = false;\r
+    }\r
+\r
+    auto channel = channelAssigner->findMidiChannelForExistingNote (note.initialNote);\r
+\r
+    if (! (*noteComponent)->isLatched)\r
+        instrument.pitchbend (channel, mousePositionToPitchbend (note.initialNote, e.position));\r
+\r
+    instrument.timbre (channel, mousePositionToTimbre (e.position));\r
+    instrument.pressure (channel, MPEValue::fromUnsignedFloat (e.isPressureValid()\r
+                                                               && useMouseSourcePressureForStrike ? e.pressure\r
+                                                                                                  : pressure));\r
+}\r
+\r
+void MPEKeyboardComponent::mouseUp (const MouseEvent& e)\r
+{\r
+    auto note = instrument.getNoteWithID (sourceIDMap[e.source.getIndex()]);\r
+\r
+    if (! note.isValid())\r
+        return;\r
+\r
+    instrument.noteOff (channelAssigner->findMidiChannelForExistingNote (note.initialNote),\r
+                        note.initialNote, MPEValue::fromUnsignedFloat (lift));\r
+    channelAssigner->noteOff (note.initialNote);\r
+    sourceIDMap.erase (e.source.getIndex());\r
+}\r
+\r
+void MPEKeyboardComponent::focusLost (FocusChangeType)\r
+{\r
+    for (auto& comp : noteComponents)\r
+    {\r
+        auto note = instrument.getNoteWithID (comp->sourceID);\r
+\r
+        if (note.isValid())\r
+            instrument.noteOff (channelAssigner->findMidiChannelForExistingNote (note.initialNote),\r
+                                note.initialNote, MPEValue::fromUnsignedFloat (lift));\r
+    }\r
+}\r
+\r
+//==============================================================================\r
+void MPEKeyboardComponent::updateZoneLayout()\r
+{\r
+    {\r
+        const ScopedLock noteLock (activeNotesLock);\r
+        activeNotes.clear();\r
+    }\r
+\r
+    noteComponents.clear();\r
+\r
+    if (instrument.isLegacyModeEnabled())\r
+    {\r
+        channelAssigner = std::make_unique<MPEChannelAssigner> (instrument.getLegacyModeChannelRange());\r
+        perNotePitchbendRange = instrument.getLegacyModePitchbendRange();\r
+    }\r
+    else\r
+    {\r
+        auto layout = instrument.getZoneLayout();\r
+\r
+        if (layout.isActive())\r
+        {\r
+            auto zone = layout.getLowerZone().isActive() ? layout.getLowerZone()\r
+                                                         : layout.getUpperZone();\r
+\r
+            channelAssigner = std::make_unique<MPEChannelAssigner> (zone);\r
+            perNotePitchbendRange = zone.perNotePitchbendRange;\r
+        }\r
+        else\r
+        {\r
+            channelAssigner.reset();\r
+        }\r
+    }\r
+}\r
+\r
+void MPEKeyboardComponent::addNewNote (MPENote note)\r
+{\r
+    noteComponents.push_back (std::make_unique<MPENoteComponent> (*this, note.noteID, note.initialNote,\r
+                                                                  note.noteOnVelocity.asUnsignedFloat(),\r
+                                                                  note.pressure.asUnsignedFloat()));\r
+    auto& comp = noteComponents.back();\r
+\r
+    addAndMakeVisible (*comp);\r
+    comp->toBack();\r
+}\r
+\r
+void MPEKeyboardComponent::handleNoteOns (std::set<MPENote>& notesToUpdate)\r
+{\r
+    for (auto& note : notesToUpdate)\r
+    {\r
+        if (! std::any_of (noteComponents.begin(),\r
+                           noteComponents.end(),\r
+                           [note] (auto& comp) { return comp->sourceID == note.noteID; }))\r
+        {\r
+            addNewNote (note);\r
+        }\r
+    }\r
+}\r
+\r
+void MPEKeyboardComponent::handleNoteOffs (std::set<MPENote>& notesToUpdate)\r
+{\r
+    auto removePredicate = [&notesToUpdate] (std::unique_ptr<MPENoteComponent>& comp)\r
+    {\r
+        return std::none_of (notesToUpdate.begin(),\r
+                             notesToUpdate.end(),\r
+                             [&comp] (auto& note) { return comp->sourceID == note.noteID; });\r
+    };\r
+\r
+    noteComponents.erase (std::remove_if (std::begin (noteComponents),\r
+                                          std::end (noteComponents),\r
+                                          removePredicate),\r
+                          std::end (noteComponents));\r
+\r
+    if (noteComponents.empty())\r
+        stopTimer();\r
+}\r
+\r
+void MPEKeyboardComponent::updateNoteComponentBounds (const MPENote& note, MPENoteComponent& noteComponent)\r
+{\r
+    auto xPos = [&]\r
+    {\r
+        const auto currentNote = note.initialNote + (float) note.totalPitchbendInSemitones;\r
+        const auto noteBend = currentNote - std::floor (currentNote);\r
+\r
+        const auto noteBounds = getRectangleForKey ((int) currentNote);\r
+        const auto nextNoteBounds = getRectangleForKey ((int) currentNote + 1);\r
+\r
+        const auto horizontal = isHorizontal();\r
+\r
+        const auto distance = noteBend * (horizontal ? nextNoteBounds.getCentreX() - noteBounds.getCentreX()\r
+                                                     : nextNoteBounds.getCentreY() - noteBounds.getCentreY());\r
+\r
+        return (horizontal ? noteBounds.getCentreX() : noteBounds.getCentreY()) + distance;\r
+    }();\r
+\r
+    auto yPos = [&]\r
+    {\r
+        const auto currentOrientation = getOrientation();\r
+\r
+        const auto timbrePosition = (currentOrientation == horizontalKeyboard\r
+                                    || currentOrientation == verticalKeyboardFacingRight ? 1.0f - note.timbre.asUnsignedFloat()\r
+                                                                                         : note.timbre.asUnsignedFloat());\r
+\r
+        return timbrePosition * getWhiteNoteLength();\r
+    }();\r
+\r
+    const auto centrePos = (isHorizontal() ? Point<float> (xPos, yPos)\r
+                                           : Point<float> (yPos, xPos));\r
+\r
+    const auto radius = jmax (noteComponent.getStrikeRadius(), noteComponent.getPressureRadius());\r
+\r
+    noteComponent.setBounds (Rectangle<float> (radius * 2.0f, radius * 2.0f)\r
+                               .withCentre (centrePos)\r
+                               .getSmallestIntegerContainer());\r
+}\r
+\r
+static bool operator< (const MPENote& n1, const MPENote& n2) noexcept  { return n1.noteID < n2.noteID; }\r
+\r
+void MPEKeyboardComponent::updateNoteComponents()\r
+{\r
+    std::set<MPENote> notesToUpdate;\r
+\r
+    {\r
+        ScopedLock noteLock (activeNotesLock);\r
+\r
+        for (const auto& note : activeNotes)\r
+            if (note.second)\r
+                notesToUpdate.insert (note.first);\r
+    };\r
+\r
+    handleNoteOns  (notesToUpdate);\r
+    handleNoteOffs (notesToUpdate);\r
+\r
+    for (auto& comp : noteComponents)\r
+    {\r
+        auto noteForComponent = std::find_if (notesToUpdate.begin(),\r
+                                              notesToUpdate.end(),\r
+                                              [&comp] (auto& note) { return note.noteID == comp->sourceID; });\r
+\r
+        if (noteForComponent != notesToUpdate.end())\r
+        {\r
+            comp->pressure = noteForComponent->pressure.asUnsignedFloat();\r
+            updateNoteComponentBounds (*noteForComponent, *comp);\r
+\r
+            comp->repaint();\r
+        }\r
+    }\r
+}\r
+\r
+void MPEKeyboardComponent::timerCallback()\r
+{\r
+    updateNoteComponents();\r
+}\r
+\r
+//==============================================================================\r
+void MPEKeyboardComponent::noteAdded (MPENote newNote)\r
+{\r
+    {\r
+        const ScopedLock noteLock (activeNotesLock);\r
+        activeNotes.push_back ({ newNote, true });\r
+    }\r
+\r
+    startTimerHz (30);\r
+}\r
+\r
+void MPEKeyboardComponent::updateNoteData (MPENote& changedNote)\r
+{\r
+    const ScopedLock noteLock (activeNotesLock);\r
+\r
+    for (auto& note : activeNotes)\r
+    {\r
+        if (note.first.noteID == changedNote.noteID)\r
+        {\r
+            note.first = changedNote;\r
+            note.second = true;\r
+            return;\r
+        }\r
+    }\r
+}\r
+\r
+void MPEKeyboardComponent::notePressureChanged (MPENote changedNote)\r
+{\r
+    updateNoteData (changedNote);\r
+}\r
+\r
+void MPEKeyboardComponent::notePitchbendChanged (MPENote changedNote)\r
+{\r
+    updateNoteData (changedNote);\r
+}\r
+\r
+void MPEKeyboardComponent::noteTimbreChanged (MPENote changedNote)\r
+{\r
+    updateNoteData (changedNote);\r
+}\r
+\r
+void MPEKeyboardComponent::noteReleased (MPENote finishedNote)\r
+{\r
+    const ScopedLock noteLock (activeNotesLock);\r
+\r
+    activeNotes.erase (std::remove_if (std::begin (activeNotes),\r
+                                       std::end (activeNotes),\r
+                                       [finishedNote] (auto& note) { return note.first.noteID == finishedNote.noteID; }),\r
+                       std::end (activeNotes));\r
+}\r
+\r
+void MPEKeyboardComponent::zoneLayoutChanged()\r
+{\r
+    MessageManager::callAsync ([this] { updateZoneLayout(); });\r
+}\r
+\r
+} // namespace juce\r
diff --git a/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h b/modules/juce_audio_utils/gui/juce_MPEKeyboardComponent.h
new file mode 100644 (file)
index 0000000..57c9e71
--- /dev/null
@@ -0,0 +1,153 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+//==============================================================================\r
+/**\r
+    A component that displays an MPE-compatible keyboard, whose notes can be clicked on.\r
+\r
+    This component will mimic a physical MPE-compatible keyboard, showing the current state\r
+    of an MPEInstrument object. When the on-screen keys are clicked on, it will play these\r
+    notes by calling the noteOn() and noteOff() methods of its MPEInstrument object. Moving\r
+    the mouse will update the pitchbend and timbre dimensions of the MPEInstrument.\r
+\r
+    @see MPEInstrument\r
+\r
+    @tags{Audio}\r
+*/\r
+class JUCE_API  MPEKeyboardComponent  : public KeyboardComponentBase,\r
+                                        private MPEInstrument::Listener,\r
+                                        private Timer\r
+{\r
+public:\r
+    //==============================================================================\r
+    /** Creates an MPEKeyboardComponent.\r
+\r
+        @param instrument   the MPEInstrument that this component represents\r
+        @param orientation  whether the keyboard is horizontal or vertical\r
+    */\r
+    MPEKeyboardComponent (MPEInstrument& instrument, Orientation orientation);\r
+\r
+    /** Destructor. */\r
+    virtual ~MPEKeyboardComponent() override;\r
+\r
+    //==============================================================================\r
+    /** Sets the note-on velocity, or "strike", value that will be used when triggering new notes. */\r
+    void setVelocity (float newVelocity)                                 { velocity = jlimit (newVelocity, 0.0f, 1.0f); }\r
+\r
+    /** Sets the pressure value that will be used for new notes. */\r
+    void setPressure (float newPressure)                                 { pressure = jlimit (newPressure, 0.0f, 1.0f); }\r
+\r
+    /** Sets the note-off velocity, or "lift", value that will be used when notes are released. */\r
+    void setLift (float newLift)                                         { lift = jlimit (newLift, 0.0f, 1.0f); }\r
+\r
+    /** Use this to enable the mouse source pressure to be used for the initial note-on\r
+        velocity, or "strike", value if the mouse source supports it.\r
+    */\r
+    void setUseMouseSourcePressureForStrike (bool usePressureForStrike)  { useMouseSourcePressureForStrike = usePressureForStrike; }\r
+\r
+    //==============================================================================\r
+    /** A set of colour IDs to use to change the colour of various aspects of the keyboard.\r
+\r
+        These constants can be used either via the Component::setColour(), or LookAndFeel::setColour()\r
+        methods.\r
+\r
+        @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour\r
+    */\r
+    enum ColourIds\r
+    {\r
+        whiteNoteColourId         = 0x1006000,\r
+        blackNoteColourId         = 0x1006001,\r
+        textLabelColourId         = 0x1006002,\r
+        noteCircleFillColourId    = 0x1006003,\r
+        noteCircleOutlineColourId = 0x1006004\r
+    };\r
+\r
+    //==============================================================================\r
+    /** @internal */\r
+    void mouseDrag (const MouseEvent&) override;\r
+    /** @internal */\r
+    void mouseDown (const MouseEvent&) override;\r
+    /** @internal */\r
+    void mouseUp (const MouseEvent&) override;\r
+    /** @internal */\r
+    void focusLost (FocusChangeType) override;\r
+    /** @internal */\r
+    void colourChanged() override;\r
+\r
+private:\r
+    //==========================================================================\r
+    struct MPENoteComponent;\r
+\r
+    //==============================================================================\r
+    void drawKeyboardBackground (Graphics& g, Rectangle<float> area) override;\r
+    void drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override;\r
+    void drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override;\r
+\r
+    void updateNoteData (MPENote&);\r
+\r
+    void noteAdded (MPENote) override;\r
+    void notePressureChanged (MPENote) override;\r
+    void notePitchbendChanged (MPENote) override;\r
+    void noteTimbreChanged (MPENote) override;\r
+    void noteReleased (MPENote) override;\r
+    void zoneLayoutChanged() override;\r
+\r
+    void timerCallback() override;\r
+\r
+    //==============================================================================\r
+    MPEValue mousePositionToPitchbend (int, Point<float>);\r
+    MPEValue mousePositionToTimbre (Point<float>);\r
+\r
+    void addNewNote (MPENote);\r
+    void removeNote (MPENote);\r
+\r
+    void handleNoteOns  (std::set<MPENote>&);\r
+    void handleNoteOffs (std::set<MPENote>&);\r
+    void updateNoteComponentBounds (const MPENote&, MPENoteComponent&);\r
+    void updateNoteComponents();\r
+\r
+    void updateZoneLayout();\r
+\r
+    //==============================================================================\r
+    MPEInstrument& instrument;\r
+    std::unique_ptr<MPEChannelAssigner> channelAssigner;\r
+\r
+    CriticalSection activeNotesLock;\r
+    std::vector<std::pair<MPENote, bool>> activeNotes;\r
+    std::vector<std::unique_ptr<MPENoteComponent>> noteComponents;\r
+    std::map<int, uint16> sourceIDMap;\r
+\r
+    float velocity = 0.7f, pressure = 1.0f, lift = 0.0f;\r
+    bool useMouseSourcePressureForStrike = false;\r
+    int perNotePitchbendRange = 48;\r
+\r
+    //==============================================================================\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MPEKeyboardComponent)\r
+};\r
+\r
+} // namespace juce\r
index 6f0f939894b5068ca484ec656993d3f313061223..babea00826a332a88d3067f2c3acf29e00256ad0 100644 (file)
 namespace juce\r
 {\r
 \r
-static const uint8 whiteNotes[] = { 0, 2, 4, 5, 7, 9, 11 };\r
-static const uint8 blackNotes[] = { 1, 3, 6, 8, 10 };\r
-\r
-\r
-struct MidiKeyboardComponent::UpDownButton  : public Button\r
-{\r
-    UpDownButton (MidiKeyboardComponent& c, int d)\r
-        : Button ({}), owner (c), delta (d)\r
-    {\r
-    }\r
-\r
-    void clicked() override\r
-    {\r
-        auto note = owner.getLowestVisibleKey();\r
-\r
-        if (delta < 0)\r
-            note = (note - 1) / 12;\r
-        else\r
-            note = note / 12 + 1;\r
-\r
-        owner.setLowestVisibleKey (note * 12);\r
-    }\r
-\r
-    using Button::clicked;\r
-\r
-    void paintButton (Graphics& g, bool shouldDrawButtonAsHighlighted, bool shouldDrawButtonAsDown) override\r
-    {\r
-        owner.drawUpDownButton (g, getWidth(), getHeight(),\r
-                                shouldDrawButtonAsHighlighted, shouldDrawButtonAsDown,\r
-                                delta > 0);\r
-    }\r
-\r
-private:\r
-    MidiKeyboardComponent& owner;\r
-    const int delta;\r
-\r
-    JUCE_DECLARE_NON_COPYABLE (UpDownButton)\r
-};\r
-\r
 //==============================================================================\r
-MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& s, Orientation o)\r
-    : state (s), orientation (o)\r
+MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& stateToUse, Orientation orientationToUse)\r
+    : KeyboardComponentBase (orientationToUse), state (stateToUse)\r
 {\r
-    scrollDown.reset (new UpDownButton (*this, -1));\r
-    scrollUp  .reset (new UpDownButton (*this, 1));\r
-\r
-    addChildComponent (scrollDown.get());\r
-    addChildComponent (scrollUp.get());\r
+    state.addListener (this);\r
 \r
     // initialise with a default set of qwerty key-mappings..\r
     int note = 0;\r
 \r
     for (char c : "awsedftgyhujkolp;")\r
-        setKeyPressForNote (KeyPress (c, 0, 0), note++);\r
+        setKeyPressForNote ({ c, 0, 0 }, note++);\r
 \r
     mouseOverNotes.insertMultiple (0, -1, 32);\r
     mouseDownNotes.insertMultiple (0, -1, 32);\r
@@ -87,8 +44,6 @@ MidiKeyboardComponent::MidiKeyboardComponent (MidiKeyboardState& s, Orientation
     colourChanged();\r
     setWantsKeyboardFocus (true);\r
 \r
-    state.addListener (this);\r
-\r
     startTimerHz (20);\r
 }\r
 \r
@@ -98,337 +53,301 @@ MidiKeyboardComponent::~MidiKeyboardComponent()
 }\r
 \r
 //==============================================================================\r
-void MidiKeyboardComponent::setKeyWidth (float widthInPixels)\r
+void MidiKeyboardComponent::setVelocity (float v, bool useMousePosition)\r
 {\r
-    jassert (widthInPixels > 0);\r
-\r
-    if (keyWidth != widthInPixels) // Prevent infinite recursion if the width is being computed in a 'resized()' call-back\r
-    {\r
-        keyWidth = widthInPixels;\r
-        resized();\r
-    }\r
+    velocity = v;\r
+    useMousePositionForVelocity = useMousePosition;\r
 }\r
 \r
-void MidiKeyboardComponent::setScrollButtonWidth (int widthInPixels)\r
+//==============================================================================\r
+void MidiKeyboardComponent::setMidiChannel (int midiChannelNumber)\r
 {\r
-    jassert (widthInPixels > 0);\r
-\r
-    if (scrollButtonWidth != widthInPixels)\r
-    {\r
-        scrollButtonWidth = widthInPixels;\r
-        resized();\r
-    }\r
-}\r
+    jassert (midiChannelNumber > 0 && midiChannelNumber <= 16);\r
 \r
-void MidiKeyboardComponent::setOrientation (Orientation newOrientation)\r
-{\r
-    if (orientation != newOrientation)\r
+    if (midiChannel != midiChannelNumber)\r
     {\r
-        orientation = newOrientation;\r
-        resized();\r
+        resetAnyKeysInUse();\r
+        midiChannel = jlimit (1, 16, midiChannelNumber);\r
     }\r
 }\r
 \r
-void MidiKeyboardComponent::setAvailableRange (int lowestNote, int highestNote)\r
+void MidiKeyboardComponent::setMidiChannelsToDisplay (int midiChannelMask)\r
 {\r
-    jassert (lowestNote >= 0 && lowestNote <= 127);\r
-    jassert (highestNote >= 0 && highestNote <= 127);\r
-    jassert (lowestNote <= highestNote);\r
-\r
-    if (rangeStart != lowestNote || rangeEnd != highestNote)\r
-    {\r
-        rangeStart = jlimit (0, 127, lowestNote);\r
-        rangeEnd = jlimit (0, 127, highestNote);\r
-        firstKey = jlimit ((float) rangeStart, (float) rangeEnd, firstKey);\r
-        resized();\r
-    }\r
+    midiInChannelMask = midiChannelMask;\r
+    noPendingUpdates.store (false);\r
 }\r
 \r
-void MidiKeyboardComponent::setLowestVisibleKey (int noteNumber)\r
+//==============================================================================\r
+void MidiKeyboardComponent::clearKeyMappings()\r
 {\r
-    setLowestVisibleKeyFloat ((float) noteNumber);\r
+    resetAnyKeysInUse();\r
+    keyPressNotes.clear();\r
+    keyPresses.clear();\r
 }\r
 \r
-void MidiKeyboardComponent::setLowestVisibleKeyFloat (float noteNumber)\r
+void MidiKeyboardComponent::setKeyPressForNote (const KeyPress& key, int midiNoteOffsetFromC)\r
 {\r
-    noteNumber = jlimit ((float) rangeStart, (float) rangeEnd, noteNumber);\r
-\r
-    if (noteNumber != firstKey)\r
-    {\r
-        bool hasMoved = (((int) firstKey) != (int) noteNumber);\r
-        firstKey = noteNumber;\r
-\r
-        if (hasMoved)\r
-            sendChangeMessage();\r
+    removeKeyPressForNote (midiNoteOffsetFromC);\r
 \r
-        resized();\r
-    }\r
+    keyPressNotes.add (midiNoteOffsetFromC);\r
+    keyPresses.add (key);\r
 }\r
 \r
-void MidiKeyboardComponent::setScrollButtonsVisible (bool newCanScroll)\r
+void MidiKeyboardComponent::removeKeyPressForNote (int midiNoteOffsetFromC)\r
 {\r
-    if (canScroll != newCanScroll)\r
+    for (int i = keyPressNotes.size(); --i >= 0;)\r
     {\r
-        canScroll = newCanScroll;\r
-        resized();\r
+        if (keyPressNotes.getUnchecked (i) == midiNoteOffsetFromC)\r
+        {\r
+            keyPressNotes.remove (i);\r
+            keyPresses.remove (i);\r
+        }\r
     }\r
 }\r
 \r
-void MidiKeyboardComponent::colourChanged()\r
+void MidiKeyboardComponent::setKeyPressBaseOctave (int newOctaveNumber)\r
 {\r
-    setOpaque (findColour (whiteNoteColourId).isOpaque());\r
-    repaint();\r
+    jassert (newOctaveNumber >= 0 && newOctaveNumber <= 10);\r
+\r
+    keyMappingOctave = newOctaveNumber;\r
 }\r
 \r
 //==============================================================================\r
-void MidiKeyboardComponent::setMidiChannel (int midiChannelNumber)\r
+void MidiKeyboardComponent::resetAnyKeysInUse()\r
 {\r
-    jassert (midiChannelNumber > 0 && midiChannelNumber <= 16);\r
+    if (! keysPressed.isZero())\r
+    {\r
+        for (int i = 128; --i >= 0;)\r
+            if (keysPressed[i])\r
+                state.noteOff (midiChannel, i, 0.0f);\r
 \r
-    if (midiChannel != midiChannelNumber)\r
+        keysPressed.clear();\r
+    }\r
+\r
+    for (int i = mouseDownNotes.size(); --i >= 0;)\r
     {\r
-        resetAnyKeysInUse();\r
-        midiChannel = jlimit (1, 16, midiChannelNumber);\r
+        auto noteDown = mouseDownNotes.getUnchecked (i);\r
+\r
+        if (noteDown >= 0)\r
+        {\r
+            state.noteOff (midiChannel, noteDown, 0.0f);\r
+            mouseDownNotes.set (i, -1);\r
+        }\r
+\r
+        mouseOverNotes.set (i, -1);\r
     }\r
 }\r
 \r
-void MidiKeyboardComponent::setMidiChannelsToDisplay (int midiChannelMask)\r
+void MidiKeyboardComponent::updateNoteUnderMouse (const MouseEvent& e, bool isDown)\r
 {\r
-    midiInChannelMask = midiChannelMask;\r
-    noPendingUpdates.store (false);\r
+    updateNoteUnderMouse (e.getEventRelativeTo (this).position, isDown, e.source.getIndex());\r
 }\r
 \r
-void MidiKeyboardComponent::setVelocity (float v, bool useMousePosition)\r
+void MidiKeyboardComponent::updateNoteUnderMouse (Point<float> pos, bool isDown, int fingerNum)\r
 {\r
-    velocity = jlimit (0.0f, 1.0f, v);\r
-    useMousePositionForVelocity = useMousePosition;\r
-}\r
+    const auto noteInfo = getNoteAndVelocityAtPosition (pos);\r
+    const auto newNote = noteInfo.note;\r
+    const auto oldNote = mouseOverNotes.getUnchecked (fingerNum);\r
+    const auto oldNoteDown = mouseDownNotes.getUnchecked (fingerNum);\r
+    const auto eventVelocity = useMousePositionForVelocity ? noteInfo.velocity * velocity : velocity;\r
 \r
-//==============================================================================\r
-Range<float> MidiKeyboardComponent::getKeyPosition (int midiNoteNumber, float targetKeyWidth) const\r
-{\r
-    jassert (midiNoteNumber >= 0 && midiNoteNumber < 128);\r
+    if (oldNote != newNote)\r
+    {\r
+        repaintNote (oldNote);\r
+        repaintNote (newNote);\r
+        mouseOverNotes.set (fingerNum, newNote);\r
+    }\r
 \r
-    static const float notePos[] = { 0.0f, 1 - blackNoteWidthRatio * 0.6f,\r
-                                     1.0f, 2 - blackNoteWidthRatio * 0.4f,\r
-                                     2.0f,\r
-                                     3.0f, 4 - blackNoteWidthRatio * 0.7f,\r
-                                     4.0f, 5 - blackNoteWidthRatio * 0.5f,\r
-                                     5.0f, 6 - blackNoteWidthRatio * 0.3f,\r
-                                     6.0f };\r
+    if (isDown)\r
+    {\r
+        if (newNote != oldNoteDown)\r
+        {\r
+            if (oldNoteDown >= 0)\r
+            {\r
+                mouseDownNotes.set (fingerNum, -1);\r
 \r
-    auto octave = midiNoteNumber / 12;\r
-    auto note   = midiNoteNumber % 12;\r
+                if (! mouseDownNotes.contains (oldNoteDown))\r
+                    state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
+            }\r
 \r
-    auto start = (float) octave * 7.0f * targetKeyWidth + notePos[note] * targetKeyWidth;\r
-    auto width = MidiMessage::isMidiNoteBlack (note) ? blackNoteWidthRatio * targetKeyWidth : targetKeyWidth;\r
+            if (newNote >= 0 && ! mouseDownNotes.contains (newNote))\r
+            {\r
+                state.noteOn (midiChannel, newNote, eventVelocity);\r
+                mouseDownNotes.set (fingerNum, newNote);\r
+            }\r
+        }\r
+    }\r
+    else if (oldNoteDown >= 0)\r
+    {\r
+        mouseDownNotes.set (fingerNum, -1);\r
 \r
-    return { start, start + width };\r
+        if (! mouseDownNotes.contains (oldNoteDown))\r
+            state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
+    }\r
 }\r
 \r
-Range<float> MidiKeyboardComponent::getKeyPos (int midiNoteNumber) const\r
+void MidiKeyboardComponent::repaintNote (int noteNum)\r
 {\r
-    return getKeyPosition (midiNoteNumber, keyWidth)\r
-             - xOffset\r
-             - getKeyPosition (rangeStart, keyWidth).getStart();\r
+    if (getRangeStart() <= noteNum && noteNum <= getRangeEnd())\r
+        repaint (getRectangleForKey (noteNum).getSmallestIntegerContainer());\r
 }\r
 \r
-Rectangle<float> MidiKeyboardComponent::getRectangleForKey (int note) const\r
+\r
+void MidiKeyboardComponent::mouseMove (const MouseEvent& e)\r
 {\r
-    jassert (note >= rangeStart && note <= rangeEnd);\r
+    updateNoteUnderMouse (e, false);\r
+}\r
 \r
-    auto pos = getKeyPos (note);\r
-    auto x = pos.getStart();\r
-    auto w = pos.getLength();\r
+void MidiKeyboardComponent::mouseDrag (const MouseEvent& e)\r
+{\r
+    auto newNote = getNoteAndVelocityAtPosition (e.position).note;\r
 \r
-    if (MidiMessage::isMidiNoteBlack (note))\r
-    {\r
-        auto blackNoteLength = getBlackNoteLength();\r
+    if (newNote >= 0 && mouseDraggedToKey (newNote, e))\r
+        updateNoteUnderMouse (e, true);\r
+}\r
 \r
-        switch (orientation)\r
-        {\r
-            case horizontalKeyboard:            return { x, 0, w, blackNoteLength };\r
-            case verticalKeyboardFacingLeft:    return { (float) getWidth() - blackNoteLength, x, blackNoteLength, w };\r
-            case verticalKeyboardFacingRight:   return { 0, (float) getHeight() - x - w, blackNoteLength, w };\r
-            default:                            jassertfalse; break;\r
-        }\r
-    }\r
-    else\r
-    {\r
-        switch (orientation)\r
-        {\r
-            case horizontalKeyboard:            return { x, 0, w, (float) getHeight() };\r
-            case verticalKeyboardFacingLeft:    return { 0, x, (float) getWidth(), w };\r
-            case verticalKeyboardFacingRight:   return { 0, (float) getHeight() - x - w, (float) getWidth(), w };\r
-            default:                            jassertfalse; break;\r
-        }\r
-    }\r
+void MidiKeyboardComponent::mouseDown (const MouseEvent& e)\r
+{\r
+    auto newNote = getNoteAndVelocityAtPosition (e.position).note;\r
 \r
-    return {};\r
+    if (newNote >= 0 && mouseDownOnKey (newNote, e))\r
+        updateNoteUnderMouse (e, true);\r
 }\r
 \r
-float MidiKeyboardComponent::getKeyStartPosition (int midiNoteNumber) const\r
+void MidiKeyboardComponent::mouseUp (const MouseEvent& e)\r
 {\r
-    return getKeyPos (midiNoteNumber).getStart();\r
+    updateNoteUnderMouse (e, false);\r
+\r
+    auto note = getNoteAndVelocityAtPosition (e.position).note;\r
+\r
+    if (note >= 0)\r
+        mouseUpOnKey (note, e);\r
 }\r
 \r
-float MidiKeyboardComponent::getTotalKeyboardWidth() const noexcept\r
+void MidiKeyboardComponent::mouseEnter (const MouseEvent& e)\r
 {\r
-    return getKeyPos (rangeEnd).getEnd();\r
+    updateNoteUnderMouse (e, false);\r
 }\r
 \r
-int MidiKeyboardComponent::getNoteAtPosition (Point<float> p)\r
+void MidiKeyboardComponent::mouseExit (const MouseEvent& e)\r
 {\r
-    return xyToNote (p).note;\r
+    updateNoteUnderMouse (e, false);\r
 }\r
 \r
-MidiKeyboardComponent::NoteAndVelocity MidiKeyboardComponent::xyToNote (Point<float> pos)\r
+void MidiKeyboardComponent::timerCallback()\r
 {\r
-    if (! reallyContains (pos, false))\r
-        return { -1, 0.0f };\r
-\r
-    auto p = pos;\r
+    if (noPendingUpdates.exchange (true))\r
+        return;\r
 \r
-    if (orientation != horizontalKeyboard)\r
+    for (auto i = getRangeStart(); i <= getRangeEnd(); ++i)\r
     {\r
-        p = { p.y, p.x };\r
+        const auto isOn = state.isNoteOnForChannels (midiInChannelMask, i);\r
 \r
-        if (orientation == verticalKeyboardFacingLeft)\r
-            p = { p.x, (float) getWidth() - p.y };\r
-        else\r
-            p = { (float) getHeight() - p.x, p.y };\r
+        if (keysCurrentlyDrawnDown[i] != isOn)\r
+        {\r
+            keysCurrentlyDrawnDown.setBit (i, isOn);\r
+            repaintNote (i);\r
+        }\r
     }\r
-\r
-    return remappedXYToNote (p + Point<float> (xOffset, 0));\r
 }\r
 \r
-MidiKeyboardComponent::NoteAndVelocity MidiKeyboardComponent::remappedXYToNote (Point<float> pos) const\r
+bool MidiKeyboardComponent::keyStateChanged (bool /*isKeyDown*/)\r
 {\r
-    auto blackNoteLength = getBlackNoteLength();\r
+    bool keyPressUsed = false;\r
 \r
-    if (pos.getY() < blackNoteLength)\r
+    for (int i = keyPresses.size(); --i >= 0;)\r
     {\r
-        for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
+        auto note = 12 * keyMappingOctave + keyPressNotes.getUnchecked (i);\r
+\r
+        if (keyPresses.getReference(i).isCurrentlyDown())\r
         {\r
-            for (int i = 0; i < 5; ++i)\r
+            if (! keysPressed[note])\r
             {\r
-                auto note = octaveStart + blackNotes[i];\r
-\r
-                if (rangeStart <= note && note <= rangeEnd)\r
-                {\r
-                    if (getKeyPos (note).contains (pos.x - xOffset))\r
-                    {\r
-                        return { note, jmax (0.0f, pos.y / blackNoteLength) };\r
-                    }\r
-                }\r
+                keysPressed.setBit (note);\r
+                state.noteOn (midiChannel, note, velocity);\r
+                keyPressUsed = true;\r
             }\r
         }\r
-    }\r
-\r
-    for (int octaveStart = 12 * (rangeStart / 12); octaveStart <= rangeEnd; octaveStart += 12)\r
-    {\r
-        for (int i = 0; i < 7; ++i)\r
+        else\r
         {\r
-            auto note = octaveStart + whiteNotes[i];\r
-\r
-            if (note >= rangeStart && note <= rangeEnd)\r
+            if (keysPressed[note])\r
             {\r
-                if (getKeyPos (note).contains (pos.x - xOffset))\r
-                {\r
-                    auto whiteNoteLength = (orientation == horizontalKeyboard) ? getHeight() : getWidth();\r
-                    return { note, jmax (0.0f, pos.y / (float) whiteNoteLength) };\r
-                }\r
+                keysPressed.clearBit (note);\r
+                state.noteOff (midiChannel, note, 0.0f);\r
+                keyPressUsed = true;\r
             }\r
         }\r
     }\r
 \r
-    return { -1, 0 };\r
+    return keyPressUsed;\r
 }\r
 \r
-//==============================================================================\r
-void MidiKeyboardComponent::repaintNote (int noteNum)\r
+bool MidiKeyboardComponent::keyPressed (const KeyPress& key)\r
 {\r
-    if (noteNum >= rangeStart && noteNum <= rangeEnd)\r
-        repaint (getRectangleForKey (noteNum).getSmallestIntegerContainer());\r
+    return keyPresses.contains (key);\r
 }\r
 \r
-void MidiKeyboardComponent::paint (Graphics& g)\r
+void MidiKeyboardComponent::focusLost (FocusChangeType)\r
+{\r
+    resetAnyKeysInUse();\r
+}\r
+\r
+//==============================================================================\r
+void MidiKeyboardComponent::drawKeyboardBackground (Graphics& g, Rectangle<float> area)\r
 {\r
     g.fillAll (findColour (whiteNoteColourId));\r
 \r
-    auto lineColour = findColour (keySeparatorLineColourId);\r
-    auto textColour = findColour (textLabelColourId);\r
+    auto width = area.getWidth();\r
+    auto height = area.getHeight();\r
+    auto currentOrientation = getOrientation();\r
+    Point<float> shadowGradientStart, shadowGradientEnd;\r
 \r
-    for (int octave = 0; octave < 128; octave += 12)\r
+    if (currentOrientation == verticalKeyboardFacingLeft)\r
     {\r
-        for (int white = 0; white < 7; ++white)\r
-        {\r
-            auto noteNum = octave + whiteNotes[white];\r
-\r
-            if (noteNum >= rangeStart && noteNum <= rangeEnd)\r
-                drawWhiteNote (noteNum, g, getRectangleForKey (noteNum),\r
-                               state.isNoteOnForChannels (midiInChannelMask, noteNum),\r
-                               mouseOverNotes.contains (noteNum), lineColour, textColour);\r
-        }\r
+        shadowGradientStart.x = width - 1.0f;\r
+        shadowGradientEnd.x   = width - 5.0f;\r
     }\r
-\r
-    float x1 = 0.0f, y1 = 0.0f, x2 = 0.0f, y2 = 0.0f;\r
-    auto width = getWidth();\r
-    auto height = getHeight();\r
-\r
-    if (orientation == verticalKeyboardFacingLeft)\r
+    else if (currentOrientation == verticalKeyboardFacingRight)\r
     {\r
-        x1 = (float) width - 1.0f;\r
-        x2 = (float) width - 5.0f;\r
+        shadowGradientEnd.x = 5.0f;\r
     }\r
-    else if (orientation == verticalKeyboardFacingRight)\r
-        x2 = 5.0f;\r
     else\r
-        y2 = 5.0f;\r
+    {\r
+        shadowGradientEnd.y = 5.0f;\r
+    }\r
 \r
-    auto x = getKeyPos (rangeEnd).getEnd();\r
-    auto shadowCol = findColour (shadowColourId);\r
+    auto keyboardWidth = getRectangleForKey (getRangeEnd()).getRight();\r
+    auto shadowColour = findColour (shadowColourId);\r
 \r
-    if (! shadowCol.isTransparent())\r
+    if (! shadowColour.isTransparent())\r
     {\r
-        g.setGradientFill (ColourGradient (shadowCol, x1, y1, shadowCol.withAlpha (0.0f), x2, y2, false));\r
+        g.setGradientFill ({ shadowColour, shadowGradientStart,\r
+                             shadowColour.withAlpha (0.0f), shadowGradientEnd,\r
+                             false });\r
 \r
-        switch (orientation)\r
+        switch (currentOrientation)\r
         {\r
-            case horizontalKeyboard:            g.fillRect (0.0f, 0.0f, x, 5.0f); break;\r
-            case verticalKeyboardFacingLeft:    g.fillRect ((float) width - 5.0f, 0.0f, 5.0f, x); break;\r
-            case verticalKeyboardFacingRight:   g.fillRect (0.0f, 0.0f, 5.0f, x); break;\r
+            case horizontalKeyboard:            g.fillRect (0.0f, 0.0f, keyboardWidth, 5.0f); break;\r
+            case verticalKeyboardFacingLeft:    g.fillRect (width - 5.0f, 0.0f, 5.0f, keyboardWidth); break;\r
+            case verticalKeyboardFacingRight:   g.fillRect (0.0f, 0.0f, 5.0f, keyboardWidth); break;\r
             default: break;\r
         }\r
     }\r
 \r
+    auto lineColour = findColour (keySeparatorLineColourId);\r
+\r
     if (! lineColour.isTransparent())\r
     {\r
         g.setColour (lineColour);\r
 \r
-        switch (orientation)\r
+        switch (currentOrientation)\r
         {\r
-            case horizontalKeyboard:            g.fillRect (0.0f, (float) height - 1.0f, x, 1.0f); break;\r
-            case verticalKeyboardFacingLeft:    g.fillRect (0.0f, 0.0f, 1.0f, x); break;\r
-            case verticalKeyboardFacingRight:   g.fillRect ((float) width - 1.0f, 0.0f, 1.0f, x); break;\r
+            case horizontalKeyboard:            g.fillRect (0.0f, height - 1.0f, keyboardWidth, 1.0f); break;\r
+            case verticalKeyboardFacingLeft:    g.fillRect (0.0f, 0.0f, 1.0f, keyboardWidth); break;\r
+            case verticalKeyboardFacingRight:   g.fillRect (width - 1.0f, 0.0f, 1.0f, keyboardWidth); break;\r
             default: break;\r
         }\r
     }\r
-\r
-    auto blackNoteColour = findColour (blackNoteColourId);\r
-\r
-    for (int octave = 0; octave < 128; octave += 12)\r
-    {\r
-        for (int black = 0; black < 5; ++black)\r
-        {\r
-            auto noteNum = octave + blackNotes[black];\r
-\r
-            if (noteNum >= rangeStart && noteNum <= rangeEnd)\r
-                drawBlackNote (noteNum, g, getRectangleForKey (noteNum),\r
-                               state.isNoteOnForChannels (midiInChannelMask, noteNum),\r
-                               mouseOverNotes.contains (noteNum), blackNoteColour);\r
-        }\r
-    }\r
 }\r
 \r
 void MidiKeyboardComponent::drawWhiteNote (int midiNoteNumber, Graphics& g, Rectangle<float> area,\r
@@ -442,16 +361,18 @@ void MidiKeyboardComponent::drawWhiteNote (int midiNoteNumber, Graphics& g, Rect
     g.setColour (c);\r
     g.fillRect (area);\r
 \r
+    const auto currentOrientation = getOrientation();\r
+\r
     auto text = getWhiteNoteText (midiNoteNumber);\r
 \r
     if (text.isNotEmpty())\r
     {\r
-        auto fontHeight = jmin (12.0f, keyWidth * 0.9f);\r
+        auto fontHeight = jmin (12.0f, getKeyWidth() * 0.9f);\r
 \r
         g.setColour (textColour);\r
         g.setFont (Font (fontHeight).withHorizontalScale (0.8f));\r
 \r
-        switch (orientation)\r
+        switch (currentOrientation)\r
         {\r
             case horizontalKeyboard:            g.drawText (text, area.withTrimmedLeft (1.0f).withTrimmedBottom (2.0f), Justification::centredBottom, false); break;\r
             case verticalKeyboardFacingLeft:    g.drawText (text, area.reduced (2.0f), Justification::centredLeft,   false); break;\r
@@ -464,7 +385,7 @@ void MidiKeyboardComponent::drawWhiteNote (int midiNoteNumber, Graphics& g, Rect
     {\r
         g.setColour (lineColour);\r
 \r
-        switch (orientation)\r
+        switch (currentOrientation)\r
         {\r
             case horizontalKeyboard:            g.fillRect (area.withWidth (1.0f)); break;\r
             case verticalKeyboardFacingLeft:    g.fillRect (area.withHeight (1.0f)); break;\r
@@ -472,9 +393,9 @@ void MidiKeyboardComponent::drawWhiteNote (int midiNoteNumber, Graphics& g, Rect
             default: break;\r
         }\r
 \r
-        if (midiNoteNumber == rangeEnd)\r
+        if (midiNoteNumber == getRangeEnd())\r
         {\r
-            switch (orientation)\r
+            switch (currentOrientation)\r
             {\r
                 case horizontalKeyboard:            g.fillRect (area.expanded (1.0f, 0).removeFromRight (1.0f)); break;\r
                 case verticalKeyboardFacingLeft:    g.fillRect (area.expanded (0, 1.0f).removeFromBottom (1.0f)); break;\r
@@ -509,7 +430,7 @@ void MidiKeyboardComponent::drawBlackNote (int /*midiNoteNumber*/, Graphics& g,
         auto w = area.getWidth();\r
         auto h = area.getHeight();\r
 \r
-        switch (orientation)\r
+        switch (getOrientation())\r
         {\r
             case horizontalKeyboard:            g.fillRect (area.reduced (w * sideIndent, 0).removeFromTop   (h * topIndent)); break;\r
             case verticalKeyboardFacingLeft:    g.fillRect (area.reduced (0, h * sideIndent).removeFromRight (w * topIndent)); break;\r
@@ -519,145 +440,31 @@ void MidiKeyboardComponent::drawBlackNote (int /*midiNoteNumber*/, Graphics& g,
     }\r
 }\r
 \r
-void MidiKeyboardComponent::setOctaveForMiddleC (int octaveNum)\r
-{\r
-    octaveNumForMiddleC = octaveNum;\r
-    repaint();\r
-}\r
-\r
 String MidiKeyboardComponent::getWhiteNoteText (int midiNoteNumber)\r
 {\r
     if (midiNoteNumber % 12 == 0)\r
-        return MidiMessage::getMidiNoteName (midiNoteNumber, true, true, octaveNumForMiddleC);\r
+        return MidiMessage::getMidiNoteName (midiNoteNumber, true, true, getOctaveForMiddleC());\r
 \r
     return {};\r
 }\r
 \r
-void MidiKeyboardComponent::drawUpDownButton (Graphics& g, int w, int h,\r
-                                              bool mouseOver,\r
-                                              bool buttonDown,\r
-                                              bool movesOctavesUp)\r
-{\r
-    g.fillAll (findColour (upDownButtonBackgroundColourId));\r
-\r
-    float angle = 0;\r
-\r
-    switch (orientation)\r
-    {\r
-        case horizontalKeyboard:            angle = movesOctavesUp ? 0.0f  : 0.5f;  break;\r
-        case verticalKeyboardFacingLeft:    angle = movesOctavesUp ? 0.25f : 0.75f; break;\r
-        case verticalKeyboardFacingRight:   angle = movesOctavesUp ? 0.75f : 0.25f; break;\r
-        default:                            jassertfalse; break;\r
-    }\r
-\r
-    Path path;\r
-    path.addTriangle (0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f);\r
-    path.applyTransform (AffineTransform::rotation (MathConstants<float>::twoPi * angle, 0.5f, 0.5f));\r
-\r
-    g.setColour (findColour (upDownButtonArrowColourId)\r
-                  .withAlpha (buttonDown ? 1.0f : (mouseOver ? 0.6f : 0.4f)));\r
-\r
-    g.fillPath (path, path.getTransformToScaleToFit (1.0f, 1.0f, (float) w - 2.0f, (float) h - 2.0f, true));\r
-}\r
-\r
-void MidiKeyboardComponent::setBlackNoteLengthProportion (float ratio) noexcept\r
-{\r
-    jassert (ratio >= 0.0f && ratio <= 1.0f);\r
-\r
-    if (blackNoteLengthRatio != ratio)\r
-    {\r
-        blackNoteLengthRatio = ratio;\r
-        resized();\r
-    }\r
-}\r
-\r
-float MidiKeyboardComponent::getBlackNoteLength() const noexcept\r
+void MidiKeyboardComponent::colourChanged()\r
 {\r
-    auto whiteNoteLength = orientation == horizontalKeyboard ? getHeight() : getWidth();\r
-    return (float) whiteNoteLength * blackNoteLengthRatio;\r
+    setOpaque (findColour (whiteNoteColourId).isOpaque());\r
+    repaint();\r
 }\r
 \r
-void MidiKeyboardComponent::setBlackNoteWidthProportion (float ratio) noexcept\r
+//==============================================================================\r
+void MidiKeyboardComponent::drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area)\r
 {\r
-    jassert (ratio >= 0.0f && ratio <= 1.0f);\r
-\r
-    if (blackNoteWidthRatio != ratio)\r
-    {\r
-        blackNoteWidthRatio = ratio;\r
-        resized();\r
-    }\r
+    drawWhiteNote (midiNoteNumber, g, area, state.isNoteOnForChannels (midiInChannelMask, midiNoteNumber),\r
+                   mouseOverNotes.contains (midiNoteNumber), findColour (keySeparatorLineColourId), findColour (textLabelColourId));\r
 }\r
 \r
-void MidiKeyboardComponent::resized()\r
+void MidiKeyboardComponent::drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area)\r
 {\r
-    auto w = getWidth();\r
-    auto h = getHeight();\r
-\r
-    if (w > 0 && h > 0)\r
-    {\r
-        if (orientation != horizontalKeyboard)\r
-            std::swap (w, h);\r
-\r
-        auto kx2 = getKeyPos (rangeEnd).getEnd();\r
-\r
-        if ((int) firstKey != rangeStart)\r
-        {\r
-            auto kx1 = getKeyPos (rangeStart).getStart();\r
-\r
-            if (kx2 - kx1 <= (float) w)\r
-            {\r
-                firstKey = (float) rangeStart;\r
-                sendChangeMessage();\r
-                repaint();\r
-            }\r
-        }\r
-\r
-        scrollDown->setVisible (canScroll && firstKey > (float) rangeStart);\r
-\r
-        xOffset = 0;\r
-\r
-        if (canScroll)\r
-        {\r
-            auto scrollButtonW = jmin (scrollButtonWidth, w / 2);\r
-            auto r = getLocalBounds();\r
-\r
-            if (orientation == horizontalKeyboard)\r
-            {\r
-                scrollDown->setBounds (r.removeFromLeft  (scrollButtonW));\r
-                scrollUp  ->setBounds (r.removeFromRight (scrollButtonW));\r
-            }\r
-            else if (orientation == verticalKeyboardFacingLeft)\r
-            {\r
-                scrollDown->setBounds (r.removeFromTop    (scrollButtonW));\r
-                scrollUp  ->setBounds (r.removeFromBottom (scrollButtonW));\r
-            }\r
-            else\r
-            {\r
-                scrollDown->setBounds (r.removeFromBottom (scrollButtonW));\r
-                scrollUp  ->setBounds (r.removeFromTop    (scrollButtonW));\r
-            }\r
-\r
-            auto endOfLastKey = getKeyPos (rangeEnd).getEnd();\r
-\r
-            auto spaceAvailable = w;\r
-            auto lastStartKey = remappedXYToNote ({ endOfLastKey - (float) spaceAvailable, 0 }).note + 1;\r
-\r
-            if (lastStartKey >= 0 && ((int) firstKey) > lastStartKey)\r
-            {\r
-                firstKey = (float) jlimit (rangeStart, rangeEnd, lastStartKey);\r
-                sendChangeMessage();\r
-            }\r
-\r
-            xOffset = getKeyPos ((int) firstKey).getStart();\r
-        }\r
-        else\r
-        {\r
-            firstKey = (float) rangeStart;\r
-        }\r
-\r
-        scrollUp->setVisible (canScroll && getKeyPos (rangeEnd).getStart() > (float) w);\r
-        repaint();\r
-    }\r
+    drawBlackNote (midiNoteNumber, g, area, state.isNoteOnForChannels (midiInChannelMask, midiNoteNumber),\r
+                   mouseOverNotes.contains (midiNoteNumber), findColour (blackNoteColourId));\r
 }\r
 \r
 //==============================================================================\r
@@ -671,225 +478,4 @@ void MidiKeyboardComponent::handleNoteOff (MidiKeyboardState*, int /*midiChannel
     noPendingUpdates.store (false);\r
 }\r
 \r
-//==============================================================================\r
-void MidiKeyboardComponent::resetAnyKeysInUse()\r
-{\r
-    if (! keysPressed.isZero())\r
-    {\r
-        for (int i = 128; --i >= 0;)\r
-            if (keysPressed[i])\r
-                state.noteOff (midiChannel, i, 0.0f);\r
-\r
-        keysPressed.clear();\r
-    }\r
-\r
-    for (int i = mouseDownNotes.size(); --i >= 0;)\r
-    {\r
-        auto noteDown = mouseDownNotes.getUnchecked(i);\r
-\r
-        if (noteDown >= 0)\r
-        {\r
-            state.noteOff (midiChannel, noteDown, 0.0f);\r
-            mouseDownNotes.set (i, -1);\r
-        }\r
-\r
-        mouseOverNotes.set (i, -1);\r
-    }\r
-}\r
-\r
-void MidiKeyboardComponent::updateNoteUnderMouse (const MouseEvent& e, bool isDown)\r
-{\r
-    updateNoteUnderMouse (e.getEventRelativeTo (this).position, isDown, e.source.getIndex());\r
-}\r
-\r
-void MidiKeyboardComponent::updateNoteUnderMouse (Point<float> pos, bool isDown, int fingerNum)\r
-{\r
-    const auto noteInfo = xyToNote (pos);\r
-    const auto newNote = noteInfo.note;\r
-    const auto oldNote = mouseOverNotes.getUnchecked (fingerNum);\r
-    const auto oldNoteDown = mouseDownNotes.getUnchecked (fingerNum);\r
-    const auto eventVelocity = useMousePositionForVelocity ? noteInfo.velocity * velocity : velocity;\r
-\r
-    if (oldNote != newNote)\r
-    {\r
-        repaintNote (oldNote);\r
-        repaintNote (newNote);\r
-        mouseOverNotes.set (fingerNum, newNote);\r
-    }\r
-\r
-    if (isDown)\r
-    {\r
-        if (newNote != oldNoteDown)\r
-        {\r
-            if (oldNoteDown >= 0)\r
-            {\r
-                mouseDownNotes.set (fingerNum, -1);\r
-\r
-                if (! mouseDownNotes.contains (oldNoteDown))\r
-                    state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
-            }\r
-\r
-            if (newNote >= 0 && ! mouseDownNotes.contains (newNote))\r
-            {\r
-                state.noteOn (midiChannel, newNote, eventVelocity);\r
-                mouseDownNotes.set (fingerNum, newNote);\r
-            }\r
-        }\r
-    }\r
-    else if (oldNoteDown >= 0)\r
-    {\r
-        mouseDownNotes.set (fingerNum, -1);\r
-\r
-        if (! mouseDownNotes.contains (oldNoteDown))\r
-            state.noteOff (midiChannel, oldNoteDown, eventVelocity);\r
-    }\r
-}\r
-\r
-void MidiKeyboardComponent::mouseMove (const MouseEvent& e)\r
-{\r
-    updateNoteUnderMouse (e, false);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseDrag (const MouseEvent& e)\r
-{\r
-    auto newNote = xyToNote (e.position).note;\r
-\r
-    if (newNote >= 0 && mouseDraggedToKey (newNote, e))\r
-        updateNoteUnderMouse (e, true);\r
-}\r
-\r
-bool MidiKeyboardComponent::mouseDownOnKey    (int, const MouseEvent&)  { return true; }\r
-bool MidiKeyboardComponent::mouseDraggedToKey (int, const MouseEvent&)  { return true; }\r
-void MidiKeyboardComponent::mouseUpOnKey      (int, const MouseEvent&)  {}\r
-\r
-void MidiKeyboardComponent::mouseDown (const MouseEvent& e)\r
-{\r
-    auto newNote = xyToNote (e.position).note;\r
-\r
-    if (newNote >= 0 && mouseDownOnKey (newNote, e))\r
-        updateNoteUnderMouse (e, true);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseUp (const MouseEvent& e)\r
-{\r
-    updateNoteUnderMouse (e, false);\r
-\r
-    auto note = xyToNote (e.position).note;\r
-\r
-    if (note >= 0)\r
-        mouseUpOnKey (note, e);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseEnter (const MouseEvent& e)\r
-{\r
-    updateNoteUnderMouse (e, false);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseExit (const MouseEvent& e)\r
-{\r
-    updateNoteUnderMouse (e, false);\r
-}\r
-\r
-void MidiKeyboardComponent::mouseWheelMove (const MouseEvent&, const MouseWheelDetails& wheel)\r
-{\r
-    auto amount = (orientation == horizontalKeyboard && wheel.deltaX != 0)\r
-                       ? wheel.deltaX : (orientation == verticalKeyboardFacingLeft ? wheel.deltaY\r
-                                                                                   : -wheel.deltaY);\r
-\r
-    setLowestVisibleKeyFloat (firstKey - amount * keyWidth);\r
-}\r
-\r
-void MidiKeyboardComponent::timerCallback()\r
-{\r
-    if (noPendingUpdates.exchange (true))\r
-        return;\r
-\r
-    for (int i = rangeStart; i <= rangeEnd; ++i)\r
-    {\r
-        bool isOn = state.isNoteOnForChannels (midiInChannelMask, i);\r
-\r
-        if (keysCurrentlyDrawnDown[i] != isOn)\r
-        {\r
-            keysCurrentlyDrawnDown.setBit (i, isOn);\r
-            repaintNote (i);\r
-        }\r
-    }\r
-}\r
-\r
-//==============================================================================\r
-void MidiKeyboardComponent::clearKeyMappings()\r
-{\r
-    resetAnyKeysInUse();\r
-    keyPressNotes.clear();\r
-    keyPresses.clear();\r
-}\r
-\r
-void MidiKeyboardComponent::setKeyPressForNote (const KeyPress& key, int midiNoteOffsetFromC)\r
-{\r
-    removeKeyPressForNote (midiNoteOffsetFromC);\r
-\r
-    keyPressNotes.add (midiNoteOffsetFromC);\r
-    keyPresses.add (key);\r
-}\r
-\r
-void MidiKeyboardComponent::removeKeyPressForNote (int midiNoteOffsetFromC)\r
-{\r
-    for (int i = keyPressNotes.size(); --i >= 0;)\r
-    {\r
-        if (keyPressNotes.getUnchecked (i) == midiNoteOffsetFromC)\r
-        {\r
-            keyPressNotes.remove (i);\r
-            keyPresses.remove (i);\r
-        }\r
-    }\r
-}\r
-\r
-void MidiKeyboardComponent::setKeyPressBaseOctave (int newOctaveNumber)\r
-{\r
-    jassert (newOctaveNumber >= 0 && newOctaveNumber <= 10);\r
-\r
-    keyMappingOctave = newOctaveNumber;\r
-}\r
-\r
-bool MidiKeyboardComponent::keyStateChanged (bool /*isKeyDown*/)\r
-{\r
-    bool keyPressUsed = false;\r
-\r
-    for (int i = keyPresses.size(); --i >= 0;)\r
-    {\r
-        auto note = 12 * keyMappingOctave + keyPressNotes.getUnchecked (i);\r
-\r
-        if (keyPresses.getReference(i).isCurrentlyDown())\r
-        {\r
-            if (! keysPressed[note])\r
-            {\r
-                keysPressed.setBit (note);\r
-                state.noteOn (midiChannel, note, velocity);\r
-                keyPressUsed = true;\r
-            }\r
-        }\r
-        else\r
-        {\r
-            if (keysPressed[note])\r
-            {\r
-                keysPressed.clearBit (note);\r
-                state.noteOff (midiChannel, note, 0.0f);\r
-                keyPressUsed = true;\r
-            }\r
-        }\r
-    }\r
-\r
-    return keyPressUsed;\r
-}\r
-\r
-bool MidiKeyboardComponent::keyPressed (const KeyPress& key)\r
-{\r
-    return keyPresses.contains (key);\r
-}\r
-\r
-void MidiKeyboardComponent::focusLost (FocusChangeType)\r
-{\r
-    resetAnyKeysInUse();\r
-}\r
-\r
 } // namespace juce\r
index da502d95aadfe50cdf252f4ff48bb655a6803885..998ab43a8fb2afd1a1475a66df40e614281f6b72 100644 (file)
@@ -46,30 +46,18 @@ namespace juce
 \r
     @tags{Audio}\r
 */\r
-class JUCE_API  MidiKeyboardComponent  : public Component,\r
-                                         public MidiKeyboardState::Listener,\r
-                                         public ChangeBroadcaster,\r
+class JUCE_API  MidiKeyboardComponent  : public KeyboardComponentBase,\r
+                                         private MidiKeyboardState::Listener,\r
                                          private Timer\r
 {\r
 public:\r
     //==============================================================================\r
-    /** The direction of the keyboard.\r
-        @see setOrientation\r
-    */\r
-    enum Orientation\r
-    {\r
-        horizontalKeyboard,\r
-        verticalKeyboardFacingLeft,\r
-        verticalKeyboardFacingRight,\r
-    };\r
-\r
     /** Creates a MidiKeyboardComponent.\r
 \r
         @param state        the midi keyboard model that this component will represent\r
         @param orientation  whether the keyboard is horizontal or vertical\r
     */\r
-    MidiKeyboardComponent (MidiKeyboardState& state,\r
-                           Orientation orientation);\r
+    MidiKeyboardComponent (MidiKeyboardState& state, Orientation orientation);\r
 \r
     /** Destructor. */\r
     ~MidiKeyboardComponent() override;\r
@@ -84,6 +72,7 @@ public:
     */\r
     void setVelocity (float velocity, bool useMousePositionForVelocity);\r
 \r
+    //==============================================================================\r
     /** Changes the midi channel number that will be used for events triggered by clicking\r
         on the component.\r
 \r
@@ -100,7 +89,7 @@ public:
     /** Returns the midi channel that the keyboard is using for midi messages.\r
         @see setMidiChannel\r
     */\r
-    int getMidiChannel() const noexcept                             { return midiChannel; }\r
+    int getMidiChannel() const noexcept            { return midiChannel; }\r
 \r
     /** Sets a mask to indicate which incoming midi channels should be represented by\r
         key movements.\r
@@ -119,86 +108,41 @@ public:
     /** Returns the current set of midi channels represented by the component.\r
         This is the value that was set with setMidiChannelsToDisplay().\r
     */\r
-    int getMidiChannelsToDisplay() const noexcept                   { return midiInChannelMask; }\r
+    int getMidiChannelsToDisplay() const noexcept  { return midiInChannelMask; }\r
 \r
     //==============================================================================\r
-    /** Changes the width used to draw the white keys. */\r
-    void setKeyWidth (float widthInPixels);\r
-\r
-    /** Returns the width that was set by setKeyWidth(). */\r
-    float getKeyWidth() const noexcept                              { return keyWidth; }\r
-\r
-    /** Changes the width used to draw the buttons that scroll the keyboard up/down in octaves. */\r
-    void setScrollButtonWidth (int widthInPixels);\r
-\r
-    /** Returns the width that was set by setScrollButtonWidth(). */\r
-    int getScrollButtonWidth() const noexcept                       { return scrollButtonWidth; }\r
-\r
-    /** Changes the keyboard's current direction. */\r
-    void setOrientation (Orientation newOrientation);\r
-\r
-    /** Returns the keyboard's current direction. */\r
-    Orientation getOrientation() const noexcept                     { return orientation; }\r
-\r
-    /** Sets the range of midi notes that the keyboard will be limited to.\r
-\r
-        By default the range is 0 to 127 (inclusive), but you can limit this if you\r
-        only want a restricted set of the keys to be shown.\r
-\r
-        Note that the values here are inclusive and must be between 0 and 127.\r
-    */\r
-    void setAvailableRange (int lowestNote,\r
-                            int highestNote);\r
-\r
-    /** Returns the first note in the available range.\r
-        @see setAvailableRange\r
-    */\r
-    int getRangeStart() const noexcept                              { return rangeStart; }\r
+    /** Deletes all key-mappings.\r
 \r
-    /** Returns the last note in the available range.\r
-        @see setAvailableRange\r
+        @see setKeyPressForNote\r
     */\r
-    int getRangeEnd() const noexcept                                { return rangeEnd; }\r
-\r
-    /** If the keyboard extends beyond the size of the component, this will scroll\r
-        it to show the given key at the start.\r
+    void clearKeyMappings();\r
 \r
-        Whenever the keyboard's position is changed, this will use the ChangeBroadcaster\r
-        base class to send a callback to any ChangeListeners that have been registered.\r
-    */\r
-    void setLowestVisibleKey (int noteNumber);\r
+    /** Maps a key-press to a given note.\r
 \r
-    /** Returns the number of the first key shown in the component.\r
-        @see setLowestVisibleKey\r
+        @param key                  the key that should trigger the note\r
+        @param midiNoteOffsetFromC  how many semitones above C the triggered note should\r
+                                    be. The actual midi note that gets played will be\r
+                                    this value + (12 * the current base octave). To change\r
+                                    the base octave, see setKeyPressBaseOctave()\r
     */\r
-    int getLowestVisibleKey() const noexcept                        { return (int) firstKey; }\r
-\r
-    /** Sets the length of the black notes as a proportion of the white note length. */\r
-    void setBlackNoteLengthProportion (float ratio) noexcept;\r
+    void setKeyPressForNote (const KeyPress& key, int midiNoteOffsetFromC);\r
 \r
-    /** Returns the length of the black notes as a proportion of the white note length. */\r
-    float getBlackNoteLengthProportion() const noexcept             { return blackNoteLengthRatio; }\r
+    /** Removes any key-mappings for a given note.\r
 \r
-    /** Returns the absolute length of the black notes.\r
-        This will be their vertical or horizontal length, depending on the keyboard's orientation.\r
+        For a description of what the note number means, see setKeyPressForNote().\r
     */\r
-    float getBlackNoteLength() const noexcept;\r
-\r
-    /** Sets the width of the black notes as a proportion of the white note width. */\r
-    void setBlackNoteWidthProportion (float ratio) noexcept;\r
+    void removeKeyPressForNote (int midiNoteOffsetFromC);\r
 \r
-    /** Returns the width of the black notes as a proportion of the white note width. */\r
-    float getBlackNoteWidthProportion() const noexcept             { return blackNoteWidthRatio; }\r
+    /** Changes the base note above which key-press-triggered notes are played.\r
 \r
-    /** Returns the absolute width of the black notes.\r
-        This will be their vertical or horizontal width, depending on the keyboard's orientation.\r
-    */\r
-    float getBlackNoteWidth() const noexcept                       { return keyWidth * blackNoteWidthRatio; }\r
+        The set of key-mappings that trigger notes can be moved up and down to cover\r
+        the entire scale using this method.\r
 \r
-    /** If set to true, then scroll buttons will appear at either end of the keyboard\r
-        if there are too many notes to fit them all in the component at once.\r
+        The value passed in is an octave number between 0 and 10 (inclusive), and\r
+        indicates which C is the base note to which the key-mapped notes are\r
+        relative.\r
     */\r
-    void setScrollButtonsVisible (bool canScroll);\r
+    void setKeyPressBaseOctave (int newOctaveNumber);\r
 \r
     //==============================================================================\r
     /** A set of colour IDs to use to change the colour of various aspects of the keyboard.\r
@@ -216,81 +160,66 @@ public:
         mouseOverKeyOverlayColourId     = 0x1005003,  /**< This colour will be overlaid on the normal note colour. */\r
         keyDownOverlayColourId          = 0x1005004,  /**< This colour will be overlaid on the normal note colour. */\r
         textLabelColourId               = 0x1005005,\r
-        upDownButtonBackgroundColourId  = 0x1005006,\r
-        upDownButtonArrowColourId       = 0x1005007,\r
-        shadowColourId                  = 0x1005008\r
+        shadowColourId                  = 0x1005006\r
     };\r
 \r
-    /** Returns the position within the component of the left-hand edge of a key.\r
+    //==============================================================================\r
+    /** Use this method to draw a white note of the keyboard in a given rectangle.\r
 \r
-        Depending on the keyboard's orientation, this may be a horizontal or vertical\r
-        distance, in either direction.\r
+        isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
+        currently pressed down.\r
+\r
+        When doing this, be sure to note the keyboard's orientation.\r
     */\r
-    float getKeyStartPosition (int midiNoteNumber) const;\r
+    virtual void drawWhiteNote (int midiNoteNumber, Graphics& g, Rectangle<float> area,\r
+                                bool isDown, bool isOver, Colour lineColour, Colour textColour);\r
 \r
-    /** Returns the total width needed to fit all the keys in the available range. */\r
-    float getTotalKeyboardWidth() const noexcept;\r
+    /** Use this method to draw a black note of the keyboard in a given rectangle.\r
 \r
-    /** Returns the key at a given coordinate. */\r
-    int getNoteAtPosition (Point<float> position);\r
+        isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
+        currently pressed down.\r
 \r
-    //==============================================================================\r
-    /** Deletes all key-mappings.\r
-        @see setKeyPressForNote\r
+        When doing this, be sure to note the keyboard's orientation.\r
     */\r
-    void clearKeyMappings();\r
+    virtual void drawBlackNote (int midiNoteNumber, Graphics& g, Rectangle<float> area,\r
+                                bool isDown, bool isOver, Colour noteFillColour);\r
 \r
-    /** Maps a key-press to a given note.\r
+    /** Callback when the mouse is clicked on a key.\r
 \r
-        @param key                  the key that should trigger the note\r
-        @param midiNoteOffsetFromC  how many semitones above C the triggered note should\r
-                                    be. The actual midi note that gets played will be\r
-                                    this value + (12 * the current base octave). To change\r
-                                    the base octave, see setKeyPressBaseOctave()\r
-    */\r
-    void setKeyPressForNote (const KeyPress& key,\r
-                             int midiNoteOffsetFromC);\r
+        You could use this to do things like handle right-clicks on keys, etc.\r
 \r
-    /** Removes any key-mappings for a given note.\r
-        For a description of what the note number means, see setKeyPressForNote().\r
+        Return true if you want the click to trigger the note, or false if you\r
+        want to handle it yourself and not have the note played.\r
+\r
+        @see mouseDraggedToKey\r
     */\r
-    void removeKeyPressForNote (int midiNoteOffsetFromC);\r
+    virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e)     { ignoreUnused (midiNoteNumber, e); return true; }\r
 \r
-    /** Changes the base note above which key-press-triggered notes are played.\r
+    /** Callback when the mouse is dragged from one key onto another.\r
 \r
-        The set of key-mappings that trigger notes can be moved up and down to cover\r
-        the entire scale using this method.\r
+        Return true if you want the drag to trigger the new note, or false if you\r
+        want to handle it yourself and not have the note played.\r
 \r
-        The value passed in is an octave number between 0 and 10 (inclusive), and\r
-        indicates which C is the base note to which the key-mapped notes are\r
-        relative.\r
+        @see mouseDownOnKey\r
     */\r
-    void setKeyPressBaseOctave (int newOctaveNumber);\r
+    virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e)  { ignoreUnused (midiNoteNumber, e); return true; }\r
 \r
-    /** This sets the octave number which is shown as the octave number for middle C.\r
+    /** Callback when the mouse is released from a key.\r
 \r
-        This affects only the default implementation of getWhiteNoteText(), which\r
-        passes this octave number to MidiMessage::getMidiNoteName() in order to\r
-        get the note text. See MidiMessage::getMidiNoteName() for more info about\r
-        the parameter.\r
+        @see mouseDownOnKey\r
+    */\r
+    virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e)       { ignoreUnused (midiNoteNumber, e); }\r
 \r
-        By default this value is set to 3.\r
+    /** Allows text to be drawn on the white notes.\r
 \r
-        @see getOctaveForMiddleC\r
-    */\r
-    void setOctaveForMiddleC (int octaveNumForMiddleC);\r
+        By default this is used to label the C in each octave, but could be used for other things.\r
 \r
-    /** This returns the value set by setOctaveForMiddleC().\r
         @see setOctaveForMiddleC\r
     */\r
-    int getOctaveForMiddleC() const noexcept            { return octaveNumForMiddleC; }\r
+    virtual String getWhiteNoteText (int midiNoteNumber);\r
 \r
     //==============================================================================\r
     /** @internal */\r
-    void paint (Graphics&) override;\r
-    /** @internal */\r
-    void resized() override;\r
-    /** @internal */\r
     void mouseMove (const MouseEvent&) override;\r
     /** @internal */\r
     void mouseDrag (const MouseEvent&) override;\r
@@ -303,8 +232,6 @@ public:
     /** @internal */\r
     void mouseExit (const MouseEvent&) override;\r
     /** @internal */\r
-    void mouseWheelMove (const MouseEvent&, const MouseWheelDetails&) override;\r
-    /** @internal */\r
     void timerCallback() override;\r
     /** @internal */\r
     bool keyStateChanged (bool isKeyDown) override;\r
@@ -313,127 +240,39 @@ public:
     /** @internal */\r
     void focusLost (FocusChangeType) override;\r
     /** @internal */\r
-    void handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override;\r
-    /** @internal */\r
-    void handleNoteOff (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override;\r
-    /** @internal */\r
     void colourChanged() override;\r
 \r
-protected:\r
+private:\r
     //==============================================================================\r
-    /** Draws a white note in the given rectangle.\r
-\r
-        isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
-        currently pressed down.\r
-\r
-        When doing this, be sure to note the keyboard's orientation.\r
-    */\r
-    virtual void drawWhiteNote (int midiNoteNumber,\r
-                                Graphics& g, Rectangle<float> area,\r
-                                bool isDown, bool isOver,\r
-                                Colour lineColour, Colour textColour);\r
-\r
-    /** Draws a black note in the given rectangle.\r
+    void drawKeyboardBackground (Graphics& g, Rectangle<float> area) override final;\r
+    void drawWhiteKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override final;\r
+    void drawBlackKey (int midiNoteNumber, Graphics& g, Rectangle<float> area) override final;\r
 \r
-        isOver indicates whether the mouse is over the key, isDown indicates whether the key is\r
-        currently pressed down.\r
-\r
-        When doing this, be sure to note the keyboard's orientation.\r
-    */\r
-    virtual void drawBlackNote (int midiNoteNumber,\r
-                                Graphics& g, Rectangle<float> area,\r
-                                bool isDown, bool isOver,\r
-                                Colour noteFillColour);\r
-\r
-    /** Allows text to be drawn on the white notes.\r
-        By default this is used to label the C in each octave, but could be used for other things.\r
-        @see setOctaveForMiddleC\r
-    */\r
-    virtual String getWhiteNoteText (int midiNoteNumber);\r
-\r
-    /** Draws the up and down buttons that scroll the keyboard up/down in octaves. */\r
-    virtual void drawUpDownButton (Graphics& g, int w, int h,\r
-                                   bool isMouseOver,\r
-                                   bool isButtonPressed,\r
-                                   bool movesOctavesUp);\r
-\r
-    /** Callback when the mouse is clicked on a key.\r
-\r
-        You could use this to do things like handle right-clicks on keys, etc.\r
+    void handleNoteOn  (MidiKeyboardState*, int, int, float) override;\r
+    void handleNoteOff (MidiKeyboardState*, int, int, float) override;\r
 \r
-        Return true if you want the click to trigger the note, or false if you\r
-        want to handle it yourself and not have the note played.\r
-\r
-        @see mouseDraggedToKey\r
-    */\r
-    virtual bool mouseDownOnKey (int midiNoteNumber, const MouseEvent& e);\r
-\r
-    /** Callback when the mouse is dragged from one key onto another.\r
-\r
-        Return true if you want the drag to trigger the new note, or false if you\r
-        want to handle it yourself and not have the note played.\r
-\r
-        @see mouseDownOnKey\r
-    */\r
-    virtual bool mouseDraggedToKey (int midiNoteNumber, const MouseEvent& e);\r
-\r
-    /** Callback when the mouse is released from a key.\r
-        @see mouseDownOnKey\r
-    */\r
-    virtual void mouseUpOnKey (int midiNoteNumber, const MouseEvent& e);\r
-\r
-    /** Calculates the position of a given midi-note.\r
-\r
-        This can be overridden to create layouts with custom key-widths.\r
-\r
-        @param midiNoteNumber   the note to find\r
-        @param keyWidth         the desired width in pixels of one key - see setKeyWidth()\r
-        @returns                the start and length of the key along the axis of the keyboard\r
-    */\r
-    virtual Range<float> getKeyPosition (int midiNoteNumber, float keyWidth) const;\r
-\r
-    /** Returns the rectangle for a given key if within the displayable range */\r
-    Rectangle<float> getRectangleForKey (int midiNoteNumber) const;\r
-\r
-\r
-private:\r
     //==============================================================================\r
-    struct UpDownButton;\r
-    struct NoteAndVelocity { int note; float velocity; };\r
+    void resetAnyKeysInUse();\r
+    void updateNoteUnderMouse (Point<float>, bool isDown, int fingerNum);\r
+    void updateNoteUnderMouse (const MouseEvent&, bool isDown);\r
+    void repaintNote (int midiNoteNumber);\r
 \r
+    //==============================================================================\r
     MidiKeyboardState& state;\r
-    float blackNoteLengthRatio = 0.7f;\r
-    float blackNoteWidthRatio = 0.7f;\r
-    float xOffset = 0;\r
-    float keyWidth = 16.0f;\r
-    int scrollButtonWidth = 12;\r
-    Orientation orientation;\r
-\r
     int midiChannel = 1, midiInChannelMask = 0xffff;\r
+    int keyMappingOctave = 6;\r
+\r
     float velocity = 1.0f;\r
+    bool useMousePositionForVelocity = true;\r
 \r
     Array<int> mouseOverNotes, mouseDownNotes;\r
-    BigInteger keysPressed, keysCurrentlyDrawnDown;\r
-    std::atomic<bool> noPendingUpdates { true };\r
-\r
-    int rangeStart = 0, rangeEnd = 127;\r
-    float firstKey = 12 * 4.0f;\r
-    bool canScroll = true, useMousePositionForVelocity = true;\r
-    std::unique_ptr<Button> scrollDown, scrollUp;\r
-\r
     Array<KeyPress> keyPresses;\r
     Array<int> keyPressNotes;\r
-    int keyMappingOctave = 6, octaveNumForMiddleC = 3;\r
+    BigInteger keysPressed, keysCurrentlyDrawnDown;\r
 \r
-    Range<float> getKeyPos (int midiNoteNumber) const;\r
-    NoteAndVelocity xyToNote (Point<float>);\r
-    NoteAndVelocity remappedXYToNote (Point<float>) const;\r
-    void resetAnyKeysInUse();\r
-    void updateNoteUnderMouse (Point<float>, bool isDown, int fingerNum);\r
-    void updateNoteUnderMouse (const MouseEvent&, bool isDown);\r
-    void repaintNote (int midiNoteNumber);\r
-    void setLowestVisibleKeyFloat (float noteNumber);\r
+    std::atomic<bool> noPendingUpdates { true };\r
 \r
+    //==============================================================================\r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiKeyboardComponent)\r
 };\r
 \r
index 5a9e66f56648b9cfb56abb1494159d6335dec83a..514254092d3fabe01318f0f7ca05d0def41d60b6 100644 (file)
@@ -58,7 +58,9 @@
 #include "gui/juce_AudioThumbnail.cpp"\r
 #include "gui/juce_AudioThumbnailCache.cpp"\r
 #include "gui/juce_AudioVisualiserComponent.cpp"\r
+#include "gui/juce_KeyboardComponentBase.cpp"\r
 #include "gui/juce_MidiKeyboardComponent.cpp"\r
+#include "gui/juce_MPEKeyboardComponent.cpp"\r
 #include "gui/juce_AudioAppComponent.cpp"\r
 #include "players/juce_SoundPlayer.cpp"\r
 #include "players/juce_AudioProcessorPlayer.cpp"\r
index 9faa8360bc2aa54c5a7e56a4b780e1f7f7af8357..90ba324d5e33b179c28deb9f8f16d28e57496530 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_utils\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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
@@ -80,7 +80,9 @@
 #include "gui/juce_AudioThumbnail.h"\r
 #include "gui/juce_AudioThumbnailCache.h"\r
 #include "gui/juce_AudioVisualiserComponent.h"\r
+#include "gui/juce_KeyboardComponentBase.h"\r
 #include "gui/juce_MidiKeyboardComponent.h"\r
+#include "gui/juce_MPEKeyboardComponent.h"\r
 #include "gui/juce_AudioAppComponent.h"\r
 #include "gui/juce_BluetoothMidiDevicePairingDialogue.h"\r
 #include "players/juce_SoundPlayer.h"\r
index d1e249ef3debef22535b794751eaf4e3ef9e8944..3b9ca41b1deb887850ed0e8f4362747f3c564138 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_box2d\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 0692a15978fb9727a8dc5c867e5dbad9f6fbff0d..065496e5599b612cb0dcc9e04f6c42789056918a 100644 (file)
@@ -76,7 +76,7 @@ public:
     {\r
     }\r
 \r
-    /** Initalises from a null-terminated raw array of values.\r
+    /** Initialises from a null-terminated raw array of values.\r
         @param data   the data to copy from\r
     */\r
     template <typename TypeToCreateFrom>\r
@@ -86,7 +86,7 @@ public:
             add (*data++);\r
     }\r
 \r
-    /** Initalises from a raw array of values.\r
+    /** Initialises from a raw array of values.\r
         @param data         the data to copy from\r
         @param numValues    the number of values in the array\r
     */\r
@@ -96,26 +96,26 @@ public:
         values.addArray (data, numValues);\r
     }\r
 \r
-    /** Initalises an Array of size 1 containing a single element. */\r
+    /** Initialises an Array of size 1 containing a single element. */\r
     Array (const ElementType& singleElementToAdd)\r
     {\r
         add (singleElementToAdd);\r
     }\r
 \r
-    /** Initalises an Array of size 1 containing a single element. */\r
+    /** Initialises an Array of size 1 containing a single element. */\r
     Array (ElementType&& singleElementToAdd)\r
     {\r
         add (std::move (singleElementToAdd));\r
     }\r
 \r
-    /** Initalises an Array from a list of items. */\r
+    /** Initialises an Array from a list of items. */\r
     template <typename... OtherElements>\r
     Array (const ElementType& firstNewElement, OtherElements&&... otherElements)\r
     {\r
         values.add (firstNewElement, std::forward<OtherElements> (otherElements)...);\r
     }\r
 \r
-    /** Initalises an Array from a list of items. */\r
+    /** Initialises an Array from a list of items. */\r
     template <typename... OtherElements>\r
     Array (ElementType&& firstNewElement, OtherElements&&... otherElements)\r
     {\r
index 645ba055cafe8201dc9dbbd12f8d218ccfd495e2..4cf2f9f332324aa4dfa23cc2ae794dd7fa5507ae 100644 (file)
@@ -105,7 +105,7 @@ bool TemporaryFile::deleteTemporaryFile() const
     // Have a few attempts at deleting the file before giving up..\r
     for (int i = 5; --i >= 0;)\r
     {\r
-        if (temporaryFile.deleteFile())\r
+        if (temporaryFile.isDirectory() ? temporaryFile.deleteRecursively() : temporaryFile.deleteFile())\r
             return true;\r
 \r
         Thread::sleep (50);\r
index 1869a7236b2bb5ee1b9bd59c7f7b221063ca9bd8..5b582e57158ed773ac867b273d8ac6ec9e40b2a9 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_core\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 89ffc0c026f0923ec3b75d1c9fe69c3f4aae2efe..bf540d81f4db6e821e11cc96937386a6cf865d84 100644 (file)
@@ -270,7 +270,8 @@ public:
     }\r
 \r
     /** Scans an array of values for its min and max, and returns these as a Range. */\r
-    static Range findMinAndMax (const ValueType* values, int numValues) noexcept\r
+    template <typename Integral, std::enable_if_t<std::is_integral<Integral>::value, int> = 0>\r
+    static Range findMinAndMax (const ValueType* values, Integral numValues) noexcept\r
     {\r
         if (numValues <= 0)\r
             return Range();\r
index 65c3f83389f060dbe7d18373d9612ba05664c490..d524214b430eeb6460ef3827235b626f5021ba3f 100644 (file)
  #define STRICT 1\r
  #define WIN32_LEAN_AND_MEAN 1\r
  #if JUCE_MINGW\r
-  #define _WIN32_WINNT 0x0600\r
+  #if ! defined (_WIN32_WINNT)\r
+   #define _WIN32_WINNT 0x0600\r
+  #endif\r
  #else\r
   #define _WIN32_WINNT 0x0602\r
  #endif\r
index edbe8e55b9beb94978e0e4c22b969e247122228f..58b1799e69dec38e865b8bf26e14fd62715a9c1a 100644 (file)
@@ -969,6 +969,7 @@ public:
 \r
         if (! connection->start (owner, webInputListener))\r
         {\r
+            const auto errorCode = connection->getErrorCode();\r
             connection.reset();\r
 \r
             if (@available (macOS 10.10, *))\r
@@ -976,7 +977,7 @@ public:
 \r
             // Workaround for macOS versions below 10.10 where HTTPS POST requests with keep-alive\r
             // fail with the NSURLErrorNetworkConnectionLost error code.\r
-            if (numRetries == 0 && connection->getErrorCode() == NSURLErrorNetworkConnectionLost)\r
+            if (numRetries == 0 && errorCode == NSURLErrorNetworkConnectionLost)\r
                 return connect (webInputListener, ++numRetries);\r
 \r
             return false;\r
index 3ba6e2a8f5344212260b47f05d90a8ad48af3fda..b1f4bcb9775f222311cafe380abab5a7dabf81df 100644 (file)
@@ -23,7 +23,7 @@
 namespace juce\r
 {\r
 \r
-#if JUCE_MINGW || (! (defined (_MSC_VER) || defined (__uuidof)))\r
+#if (JUCE_MINGW && JUCE_32BIT) || (! defined (_MSC_VER) && ! defined (__uuidof))\r
  #ifdef __uuidof\r
   #undef __uuidof\r
  #endif\r
@@ -47,7 +47,7 @@ namespace juce
 \r
 #else\r
  #define JUCE_DECLARE_UUID_GETTER(name, uuid)\r
- #define JUCE_COMCLASS(name, guid)       struct __declspec (uuid (guid)) name\r
+ #define JUCE_COMCLASS(name, guid)       struct DECLSPEC_UUID (guid) name\r
 #endif\r
 \r
 #define JUCE_IUNKNOWNCLASS(name, guid)   JUCE_COMCLASS(name, guid) : public IUnknown\r
index 6e7754878e04142599d1d2303cfd7be8f4ddce46..b9628eb13695b7a76a98080515ed53715c1a10bc 100644 (file)
@@ -706,7 +706,8 @@ String File::getVersion() const
 //==============================================================================\r
 bool File::isSymbolicLink() const\r
 {\r
-    return (GetFileAttributes (fullPath.toWideCharPointer()) & FILE_ATTRIBUTE_REPARSE_POINT) != 0;\r
+    const auto attributes = WindowsFileHelpers::getAtts (fullPath);\r
+    return (attributes != INVALID_FILE_ATTRIBUTES && (attributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0);\r
 }\r
 \r
 bool File::isShortcut() const\r
index 00231fb183e5fbefa29635982dc11c30f6f1af93..1a40043536617fa4c1d1d2199f42eb2f99200ad2 100644 (file)
@@ -53,8 +53,6 @@ void CriticalSection::exit() const noexcept         { LeaveCriticalSection ((CRI
 \r
 \r
 //==============================================================================\r
-void JUCE_API juce_threadEntryPoint (void*);\r
-\r
 static unsigned int STDMETHODCALLTYPE threadEntryProc (void* userData)\r
 {\r
     if (juce_messageWindowHandle != nullptr)\r
index 8da365521f93780d84488e6f995bb94ffb186190..c0943302ca4e8d7c855dd80d9f021669c830122a 100644 (file)
@@ -71,7 +71,7 @@ namespace juce
     #pragma intrinsic (__debugbreak)\r
   #endif\r
   #define JUCE_BREAK_IN_DEBUGGER        { __debugbreak(); }\r
-#elif JUCE_INTEL && (JUCE_GCC || JUCE_MAC)\r
+#elif JUCE_INTEL && (JUCE_GCC || JUCE_CLANG || JUCE_MAC)\r
   #if JUCE_NO_INLINE_ASM\r
    #define JUCE_BREAK_IN_DEBUGGER       { }\r
   #else\r
index 8e536f3dc3d45e02fb6e35f2b9819fa1f09a54c9..919c864b09944658101399cf5399530c7733dbc6 100644 (file)
@@ -29,7 +29,7 @@
 */\r
 #define JUCE_MAJOR_VERSION      6\r
 #define JUCE_MINOR_VERSION      1\r
-#define JUCE_BUILDNUMBER        4\r
+#define JUCE_BUILDNUMBER        5\r
 \r
 /** Current JUCE version number.\r
 \r
@@ -64,6 +64,7 @@
 #include <typeindex>\r
 #include <unordered_set>\r
 #include <vector>\r
+#include <set>\r
 \r
 //==============================================================================\r
 #include "juce_CompilerSupport.h"\r
index 91cc0785253b90ddd5c9e40ae62268a738336d0e..9bd239c29e4cc759cf220cf3bc11b42e83c33a4b 100644 (file)
@@ -167,7 +167,8 @@ void StringPairArray::minimiseStorageOverheads()
     values.minimiseStorageOverheads();\r
 }\r
 \r
-void StringPairArray::addMap (const std::map<String, String>& toAdd)\r
+template <typename Map>\r
+void StringPairArray::addMapImpl (const Map& toAdd)\r
 {\r
     // If we just called `set` for each item in `toAdd`, that would\r
     // perform badly when adding to large StringPairArrays, as `set`\r
@@ -201,6 +202,9 @@ void StringPairArray::addMap (const std::map<String, String>& toAdd)
     }\r
 }\r
 \r
+void StringPairArray::addUnorderedMap (const std::unordered_map<String, String>& toAdd) { addMapImpl (toAdd); }\r
+void StringPairArray::addMap (const std::map<String, String>& toAdd)                    { addMapImpl (toAdd); }\r
+\r
 //==============================================================================\r
 //==============================================================================\r
 #if JUCE_UNIT_TESTS\r
index 9f105e75d797c03f874aa57f69209ad2667420d4..95ae9ed0377f6832cdae8df037f5273a588afbaa 100644 (file)
@@ -147,8 +147,14 @@ public:
     /** Adds the contents of a map to this StringPairArray. */\r
     void addMap (const std::map<String, String>& mapToAdd);\r
 \r
+    /** Adds the contents of an unordered map to this StringPairArray. */\r
+    void addUnorderedMap (const std::unordered_map<String, String>& mapToAdd);\r
+\r
 private:\r
     //==============================================================================\r
+    template <typename Map>\r
+    void addMapImpl (const Map& mapToAdd);\r
+\r
     StringArray keys, values;\r
     bool ignoreCase;\r
 \r
index b76824501b67fd6063d051d9b1bfed59c6fb24bd..4dbae77f2f5c52a4583b53e84ab373cca6c146a0 100644 (file)
@@ -379,8 +379,7 @@ String Time::getTimeZone() const
 {\r
     String zone[2];\r
 \r
-  #if JUCE_WINDOWS\r
-   #if JUCE_MSVC || JUCE_CLANG\r
+  #if JUCE_WINDOWS && (JUCE_MSVC || JUCE_CLANG)\r
     _tzset();\r
 \r
     for (int i = 0; i < 2; ++i)\r
@@ -390,9 +389,6 @@ String Time::getTimeZone() const
         _get_tzname (&length, name, sizeof (name) - 1, i);\r
         zone[i] = name;\r
     }\r
-   #else\r
-    #warning "Can't find a replacement for tzset on mingw - ideas welcome!"\r
-   #endif\r
   #else\r
     tzset();\r
 \r
index 92918ed325189887c048a7f4e409e512469c547e..fe12c3f50830600b94ce2e7309fc2d112a26c0f9 100644 (file)
@@ -125,7 +125,7 @@ public:
     /** Sets a flag to change the treatment of empty text elements.\r
 \r
         If this is true (the default state), then any text elements that contain only\r
-        whitespace characters will be ingored during parsing. If you need to catch\r
+        whitespace characters will be ignored during parsing. If you need to catch\r
         whitespace-only text, then you should set this to false before calling the\r
         getDocumentElement() method.\r
     */\r
index 1bc025f5b361bb25208036798755e7ac4f6b37f4..084e6d3789cdde744c644289488e34c68befff4c 100644 (file)
@@ -122,6 +122,19 @@ static int64 findCentralDirectoryFileHeader (InputStream& input, int& numEntries
     return 0;\r
 }\r
 \r
+static bool hasSymbolicPart (const File& root, const File& f)\r
+{\r
+    jassert (root == f || f.isAChildOf (root));\r
+\r
+    for (auto p = f; p != root; p = p.getParentDirectory())\r
+    {\r
+        if (p.isSymbolicLink())\r
+            return true;\r
+    }\r
+\r
+    return false;\r
+}\r
+\r
 //==============================================================================\r
 struct ZipFile::ZipInputStream  : public InputStream\r
 {\r
@@ -400,6 +413,14 @@ Result ZipFile::uncompressTo (const File& targetDirectory,
 }\r
 \r
 Result ZipFile::uncompressEntry (int index, const File& targetDirectory, bool shouldOverwriteFiles)\r
+{\r
+    return uncompressEntry (index,\r
+                            targetDirectory,\r
+                            shouldOverwriteFiles ? OverwriteFiles::yes : OverwriteFiles::no,\r
+                            FollowSymlinks::no);\r
+}\r
+\r
+Result ZipFile::uncompressEntry (int index, const File& targetDirectory, OverwriteFiles overwriteFiles, FollowSymlinks followSymlinks)\r
 {\r
     auto* zei = entries.getUnchecked (index);\r
 \r
@@ -414,6 +435,9 @@ Result ZipFile::uncompressEntry (int index, const File& targetDirectory, bool sh
 \r
     auto targetFile = targetDirectory.getChildFile (entryPath);\r
 \r
+    if (! targetFile.isAChildOf (targetDirectory))\r
+        return Result::fail ("Entry " + entryPath + " is outside the target directory");\r
+\r
     if (entryPath.endsWithChar ('/') || entryPath.endsWithChar ('\\'))\r
         return targetFile.createDirectory(); // (entry is a directory, not a file)\r
 \r
@@ -424,13 +448,16 @@ Result ZipFile::uncompressEntry (int index, const File& targetDirectory, bool sh
 \r
     if (targetFile.exists())\r
     {\r
-        if (! shouldOverwriteFiles)\r
+        if (overwriteFiles == OverwriteFiles::no)\r
             return Result::ok();\r
 \r
         if (! targetFile.deleteFile())\r
             return Result::fail ("Failed to write to target file: " + targetFile.getFullPathName());\r
     }\r
 \r
+    if (followSymlinks == FollowSymlinks::no && hasSymbolicPart (targetDirectory, targetFile.getParentDirectory()))\r
+        return Result::fail ("Parent directory leads through symlink for target file: " + targetFile.getFullPathName());\r
+\r
     if (! targetFile.getParentDirectory().createDirectory())\r
         return Result::fail ("Failed to create target folder: " + targetFile.getParentDirectory().getFullPathName());\r
 \r
@@ -649,12 +676,9 @@ struct ZIPTests   : public UnitTest
         : UnitTest ("ZIP", UnitTestCategories::compression)\r
     {}\r
 \r
-    void runTest() override\r
+    static MemoryBlock createZipMemoryBlock (const StringArray& entryNames)\r
     {\r
-        beginTest ("ZIP");\r
-\r
         ZipFile::Builder builder;\r
-        StringArray entryNames { "first", "second", "third" };\r
         HashMap<String, MemoryBlock> blocks;\r
 \r
         for (auto& entryName : entryNames)\r
@@ -669,8 +693,61 @@ struct ZIPTests   : public UnitTest
         MemoryBlock data;\r
         MemoryOutputStream mo (data, false);\r
         builder.writeToStream (mo, nullptr);\r
+\r
+        return data;\r
+    }\r
+\r
+    void runZipSlipTest()\r
+    {\r
+        const std::map<String, bool> testCases = { { "a",                    true  },\r
+#if JUCE_WINDOWS\r
+                                                   { "C:/b",                 false },\r
+#else\r
+                                                   { "/b",                   false },\r
+#endif\r
+                                                   { "c/d",                  true  },\r
+                                                   { "../e/f",               false },\r
+                                                   { "../../g/h",            false },\r
+                                                   { "i/../j",               true  },\r
+                                                   { "k/l/../",              true  },\r
+                                                   { "m/n/../../",           false },\r
+                                                   { "o/p/../../../",        false } };\r
+\r
+        StringArray entryNames;\r
+\r
+        for (const auto& testCase : testCases)\r
+            entryNames.add (testCase.first);\r
+\r
+        TemporaryFile tmpDir;\r
+        tmpDir.getFile().createDirectory();\r
+        auto data = createZipMemoryBlock (entryNames);\r
         MemoryInputStream mi (data, false);\r
+        ZipFile zip (mi);\r
+\r
+        for (int i = 0; i < zip.getNumEntries(); ++i)\r
+        {\r
+            const auto result = zip.uncompressEntry (i, tmpDir.getFile());\r
+            const auto caseIt = testCases.find (zip.getEntry (i)->filename);\r
 \r
+            if (caseIt != testCases.end())\r
+            {\r
+                expect (result.wasOk() == caseIt->second,\r
+                        zip.getEntry (i)->filename + " was unexpectedly " + (result.wasOk() ? "OK" : "not OK"));\r
+            }\r
+            else\r
+            {\r
+                expect (false);\r
+            }\r
+        }\r
+    }\r
+\r
+    void runTest() override\r
+    {\r
+        beginTest ("ZIP");\r
+\r
+        StringArray entryNames { "first", "second", "third" };\r
+        auto data = createZipMemoryBlock (entryNames);\r
+        MemoryInputStream mi (data, false);\r
         ZipFile zip (mi);\r
 \r
         expectEquals (zip.getNumEntries(), entryNames.size());\r
@@ -681,6 +758,9 @@ struct ZIPTests   : public UnitTest
             std::unique_ptr<InputStream> input (zip.createStreamForEntry (*entry));\r
             expectEquals (input->readEntireStreamAsString(), entryName);\r
         }\r
+\r
+        beginTest ("ZipSlip");\r
+        runZipSlipTest();\r
     }\r
 };\r
 \r
index d0a4baff8279c93ca48af566b8e753bebb46ec73..212e547354889d13ea57cb61a3b69f6940d61079 100644 (file)
@@ -179,6 +179,25 @@ public:
                             const File& targetDirectory,\r
                             bool shouldOverwriteFiles = true);\r
 \r
+    enum class OverwriteFiles { no, yes };\r
+    enum class FollowSymlinks { no, yes };\r
+\r
+    /** Uncompresses one of the entries from the zip file.\r
+\r
+        This will expand the entry and write it in a target directory. The entry's path is used to\r
+        determine which subfolder of the target should contain the new file.\r
+\r
+        @param index                the index of the entry to uncompress - this must be a valid index\r
+                                    between 0 and (getNumEntries() - 1).\r
+        @param targetDirectory      the root folder to uncompress into\r
+        @param overwriteFiles       whether to overwrite existing files with similarly-named ones\r
+        @param followSymlinks       whether to follow symlinks inside the target directory\r
+        @returns success if all the files are successfully unzipped\r
+    */\r
+    Result uncompressEntry (int index,\r
+                            const File& targetDirectory,\r
+                            OverwriteFiles overwriteFiles,\r
+                            FollowSymlinks followSymlinks);\r
 \r
     //==============================================================================\r
     /** Used to create a new zip file.\r
index 2735d0dab46635a2e4c382cd82430c7a44039fc0..794d2b99062c862c646c56cd6ec71836b38ebbaa 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_cryptography\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 a8ca6d1c460bbb046c3fb6055244f47d4c201b99..1017ca5a857594bdd8b405a0784ea97c350e7acc 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_data_structures\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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
index b3a005fd5b6d90ff342ad524e0265d662e10e894..7fa027e509108a0b74f1a23a9ade7cb66de9c4f1 100644 (file)
@@ -37,6 +37,12 @@ namespace SampleTypeHelpers // Internal classes needed for handling sample type
         using Type = T;\r
     };\r
 \r
+    template <typename T>\r
+    struct ElementType<const T, false>\r
+    {\r
+        using Type = const typename T::value_type;\r
+    };\r
+\r
     template <typename T>\r
     struct ElementType<T, false>\r
     {\r
index c6dd10d65793360800324595abf285fa0ef2060b..862cfcd05c15fbd65080dff565783399b56edafa 100644 (file)
@@ -969,10 +969,10 @@ void FFT::perform (const Complex<float>* input, Complex<float>* output, bool inv
         engine->perform (input, output, inverse);\r
 }\r
 \r
-void FFT::performRealOnlyForwardTransform (float* inputOutputData, bool ignoreNeagtiveFreqs) const noexcept\r
+void FFT::performRealOnlyForwardTransform (float* inputOutputData, bool ignoreNegativeFreqs) const noexcept\r
 {\r
     if (engine != nullptr)\r
-        engine->performRealOnlyForwardTransform (inputOutputData, ignoreNeagtiveFreqs);\r
+        engine->performRealOnlyForwardTransform (inputOutputData, ignoreNegativeFreqs);\r
 }\r
 \r
 void FFT::performRealOnlyInverseTransform (float* inputOutputData) const noexcept\r
@@ -981,18 +981,20 @@ void FFT::performRealOnlyInverseTransform (float* inputOutputData) const noexcep
         engine->performRealOnlyInverseTransform (inputOutputData);\r
 }\r
 \r
-void FFT::performFrequencyOnlyForwardTransform (float* inputOutputData) const noexcept\r
+void FFT::performFrequencyOnlyForwardTransform (float* inputOutputData, bool ignoreNegativeFreqs) const noexcept\r
 {\r
     if (size == 1)\r
         return;\r
 \r
-    performRealOnlyForwardTransform (inputOutputData);\r
+    performRealOnlyForwardTransform (inputOutputData, ignoreNegativeFreqs);\r
     auto* out = reinterpret_cast<Complex<float>*> (inputOutputData);\r
 \r
-    for (int i = 0; i < size; ++i)\r
+    const auto limit = ignoreNegativeFreqs ? (size / 2) + 1 : size;\r
+\r
+    for (int i = 0; i < limit; ++i)\r
         inputOutputData[i] = std::abs (out[i]);\r
 \r
-    zeromem (&inputOutputData[size], static_cast<size_t> (size) * sizeof (float));\r
+    zeromem (inputOutputData + limit, static_cast<size_t> (size * 2 - limit) * sizeof (float));\r
 }\r
 \r
 } // namespace dsp\r
index f746e6fb1e68f0263639e236a27422942b9642d2..59432522546de99f8bf30328f09d6e3f3bca9a86 100644 (file)
@@ -70,22 +70,22 @@ public:
         As the coefficients of the negative frequencies (frequencies higher than\r
         N/2 or pi) are the complex conjugate of their positive counterparts,\r
         it may not be necessary to calculate them for your particular application.\r
-        You can use dontCalculateNegativeFrequencies to let the FFT\r
+        You can use onlyCalculateNonNegativeFrequencies to let the FFT\r
         engine know that you do not plan on using them. Note that this is only a\r
         hint: some FFT engines (currently only the Fallback engine), will still\r
-        calculate the negative frequencies even if dontCalculateNegativeFrequencies\r
+        calculate the negative frequencies even if onlyCalculateNonNegativeFrequencies\r
         is true.\r
 \r
         The size of the array passed in must be 2 * getSize(), and the first half\r
         should contain your raw input sample data. On return, if\r
-        dontCalculateNegativeFrequencies is false, the array will contain size\r
+        onlyCalculateNonNegativeFrequencies is false, the array will contain size\r
         complex real + imaginary parts data interleaved. If\r
-        dontCalculateNegativeFrequencies is true, the array will contain at least\r
+        onlyCalculateNonNegativeFrequencies is true, the array will contain at least\r
         (size / 2) + 1 complex numbers. Both outputs can be passed to\r
         performRealOnlyInverseTransform() in order to convert it back to reals.\r
     */\r
     void performRealOnlyForwardTransform (float* inputOutputData,\r
-                                          bool dontCalculateNegativeFrequencies = false) const noexcept;\r
+                                          bool onlyCalculateNonNegativeFrequencies = false) const noexcept;\r
 \r
     /** Performs a reverse operation to data created in performRealOnlyForwardTransform().\r
 \r
@@ -99,8 +99,13 @@ public:
     /** Takes an array and simply transforms it to the magnitude frequency response\r
         spectrum. This may be handy for things like frequency displays or analysis.\r
         The size of the array passed in must be 2 * getSize().\r
+\r
+        On return, if onlyCalculateNonNegativeFrequencies is false, the array will contain size\r
+        magnitude values. If onlyCalculateNonNegativeFrequencies is true, the array will contain\r
+        at least size / 2 + 1 magnitude values.\r
     */\r
-    void performFrequencyOnlyForwardTransform (float* inputOutputData) const noexcept;\r
+    void performFrequencyOnlyForwardTransform (float* inputOutputData,\r
+                                               bool onlyCalculateNonNegativeFrequencies = false) const noexcept;\r
 \r
     /** Returns the number of data points that this FFT was created to work with. */\r
     int getSize() const noexcept            { return size; }\r
index 1abf309d062b502bfc0c85773a5a32f4c0b25813..7242e078c1e9be4e89f5059d1c37056f575ffa0f 100644 (file)
@@ -135,7 +135,7 @@ struct FFTUnitTest  : public UnitTest
 \r
     struct FrequencyOnlyTest\r
     {\r
-        static void run(FFTUnitTest& u)\r
+        static void run (FFTUnitTest& u)\r
         {\r
             Random random (378272);\r
             for (size_t order = 0; order <= 8; ++order)\r
@@ -144,19 +144,23 @@ struct FFTUnitTest  : public UnitTest
 \r
                 FFT fft ((int) order);\r
 \r
-                HeapBlock<float> inout (n << 1), reference (n << 1);\r
-                HeapBlock<Complex<float>> frequency (n);\r
+                std::vector<float> inout ((size_t) n << 1), reference ((size_t) n << 1);\r
+                std::vector<Complex<float>> frequency (n);\r
 \r
-                fillRandom (random, inout.getData(), n);\r
-                zeromem (reference.getData(), sizeof (float) * ((size_t) n << 1));\r
-                performReferenceFourier (inout.getData(), frequency.getData(), n, false);\r
+                fillRandom (random, inout.data(), n);\r
+                zeromem (reference.data(), sizeof (float) * ((size_t) n << 1));\r
+                performReferenceFourier (inout.data(), frequency.data(), n, false);\r
 \r
                 for (size_t i = 0; i < n; ++i)\r
-                    reference.getData()[i] = std::abs (frequency.getData()[i]);\r
-\r
-                fft.performFrequencyOnlyForwardTransform (inout.getData());\r
-\r
-                u.expect (checkArrayIsSimilar (inout.getData(), reference.getData(), n));\r
+                    reference[i] = std::abs (frequency[i]);\r
+\r
+                for (auto ignoreNegative : { false, true })\r
+                {\r
+                    auto inoutCopy = inout;\r
+                    fft.performFrequencyOnlyForwardTransform (inoutCopy.data(), ignoreNegative);\r
+                    auto numMatching = ignoreNegative ? (n / 2) + 1 : n;\r
+                    u.expect (checkArrayIsSimilar (inoutCopy.data(), reference.data(), numMatching));\r
+                }\r
             }\r
         }\r
     };\r
index cde29675e7537cf39cc0d9184244814bc220c452..7d7ff801c683a007a82decbadacafdab8aa03e5b 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_dsp\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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
index 387850d36bcb5810b24a3ae54189a730002e9345..f1d932976c070bd3fc5fc6bf1bd2a379b15d7625 100644 (file)
@@ -37,7 +37,7 @@ namespace dsp
     of the modulation.\r
 \r
     Note: To get classic chorus sounds try to use a centre delay time around 7-8 ms\r
-    with a low feeback volume and a low depth. This effect can also be used as a\r
+    with a low feedback volume and a low depth. This effect can also be used as a\r
     flanger with a lower centre delay time and a lot of feedback, and as a vibrato\r
     effect if the mix value is 1.\r
 \r
index 6b708b761903e87da64e11c03b0c8ca42c302b1e..ca71a816de0e0348f06a2a8d535664e0b0a41c68 100644 (file)
@@ -71,14 +71,12 @@ struct WaveShaper
 };\r
 \r
 //==============================================================================\r
-// Although clang supports C++17, their standard library still has no invoke_result\r
-// support. Remove the "|| JUCE_CLANG" once clang supports this properly!\r
-#if (! JUCE_CXX17_IS_AVAILABLE) || (JUCE_CLANG && ! JUCE_WINDOWS)\r
+#if JUCE_CXX17_IS_AVAILABLE\r
 template <typename Functor>\r
-static WaveShaper<typename std::result_of<Functor>, Functor> CreateWaveShaper (Functor functionToUse)   { return {functionToUse}; }\r
+static WaveShaper<typename std::invoke_result<Functor>, Functor> CreateWaveShaper (Functor functionToUse)   { return {functionToUse}; }\r
 #else\r
 template <typename Functor>\r
-static WaveShaper<typename std::invoke_result<Functor>, Functor> CreateWaveShaper (Functor functionToUse)   { return {functionToUse}; }\r
+static WaveShaper<typename std::result_of<Functor>, Functor> CreateWaveShaper (Functor functionToUse)   { return {functionToUse}; }\r
 #endif\r
 \r
 } // namespace dsp\r
index edf191e752436254acf4edb087393b8d8f46c90f..6bff21aec3e1c37cf8ab3b1743edbc074c89a7b0 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_events\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 fb1790b977e2db54d85efd5f7c24742de640e075..10e4c748a1d99dd25a47a7347c0e8c8ce1435a02 100644 (file)
@@ -65,7 +65,7 @@ public:
     ScaledImage (const Image& imageIn, double scaleIn)\r
         : image (imageIn), scaleFactor (scaleIn) {}\r
 \r
-    /** Returns the image at its original dimentions. */\r
+    /** Returns the image at its original dimensions. */\r
     Image getImage() const { return image; }\r
 \r
     /** Returns the image's scale. */\r
index 77d8270802e5986ee1c585ab15b9733957cce84e..510b38f1ef5610b8460a0a7fba1dee953b0e8a17 100644 (file)
  #endif\r
 \r
  #if JUCE_USE_DIRECTWRITE || JUCE_DIRECT2D\r
+  /*  This is a workaround for broken-by-default function definitions\r
+      in the MinGW headers. If you're using a newer distribution of MinGW,\r
+      then your headers may substitute the broken definitions with working definitions\r
+      when this flag is enabled. Unfortunately, not all MinGW headers contain this\r
+      workaround, so Direct2D remains disabled by default when building with MinGW.\r
+  */\r
+  #define WIDL_EXPLICIT_AGGREGATE_RETURNS 1\r
+\r
   /* If you hit a compile error trying to include these files, you may need to update\r
      your version of the Windows SDK to the latest one. The DirectWrite and Direct2D\r
      headers are in the version 7 SDKs.\r
index 161f26e4f36ec814a5de65af85f8847ea303aeb2..1fcf6d2e1e10324f0544b58c2de1dc715f5daf0e 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_graphics\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 1b194506dd394f8ed0e2b5e4b54db23950bcb9ad..a877e559b69fdc28b246de27179bdfaf69c1e393 100644 (file)
@@ -201,6 +201,7 @@ namespace DirectWriteTypeLayout
 \r
             ComSmartPtr<IDWriteFont> dwFont;\r
             auto hr = fontCollection.GetFontFromFontFace (glyphRun.fontFace, dwFont.resetAndGetPointerAddress());\r
+            ignoreUnused (hr);\r
             jassert (dwFont != nullptr);\r
 \r
             ComSmartPtr<IDWriteFontFamily> dwFontFamily;\r
@@ -289,6 +290,7 @@ namespace DirectWriteTypeLayout
 \r
             ComSmartPtr<IDWriteFontFamily> fontFamily;\r
             auto hr = fontCollection.GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress());\r
+            ignoreUnused (hr);\r
 \r
             ComSmartPtr<IDWriteFont> dwFont;\r
             uint32 fontFacesCount = 0;\r
@@ -394,6 +396,7 @@ namespace DirectWriteTypeLayout
 \r
         UINT32 actualLineCount = 0;\r
         auto hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount);\r
+        ignoreUnused (hr);\r
 \r
         layout.ensureStorageAllocated ((int) actualLineCount);\r
 \r
@@ -415,7 +418,7 @@ namespace DirectWriteTypeLayout
             line.stringRange = Range<int> (lastLocation, lastLocation + (int) dwLineMetrics[i].length);\r
             line.lineOrigin.y += yAdjustment;\r
             yAdjustment += extraLineSpacing;\r
-            lastLocation += dwLineMetrics[i].length;\r
+            lastLocation += (int) dwLineMetrics[i].length;\r
         }\r
     }\r
 \r
index e4869ed0a454c3298ba5e3aac953c8c925bf6cf3..189ca991c105ea0de143311e3daba333c40f527d 100644 (file)
@@ -36,6 +36,7 @@ namespace
         uint32 index = 0;\r
         BOOL exists = false;\r
         auto hr = names->FindLocaleName (L"en-us", &index, &exists);\r
+        ignoreUnused (hr);\r
 \r
         if (! exists)\r
             index = 0;\r
@@ -54,7 +55,7 @@ namespace
         jassert (family != nullptr);\r
         ComSmartPtr<IDWriteLocalizedStrings> familyNames;\r
         auto hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress());\r
-        jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
+        jassertquiet (SUCCEEDED (hr));\r
         return getLocalisedName (familyNames);\r
     }\r
 \r
@@ -63,7 +64,7 @@ namespace
         jassert (font != nullptr);\r
         ComSmartPtr<IDWriteLocalizedStrings> faceNames;\r
         auto hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress());\r
-        jassert (SUCCEEDED (hr)); ignoreUnused (hr);\r
+        jassertquiet (SUCCEEDED (hr));\r
         return getLocalisedName (faceNames);\r
     }\r
 \r
@@ -152,6 +153,7 @@ public:
 \r
         uint32 fontIndex = 0;\r
         auto hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound);\r
+        ignoreUnused (hr);\r
 \r
         if (! fontFound)\r
             fontIndex = 0;\r
index f7245d73b7b990fa1daffebb4df9a492fe854a73..119a60e548413c222b0f60a09ac4c18e0cf067dc 100644 (file)
@@ -235,6 +235,7 @@ StringArray Font::findAllTypefaceStyles (const String& family)
         BOOL fontFound = false;\r
         uint32 fontIndex = 0;\r
         auto hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound);\r
+        ignoreUnused (hr);\r
 \r
         if (! fontFound)\r
             fontIndex = 0;\r
index b8a9b7d13803305ea1376e06c4a131171f697900..3690ebf75ae82bcb9d26966d3884a31505f8ca75 100644 (file)
@@ -113,7 +113,7 @@ public:
         /** Returns the minimum value for this range. */\r
         double getMinimumValue() const noexcept  { return range.min; }\r
 \r
-        /** Returns the maxiumum value for this range. */\r
+        /** Returns the maximum value for this range. */\r
         double getMaximumValue() const noexcept  { return range.max; }\r
 \r
         /** Returns the interval for this range. */\r
index d1b1c538ff334f25bfcdbbaa9659befb225f44cf..a53392c19606137ac3559fa540fe69c99986f543 100644 (file)
@@ -1475,6 +1475,23 @@ public:
     */\r
     virtual std::unique_ptr<ComponentTraverser> createKeyboardFocusTraverser();\r
 \r
+    /** Use this to indicate that the component should have an outline drawn around it\r
+        when it has keyboard focus.\r
+\r
+        If this is set to true, then when the component gains keyboard focus the\r
+        LookAndFeel::createFocusOutlineForComponent() method will be used to draw an outline\r
+        around it.\r
+\r
+        @see FocusOutline, hasFocusOutline\r
+    */\r
+    void setHasFocusOutline (bool hasFocusOutline) noexcept  { flags.hasFocusOutlineFlag = hasFocusOutline; }\r
+\r
+    /** Returns true if this component should have a focus outline.\r
+\r
+        @see FocusOutline, setHasFocusOutline\r
+    */\r
+    bool hasFocusOutline() const noexcept                    { return flags.hasFocusOutlineFlag; }\r
+\r
     //==============================================================================\r
     /** Returns true if the component (and all its parents) are enabled.\r
 \r
@@ -2548,6 +2565,7 @@ private:
         bool isKeyboardFocusContainerFlag : 1;\r
         bool childKeyboardFocusedFlag     : 1;\r
         bool dontFocusOnMouseClickFlag    : 1;\r
+        bool hasFocusOutlineFlag          : 1;\r
         bool alwaysOnTopFlag              : 1;\r
         bool bufferToImageFlag            : 1;\r
         bool bringToFrontOnClickFlag      : 1;\r
index 8035b700eb5208ac9bf1e79ea6777038e539953e..a6df54ff853952fc548f316d62ff02bf2113197a 100644 (file)
@@ -189,6 +189,24 @@ void Desktop::addFocusChangeListener    (FocusChangeListener* l)   { focusListen
 void Desktop::removeFocusChangeListener (FocusChangeListener* l)   { focusListeners.remove (l); }\r
 void Desktop::triggerFocusCallback()                               { triggerAsyncUpdate(); }\r
 \r
+void Desktop::updateFocusOutline()\r
+{\r
+    if (auto* currentFocus = Component::getCurrentlyFocusedComponent())\r
+    {\r
+        if (currentFocus->hasFocusOutline())\r
+        {\r
+            focusOutline = currentFocus->getLookAndFeel().createFocusOutlineForComponent (*currentFocus);\r
+\r
+            if (focusOutline != nullptr)\r
+                focusOutline->setOwner (currentFocus);\r
+\r
+            return;\r
+        }\r
+    }\r
+\r
+    focusOutline = nullptr;\r
+}\r
+\r
 void Desktop::handleAsyncUpdate()\r
 {\r
     // The component may be deleted during this operation, but we'll use a SafePointer rather than a\r
@@ -197,6 +215,8 @@ void Desktop::handleAsyncUpdate()
     {\r
         l.globalFocusChanged (currentFocus.get());\r
     });\r
+\r
+    updateFocusOutline();\r
 }\r
 \r
 //==============================================================================\r
index 93b630a9ba62a1d826502279bec128e06caa53c6..f01279fda282740b16f0e5f7db2217b8bcfc499d 100644 (file)
@@ -436,6 +436,8 @@ private:
     std::unique_ptr<LookAndFeel> defaultLookAndFeel;\r
     WeakReference<LookAndFeel> currentLookAndFeel;\r
 \r
+    std::unique_ptr<FocusOutline> focusOutline;\r
+\r
     Component* kioskModeComponent = nullptr;\r
     Rectangle<int> kioskComponentOriginalBounds;\r
     bool kioskModeReentrant = false;\r
@@ -458,6 +460,7 @@ private:
     void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars);\r
 \r
     void triggerFocusCallback();\r
+    void updateFocusOutline();\r
     void handleAsyncUpdate() override;\r
 \r
     static Point<float> getMousePositionFloat();\r
index 50cafa82b820dd317e09c365c9ddc22f15179b65..2a1fb141f0b2adc4f028c969fa26da21bce4a5d8 100644 (file)
  #include <vfw.h>\r
  #include <commdlg.h>\r
  #include <commctrl.h>\r
-\r
- #if ! JUCE_MINGW\r
-  #include <UIAutomation.h>\r
-  #include <sapi.h>\r
- #endif\r
+ #include <UIAutomation.h>\r
+ #include <sapi.h>\r
 \r
  #if JUCE_WEB_BROWSER\r
   #include <exdisp.h>\r
@@ -97,8 +94,6 @@
  #endif\r
 #endif\r
 \r
-#include <set>\r
-\r
 //==============================================================================\r
 #define JUCE_ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN \\r
     jassert ((MessageManager::getInstanceWithoutCreating() != nullptr \\r
@@ -249,6 +244,7 @@ namespace juce
 #include "application/juce_Application.cpp"\r
 #include "misc/juce_BubbleComponent.cpp"\r
 #include "misc/juce_DropShadower.cpp"\r
+#include "misc/juce_FocusOutline.cpp"\r
 #include "misc/juce_JUCESplashScreen.cpp"\r
 \r
 #include "layout/juce_FlexBox.cpp"\r
@@ -310,26 +306,13 @@ JUCE_END_IGNORE_WARNINGS_GCC_LIKE
  #include "native/juce_mac_MouseCursor.mm"\r
 \r
 #elif JUCE_WINDOWS\r
-\r
- #if ! JUCE_MINGW\r
-  #include "native/accessibility/juce_win32_WindowsUIAWrapper.h"\r
-  #include "native/accessibility/juce_win32_AccessibilityElement.h"\r
-  #include "native/accessibility/juce_win32_UIAHelpers.h"\r
-  #include "native/accessibility/juce_win32_UIAProviders.h"\r
-  #include "native/accessibility/juce_win32_AccessibilityElement.cpp"\r
-  #include "native/accessibility/juce_win32_Accessibility.cpp"\r
- #else\r
-  namespace juce\r
-  {\r
-      namespace WindowsAccessibility\r
-      {\r
-          long getUiaRootObjectId()  { return -1; }\r
-          bool handleWmGetObject (AccessibilityHandler*, WPARAM, LPARAM, LRESULT*) { return false; }\r
-          void revokeUIAMapEntriesForWindow (HWND) {}\r
-      }\r
-  }\r
- #endif\r
-\r
+ #include "native/accessibility/juce_win32_ComInterfaces.h"\r
+ #include "native/accessibility/juce_win32_WindowsUIAWrapper.h"\r
+ #include "native/accessibility/juce_win32_AccessibilityElement.h"\r
+ #include "native/accessibility/juce_win32_UIAHelpers.h"\r
+ #include "native/accessibility/juce_win32_UIAProviders.h"\r
+ #include "native/accessibility/juce_win32_AccessibilityElement.cpp"\r
+ #include "native/accessibility/juce_win32_Accessibility.cpp"\r
  #include "native/juce_win32_Windowing.cpp"\r
  #include "native/juce_win32_DragAndDrop.cpp"\r
  #include "native/juce_win32_FileChooser.cpp"\r
@@ -381,6 +364,34 @@ namespace juce
 \r
 //==============================================================================\r
 #if JUCE_WINDOWS\r
+namespace juce\r
+{\r
+\r
+JUCE_COMCLASS (JuceIVirtualDesktopManager, "a5cd92ff-29be-454c-8d04-d82879fb3f1b") : public IUnknown\r
+{\r
+public:\r
+    virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop(\r
+         __RPC__in HWND topLevelWindow,\r
+         __RPC__out BOOL * onCurrentDesktop) = 0;\r
+\r
+    virtual HRESULT STDMETHODCALLTYPE GetWindowDesktopId(\r
+         __RPC__in HWND topLevelWindow,\r
+         __RPC__out GUID * desktopId) = 0;\r
+\r
+    virtual HRESULT STDMETHODCALLTYPE MoveWindowToDesktop(\r
+         __RPC__in HWND topLevelWindow,\r
+         __RPC__in REFGUID desktopId) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (JuceVirtualDesktopManager, "aa509086-5ca9-4c25-8f95-589d3c07b48a");\r
+\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::JuceIVirtualDesktopManager, 0xa5cd92ff, 0x29be, 0x454c, 0x8d, 0x04, 0xd8, 0x28, 0x79, 0xfb, 0x3f, 0x1b)\r
+__CRT_UUID_DECL (juce::JuceVirtualDesktopManager,  0xaa509086, 0x5ca9, 0x4c25, 0x8f, 0x95, 0x58, 0x9d, 0x3c, 0x07, 0xb4, 0x8a)\r
+#endif\r
+\r
 bool juce::isWindowOnCurrentVirtualDesktop (void* x)\r
 {\r
     if (x == nullptr)\r
@@ -388,36 +399,16 @@ bool juce::isWindowOnCurrentVirtualDesktop (void* x)
 \r
     static auto* desktopManager = []\r
     {\r
-        // IVirtualDesktopManager Copied from ShObjdl_core.h, because it may not be defined\r
-        MIDL_INTERFACE ("a5cd92ff-29be-454c-8d04-d82879fb3f1b")\r
-        juce_IVirtualDesktopManager : public IUnknown\r
-        {\r
-        public:\r
-            virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop(\r
-                 __RPC__in HWND topLevelWindow,\r
-                 __RPC__out BOOL * onCurrentDesktop) = 0;\r
-\r
-            virtual HRESULT STDMETHODCALLTYPE GetWindowDesktopId(\r
-                 __RPC__in HWND topLevelWindow,\r
-                 __RPC__out GUID * desktopId) = 0;\r
-\r
-            virtual HRESULT STDMETHODCALLTYPE MoveWindowToDesktop(\r
-                 __RPC__in HWND topLevelWindow,\r
-                 __RPC__in REFGUID desktopId) = 0;\r
-        };\r
-\r
-        juce_IVirtualDesktopManager* result = nullptr;\r
+        JuceIVirtualDesktopManager* result = nullptr;\r
 \r
         JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
 \r
-        class DECLSPEC_UUID("aa509086-5ca9-4c25-8f95-589d3c07b48a") juce_VirtualDesktopManager;\r
-\r
-        if (SUCCEEDED (CoCreateInstance (__uuidof (juce_VirtualDesktopManager), nullptr, CLSCTX_ALL, IID_PPV_ARGS (&result))))\r
+        if (SUCCEEDED (CoCreateInstance (__uuidof (JuceVirtualDesktopManager), nullptr, CLSCTX_ALL, IID_PPV_ARGS (&result))))\r
             return result;\r
 \r
         JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
-        return static_cast<juce_IVirtualDesktopManager*> (nullptr);\r
+        return static_cast<JuceIVirtualDesktopManager*> (nullptr);\r
     }();\r
 \r
     BOOL current = false;\r
@@ -428,6 +419,7 @@ bool juce::isWindowOnCurrentVirtualDesktop (void* x)
 \r
     return true;\r
 }\r
+\r
 #else\r
  bool juce::isWindowOnCurrentVirtualDesktop (void*) { return true; }\r
  juce::ScopedDPIAwarenessDisabler::ScopedDPIAwarenessDisabler()  { ignoreUnused (previousContext); }\r
index 09c618605a0c0c04c52734ea89bc9c3d03ca384a..f497d0385c461a973114571a020ce056a272608e 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_gui_basics\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE GUI core classes\r
   description:        Basic user-interface components and related classes.\r
   website:            http://www.juce.com/juce\r
@@ -161,6 +161,7 @@ namespace juce
 \r
     class FlexBox;\r
     class Grid;\r
+    class FocusOutline;\r
 \r
    #if JUCE_MAC || JUCE_WINDOWS || JUCE_LINUX\r
     Image createSnapshotOfNativeWindow (void* nativeWindowHandle);\r
@@ -259,6 +260,7 @@ namespace juce
 #include "menus/juce_BurgerMenuComponent.h"\r
 #include "buttons/juce_ToolbarButton.h"\r
 #include "misc/juce_DropShadower.h"\r
+#include "misc/juce_FocusOutline.h"\r
 #include "misc/juce_JUCESplashScreen.h"\r
 #include "widgets/juce_TreeView.h"\r
 #include "windows/juce_TopLevelWindow.h"\r
index f208e7736cb9b16f327006f23e4bb029a8f424fa..14034284baf4280a2cbe8cd3943375ce0d855e80 100644 (file)
@@ -328,7 +328,7 @@ public:
         operation you could give a value of false to the callback to abort the close operation.\r
 \r
         If your component is based on the FileBasedDocument class, then you'd probably want\r
-        to call FileBasedDocument::saveIfNeededAndUserAgreesAsync() and call the calback with\r
+        to call FileBasedDocument::saveIfNeededAndUserAgreesAsync() and call the callback with\r
         true if this returned FileBasedDocument::savedOk.\r
 \r
         @see closeDocumentAsync, FileBasedDocument::saveIfNeededAndUserAgreesAsync()\r
index a62101604e41ffb3097ea68ab99164c1602458b8..f0ba3666409628728aa2f7ad691d3a14c2d83f28 100644 (file)
@@ -153,7 +153,9 @@ public:
     Colour findColour (int colourId) const noexcept;\r
 \r
     /** Registers a colour to be used for a particular purpose.\r
+\r
         For more details, see the comments for findColour().\r
+\r
         @see findColour, Component::findColour, Component::setColour\r
     */\r
     void setColour (int colourId, Colour colour) noexcept;\r
@@ -165,22 +167,27 @@ public:
 \r
     //==============================================================================\r
     /** Returns the typeface that should be used for a given font.\r
+\r
         The default implementation just does what you'd expect it to, but you can override\r
         this if you want to intercept fonts and use your own custom typeface object.\r
+\r
         @see setDefaultTypeface\r
     */\r
     virtual Typeface::Ptr getTypefaceForFont (const Font&);\r
 \r
     /** Allows you to supply a default typeface that will be returned as the default\r
         sans-serif font.\r
+\r
         Instead of a typeface object, you can specify a typeface by name using the\r
         setDefaultSansSerifTypefaceName() method.\r
+\r
         You can perform more complex typeface substitutions by overloading\r
         getTypefaceForFont() but this lets you easily set a global typeface.\r
     */\r
     void setDefaultSansSerifTypeface (Typeface::Ptr newDefaultTypeface);\r
 \r
     /** Allows you to change the default sans-serif font.\r
+\r
         If you need to supply your own Typeface object for any of the default fonts, rather\r
         than just supplying the name (e.g. if you want to use an embedded font), then\r
         you can instead call setDefaultSansSerifTypeface() with an object to use.\r
@@ -188,39 +195,64 @@ public:
     void setDefaultSansSerifTypefaceName (const String& newName);\r
 \r
     //==============================================================================\r
-    /** Override this to get the chance to swap a component's mouse cursor for a\r
-        customised one.\r
+    /** Sets whether native alert windows (if available) or standard JUCE AlertWindows\r
+        drawn with AlertWindow::LookAndFeelMethods will be used.\r
+\r
+        @see isUsingNativeAlertWindows\r
     */\r
-    virtual MouseCursor getMouseCursorFor (Component&);\r
+    void setUsingNativeAlertWindows (bool shouldUseNativeAlerts);\r
 \r
-    //==============================================================================\r
-    /** Creates a new graphics context object. */\r
-    virtual std::unique_ptr<LowLevelGraphicsContext> createGraphicsContext (const Image& imageToRenderOn,\r
-                                                                            Point<int> origin,\r
-                                                                            const RectangleList<int>& initialClip);\r
+    /** Returns true if native alert windows will be used (if available).\r
 \r
-    void setUsingNativeAlertWindows (bool shouldUseNativeAlerts);\r
+        The default setting for this is false.\r
+\r
+        @see setUsingNativeAlertWindows\r
+    */\r
     bool isUsingNativeAlertWindows();\r
 \r
     //==============================================================================\r
     /** Draws a small image that spins to indicate that something's happening.\r
+\r
         This method should use the current time to animate itself, so just keep\r
         repainting it every so often.\r
     */\r
     virtual void drawSpinningWaitAnimation (Graphics&, const Colour& colour,\r
                                             int x, int y, int w, int h) = 0;\r
 \r
-    //==============================================================================\r
     /** Returns a tick shape for use in yes/no boxes, etc. */\r
     virtual Path getTickShape (float height) = 0;\r
+\r
     /** Returns a cross shape for use in yes/no boxes, etc. */\r
     virtual Path getCrossShape (float height) = 0;\r
 \r
-    //==============================================================================\r
-    virtual DropShadower* createDropShadowerForComponent (Component*) = 0;\r
+    /** Creates a drop-shadower for a given component, if required.\r
+\r
+        @see DropShadower\r
+    */\r
+    virtual std::unique_ptr<DropShadower> createDropShadowerForComponent (Component&) = 0;\r
+\r
+    /** Creates a focus outline for a given component, if required.\r
+\r
+        @see FocusOutline\r
+    */\r
+    virtual std::unique_ptr<FocusOutline> createFocusOutlineForComponent (Component&) = 0;\r
 \r
     //==============================================================================\r
-    /** Plays the system's default 'beep' noise, to alert the user about something very important. */\r
+    /** Override this to get the chance to swap a component's mouse cursor for a\r
+        customised one.\r
+\r
+        @see MouseCursor\r
+    */\r
+    virtual MouseCursor getMouseCursorFor (Component&);\r
+\r
+    /** Creates a new graphics context object. */\r
+    virtual std::unique_ptr<LowLevelGraphicsContext> createGraphicsContext (const Image& imageToRenderOn,\r
+                                                                            Point<int> origin,\r
+                                                                            const RectangleList<int>& initialClip);\r
+\r
+    /** Plays the system's default 'beep' noise, to alert the user about something\r
+        very important. This is only supported on some platforms.\r
+    */\r
     virtual void playAlertSound();\r
 \r
 private:\r
index 6295b0a51c210ccb04c3a88df9315fa815502e64..7ea997dec359a13c3d3739c054c63e207115807f 100644 (file)
@@ -188,15 +188,22 @@ LookAndFeel_V2::LookAndFeel_V2()
         0x1000440, /*LassoComponent::lassoFillColourId*/        0x66dddddd,\r
         0x1000441, /*LassoComponent::lassoOutlineColourId*/     0x99111111,\r
 \r
+        0x1004000, /*KeyboardComponentBase::upDownButtonBackgroundColourId*/  0xffd3d3d3,\r
+        0x1004001, /*KeyboardComponentBase::upDownButtonArrowColourId*/       0xff000000,\r
+\r
         0x1005000, /*MidiKeyboardComponent::whiteNoteColourId*/               0xffffffff,\r
         0x1005001, /*MidiKeyboardComponent::blackNoteColourId*/               0xff000000,\r
         0x1005002, /*MidiKeyboardComponent::keySeparatorLineColourId*/        0x66000000,\r
         0x1005003, /*MidiKeyboardComponent::mouseOverKeyOverlayColourId*/     0x80ffff00,\r
         0x1005004, /*MidiKeyboardComponent::keyDownOverlayColourId*/          0xffb6b600,\r
         0x1005005, /*MidiKeyboardComponent::textLabelColourId*/               0xff000000,\r
-        0x1005006, /*MidiKeyboardComponent::upDownButtonBackgroundColourId*/  0xffd3d3d3,\r
-        0x1005007, /*MidiKeyboardComponent::upDownButtonArrowColourId*/       0xff000000,\r
-        0x1005008, /*MidiKeyboardComponent::shadowColourId*/                  0x4c000000,\r
+        0x1005006, /*MidiKeyboardComponent::shadowColourId*/                  0x4c000000,\r
+\r
+        0x1006000, /*MPEKeyboardComponent::whiteNoteColourId*/                0xff1a1c27,\r
+        0x1006001, /*MPEKeyboardComponent::blackNoteColourId*/                0x99f1f1f1,\r
+        0x1006002, /*MPEKeyboardComponent::textLabelColourId*/                0xfff1f1f1,\r
+        0x1006003, /*MPEKeyboardComponent::noteCircleFillColourId*/           0x99ba00ff,\r
+        0x1006004, /*MPEKeyboardComponent::noteCircleOutlineColourId*/        0xfff1f1f1,\r
 \r
         0x1004500, /*CodeEditorComponent::backgroundColourId*/                0xffffffff,\r
         0x1004502, /*CodeEditorComponent::highlightColourId*/                 textHighlightColour,\r
@@ -2056,9 +2063,28 @@ int LookAndFeel_V2::getDefaultMenuBarHeight()
 }\r
 \r
 //==============================================================================\r
-DropShadower* LookAndFeel_V2::createDropShadowerForComponent (Component*)\r
+std::unique_ptr<DropShadower> LookAndFeel_V2::createDropShadowerForComponent (Component&)\r
 {\r
-    return new DropShadower (DropShadow (Colours::black.withAlpha (0.4f), 10, Point<int> (0, 2)));\r
+    return std::make_unique<DropShadower> (DropShadow (Colours::black.withAlpha (0.4f), 10, Point<int> (0, 2)));\r
+}\r
+\r
+std::unique_ptr<FocusOutline> LookAndFeel_V2::createFocusOutlineForComponent (Component&)\r
+{\r
+    struct WindowProperties  : public FocusOutline::OutlineWindowProperties\r
+    {\r
+        Rectangle<int> getOutlineBounds (Component& c) override\r
+        {\r
+            return c.getScreenBounds();\r
+        }\r
+\r
+        void drawOutline (Graphics& g, int width, int height) override\r
+        {\r
+            g.setColour (Colours::yellow.withAlpha (0.6f));\r
+            g.drawRoundedRectangle ({ (float) width, (float) height }, 3.0f, 3.0f);\r
+        }\r
+    };\r
+\r
+    return std::make_unique<FocusOutline> (std::make_unique<WindowProperties>());\r
 }\r
 \r
 //==============================================================================\r
index 425b3410e15f184ce8efc65ccf7c8b6daf82e238..0a2cd69e8c4970e47b4f85e7acf40b80323d61dc 100644 (file)
@@ -299,7 +299,8 @@ public:
                                         bool positionTitleBarButtonsOnLeft) override;\r
 \r
     //==============================================================================\r
-    DropShadower* createDropShadowerForComponent (Component*) override;\r
+    std::unique_ptr<DropShadower> createDropShadowerForComponent (Component&) override;\r
+    std::unique_ptr<FocusOutline> createFocusOutlineForComponent (Component&) override;\r
 \r
     //==============================================================================\r
     void drawStretchableLayoutResizerBar (Graphics&, int w, int h, bool isVerticalBar,\r
index ece512a13161bbffdadc364a48c40314d1aa4818..78b2c7eefb4eafbf852cabc566a7e834ce2f094e 100644 (file)
@@ -1438,15 +1438,22 @@ void LookAndFeel_V4::initialiseColours()
         0x1000440, /*LassoComponent::lassoFillColourId*/        currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).getARGB(),\r
         0x1000441, /*LassoComponent::lassoOutlineColourId*/     currentColourScheme.getUIColour (ColourScheme::UIColour::outline).getARGB(),\r
 \r
+        0x1004000, /*KeyboardComponentBase::upDownButtonBackgroundColourId*/  0xffd3d3d3,\r
+        0x1004001, /*KeyboardComponentBase::upDownButtonArrowColourId*/       0xff000000,\r
+\r
         0x1005000, /*MidiKeyboardComponent::whiteNoteColourId*/               0xffffffff,\r
         0x1005001, /*MidiKeyboardComponent::blackNoteColourId*/               0xff000000,\r
         0x1005002, /*MidiKeyboardComponent::keySeparatorLineColourId*/        0x66000000,\r
         0x1005003, /*MidiKeyboardComponent::mouseOverKeyOverlayColourId*/     0x80ffff00,\r
         0x1005004, /*MidiKeyboardComponent::keyDownOverlayColourId*/          0xffb6b600,\r
         0x1005005, /*MidiKeyboardComponent::textLabelColourId*/               0xff000000,\r
-        0x1005006, /*MidiKeyboardComponent::upDownButtonBackgroundColourId*/  0xffd3d3d3,\r
-        0x1005007, /*MidiKeyboardComponent::upDownButtonArrowColourId*/       0xff000000,\r
-        0x1005008, /*MidiKeyboardComponent::shadowColourId*/                  0x4c000000,\r
+        0x1005006, /*MidiKeyboardComponent::shadowColourId*/                  0x4c000000,\r
+\r
+        0x1006000, /*MPEKeyboardComponent::whiteNoteColourId*/                0xff1a1c27,\r
+        0x1006001, /*MPEKeyboardComponent::blackNoteColourId*/                0x99f1f1f1,\r
+        0x1006002, /*MPEKeyboardComponent::textLabelColourId*/                0xfff1f1f1,\r
+        0x1006003, /*MPEKeyboardComponent::noteCircleFillColourId*/           0x99ba00ff,\r
+        0x1006004, /*MPEKeyboardComponent::noteCircleOutlineColourId*/        0xfff1f1f1,\r
 \r
         0x1004500, /*CodeEditorComponent::backgroundColourId*/                currentColourScheme.getUIColour (ColourScheme::UIColour::widgetBackground).getARGB(),\r
         0x1004502, /*CodeEditorComponent::highlightColourId*/                 currentColourScheme.getUIColour (ColourScheme::UIColour::defaultFill).withAlpha (0.4f).getARGB(),\r
index 276f1203af58a2c1bda76e1b1e745af27dc3e3e4..22668e1044a6e3790805617ca5e7ce3684aea6b5 100644 (file)
@@ -41,8 +41,20 @@ struct PopupMenu::HelperClasses
 class MouseSourceState;\r
 struct MenuWindow;\r
 \r
-static bool canBeTriggered (const PopupMenu::Item& item) noexcept        { return item.isEnabled && item.itemID != 0 && ! item.isSectionHeader; }\r
-static bool hasActiveSubMenu (const PopupMenu::Item& item) noexcept      { return item.isEnabled && item.subMenu != nullptr && item.subMenu->items.size() > 0; }\r
+static bool canBeTriggered (const PopupMenu::Item& item) noexcept\r
+{\r
+    return item.isEnabled\r
+        && item.itemID != 0\r
+        && ! item.isSectionHeader\r
+        && (item.customComponent == nullptr || item.customComponent->isTriggeredAutomatically());\r
+}\r
+\r
+static bool hasActiveSubMenu (const PopupMenu::Item& item) noexcept\r
+{\r
+    return item.isEnabled\r
+        && item.subMenu != nullptr\r
+        && item.subMenu->items.size() > 0;\r
+}\r
 \r
 //==============================================================================\r
 struct HeaderItemComponent  : public PopupMenu::CustomComponent\r
@@ -73,6 +85,11 @@ struct HeaderItemComponent  : public PopupMenu::CustomComponent
         idealWidth += idealWidth / 4;\r
     }\r
 \r
+    std::unique_ptr<AccessibilityHandler> createAccessibilityHandler() override\r
+    {\r
+        return nullptr;\r
+    }\r
+\r
     const Options& options;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HeaderItemComponent)\r
@@ -81,9 +98,7 @@ struct HeaderItemComponent  : public PopupMenu::CustomComponent
 //==============================================================================\r
 struct ItemComponent  : public Component\r
 {\r
-    ItemComponent (const PopupMenu::Item& i,\r
-                   const PopupMenu::Options& o,\r
-                   MenuWindow& parent)\r
+    ItemComponent (const PopupMenu::Item& i, const PopupMenu::Options& o, MenuWindow& parent)\r
         : item (i), parentWindow (parent), options (o), customComp (i.customComponent)\r
     {\r
         if (item.isSectionHeader)\r
@@ -164,17 +179,48 @@ struct ItemComponent  : public Component
         }\r
     }\r
 \r
+    static bool isAccessibilityHandlerRequired (const PopupMenu::Item& item)\r
+    {\r
+        return item.isSectionHeader || hasActiveSubMenu (item) || canBeTriggered (item);\r
+    }\r
+\r
     PopupMenu::Item item;\r
 \r
 private:\r
+    class ValueInterface  : public AccessibilityValueInterface\r
+    {\r
+    public:\r
+        ValueInterface() = default;\r
+\r
+        bool isReadOnly() const override  { return true; }\r
+\r
+        double getCurrentValue() const override\r
+        {\r
+            return 1.0;\r
+        }\r
+\r
+        String getCurrentValueAsString() const override\r
+        {\r
+            return TRANS ("Checked");\r
+        }\r
+\r
+        void setValue (double) override {}\r
+        void setValueAsString (const String&) override  {}\r
+\r
+        AccessibleValueRange getRange() const override { return {}; }\r
+    };\r
+\r
     //==============================================================================\r
     class ItemAccessibilityHandler  : public AccessibilityHandler\r
     {\r
     public:\r
         explicit ItemAccessibilityHandler (ItemComponent& itemComponentToWrap)\r
             : AccessibilityHandler (itemComponentToWrap,\r
-                                    AccessibilityRole::menuItem,\r
-                                    getAccessibilityActions (*this, itemComponentToWrap)),\r
+                                    isAccessibilityHandlerRequired (itemComponentToWrap.item) ? AccessibilityRole::menuItem\r
+                                                                                              : AccessibilityRole::ignored,\r
+                                    getAccessibilityActions (*this, itemComponentToWrap),\r
+                                    AccessibilityHandler::Interfaces { itemComponentToWrap.item.isTicked ? std::make_unique<ValueInterface>()\r
+                                                                                                         : nullptr }),\r
               itemComponent (itemComponentToWrap)\r
         {\r
         }\r
@@ -195,6 +241,9 @@ private:
                                                                       : state.withExpandable().withCollapsed();\r
             }\r
 \r
+            if (itemComponent.item.isTicked)\r
+                state = state.withChecked();\r
+\r
             return state.isFocused() ? state.withSelected() : state;\r
         }\r
 \r
@@ -209,12 +258,6 @@ private:
                 item.parentWindow.setCurrentlyHighlightedChild (&item);\r
             };\r
 \r
-            auto onPress = [&item]\r
-            {\r
-                item.parentWindow.setCurrentlyHighlightedChild (&item);\r
-                item.parentWindow.triggerCurrentlyHighlightedItem();\r
-            };\r
-\r
             auto onToggle = [&handler, &item, onFocus]\r
             {\r
                 if (handler.getCurrentState().isSelected())\r
@@ -224,9 +267,17 @@ private:
             };\r
 \r
             auto actions = AccessibilityActions().addAction (AccessibilityActionType::focus,  std::move (onFocus))\r
-                                                 .addAction (AccessibilityActionType::press,  std::move (onPress))\r
                                                  .addAction (AccessibilityActionType::toggle, std::move (onToggle));\r
 \r
+            if (canBeTriggered (item.item))\r
+            {\r
+                actions.addAction (AccessibilityActionType::press, [&item]\r
+                {\r
+                    item.parentWindow.setCurrentlyHighlightedChild (&item);\r
+                    item.parentWindow.triggerCurrentlyHighlightedItem();\r
+                });\r
+            }\r
+\r
             if (hasActiveSubMenu (item.item))\r
             {\r
                 auto showSubMenu = [&item]\r
@@ -1176,10 +1227,7 @@ struct MenuWindow  : public Component
 \r
     void triggerCurrentlyHighlightedItem()\r
     {\r
-        if (currentChild != nullptr\r
-             && canBeTriggered (currentChild->item)\r
-             && (currentChild->item.customComponent == nullptr\r
-                  || currentChild->item.customComponent->isTriggeredAutomatically()))\r
+        if (currentChild != nullptr && canBeTriggered (currentChild->item))\r
         {\r
             dismissMenu (&currentChild->item);\r
         }\r
@@ -1720,7 +1768,7 @@ PopupMenu::Item&& PopupMenu::Item::setImage (std::unique_ptr<Drawable> newImage)
 void PopupMenu::addItem (Item newItem)\r
 {\r
     // An ID of 0 is used as a return value to indicate that the user\r
-    // didn't pick anything, so you shouldn't use it as the ID for an item..\r
+    // didn't pick anything, so you shouldn't use it as the ID for an item.\r
     jassert (newItem.itemID != 0\r
               || newItem.isSeparator || newItem.isSectionHeader\r
               || newItem.subMenu != nullptr);\r
@@ -1828,12 +1876,23 @@ void PopupMenu::addColouredItem (int itemResultID, String itemText, Colour itemT
 \r
 void PopupMenu::addCustomItem (int itemResultID,\r
                                std::unique_ptr<CustomComponent> cc,\r
-                               std::unique_ptr<const PopupMenu> subMenu)\r
+                               std::unique_ptr<const PopupMenu> subMenu,\r
+                               const String& itemTitle)\r
 {\r
     Item i;\r
+    i.text = itemTitle;\r
     i.itemID = itemResultID;\r
     i.customComponent = cc.release();\r
     i.subMenu.reset (createCopyIfNotNull (subMenu.get()));\r
+\r
+    // If this assertion is hit, this item will be visible to screen readers but with\r
+    // no name, which may be confusing to users.\r
+    // It's probably a good idea to add a title for this menu item that describes\r
+    // the meaning of the item, or the contents of the submenu, as appropriate.\r
+    // If you don't want this menu item to be press-able directly, pass "false" to the\r
+    // constructor of the CustomComponent.\r
+    jassert (! (HelperClasses::ItemComponent::isAccessibilityHandlerRequired (i) && itemTitle.isEmpty()));\r
+\r
     addItem (std::move (i));\r
 }\r
 \r
@@ -1841,11 +1900,12 @@ void PopupMenu::addCustomItem (int itemResultID,
                                Component& customComponent,\r
                                int idealWidth, int idealHeight,\r
                                bool triggerMenuItemAutomaticallyWhenClicked,\r
-                               std::unique_ptr<const PopupMenu> subMenu)\r
+                               std::unique_ptr<const PopupMenu> subMenu,\r
+                               const String& itemTitle)\r
 {\r
     auto comp = std::make_unique<HelperClasses::NormalComponentWrapper> (customComponent, idealWidth, idealHeight,\r
                                                                          triggerMenuItemAutomaticallyWhenClicked);\r
-    addCustomItem (itemResultID, std::move (comp), std::move (subMenu));\r
+    addCustomItem (itemResultID, std::move (comp), std::move (subMenu), itemTitle);\r
 }\r
 \r
 void PopupMenu::addSubMenu (String subMenuName, PopupMenu subMenu, bool isActive)\r
@@ -2211,15 +2271,13 @@ void PopupMenu::setItem (CustomComponent& c, const Item* itemToUse)
 }\r
 \r
 //==============================================================================\r
+PopupMenu::CustomComponent::CustomComponent() : CustomComponent (true) {}\r
+\r
 PopupMenu::CustomComponent::CustomComponent (bool autoTrigger)\r
     : triggeredAutomatically (autoTrigger)\r
 {\r
 }\r
 \r
-PopupMenu::CustomComponent::~CustomComponent()\r
-{\r
-}\r
-\r
 void PopupMenu::CustomComponent::setHighlighted (bool shouldBeHighlighted)\r
 {\r
     isHighlighted = shouldBeHighlighted;\r
index ca43cfc2ee39be69ba544371583b494743724bdf..95677219b9324ef9a1907004bcb995ab8a01993e 100644 (file)
@@ -39,20 +39,22 @@ namespace juce
         m.addItem (1, "item 1");\r
         m.addItem (2, "item 2");\r
 \r
-        const int result = m.show();\r
-\r
-        if (result == 0)\r
-        {\r
-            // user dismissed the menu without picking anything\r
-        }\r
-        else if (result == 1)\r
-        {\r
-            // user picked item 1\r
-        }\r
-        else if (result == 2)\r
-        {\r
-            // user picked item 2\r
-        }\r
+        m.showMenuAsync (PopupMenu::Options(),\r
+                         [] (int result)\r
+                         {\r
+                             if (result == 0)\r
+                             {\r
+                                 // user dismissed the menu without picking anything\r
+                             }\r
+                             else if (result == 1)\r
+                             {\r
+                                 // user picked item 1\r
+                             }\r
+                             else if (result == 2)\r
+                             {\r
+                                 // user picked item 2\r
+                             }\r
+                         });\r
     }\r
     @endcode\r
 \r
@@ -68,9 +70,7 @@ namespace juce
         mainMenu.addItem (3, "item 3");\r
         mainMenu.addSubMenu ("other choices", subMenu);\r
 \r
-        const int result = m.show();\r
-\r
-        ...etc\r
+        m.showMenuAsync (...);\r
     }\r
     @endcode\r
 \r
@@ -333,11 +333,15 @@ public:
 \r
         Note that native macOS menus do not support custom components.\r
 \r
+        itemTitle will be used as the fallback text for this item, and will\r
+        be exposed to screen reader clients.\r
+\r
         @see CustomComponent\r
     */\r
     void addCustomItem (int itemResultID,\r
                         std::unique_ptr<CustomComponent> customComponent,\r
-                        std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr);\r
+                        std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr,\r
+                        const String& itemTitle = {});\r
 \r
     /** Appends a custom menu item that can't be used to trigger a result.\r
 \r
@@ -350,6 +354,9 @@ public:
         menu ID specified in itemResultID. If this is false, the menu item can't\r
         be triggered, so itemResultID is not used.\r
 \r
+        itemTitle will be used as the fallback text for this item, and will\r
+        be exposed to screen reader clients.\r
+\r
         Note that native macOS menus do not support custom components.\r
     */\r
     void addCustomItem (int itemResultID,\r
@@ -357,7 +364,8 @@ public:
                         int idealWidth,\r
                         int idealHeight,\r
                         bool triggerMenuItemAutomaticallyWhenClicked,\r
-                        std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr);\r
+                        std::unique_ptr<const PopupMenu> optionalSubMenu = nullptr,\r
+                        const String& itemTitle = {});\r
 \r
     /** Appends a sub-menu.\r
 \r
@@ -820,15 +828,22 @@ public:
                                        public SingleThreadedReferenceCountedObject\r
     {\r
     public:\r
+        /** Creates a custom item that is triggered automatically. */\r
+        CustomComponent();\r
+\r
         /** Creates a custom item.\r
+\r
             If isTriggeredAutomatically is true, then the menu will automatically detect\r
             a mouse-click on this component and use that to invoke the menu item. If it's\r
             false, then it's up to your class to manually trigger the item when it wants to.\r
-        */\r
-        CustomComponent (bool isTriggeredAutomatically = true);\r
 \r
-        /** Destructor. */\r
-        ~CustomComponent() override;\r
+            If isTriggeredAutomatically is true, then an accessibility handler 'wrapper'\r
+            will be created for the item that allows pressing, focusing, and toggling.\r
+            If isTriggeredAutomatically is false, and the item has no submenu, then\r
+            no accessibility wrapper will be created and your component must be\r
+            independently accessible.\r
+        */\r
+        explicit CustomComponent (bool isTriggeredAutomatically);\r
 \r
         /** Returns a rectangle with the size that this component would like to have.\r
 \r
index 38babb5a30350720e8c676b400518357f3efbd27..84384c4bebaa7e79063461a7d9e39a5e5938dffc 100644 (file)
@@ -55,17 +55,8 @@ public:
     /** Attaches the DropShadower to the component you want to shadow. */\r
     void setOwner (Component* componentToFollow);\r
 \r
-\r
 private:\r
     //==============================================================================\r
-    class ShadowWindow;\r
-\r
-    WeakReference<Component> owner;\r
-    OwnedArray<Component> shadowWindows;\r
-    DropShadow shadow;\r
-    bool reentrant = false;\r
-    WeakReference<Component> lastParentComp;\r
-\r
     void componentMovedOrResized (Component&, bool, bool) override;\r
     void componentBroughtToFront (Component&) override;\r
     void componentChildrenChanged (Component&) override;\r
@@ -75,6 +66,14 @@ private:
     void updateParent();\r
     void updateShadows();\r
 \r
+    class ShadowWindow;\r
+\r
+    WeakReference<Component> owner;\r
+    OwnedArray<Component> shadowWindows;\r
+    DropShadow shadow;\r
+    bool reentrant = false;\r
+    WeakReference<Component> lastParentComp;\r
+\r
     class ParentVisibilityChangedListener;\r
     std::unique_ptr<ParentVisibilityChangedListener> visibilityChangedListener;\r
 \r
diff --git a/modules/juce_gui_basics/misc/juce_FocusOutline.cpp b/modules/juce_gui_basics/misc/juce_FocusOutline.cpp
new file mode 100644 (file)
index 0000000..b2171b6
--- /dev/null
@@ -0,0 +1,185 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+//==============================================================================\r
+struct OutlineWindowComponent  : public Component\r
+{\r
+    OutlineWindowComponent (Component* c, FocusOutline::OutlineWindowProperties& p)\r
+      : target (c), props (p)\r
+    {\r
+        setVisible (true);\r
+        setInterceptsMouseClicks (false, false);\r
+\r
+        if (target->isOnDesktop())\r
+        {\r
+            setSize (1, 1);\r
+            addToDesktop (ComponentPeer::windowIgnoresMouseClicks\r
+                            | ComponentPeer::windowIsTemporary\r
+                            | ComponentPeer::windowIgnoresKeyPresses);\r
+        }\r
+        else if (auto* parent = target->getParentComponent())\r
+        {\r
+            auto targetIndex = parent->getIndexOfChildComponent (target);\r
+            parent->addChildComponent (this, targetIndex + 1);\r
+        }\r
+    }\r
+\r
+    void paint (Graphics& g) override\r
+    {\r
+        if (target != nullptr)\r
+            props.drawOutline (g, getWidth(), getHeight());\r
+    }\r
+\r
+    void resized() override\r
+    {\r
+        repaint();\r
+    }\r
+\r
+    float getDesktopScaleFactor() const override\r
+    {\r
+        return target != nullptr ? target->getDesktopScaleFactor()\r
+                                 : Component::getDesktopScaleFactor();\r
+    }\r
+\r
+private:\r
+    WeakReference<Component> target;\r
+    FocusOutline::OutlineWindowProperties& props;\r
+\r
+    JUCE_DECLARE_NON_COPYABLE (OutlineWindowComponent)\r
+};\r
+\r
+//==============================================================================\r
+FocusOutline::FocusOutline (std::unique_ptr<OutlineWindowProperties> props)\r
+    : properties (std::move (props))\r
+{\r
+}\r
+\r
+FocusOutline::~FocusOutline()\r
+{\r
+    if (owner != nullptr)\r
+        owner->removeComponentListener (this);\r
+\r
+    if (lastParentComp != nullptr)\r
+        lastParentComp->removeComponentListener (this);\r
+}\r
+\r
+void FocusOutline::setOwner (Component* componentToFollow)\r
+{\r
+    if (componentToFollow != owner)\r
+    {\r
+        if (owner != nullptr)\r
+            owner->removeComponentListener (this);\r
+\r
+        owner = componentToFollow;\r
+\r
+        if (owner != nullptr)\r
+            owner->addComponentListener (this);\r
+\r
+        updateParent();\r
+        updateOutlineWindow();\r
+    }\r
+}\r
+\r
+void FocusOutline::componentMovedOrResized (Component& c, bool, bool)\r
+{\r
+    if (owner == &c)\r
+        updateOutlineWindow();\r
+}\r
+\r
+void FocusOutline::componentBroughtToFront (Component& c)\r
+{\r
+    if (owner == &c)\r
+        updateOutlineWindow();\r
+}\r
+\r
+void FocusOutline::componentParentHierarchyChanged (Component& c)\r
+{\r
+    if (owner == &c)\r
+    {\r
+        updateParent();\r
+        updateOutlineWindow();\r
+    }\r
+}\r
+\r
+void FocusOutline::componentVisibilityChanged (Component& c)\r
+{\r
+    if (owner == &c)\r
+        updateOutlineWindow();\r
+}\r
+\r
+void FocusOutline::updateParent()\r
+{\r
+    lastParentComp = (owner != nullptr ? owner->getParentComponent()\r
+                                       : nullptr);\r
+}\r
+\r
+void FocusOutline::updateOutlineWindow()\r
+{\r
+    if (reentrant)\r
+        return;\r
+\r
+    const ScopedValueSetter<bool> setter (reentrant, true);\r
+\r
+    if (owner == nullptr)\r
+    {\r
+        outlineWindow = nullptr;\r
+        return;\r
+    }\r
+\r
+    if (owner->isShowing()\r
+         && owner->getWidth() > 0 && owner->getHeight() > 0)\r
+    {\r
+        if (outlineWindow == nullptr)\r
+            outlineWindow = std::make_unique<OutlineWindowComponent> (owner, *properties);\r
+\r
+        WeakReference<Component> deletionChecker (outlineWindow.get());\r
+\r
+        outlineWindow->setAlwaysOnTop (owner->isAlwaysOnTop());\r
+\r
+        if (deletionChecker == nullptr)\r
+            return;\r
+\r
+        const auto windowBounds = [this]\r
+        {\r
+            const auto bounds = properties->getOutlineBounds (*owner);\r
+\r
+            if (lastParentComp != nullptr)\r
+                return lastParentComp->getLocalArea (nullptr, bounds);\r
+\r
+            return bounds;\r
+        }();\r
+\r
+        outlineWindow->setBounds (windowBounds);\r
+    }\r
+    else\r
+    {\r
+        outlineWindow = nullptr;\r
+    }\r
+}\r
+\r
+} // namespace juce\r
diff --git a/modules/juce_gui_basics/misc/juce_FocusOutline.h b/modules/juce_gui_basics/misc/juce_FocusOutline.h
new file mode 100644 (file)
index 0000000..9bd9403
--- /dev/null
@@ -0,0 +1,100 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+/**\r
+    Adds a focus outline to a component.\r
+\r
+    This object creates and manages a component that sits on top of a target\r
+    component. It will track the position of the target component and will be\r
+    brought to the front with the tracked component.\r
+\r
+    Use the Component::setHasFocusOutline() method to indicate that a component\r
+    should have a focus outline drawn around it, and when it receives keyboard\r
+    focus one of these objects will be created using the\r
+    LookAndFeel::createFocusOutlineForComponent() method. You can override this\r
+    method in your own LookAndFeel classes to draw a custom outline if required.\r
+\r
+    @tags{GUI}\r
+*/\r
+class JUCE_API  FocusOutline  : private ComponentListener\r
+{\r
+public:\r
+    //==============================================================================\r
+    /** Defines the focus outline window properties.\r
+\r
+        Pass an instance of one of these to the FocusOutline constructor to control\r
+        the bounds for the outline window and how it is drawn.\r
+    */\r
+    struct JUCE_API  OutlineWindowProperties\r
+    {\r
+        virtual ~OutlineWindowProperties() = default;\r
+\r
+        /** Return the bounds for the outline window in screen coordinates. */\r
+        virtual Rectangle<int> getOutlineBounds (Component& focusedComponent) = 0;\r
+\r
+        /** This method will be called to draw the focus outline. */\r
+        virtual void drawOutline (Graphics&, int width, int height) = 0;\r
+    };\r
+\r
+    //==============================================================================\r
+    /** Creates a FocusOutline.\r
+\r
+        Call setOwner to attach it to a component.\r
+    */\r
+    FocusOutline (std::unique_ptr<OutlineWindowProperties> props);\r
+\r
+    /** Destructor. */\r
+    ~FocusOutline() override;\r
+\r
+    /** Attaches the outline to a component. */\r
+    void setOwner (Component* componentToFollow);\r
+\r
+private:\r
+    //==============================================================================\r
+    void componentMovedOrResized (Component&, bool, bool) override;\r
+    void componentBroughtToFront (Component&) override;\r
+    void componentParentHierarchyChanged (Component&) override;\r
+    void componentVisibilityChanged (Component&) override;\r
+\r
+    void updateOutlineWindow();\r
+    void updateParent();\r
+\r
+    //==============================================================================\r
+    std::unique_ptr<OutlineWindowProperties> properties;\r
+\r
+    WeakReference<Component> owner;\r
+    std::unique_ptr<Component> outlineWindow;\r
+    WeakReference<Component> lastParentComp;\r
+\r
+    bool reentrant = false;\r
+\r
+    //==============================================================================\r
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FocusOutline)\r
+};\r
+\r
+} // namespace juce\r
index 9fa5bd163982e4e29acd5f08c79008dbaf238d11..0e82864bd0dc03e32ad15496ac7d00707a3a5cb8 100644 (file)
@@ -43,7 +43,7 @@ public:
           standard (false)\r
     {\r
         // your hotspot needs to be within the bounds of the image!\r
-        jassert (image.getImage().getBounds().contains (hotSpot));\r
+        jassert (image.getScaledBounds().toNearestInt().contains (hotSpot));\r
     }\r
 \r
     static std::shared_ptr<SharedCursorHandle> createStandard (const MouseCursor::StandardCursorType type)\r
index 84df167a2bca693589f031da5c3201c8c279a849..53ae2a67f3dee58b86f5df49b0b427734235d235 100644 (file)
@@ -354,7 +354,8 @@ public:
                                  isSelected ? ACTION_CLEAR_SELECTION : ACTION_SELECT);\r
         }\r
 \r
-        if (accessibilityHandler.getActions().contains (AccessibilityActionType::press))\r
+        if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().contains (AccessibilityActionType::toggle))\r
+            || accessibilityHandler.getActions().contains (AccessibilityActionType::press))\r
         {\r
             env->CallVoidMethod (info,\r
                                  AndroidAccessibilityNodeInfo.setClickable,\r
@@ -480,7 +481,8 @@ public:
 \r
             case ACTION_CLICK:\r
             {\r
-                if (accessibilityHandler.getActions().invoke (AccessibilityActionType::press))\r
+                if ((accessibilityHandler.getCurrentState().isCheckable() && accessibilityHandler.getActions().invoke (AccessibilityActionType::toggle))\r
+                    || accessibilityHandler.getActions().invoke (AccessibilityActionType::press))\r
                 {\r
                     sendAccessibilityEventImpl (accessibilityHandler, TYPE_VIEW_CLICKED, 0);\r
                     return true;\r
index 770bb78ecbceb210a9a29daa69e87cff5232fbec..eacd2753c5ccd04c4256a77785780a43b3b4fed9 100644 (file)
@@ -399,11 +399,11 @@ private:
         {\r
             if (auto* handler = getHandler (self))\r
             {\r
-                // occasionaly VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
+                // Occasionally VoiceOver sends accessibilityActivate to the wrong element, so we first query\r
                 // which element it thinks has focus and forward the event on to that element if it differs\r
                 id focusedElement = UIAccessibilityFocusedElement (UIAccessibilityNotificationVoiceOverIdentifier);\r
 \r
-                if (! [(id) handler->getNativeImplementation() isEqual: focusedElement])\r
+                if (focusedElement != nullptr && ! [(id) handler->getNativeImplementation() isEqual: focusedElement])\r
                     return [focusedElement accessibilityActivate];\r
 \r
                 if (handler->hasFocus (false))\r
index d2c226bfac28917c1ffbfc2f34000fbeea134df8..6e3bfafda9b1084d1a633655e6c6551dcff24ffe 100644 (file)
@@ -797,7 +797,8 @@ private:
                         continue;\r
 \r
                     if (selector == @selector (accessibilityPerformPress))\r
-                        return handler->getActions().contains (AccessibilityActionType::press);\r
+                        return (handler->getCurrentState().isCheckable() && handler->getActions().contains (AccessibilityActionType::toggle))\r
+                                || handler->getActions().contains (AccessibilityActionType::press);\r
 \r
                     if (selector == @selector (accessibilityPerformShowMenu))\r
                         return handler->getActions().contains (AccessibilityActionType::showMenu);\r
index ff08d2f962ba35e9e7617f5292ba24bbbcfbf35d..b188848fde730a2daaa482522e3d1fa86ac4cdfd 100644 (file)
@@ -126,6 +126,10 @@ protected:
 \r
     static BOOL accessibilityPerformPress (id self, SEL)\r
     {\r
+        if (auto* handler = getHandler (self))\r
+            if (handler->getCurrentState().isCheckable() && handler->getActions().invoke (AccessibilityActionType::toggle))\r
+                return YES;\r
+\r
         return performActionIfSupported (self, AccessibilityActionType::press);\r
     }\r
 \r
index 406eb2cdc009ad53641f584faf91be52031d2ade..a116d1aa2e6a0c710d3d3a437014b45e519def41 100644 (file)
@@ -159,7 +159,7 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, Inte
         || eventType == InternalAccessibilityEvent::elementDestroyed)\r
     {\r
         if (auto* parent = handler.getParent())\r
-            sendAccessibilityAutomationEvent (*parent, UIA_LayoutInvalidatedEventId);\r
+            sendAccessibilityAutomationEvent (*parent, ComTypes::UIA_LayoutInvalidatedEventId);\r
 \r
         return;\r
     }\r
@@ -176,9 +176,9 @@ void notifyAccessibilityEventInternal (const AccessibilityHandler& handler, Inte
     {\r
         switch (eventType)\r
         {\r
-            case InternalAccessibilityEvent::focusChanged:           return UIA_AutomationFocusChangedEventId;\r
-            case InternalAccessibilityEvent::windowOpened:           return UIA_Window_WindowOpenedEventId;\r
-            case InternalAccessibilityEvent::windowClosed:           return UIA_Window_WindowClosedEventId;\r
+            case InternalAccessibilityEvent::focusChanged:           return ComTypes::UIA_AutomationFocusChangedEventId;\r
+            case InternalAccessibilityEvent::windowOpened:           return ComTypes::UIA_Window_WindowOpenedEventId;\r
+            case InternalAccessibilityEvent::windowClosed:           return ComTypes::UIA_Window_WindowClosedEventId;\r
             case InternalAccessibilityEvent::elementCreated:\r
             case InternalAccessibilityEvent::elementDestroyed:\r
             case InternalAccessibilityEvent::elementMovedOrResized:  break;\r
@@ -219,10 +219,10 @@ void AccessibilityHandler::notifyAccessibilityEvent (AccessibilityEvent eventTyp
     {\r
         switch (eventType)\r
         {\r
-            case AccessibilityEvent::textSelectionChanged:  return UIA_Text_TextSelectionChangedEventId;\r
-            case AccessibilityEvent::textChanged:           return UIA_Text_TextChangedEventId;\r
-            case AccessibilityEvent::structureChanged:      return UIA_StructureChangedEventId;\r
-            case AccessibilityEvent::rowSelectionChanged:   return UIA_SelectionItem_ElementSelectedEventId;\r
+            case AccessibilityEvent::textSelectionChanged:  return ComTypes::UIA_Text_TextSelectionChangedEventId;\r
+            case AccessibilityEvent::textChanged:           return ComTypes::UIA_Text_TextChangedEventId;\r
+            case AccessibilityEvent::structureChanged:      return ComTypes::UIA_StructureChangedEventId;\r
+            case AccessibilityEvent::rowSelectionChanged:   return ComTypes::UIA_SelectionItem_ElementSelectedEventId;\r
             case AccessibilityEvent::titleChanged:\r
             case AccessibilityEvent::valueChanged:          break;\r
         }\r
@@ -238,7 +238,7 @@ struct SpVoiceWrapper  : public DeletedAtShutdown
 {\r
     SpVoiceWrapper()\r
     {\r
-        auto hr = voice.CoCreateInstance (CLSID_SpVoice);\r
+        auto hr = voice.CoCreateInstance (ComTypes::CLSID_SpVoice);\r
 \r
         jassertquiet (SUCCEEDED (hr));\r
     }\r
index 1de454272fec84838196b99cc0addf4dfba46e1c..816f998fa8b8c21803554451a022bc3ce70a7453 100644 (file)
@@ -57,41 +57,41 @@ static auto roleToControlTypeId (AccessibilityRole roleType)
         case AccessibilityRole::popupMenu:\r
         case AccessibilityRole::dialogWindow:\r
         case AccessibilityRole::splashScreen:\r
-        case AccessibilityRole::window:        return UIA_WindowControlTypeId;\r
+        case AccessibilityRole::window:        return ComTypes::UIA_WindowControlTypeId;\r
 \r
         case AccessibilityRole::label:\r
-        case AccessibilityRole::staticText:    return UIA_TextControlTypeId;\r
+        case AccessibilityRole::staticText:    return ComTypes::UIA_TextControlTypeId;\r
 \r
         case AccessibilityRole::column:\r
-        case AccessibilityRole::row:           return UIA_HeaderItemControlTypeId;\r
-\r
-        case AccessibilityRole::button:        return UIA_ButtonControlTypeId;\r
-        case AccessibilityRole::toggleButton:  return UIA_CheckBoxControlTypeId;\r
-        case AccessibilityRole::radioButton:   return UIA_RadioButtonControlTypeId;\r
-        case AccessibilityRole::comboBox:      return UIA_ComboBoxControlTypeId;\r
-        case AccessibilityRole::image:         return UIA_ImageControlTypeId;\r
-        case AccessibilityRole::slider:        return UIA_SliderControlTypeId;\r
-        case AccessibilityRole::editableText:  return UIA_EditControlTypeId;\r
-        case AccessibilityRole::menuItem:      return UIA_MenuItemControlTypeId;\r
-        case AccessibilityRole::menuBar:       return UIA_MenuBarControlTypeId;\r
-        case AccessibilityRole::table:         return UIA_TableControlTypeId;\r
-        case AccessibilityRole::tableHeader:   return UIA_HeaderControlTypeId;\r
-        case AccessibilityRole::cell:          return UIA_DataItemControlTypeId;\r
-        case AccessibilityRole::hyperlink:     return UIA_HyperlinkControlTypeId;\r
-        case AccessibilityRole::list:          return UIA_ListControlTypeId;\r
-        case AccessibilityRole::listItem:      return UIA_ListItemControlTypeId;\r
-        case AccessibilityRole::tree:          return UIA_TreeControlTypeId;\r
-        case AccessibilityRole::treeItem:      return UIA_TreeItemControlTypeId;\r
-        case AccessibilityRole::progressBar:   return UIA_ProgressBarControlTypeId;\r
-        case AccessibilityRole::group:         return UIA_GroupControlTypeId;\r
-        case AccessibilityRole::scrollBar:     return UIA_ScrollBarControlTypeId;\r
-        case AccessibilityRole::tooltip:       return UIA_ToolTipControlTypeId;\r
+        case AccessibilityRole::row:           return ComTypes::UIA_HeaderItemControlTypeId;\r
+\r
+        case AccessibilityRole::button:        return ComTypes::UIA_ButtonControlTypeId;\r
+        case AccessibilityRole::toggleButton:  return ComTypes::UIA_CheckBoxControlTypeId;\r
+        case AccessibilityRole::radioButton:   return ComTypes::UIA_RadioButtonControlTypeId;\r
+        case AccessibilityRole::comboBox:      return ComTypes::UIA_ComboBoxControlTypeId;\r
+        case AccessibilityRole::image:         return ComTypes::UIA_ImageControlTypeId;\r
+        case AccessibilityRole::slider:        return ComTypes::UIA_SliderControlTypeId;\r
+        case AccessibilityRole::editableText:  return ComTypes::UIA_EditControlTypeId;\r
+        case AccessibilityRole::menuItem:      return ComTypes::UIA_MenuItemControlTypeId;\r
+        case AccessibilityRole::menuBar:       return ComTypes::UIA_MenuBarControlTypeId;\r
+        case AccessibilityRole::table:         return ComTypes::UIA_TableControlTypeId;\r
+        case AccessibilityRole::tableHeader:   return ComTypes::UIA_HeaderControlTypeId;\r
+        case AccessibilityRole::cell:          return ComTypes::UIA_DataItemControlTypeId;\r
+        case AccessibilityRole::hyperlink:     return ComTypes::UIA_HyperlinkControlTypeId;\r
+        case AccessibilityRole::list:          return ComTypes::UIA_ListControlTypeId;\r
+        case AccessibilityRole::listItem:      return ComTypes::UIA_ListItemControlTypeId;\r
+        case AccessibilityRole::tree:          return ComTypes::UIA_TreeControlTypeId;\r
+        case AccessibilityRole::treeItem:      return ComTypes::UIA_TreeItemControlTypeId;\r
+        case AccessibilityRole::progressBar:   return ComTypes::UIA_ProgressBarControlTypeId;\r
+        case AccessibilityRole::group:         return ComTypes::UIA_GroupControlTypeId;\r
+        case AccessibilityRole::scrollBar:     return ComTypes::UIA_ScrollBarControlTypeId;\r
+        case AccessibilityRole::tooltip:       return ComTypes::UIA_ToolTipControlTypeId;\r
 \r
         case AccessibilityRole::ignored:\r
         case AccessibilityRole::unspecified:   break;\r
     };\r
 \r
-    return UIA_CustomControlTypeId;\r
+    return ComTypes::UIA_CustomControlTypeId;\r
 }\r
 \r
 //==============================================================================\r
@@ -109,7 +109,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::QueryInterface (REFIID refId, void** r
     if (! isElementValid())\r
         return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
 \r
-    if ((refId == __uuidof (IRawElementProviderFragmentRoot) && ! isFragmentRoot()))\r
+    if ((refId == __uuidof (ComTypes::IRawElementProviderFragmentRoot) && ! isFragmentRoot()))\r
         return E_NOINTERFACE;\r
 \r
     return ComBaseClassHelper::QueryInterface (refId, result);\r
@@ -133,7 +133,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::get_ProviderOptions (ProviderOptions*
     if (options == nullptr)\r
         return E_INVALIDARG;\r
 \r
-    *options = ProviderOptions_ServerSideProvider | ProviderOptions_UseComThreading;\r
+    *options = (ProviderOptions) (ProviderOptions_ServerSideProvider | ProviderOptions_UseComThreading);\r
     return S_OK;\r
 }\r
 \r
@@ -148,36 +148,36 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn
 \r
             switch (pId)\r
             {\r
-                case UIA_WindowPatternId:\r
+                case ComTypes::UIA_WindowPatternId:\r
                 {\r
                     if (fragmentRoot)\r
                         return new UIAWindowProvider (this);\r
 \r
                     break;\r
                 }\r
-                case UIA_TransformPatternId:\r
+                case ComTypes::UIA_TransformPatternId:\r
                 {\r
                     if (fragmentRoot)\r
                         return new UIATransformProvider (this);\r
 \r
                     break;\r
                 }\r
-                case UIA_TextPatternId:\r
-                case UIA_TextPattern2Id:\r
+                case ComTypes::UIA_TextPatternId:\r
+                case ComTypes::UIA_TextPattern2Id:\r
                 {\r
                     if (accessibilityHandler.getTextInterface() != nullptr)\r
                         return new UIATextProvider (this);\r
 \r
                     break;\r
                 }\r
-                case UIA_ValuePatternId:\r
+                case ComTypes::UIA_ValuePatternId:\r
                 {\r
                     if (accessibilityHandler.getValueInterface() != nullptr)\r
                         return new UIAValueProvider (this);\r
 \r
                     break;\r
                 }\r
-                case UIA_RangeValuePatternId:\r
+                case ComTypes::UIA_RangeValuePatternId:\r
                 {\r
                     if (accessibilityHandler.getValueInterface() != nullptr\r
                         && accessibilityHandler.getValueInterface()->getRange().isValid())\r
@@ -187,17 +187,18 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn
 \r
                     break;\r
                 }\r
-                case UIA_TogglePatternId:\r
+                case ComTypes::UIA_TogglePatternId:\r
                 {\r
-                    if (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle)\r
-                        && accessibilityHandler.getCurrentState().isCheckable())\r
+                    if (accessibilityHandler.getCurrentState().isCheckable()\r
+                        && (accessibilityHandler.getActions().contains (AccessibilityActionType::toggle)\r
+                            || accessibilityHandler.getActions().contains (AccessibilityActionType::press)))\r
                     {\r
                         return new UIAToggleProvider (this);\r
                     }\r
 \r
                     break;\r
                 }\r
-                case UIA_SelectionPatternId:\r
+                case ComTypes::UIA_SelectionPatternId:\r
                 {\r
                     if (role == AccessibilityRole::list\r
                         || role == AccessibilityRole::popupMenu\r
@@ -208,7 +209,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn
 \r
                     break;\r
                 }\r
-                case UIA_SelectionItemPatternId:\r
+                case ComTypes::UIA_SelectionItemPatternId:\r
                 {\r
                     auto state = accessibilityHandler.getCurrentState();\r
 \r
@@ -220,28 +221,28 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPatternProvider (PATTERNID pId, IUn
 \r
                     break;\r
                 }\r
-                case UIA_GridPatternId:\r
+                case ComTypes::UIA_GridPatternId:\r
                 {\r
                     if (accessibilityHandler.getTableInterface() != nullptr)\r
                         return new UIAGridProvider (this);\r
 \r
                     break;\r
                 }\r
-                case UIA_GridItemPatternId:\r
+                case ComTypes::UIA_GridItemPatternId:\r
                 {\r
                     if (accessibilityHandler.getCellInterface() != nullptr)\r
                         return new UIAGridItemProvider (this);\r
 \r
                     break;\r
                 }\r
-                case UIA_InvokePatternId:\r
+                case ComTypes::UIA_InvokePatternId:\r
                 {\r
                     if (accessibilityHandler.getActions().contains (AccessibilityActionType::press))\r
                         return new UIAInvokeProvider (this);\r
 \r
                     break;\r
                 }\r
-                case UIA_ExpandCollapsePatternId:\r
+                case ComTypes::UIA_ExpandCollapsePatternId:\r
                 {\r
                     if (accessibilityHandler.getActions().contains (AccessibilityActionType::showMenu)\r
                         && accessibilityHandler.getCurrentState().isExpandable())\r
@@ -312,7 +313,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPropertyValue (PROPERTYID propertyI
                     VariantHelpers::setBool (textInterface->isDisplayingProtectedText(), pRetVal);\r
 \r
                 break;\r
-            case UIA_IsPeripheralPropertyId:\r
+            case ComTypes::UIA_IsPeripheralPropertyId:\r
                 VariantHelpers::setBool (role == AccessibilityRole::tooltip\r
                                          || role == AccessibilityRole::popupMenu\r
                                          || role == AccessibilityRole::splashScreen,\r
@@ -338,27 +339,27 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetPropertyValue (PROPERTYID propertyI
 }\r
 \r
 //==============================================================================\r
-JUCE_COMRESULT AccessibilityNativeHandle::Navigate (NavigateDirection direction, IRawElementProviderFragment** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::Navigate (ComTypes::NavigateDirection direction, ComTypes::IRawElementProviderFragment** pRetVal)\r
 {\r
     return withCheckedComArgs (pRetVal, *this, [&]\r
     {\r
         auto* handler = [&]() -> AccessibilityHandler*\r
         {\r
-            if (direction == NavigateDirection_Parent)\r
+            if (direction == ComTypes::NavigateDirection_Parent)\r
                 return accessibilityHandler.getParent();\r
 \r
-            if (direction == NavigateDirection_FirstChild\r
-                || direction == NavigateDirection_LastChild)\r
+            if (direction == ComTypes::NavigateDirection_FirstChild\r
+                || direction == ComTypes::NavigateDirection_LastChild)\r
             {\r
                 auto children = accessibilityHandler.getChildren();\r
 \r
                 return children.empty() ? nullptr\r
-                                        : (direction == NavigateDirection_FirstChild ? children.front()\r
-                                                                                     : children.back());\r
+                                        : (direction == ComTypes::NavigateDirection_FirstChild ? children.front()\r
+                                                                                               : children.back());\r
             }\r
 \r
-            if (direction == NavigateDirection_NextSibling\r
-                || direction == NavigateDirection_PreviousSibling)\r
+            if (direction == ComTypes::NavigateDirection_NextSibling\r
+                || direction == ComTypes::NavigateDirection_PreviousSibling)\r
             {\r
                 if (auto* parent = accessibilityHandler.getParent())\r
                 {\r
@@ -368,10 +369,10 @@ JUCE_COMRESULT AccessibilityNativeHandle::Navigate (NavigateDirection direction,
                     if (iter == siblings.end())\r
                         return nullptr;\r
 \r
-                    if (direction == NavigateDirection_NextSibling && iter != std::prev (siblings.cend()))\r
+                    if (direction == ComTypes::NavigateDirection_NextSibling && iter != std::prev (siblings.cend()))\r
                         return *std::next (iter);\r
 \r
-                    if (direction == NavigateDirection_PreviousSibling && iter != siblings.cbegin())\r
+                    if (direction == ComTypes::NavigateDirection_PreviousSibling && iter != siblings.cbegin())\r
                         return *std::prev (iter);\r
                 }\r
             }\r
@@ -412,7 +413,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::GetRuntimeId (SAFEARRAY** pRetVal)
     });\r
 }\r
 \r
-JUCE_COMRESULT AccessibilityNativeHandle::get_BoundingRectangle (UiaRect* pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::get_BoundingRectangle (ComTypes::UiaRect* pRetVal)\r
 {\r
     return withCheckedComArgs (pRetVal, *this, [&]\r
     {\r
@@ -451,7 +452,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::SetFocus()
     return S_OK;\r
 }\r
 \r
-JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (IRawElementProviderFragmentRoot** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (ComTypes::IRawElementProviderFragmentRoot** pRetVal)\r
 {\r
     return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
     {\r
@@ -477,7 +478,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::get_FragmentRoot (IRawElementProviderF
 }\r
 \r
 //==============================================================================\r
-JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, double y, IRawElementProviderFragment** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, double y, ComTypes::IRawElementProviderFragment** pRetVal)\r
 {\r
     return withCheckedComArgs (pRetVal, *this, [&]\r
     {\r
@@ -499,7 +500,7 @@ JUCE_COMRESULT AccessibilityNativeHandle::ElementProviderFromPoint (double x, do
     });\r
 }\r
 \r
-JUCE_COMRESULT AccessibilityNativeHandle::GetFocus (IRawElementProviderFragment** pRetVal)\r
+JUCE_COMRESULT AccessibilityNativeHandle::GetFocus (ComTypes::IRawElementProviderFragment** pRetVal)\r
 {\r
     return withCheckedComArgs (pRetVal, *this, [&]\r
     {\r
index ffd4ccff642f6e1f4f1aed4cbded26ad40e3a250..83d8587635b7027b1ef8c84031cdd5faef3ee9b9 100644 (file)
@@ -30,8 +30,8 @@ namespace juce
 #define UIA_IsDialogPropertyId        30174\r
 \r
 class AccessibilityNativeHandle  : public ComBaseClassHelper<IRawElementProviderSimple,\r
-                                                             IRawElementProviderFragment,\r
-                                                             IRawElementProviderFragmentRoot>\r
+                                                             ComTypes::IRawElementProviderFragment,\r
+                                                             ComTypes::IRawElementProviderFragmentRoot>\r
 {\r
 public:\r
     explicit AccessibilityNativeHandle (AccessibilityHandler& handler);\r
@@ -51,15 +51,15 @@ public:
     JUCE_COMRESULT GetPatternProvider (PATTERNID pId, IUnknown** provider) override;\r
     JUCE_COMRESULT GetPropertyValue (PROPERTYID propertyId, VARIANT* pRetVal) override;\r
 \r
-    JUCE_COMRESULT Navigate (NavigateDirection direction, IRawElementProviderFragment** pRetVal) override;\r
+    JUCE_COMRESULT Navigate (ComTypes::NavigateDirection direction, ComTypes::IRawElementProviderFragment** pRetVal) override;\r
     JUCE_COMRESULT GetRuntimeId (SAFEARRAY** pRetVal) override;\r
-    JUCE_COMRESULT get_BoundingRectangle (UiaRect* pRetVal) override;\r
+    JUCE_COMRESULT get_BoundingRectangle (ComTypes::UiaRect* pRetVal) override;\r
     JUCE_COMRESULT GetEmbeddedFragmentRoots (SAFEARRAY** pRetVal) override;\r
     JUCE_COMRESULT SetFocus() override;\r
-    JUCE_COMRESULT get_FragmentRoot (IRawElementProviderFragmentRoot** pRetVal) override;\r
+    JUCE_COMRESULT get_FragmentRoot (ComTypes::IRawElementProviderFragmentRoot** pRetVal) override;\r
 \r
-    JUCE_COMRESULT ElementProviderFromPoint (double x, double y, IRawElementProviderFragment** pRetVal) override;\r
-    JUCE_COMRESULT GetFocus (IRawElementProviderFragment** pRetVal) override;\r
+    JUCE_COMRESULT ElementProviderFromPoint (double x, double y, ComTypes::IRawElementProviderFragment** pRetVal) override;\r
+    JUCE_COMRESULT GetFocus (ComTypes::IRawElementProviderFragment** pRetVal) override;\r
 \r
 private:\r
     //==============================================================================\r
diff --git a/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h b/modules/juce_gui_basics/native/accessibility/juce_win32_ComInterfaces.h
new file mode 100644 (file)
index 0000000..6af77ae
--- /dev/null
@@ -0,0 +1,371 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+namespace ComTypes\r
+{\r
+\r
+/*\r
+    These interfaces would normally be included in the system platform headers.\r
+    However, those headers are likely to be incomplete when building with\r
+    MinGW. In order to allow building accessible applications under MinGW,\r
+    we reproduce all necessary definitions here.\r
+*/\r
+\r
+struct UiaPoint\r
+{\r
+    double x;\r
+    double y;\r
+};\r
+\r
+struct UiaRect\r
+{\r
+    double left;\r
+    double top;\r
+    double width;\r
+    double height;\r
+};\r
+\r
+enum NavigateDirection\r
+{\r
+    NavigateDirection_Parent = 0,\r
+    NavigateDirection_NextSibling = 1,\r
+    NavigateDirection_PreviousSibling = 2,\r
+    NavigateDirection_FirstChild = 3,\r
+    NavigateDirection_LastChild = 4\r
+};\r
+\r
+enum ExpandCollapseState\r
+{\r
+    ExpandCollapseState_Collapsed = 0,\r
+    ExpandCollapseState_Expanded = 1,\r
+    ExpandCollapseState_PartiallyExpanded = 2,\r
+    ExpandCollapseState_LeafNode = 3\r
+};\r
+\r
+enum TextPatternRangeEndpoint\r
+{\r
+    TextPatternRangeEndpoint_Start = 0,\r
+    TextPatternRangeEndpoint_End = 1\r
+};\r
+\r
+enum TextUnit\r
+{\r
+    TextUnit_Character = 0,\r
+    TextUnit_Format = 1,\r
+    TextUnit_Word = 2,\r
+    TextUnit_Line = 3,\r
+    TextUnit_Paragraph = 4,\r
+    TextUnit_Page = 5,\r
+    TextUnit_Document = 6\r
+};\r
+\r
+enum SupportedTextSelection\r
+{\r
+    SupportedTextSelection_None = 0,\r
+    SupportedTextSelection_Single = 1,\r
+    SupportedTextSelection_Multiple = 2\r
+};\r
+\r
+enum CaretPosition\r
+{\r
+    CaretPosition_Unknown = 0,\r
+    CaretPosition_EndOfLine = 1,\r
+    CaretPosition_BeginningOfLine = 2\r
+};\r
+\r
+enum ToggleState\r
+{\r
+    ToggleState_Off = 0,\r
+    ToggleState_On = 1,\r
+    ToggleState_Indeterminate = 2\r
+};\r
+\r
+enum WindowVisualState\r
+{\r
+    WindowVisualState_Normal = 0,\r
+    WindowVisualState_Maximized = 1,\r
+    WindowVisualState_Minimized = 2\r
+};\r
+\r
+enum WindowInteractionState\r
+{\r
+    WindowInteractionState_Running = 0,\r
+    WindowInteractionState_Closing = 1,\r
+    WindowInteractionState_ReadyForUserInteraction = 2,\r
+    WindowInteractionState_BlockedByModalWindow = 3,\r
+    WindowInteractionState_NotResponding = 4\r
+};\r
+\r
+const long UIA_InvokePatternId = 10000;\r
+const long UIA_SelectionPatternId = 10001;\r
+const long UIA_ValuePatternId = 10002;\r
+const long UIA_RangeValuePatternId = 10003;\r
+const long UIA_ExpandCollapsePatternId = 10005;\r
+const long UIA_GridPatternId = 10006;\r
+const long UIA_GridItemPatternId = 10007;\r
+const long UIA_WindowPatternId = 10009;\r
+const long UIA_SelectionItemPatternId = 10010;\r
+const long UIA_TextPatternId = 10014;\r
+const long UIA_TogglePatternId = 10015;\r
+const long UIA_TransformPatternId = 10016;\r
+const long UIA_TextPattern2Id = 10024;\r
+const long UIA_StructureChangedEventId = 20002;\r
+const long UIA_MenuOpenedEventId = 20003;\r
+const long UIA_AutomationFocusChangedEventId = 20005;\r
+const long UIA_MenuClosedEventId = 20007;\r
+const long UIA_LayoutInvalidatedEventId = 20008;\r
+const long UIA_Invoke_InvokedEventId = 20009;\r
+const long UIA_SelectionItem_ElementSelectedEventId = 20012;\r
+const long UIA_Text_TextSelectionChangedEventId = 20014;\r
+const long UIA_Text_TextChangedEventId = 20015;\r
+const long UIA_Window_WindowOpenedEventId = 20016;\r
+const long UIA_Window_WindowClosedEventId = 20017;\r
+const long UIA_IsPeripheralPropertyId = 30150;\r
+const long UIA_IsReadOnlyAttributeId = 40015;\r
+const long UIA_CaretPositionAttributeId = 40038;\r
+const long UIA_ButtonControlTypeId = 50000;\r
+const long UIA_CheckBoxControlTypeId = 50002;\r
+const long UIA_ComboBoxControlTypeId = 50003;\r
+const long UIA_EditControlTypeId = 50004;\r
+const long UIA_HyperlinkControlTypeId = 50005;\r
+const long UIA_ImageControlTypeId = 50006;\r
+const long UIA_ListItemControlTypeId = 50007;\r
+const long UIA_ListControlTypeId = 50008;\r
+const long UIA_MenuBarControlTypeId = 50010;\r
+const long UIA_MenuItemControlTypeId = 50011;\r
+const long UIA_ProgressBarControlTypeId = 50012;\r
+const long UIA_RadioButtonControlTypeId = 50013;\r
+const long UIA_ScrollBarControlTypeId = 50014;\r
+const long UIA_SliderControlTypeId = 50015;\r
+const long UIA_TextControlTypeId = 50020;\r
+const long UIA_ToolTipControlTypeId = 50022;\r
+const long UIA_TreeControlTypeId = 50023;\r
+const long UIA_TreeItemControlTypeId = 50024;\r
+const long UIA_CustomControlTypeId = 50025;\r
+const long UIA_GroupControlTypeId = 50026;\r
+const long UIA_DataItemControlTypeId = 50029;\r
+const long UIA_WindowControlTypeId = 50032;\r
+const long UIA_HeaderControlTypeId = 50034;\r
+const long UIA_HeaderItemControlTypeId = 50035;\r
+const long UIA_TableControlTypeId = 50036;\r
+\r
+interface IRawElementProviderFragmentRoot;\r
+interface IRawElementProviderFragment;\r
+\r
+JUCE_COMCLASS (IRawElementProviderFragmentRoot, "620ce2a5-ab8f-40a9-86cb-de3c75599b58") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL ElementProviderFromPoint (double x, double y, __RPC__deref_out_opt IRawElementProviderFragment** pRetVal) = 0;\r
+    JUCE_COMCALL GetFocus (__RPC__deref_out_opt IRawElementProviderFragment * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IRawElementProviderFragment, "f7063da8-8359-439c-9297-bbc5299a7d87") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Navigate (NavigateDirection direction, __RPC__deref_out_opt IRawElementProviderFragment** pRetVal) = 0;\r
+    JUCE_COMCALL GetRuntimeId (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+    JUCE_COMCALL get_BoundingRectangle (__RPC__out UiaRect * pRetVal) = 0;\r
+    JUCE_COMCALL GetEmbeddedFragmentRoots (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+    JUCE_COMCALL SetFocus() = 0;\r
+    JUCE_COMCALL get_FragmentRoot (__RPC__deref_out_opt IRawElementProviderFragmentRoot * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IExpandCollapseProvider, "d847d3a5-cab0-4a98-8c32-ecb45c59ad24") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Expand() = 0;\r
+    JUCE_COMCALL Collapse() = 0;\r
+    JUCE_COMCALL get_ExpandCollapseState (__RPC__out ExpandCollapseState * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IGridItemProvider, "d02541f1-fb81-4d64-ae32-f520f8a6dbd1") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL get_Row (__RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL get_Column (__RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL get_RowSpan (__RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL get_ColumnSpan (__RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL get_ContainingGrid (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IGridProvider, "b17d6187-0907-464b-a168-0ef17a1572b1") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetItem (int row, int column, __RPC__deref_out_opt IRawElementProviderSimple** pRetVal) = 0;\r
+    JUCE_COMCALL get_RowCount (__RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL get_ColumnCount (__RPC__out int* pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IInvokeProvider, "54fcb24b-e18e-47a2-b4d3-eccbe77599a2") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Invoke() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IRangeValueProvider, "36dc7aef-33e6-4691-afe1-2be7274b3d33") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL SetValue (double val) = 0;\r
+    JUCE_COMCALL get_Value (__RPC__out double* pRetVal) = 0;\r
+    JUCE_COMCALL get_IsReadOnly (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_Maximum (__RPC__out double* pRetVal) = 0;\r
+    JUCE_COMCALL get_Minimum (__RPC__out double* pRetVal) = 0;\r
+    JUCE_COMCALL get_LargeChange (__RPC__out double* pRetVal) = 0;\r
+    JUCE_COMCALL get_SmallChange (__RPC__out double* pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISelectionProvider, "fb8b03af-3bdf-48d4-bd36-1a65793be168") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetSelection (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+    JUCE_COMCALL get_CanSelectMultiple (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_IsSelectionRequired (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISelectionProvider2, "14f68475-ee1c-44f6-a869-d239381f0fe7") : public ISelectionProvider\r
+{\r
+    JUCE_COMCALL get_FirstSelectedItem (IRawElementProviderSimple * *retVal) = 0;\r
+    JUCE_COMCALL get_LastSelectedItem (IRawElementProviderSimple * *retVal) = 0;\r
+    JUCE_COMCALL get_CurrentSelectedItem (IRawElementProviderSimple * *retVal) = 0;\r
+    JUCE_COMCALL get_ItemCount (int* retVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISelectionItemProvider, "2acad808-b2d4-452d-a407-91ff1ad167b2") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Select() = 0;\r
+    JUCE_COMCALL AddToSelection() = 0;\r
+    JUCE_COMCALL RemoveFromSelection() = 0;\r
+    JUCE_COMCALL get_IsSelected (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_SelectionContainer (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITextRangeProvider, "5347ad7b-c355-46f8-aff5-909033582f63") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Clone (__RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+    JUCE_COMCALL Compare (__RPC__in_opt ITextRangeProvider * range, __RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL CompareEndpoints (TextPatternRangeEndpoint endpoint, __RPC__in_opt ITextRangeProvider * targetRange, TextPatternRangeEndpoint targetEndpoint, __RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL ExpandToEnclosingUnit (TextUnit unit) = 0;\r
+    JUCE_COMCALL FindAttribute (TEXTATTRIBUTEID attributeId, VARIANT val, BOOL backward, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+    JUCE_COMCALL FindText (__RPC__in BSTR text, BOOL backward, BOOL ignoreCase, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+    JUCE_COMCALL GetAttributeValue (TEXTATTRIBUTEID attributeId, __RPC__out VARIANT * pRetVal) = 0;\r
+    JUCE_COMCALL GetBoundingRectangles (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+    JUCE_COMCALL GetEnclosingElement (__RPC__deref_out_opt IRawElementProviderSimple * *pRetVal) = 0;\r
+    JUCE_COMCALL GetText (int maxLength, __RPC__deref_out_opt BSTR* pRetVal) = 0;\r
+    JUCE_COMCALL Move (TextUnit unit, int count, __RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL MoveEndpointByUnit (TextPatternRangeEndpoint endpoint, TextUnit unit, int count, __RPC__out int* pRetVal) = 0;\r
+    JUCE_COMCALL MoveEndpointByRange (TextPatternRangeEndpoint endpoint, __RPC__in_opt ITextRangeProvider * targetRange, TextPatternRangeEndpoint targetEndpoint) = 0;\r
+    JUCE_COMCALL Select() = 0;\r
+    JUCE_COMCALL AddToSelection() = 0;\r
+    JUCE_COMCALL RemoveFromSelection() = 0;\r
+    JUCE_COMCALL ScrollIntoView (BOOL alignToTop) = 0;\r
+    JUCE_COMCALL GetChildren (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITextProvider, "3589c92c-63f3-4367-99bb-ada653b77cf2") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetSelection (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+    JUCE_COMCALL GetVisibleRanges (__RPC__deref_out_opt SAFEARRAY * *pRetVal) = 0;\r
+    JUCE_COMCALL RangeFromChild (__RPC__in_opt IRawElementProviderSimple * childElement, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+    JUCE_COMCALL RangeFromPoint (UiaPoint point, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+    JUCE_COMCALL get_DocumentRange (__RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+    JUCE_COMCALL get_SupportedTextSelection (__RPC__out SupportedTextSelection * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITextProvider2, "0dc5e6ed-3e16-4bf1-8f9a-a979878bc195") : public ITextProvider\r
+{\r
+public:\r
+    JUCE_COMCALL RangeFromAnnotation (__RPC__in_opt IRawElementProviderSimple * annotationElement, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+    JUCE_COMCALL GetCaretRange (__RPC__out BOOL * isActive, __RPC__deref_out_opt ITextRangeProvider * *pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IToggleProvider, "56d00bd0-c4f4-433c-a836-1a52a57e0892") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Toggle() = 0;\r
+    JUCE_COMCALL get_ToggleState (__RPC__out ToggleState * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ITransformProvider, "6829ddc4-4f91-4ffa-b86f-bd3e2987cb4c") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Move (double x, double y) = 0;\r
+    JUCE_COMCALL Resize (double width, double height) = 0;\r
+    JUCE_COMCALL Rotate (double degrees) = 0;\r
+    JUCE_COMCALL get_CanMove (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_CanResize (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_CanRotate (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IValueProvider, "c7935180-6fb3-4201-b174-7df73adbf64a") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL SetValue (__RPC__in LPCWSTR val) = 0;\r
+    JUCE_COMCALL get_Value (__RPC__deref_out_opt BSTR * pRetVal) = 0;\r
+    JUCE_COMCALL get_IsReadOnly (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IWindowProvider, "987df77b-db06-4d77-8f8a-86a9c3bb90b9") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL SetVisualState (WindowVisualState state) = 0;\r
+    JUCE_COMCALL Close() = 0;\r
+    JUCE_COMCALL WaitForInputIdle (int milliseconds, __RPC__out BOOL* pRetVal) = 0;\r
+    JUCE_COMCALL get_CanMaximize (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_CanMinimize (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_IsModal (__RPC__out BOOL * pRetVal) = 0;\r
+    JUCE_COMCALL get_WindowVisualState (__RPC__out WindowVisualState * pRetVal) = 0;\r
+    JUCE_COMCALL get_WindowInteractionState (__RPC__out WindowInteractionState * pRetVal) = 0;\r
+    JUCE_COMCALL get_IsTopmost (__RPC__out BOOL * pRetVal) = 0;\r
+};\r
+\r
+constexpr CLSID CLSID_SpVoice { 0x96749377, 0x3391, 0x11D2, { 0x9E, 0xE3, 0x00, 0xC0, 0x4F, 0x79, 0x73, 0x96 } };\r
+\r
+} // namespace ComTypes\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::ComTypes::IRawElementProviderFragmentRoot, 0x620ce2a5, 0xab8f, 0x40a9, 0x86, 0xcb, 0xde, 0x3c, 0x75, 0x59, 0x9b, 0x58)\r
+__CRT_UUID_DECL (juce::ComTypes::IRawElementProviderFragment,     0xf7063da8, 0x8359, 0x439c, 0x92, 0x97, 0xbb, 0xc5, 0x29, 0x9a, 0x7d, 0x87)\r
+__CRT_UUID_DECL (juce::ComTypes::IExpandCollapseProvider,         0xd847d3a5, 0xcab0, 0x4a98, 0x8c, 0x32, 0xec, 0xb4, 0x5c, 0x59, 0xad, 0x24)\r
+__CRT_UUID_DECL (juce::ComTypes::IGridItemProvider,               0xd02541f1, 0xfb81, 0x4d64, 0xae, 0x32, 0xf5, 0x20, 0xf8, 0xa6, 0xdb, 0xd1)\r
+__CRT_UUID_DECL (juce::ComTypes::IGridProvider,                   0xb17d6187, 0x0907, 0x464b, 0xa1, 0x68, 0x0e, 0xf1, 0x7a, 0x15, 0x72, 0xb1)\r
+__CRT_UUID_DECL (juce::ComTypes::IInvokeProvider,                 0x54fcb24b, 0xe18e, 0x47a2, 0xb4, 0xd3, 0xec, 0xcb, 0xe7, 0x75, 0x99, 0xa2)\r
+__CRT_UUID_DECL (juce::ComTypes::IRangeValueProvider,             0x36dc7aef, 0x33e6, 0x4691, 0xaf, 0xe1, 0x2b, 0xe7, 0x27, 0x4b, 0x3d, 0x33)\r
+__CRT_UUID_DECL (juce::ComTypes::ISelectionProvider,              0xfb8b03af, 0x3bdf, 0x48d4, 0xbd, 0x36, 0x1a, 0x65, 0x79, 0x3b, 0xe1, 0x68)\r
+__CRT_UUID_DECL (juce::ComTypes::ISelectionProvider2,             0x14f68475, 0xee1c, 0x44f6, 0xa8, 0x69, 0xd2, 0x39, 0x38, 0x1f, 0x0f, 0xe7)\r
+__CRT_UUID_DECL (juce::ComTypes::ISelectionItemProvider,          0x2acad808, 0xb2d4, 0x452d, 0xa4, 0x07, 0x91, 0xff, 0x1a, 0xd1, 0x67, 0xb2)\r
+__CRT_UUID_DECL (juce::ComTypes::ITextRangeProvider,              0x5347ad7b, 0xc355, 0x46f8, 0xaf, 0xf5, 0x90, 0x90, 0x33, 0x58, 0x2f, 0x63)\r
+__CRT_UUID_DECL (juce::ComTypes::ITextProvider,                   0x3589c92c, 0x63f3, 0x4367, 0x99, 0xbb, 0xad, 0xa6, 0x53, 0xb7, 0x7c, 0xf2)\r
+__CRT_UUID_DECL (juce::ComTypes::ITextProvider2,                  0x0dc5e6ed, 0x3e16, 0x4bf1, 0x8f, 0x9a, 0xa9, 0x79, 0x87, 0x8b, 0xc1, 0x95)\r
+__CRT_UUID_DECL (juce::ComTypes::IToggleProvider,                 0x56d00bd0, 0xc4f4, 0x433c, 0xa8, 0x36, 0x1a, 0x52, 0xa5, 0x7e, 0x08, 0x92)\r
+__CRT_UUID_DECL (juce::ComTypes::ITransformProvider,              0x6829ddc4, 0x4f91, 0x4ffa, 0xb8, 0x6f, 0xbd, 0x3e, 0x29, 0x87, 0xcb, 0x4c)\r
+__CRT_UUID_DECL (juce::ComTypes::IValueProvider,                  0xc7935180, 0x6fb3, 0x4201, 0xb1, 0x74, 0x7d, 0xf7, 0x3a, 0xdb, 0xf6, 0x4a)\r
+__CRT_UUID_DECL (juce::ComTypes::IWindowProvider,                 0x987df77b, 0xdb06, 0x4d77, 0x8f, 0x8a, 0x86, 0xa9, 0xc3, 0xbb, 0x90, 0xb9)\r
+#endif\r
index 4fc220e38ca4bcdc73b76f2de634d9190c699b1e..86613cc2940d74f3e4d4877658a69678d10315d0 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAExpandCollapseProvider  : public UIAProviderBase,\r
-                                   public ComBaseClassHelper<IExpandCollapseProvider>\r
+                                   public ComBaseClassHelper<ComTypes::IExpandCollapseProvider>\r
 {\r
 public:\r
-    explicit UIAExpandCollapseProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT Expand() override\r
@@ -47,13 +44,13 @@ public:
         return invokeShowMenu();\r
     }\r
 \r
-    JUCE_COMRESULT get_ExpandCollapseState (ExpandCollapseState* pRetVal) override\r
+    JUCE_COMRESULT get_ExpandCollapseState (ComTypes::ExpandCollapseState* pRetVal) override\r
     {\r
         return withCheckedComArgs (pRetVal, *this, [&]\r
         {\r
             *pRetVal = getHandler().getCurrentState().isExpanded()\r
-                           ? ExpandCollapseState_Expanded\r
-                           : ExpandCollapseState_Collapsed;\r
+                           ? ComTypes::ExpandCollapseState_Expanded\r
+                           : ComTypes::ExpandCollapseState_Collapsed;\r
 \r
             return S_OK;\r
         });\r
@@ -70,8 +67,8 @@ private:
         if (handler.getActions().invoke (AccessibilityActionType::showMenu))\r
         {\r
             sendAccessibilityAutomationEvent (handler, handler.getCurrentState().isExpanded()\r
-                                                           ? UIA_MenuOpenedEventId\r
-                                                           : UIA_MenuClosedEventId);\r
+                                                           ? ComTypes::UIA_MenuOpenedEventId\r
+                                                           : ComTypes::UIA_MenuClosedEventId);\r
 \r
             return S_OK;\r
         }\r
index ec7f6e2272a58ccf5740f80f1968f493736c0b42..c63f4d9e0c616bcdbf3fb20ec0f04714ae4c4447 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAGridItemProvider  : public UIAProviderBase,\r
-                             public ComBaseClassHelper<IGridItemProvider>\r
+                             public ComBaseClassHelper<ComTypes::IGridItemProvider>\r
 {\r
 public:\r
-    explicit UIAGridItemProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT get_Row (int* pRetVal) override\r
index 5b4670b0a2244b51f60859af1256039fc9988fd6..cc10e6f8c83f81622bd1290ae9a481e3007ad3d9 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAGridProvider  : public UIAProviderBase,\r
-                         public ComBaseClassHelper<IGridProvider>\r
+                         public ComBaseClassHelper<ComTypes::IGridProvider>\r
 {\r
 public:\r
-    explicit UIAGridProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT GetItem (int row, int column, IRawElementProviderSimple** pRetVal) override\r
index ea01f25f5531ac31c7fb5e3d4990b68bef922739..fcdf2a213df41b9463c500540dc672dfec94f8be 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAInvokeProvider  : public UIAProviderBase,\r
-                           public ComBaseClassHelper<IInvokeProvider>\r
+                           public ComBaseClassHelper<ComTypes::IInvokeProvider>\r
 {\r
 public:\r
-    explicit UIAInvokeProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT Invoke() override\r
@@ -47,7 +44,7 @@ public:
         if (handler.getActions().invoke (AccessibilityActionType::press))\r
         {\r
             if (isElementValid())\r
-                sendAccessibilityAutomationEvent (handler, UIA_Invoke_InvokedEventId);\r
+                sendAccessibilityAutomationEvent (handler, ComTypes::UIA_Invoke_InvokedEventId);\r
 \r
             return S_OK;\r
         }\r
index be9ed678580d0fa2f0d6e16386d19492853b4a69..4636048f637ffce7a32415eef8a3f40ee109b6d0 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIARangeValueProvider  : public UIAProviderBase,\r
-                               public ComBaseClassHelper<IRangeValueProvider>\r
+                               public ComBaseClassHelper<ComTypes::IRangeValueProvider>\r
 {\r
 public:\r
-    explicit UIARangeValueProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT SetValue (double val) override\r
index 0a0d6def1683390d21aefb36a8d7c9faec4b9f00..3cc1f86db5d031c710eee553f52102c52c3c2b47 100644 (file)
@@ -28,21 +28,13 @@ namespace juce
 \r
 JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
 \r
-JUCE_COMCLASS (ISelectionProvider2, "14f68475-ee1c-44f6-a869-d239381f0fe7")  : public ISelectionProvider\r
-{\r
-    JUCE_COMCALL get_FirstSelectedItem   (IRawElementProviderSimple** retVal) = 0;\r
-    JUCE_COMCALL get_LastSelectedItem    (IRawElementProviderSimple** retVal) = 0;\r
-    JUCE_COMCALL get_CurrentSelectedItem (IRawElementProviderSimple** retVal) = 0;\r
-    JUCE_COMCALL get_ItemCount (int* retVal) = 0;\r
-};\r
-\r
 //==============================================================================\r
 class UIASelectionItemProvider  : public UIAProviderBase,\r
-                                  public ComBaseClassHelper<ISelectionItemProvider>\r
+                                  public ComBaseClassHelper<ComTypes::ISelectionItemProvider>\r
 {\r
 public:\r
-    explicit UIASelectionItemProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle),\r
+    explicit UIASelectionItemProvider (AccessibilityNativeHandle* handle)\r
+        : UIAProviderBase (handle),\r
           isRadioButton (getHandler().getRole() == AccessibilityRole::radioButton)\r
     {\r
     }\r
@@ -58,7 +50,7 @@ public:
         if (isRadioButton)\r
         {\r
             handler.getActions().invoke (AccessibilityActionType::press);\r
-            sendAccessibilityAutomationEvent (handler, UIA_SelectionItem_ElementSelectedEventId);\r
+            sendAccessibilityAutomationEvent (handler, ComTypes::UIA_SelectionItem_ElementSelectedEventId);\r
 \r
             return S_OK;\r
         }\r
@@ -136,22 +128,19 @@ private:
 \r
 //==============================================================================\r
 class UIASelectionProvider  : public UIAProviderBase,\r
-                              public ComBaseClassHelper<ISelectionProvider2>\r
+                              public ComBaseClassHelper<ComTypes::ISelectionProvider2>\r
 {\r
 public:\r
-    explicit UIASelectionProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT QueryInterface (REFIID iid, void** result) override\r
     {\r
-        if (iid == _uuidof (IUnknown) || iid == _uuidof (ISelectionProvider))\r
-            return castToType<ISelectionProvider> (result);\r
+        if (iid == __uuidof (IUnknown) || iid == __uuidof (ComTypes::ISelectionProvider))\r
+            return castToType<ComTypes::ISelectionProvider> (result);\r
 \r
-        if (iid == _uuidof (ISelectionProvider2))\r
-            return castToType<ISelectionProvider2> (result);\r
+        if (iid == __uuidof (ComTypes::ISelectionProvider2))\r
+            return castToType<ComTypes::ISelectionProvider2> (result);\r
 \r
         *result = nullptr;\r
         return E_NOINTERFACE;\r
index 8b301401df13677d46985f70c619c43ed595250c..9111e3064b7513f3b3096c9c1bed57765eb0949f 100644 (file)
@@ -28,24 +28,21 @@ namespace juce
 \r
 //==============================================================================\r
 class UIATextProvider  : public UIAProviderBase,\r
-                         public ComBaseClassHelper<ITextProvider2>\r
+                         public ComBaseClassHelper<ComTypes::ITextProvider2>\r
 {\r
 public:\r
-    explicit UIATextProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT QueryInterface (REFIID iid, void** result) override\r
     {\r
         JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
 \r
-        if (iid == _uuidof (IUnknown) || iid == _uuidof (ITextProvider))\r
-            return castToType<ITextProvider> (result);\r
+        if (iid == __uuidof (IUnknown) || iid == __uuidof (ComTypes::ITextProvider))\r
+            return castToType<ComTypes::ITextProvider> (result);\r
 \r
-        if (iid == _uuidof (ITextProvider2))\r
-            return castToType<ITextProvider2> (result);\r
+        if (iid == __uuidof (ComTypes::ITextProvider2))\r
+            return castToType<ComTypes::ITextProvider2> (result);\r
 \r
         *result = nullptr;\r
         return E_NOINTERFACE;\r
@@ -54,7 +51,7 @@ public:
     }\r
 \r
     //=============================================================================\r
-    JUCE_COMRESULT get_DocumentRange (ITextRangeProvider** pRetVal) override\r
+    JUCE_COMRESULT get_DocumentRange (ComTypes::ITextRangeProvider** pRetVal) override\r
     {\r
         return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
         {\r
@@ -63,11 +60,11 @@ public:
         });\r
     }\r
 \r
-    JUCE_COMRESULT get_SupportedTextSelection (SupportedTextSelection* pRetVal) override\r
+    JUCE_COMRESULT get_SupportedTextSelection (ComTypes::SupportedTextSelection* pRetVal) override\r
     {\r
         return withCheckedComArgs (pRetVal, *this, [&]\r
         {\r
-            *pRetVal = SupportedTextSelection_Single;\r
+            *pRetVal = ComTypes::SupportedTextSelection_Single;\r
             return S_OK;\r
         });\r
     }\r
@@ -124,7 +121,7 @@ public:
         });\r
     }\r
 \r
-    JUCE_COMRESULT RangeFromChild (IRawElementProviderSimple*, ITextRangeProvider** pRetVal) override\r
+    JUCE_COMRESULT RangeFromChild (IRawElementProviderSimple*, ComTypes::ITextRangeProvider** pRetVal) override\r
     {\r
         return withCheckedComArgs (pRetVal, *this, []\r
         {\r
@@ -132,7 +129,7 @@ public:
         });\r
     }\r
 \r
-    JUCE_COMRESULT RangeFromPoint (UiaPoint point, ITextRangeProvider** pRetVal) override\r
+    JUCE_COMRESULT RangeFromPoint (ComTypes::UiaPoint point, ComTypes::ITextRangeProvider** pRetVal) override\r
     {\r
         return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
         {\r
@@ -146,7 +143,7 @@ public:
     }\r
 \r
     //==============================================================================\r
-    JUCE_COMRESULT GetCaretRange (BOOL* isActive, ITextRangeProvider** pRetVal) override\r
+    JUCE_COMRESULT GetCaretRange (BOOL* isActive, ComTypes::ITextRangeProvider** pRetVal) override\r
     {\r
         return withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
         {\r
@@ -159,7 +156,7 @@ public:
         });\r
     }\r
 \r
-    JUCE_COMRESULT RangeFromAnnotation (IRawElementProviderSimple*, ITextRangeProvider** pRetVal) override\r
+    JUCE_COMRESULT RangeFromAnnotation (IRawElementProviderSimple*, ComTypes::ITextRangeProvider** pRetVal) override\r
     {\r
         return withCheckedComArgs (pRetVal, *this, []\r
         {\r
@@ -183,7 +180,7 @@ private:
 \r
     //==============================================================================\r
     class UIATextRangeProvider  : public UIAProviderBase,\r
-                                  public ComBaseClassHelper<ITextRangeProvider>\r
+                                  public ComBaseClassHelper<ComTypes::ITextRangeProvider>\r
     {\r
     public:\r
         UIATextRangeProvider (UIATextProvider& textProvider, Range<int> range)\r
@@ -202,7 +199,7 @@ private:
             return Select();\r
         }\r
 \r
-        JUCE_COMRESULT Clone (ITextRangeProvider** pRetVal) override\r
+        JUCE_COMRESULT Clone (ComTypes::ITextRangeProvider** pRetVal) override\r
         {\r
             return withCheckedComArgs (pRetVal, *this, [&]\r
             {\r
@@ -211,7 +208,7 @@ private:
             });\r
         }\r
 \r
-        JUCE_COMRESULT Compare (ITextRangeProvider* range, BOOL* pRetVal) override\r
+        JUCE_COMRESULT Compare (ComTypes::ITextRangeProvider* range, BOOL* pRetVal) override\r
         {\r
             return withCheckedComArgs (pRetVal, *this, [&]\r
             {\r
@@ -220,9 +217,9 @@ private:
             });\r
         }\r
 \r
-        JUCE_COMRESULT CompareEndpoints (TextPatternRangeEndpoint endpoint,\r
-                                         ITextRangeProvider* targetRange,\r
-                                         TextPatternRangeEndpoint targetEndpoint,\r
+        JUCE_COMRESULT CompareEndpoints (ComTypes::TextPatternRangeEndpoint endpoint,\r
+                                         ComTypes::ITextRangeProvider* targetRange,\r
+                                         ComTypes::TextPatternRangeEndpoint targetEndpoint,\r
                                          int* pRetVal) override\r
         {\r
             if (targetRange == nullptr)\r
@@ -230,19 +227,19 @@ private:
 \r
             return withCheckedComArgs (pRetVal, *this, [&]\r
             {\r
-                auto offset = (endpoint == TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
-                                                                          : selectionRange.getEnd());\r
+                auto offset = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
+                                                                                    : selectionRange.getEnd());\r
 \r
                 auto otherRange = static_cast<UIATextRangeProvider*> (targetRange)->getSelectionRange();\r
-                auto otherOffset = (targetEndpoint == TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
-                                                                                     : otherRange.getEnd());\r
+                auto otherOffset = (targetEndpoint == ComTypes::TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
+                                                                                               : otherRange.getEnd());\r
 \r
                 *pRetVal = offset - otherOffset;\r
                 return S_OK;\r
             });\r
         }\r
 \r
-        JUCE_COMRESULT ExpandToEnclosingUnit (TextUnit unit) override\r
+        JUCE_COMRESULT ExpandToEnclosingUnit (ComTypes::TextUnit unit) override\r
         {\r
             if (! isElementValid())\r
                 return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
@@ -269,7 +266,7 @@ private:
             return (HRESULT) UIA_E_NOTSUPPORTED;\r
         }\r
 \r
-        JUCE_COMRESULT FindAttribute (TEXTATTRIBUTEID, VARIANT, BOOL, ITextRangeProvider** pRetVal) override\r
+        JUCE_COMRESULT FindAttribute (TEXTATTRIBUTEID, VARIANT, BOOL, ComTypes::ITextRangeProvider** pRetVal) override\r
         {\r
             return withCheckedComArgs (pRetVal, *this, []\r
             {\r
@@ -278,7 +275,7 @@ private:
         }\r
 \r
         JUCE_COMRESULT FindText (BSTR text, BOOL backward, BOOL ignoreCase,\r
-                                 ITextRangeProvider** pRetVal) override\r
+                                 ComTypes::ITextRangeProvider** pRetVal) override\r
         {\r
             return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface& textInterface)\r
             {\r
@@ -303,25 +300,25 @@ private:
 \r
                 switch (attributeId)\r
                 {\r
-                    case UIA_IsReadOnlyAttributeId:\r
+                    case ComTypes::UIA_IsReadOnlyAttributeId:\r
                     {\r
                         VariantHelpers::setBool (textInterface.isReadOnly(), pRetVal);\r
                         break;\r
                     }\r
 \r
-                    case UIA_CaretPositionAttributeId:\r
+                    case ComTypes::UIA_CaretPositionAttributeId:\r
                     {\r
                         auto cursorPos = textInterface.getTextInsertionOffset();\r
 \r
                         auto caretPos = [&]\r
                         {\r
                             if (cursorPos == 0)\r
-                                return CaretPosition_BeginningOfLine;\r
+                                return ComTypes::CaretPosition_BeginningOfLine;\r
 \r
                             if (cursorPos == textInterface.getTotalNumCharacters())\r
-                                return CaretPosition_EndOfLine;\r
+                                return ComTypes::CaretPosition_EndOfLine;\r
 \r
-                            return CaretPosition_Unknown;\r
+                            return ComTypes::CaretPosition_Unknown;\r
                         }();\r
 \r
                         VariantHelpers::setInt (caretPos, pRetVal);\r
@@ -412,28 +409,28 @@ private:
             });\r
         }\r
 \r
-        JUCE_COMRESULT Move (TextUnit unit, int count, int* pRetVal) override\r
+        JUCE_COMRESULT Move (ComTypes::TextUnit unit, int count, int* pRetVal) override\r
         {\r
             return owner->withTextInterface (pRetVal, [&] (const AccessibilityTextInterface&)\r
             {\r
                 if (count > 0)\r
                 {\r
-                    MoveEndpointByUnit (TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
-                    MoveEndpointByUnit (TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
+                    MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
+                    MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
                 }\r
                 else if (count < 0)\r
                 {\r
-                    MoveEndpointByUnit (TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
-                    MoveEndpointByUnit (TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
+                    MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_Start, unit, count, pRetVal);\r
+                    MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint_End, unit, count, pRetVal);\r
                 }\r
 \r
                 return S_OK;\r
             });\r
         }\r
 \r
-        JUCE_COMRESULT MoveEndpointByRange (TextPatternRangeEndpoint endpoint,\r
-                                            ITextRangeProvider* targetRange,\r
-                                            TextPatternRangeEndpoint targetEndpoint) override\r
+        JUCE_COMRESULT MoveEndpointByRange (ComTypes::TextPatternRangeEndpoint endpoint,\r
+                                            ComTypes::ITextRangeProvider* targetRange,\r
+                                            ComTypes::TextPatternRangeEndpoint targetEndpoint) override\r
         {\r
             if (targetRange == nullptr)\r
                 return E_INVALIDARG;\r
@@ -441,11 +438,11 @@ private:
             if (! isElementValid())\r
                 return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
 \r
-            if (auto* textInterface = owner->getHandler().getTextInterface())\r
+            if (owner->getHandler().getTextInterface() != nullptr)\r
             {\r
                 auto otherRange = static_cast<UIATextRangeProvider*> (targetRange)->getSelectionRange();\r
-                auto targetPoint = (targetEndpoint == TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
-                                                                                     : otherRange.getEnd());\r
+                auto targetPoint = (targetEndpoint == ComTypes::TextPatternRangeEndpoint_Start ? otherRange.getStart()\r
+                                                                                               : otherRange.getEnd());\r
 \r
                 setEndpointChecked (endpoint, targetPoint);\r
                 return S_OK;\r
@@ -454,8 +451,8 @@ private:
             return (HRESULT) UIA_E_NOTSUPPORTED;\r
         }\r
 \r
-        JUCE_COMRESULT MoveEndpointByUnit (TextPatternRangeEndpoint endpoint,\r
-                                           TextUnit unit,\r
+        JUCE_COMRESULT MoveEndpointByUnit (ComTypes::TextPatternRangeEndpoint endpoint,\r
+                                           ComTypes::TextUnit unit,\r
                                            int count,\r
                                            int* pRetVal) override\r
         {\r
@@ -464,8 +461,8 @@ private:
                 if (count == 0 || textInterface.getTotalNumCharacters() == 0)\r
                     return S_OK;\r
 \r
-                auto endpointToMove = (endpoint == TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
-                                                                                  : selectionRange.getEnd());\r
+                auto endpointToMove = (endpoint == ComTypes::TextPatternRangeEndpoint_Start ? selectionRange.getStart()\r
+                                                                                            : selectionRange.getEnd());\r
 \r
                 const auto direction = (count > 0 ? AccessibilityTextHelpers::Direction::forwards\r
                                                   : AccessibilityTextHelpers::Direction::backwards);\r
@@ -536,23 +533,23 @@ private:
         }\r
 \r
     private:\r
-        static AccessibilityTextHelpers::BoundaryType getBoundaryType (TextUnit unit)\r
+        static AccessibilityTextHelpers::BoundaryType getBoundaryType (ComTypes::TextUnit unit)\r
         {\r
             switch (unit)\r
             {\r
-                case TextUnit_Character:\r
+                case ComTypes::TextUnit_Character:\r
                     return AccessibilityTextHelpers::BoundaryType::character;\r
 \r
-                case TextUnit_Format:\r
-                case TextUnit_Word:\r
+                case ComTypes::TextUnit_Format:\r
+                case ComTypes::TextUnit_Word:\r
                     return AccessibilityTextHelpers::BoundaryType::word;\r
 \r
-                case TextUnit_Line:\r
+                case ComTypes::TextUnit_Line:\r
                     return AccessibilityTextHelpers::BoundaryType::line;\r
 \r
-                case TextUnit_Paragraph:\r
-                case TextUnit_Page:\r
-                case TextUnit_Document:\r
+                case ComTypes::TextUnit_Paragraph:\r
+                case ComTypes::TextUnit_Page:\r
+                case ComTypes::TextUnit_Document:\r
                     return AccessibilityTextHelpers::BoundaryType::document;\r
             };\r
 \r
@@ -560,9 +557,9 @@ private:
             return AccessibilityTextHelpers::BoundaryType::character;\r
         }\r
 \r
-        void setEndpointChecked (TextPatternRangeEndpoint endpoint, int newEndpoint)\r
+        void setEndpointChecked (ComTypes::TextPatternRangeEndpoint endpoint, int newEndpoint)\r
         {\r
-            if (endpoint == TextPatternRangeEndpoint_Start)\r
+            if (endpoint == ComTypes::TextPatternRangeEndpoint_Start)\r
             {\r
                 if (selectionRange.getEnd() < newEndpoint)\r
                     selectionRange.setEnd (newEndpoint);\r
index debc6d983906c11e05a84b64d1bab4fcab0c856d..8283a193a5ded1c690047771305a8907591b8e50 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAToggleProvider  : public UIAProviderBase,\r
-                           public ComBaseClassHelper<IToggleProvider>\r
+                           public ComBaseClassHelper<ComTypes::IToggleProvider>\r
 {\r
 public:\r
-    explicit UIAToggleProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT Toggle() override\r
@@ -44,7 +41,8 @@ public:
 \r
         const auto& handler = getHandler();\r
 \r
-        if (handler.getActions().invoke (AccessibilityActionType::toggle))\r
+        if (handler.getActions().invoke (AccessibilityActionType::toggle)\r
+            || handler.getActions().invoke (AccessibilityActionType::press))\r
         {\r
             VARIANT newValue;\r
             VariantHelpers::setInt (getCurrentToggleState(), &newValue);\r
@@ -57,7 +55,7 @@ public:
         return (HRESULT) UIA_E_NOTSUPPORTED;\r
     }\r
 \r
-    JUCE_COMRESULT get_ToggleState (ToggleState* pRetVal) override\r
+    JUCE_COMRESULT get_ToggleState (ComTypes::ToggleState* pRetVal) override\r
     {\r
         return withCheckedComArgs (pRetVal, *this, [&]\r
         {\r
@@ -67,10 +65,10 @@ public:
     }\r
 \r
 private:\r
-    ToggleState getCurrentToggleState() const\r
+    ComTypes::ToggleState getCurrentToggleState() const\r
     {\r
-        return getHandler().getCurrentState().isChecked() ? ToggleState_On\r
-                                                          : ToggleState_Off;\r
+        return getHandler().getCurrentState().isChecked() ? ComTypes::ToggleState_On\r
+                                                          : ComTypes::ToggleState_Off;\r
     }\r
 \r
     //==============================================================================\r
index d04859cc805541a821b8546e1e9f8cbacf2dc2d3..2e1194db0d864150f7675f6bb92d14dca15aeb7a 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIATransformProvider  : public UIAProviderBase,\r
-                              public ComBaseClassHelper<ITransformProvider>\r
+                              public ComBaseClassHelper<ComTypes::ITransformProvider>\r
 {\r
 public:\r
-    explicit UIATransformProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT Move (double x, double y) override\r
index 05ce7ba57a60736fb65588d5b4e08ddf51086d8a..32702e697a048ac6386debeca8f005f7ecf72d8b 100644 (file)
@@ -28,13 +28,10 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAValueProvider  : public UIAProviderBase,\r
-                          public ComBaseClassHelper<IValueProvider>\r
+                          public ComBaseClassHelper<ComTypes::IValueProvider>\r
 {\r
 public:\r
-    UIAValueProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
     JUCE_COMRESULT SetValue (LPCWSTR val) override\r
index ab1d14e49cbc0f1ac00cc3306763441b8e18d5d8..71bf8e7f32d3b976c2dceed091cbae7a08ec8274 100644 (file)
@@ -28,16 +28,13 @@ namespace juce
 \r
 //==============================================================================\r
 class UIAWindowProvider : public UIAProviderBase,\r
-                          public ComBaseClassHelper<IWindowProvider>\r
+                          public ComBaseClassHelper<ComTypes::IWindowProvider>\r
 {\r
 public:\r
-    explicit UIAWindowProvider (AccessibilityNativeHandle* nativeHandle)\r
-        : UIAProviderBase (nativeHandle)\r
-    {\r
-    }\r
+    using UIAProviderBase::UIAProviderBase;\r
 \r
     //==============================================================================\r
-    JUCE_COMRESULT SetVisualState (WindowVisualState state) override\r
+    JUCE_COMRESULT SetVisualState (ComTypes::WindowVisualState state) override\r
     {\r
         if (! isElementValid())\r
             return (HRESULT) UIA_E_ELEMENTNOTAVAILABLE;\r
@@ -46,15 +43,15 @@ public:
         {\r
             switch (state)\r
             {\r
-                case WindowVisualState_Maximized:\r
+                case ComTypes::WindowVisualState_Maximized:\r
                     peer->setFullScreen (true);\r
                     break;\r
 \r
-                case WindowVisualState_Minimized:\r
+                case ComTypes::WindowVisualState_Minimized:\r
                     peer->setMinimised (true);\r
                     break;\r
 \r
-                case WindowVisualState_Normal:\r
+                case ComTypes::WindowVisualState_Normal:\r
                     peer->setFullScreen (false);\r
                     peer->setMinimised (false);\r
                     break;\r
@@ -133,18 +130,18 @@ public:
         });\r
     }\r
 \r
-    JUCE_COMRESULT get_WindowVisualState (WindowVisualState* pRetVal) override\r
+    JUCE_COMRESULT get_WindowVisualState (ComTypes::WindowVisualState* pRetVal) override\r
     {\r
         return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
         {\r
             if (auto* peer = getPeer())\r
             {\r
                 if (peer->isFullScreen())\r
-                    *pRetVal = WindowVisualState_Maximized;\r
+                    *pRetVal = ComTypes::WindowVisualState_Maximized;\r
                 else if (peer->isMinimised())\r
-                    *pRetVal = WindowVisualState_Minimized;\r
+                    *pRetVal = ComTypes::WindowVisualState_Minimized;\r
                 else\r
-                    *pRetVal = WindowVisualState_Normal;\r
+                    *pRetVal = ComTypes::WindowVisualState_Normal;\r
 \r
                 return S_OK;\r
             }\r
@@ -153,15 +150,15 @@ public:
         });\r
     }\r
 \r
-    JUCE_COMRESULT get_WindowInteractionState (WindowInteractionState* pRetVal) override\r
+    JUCE_COMRESULT get_WindowInteractionState (ComTypes::WindowInteractionState* pRetVal) override\r
     {\r
         return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT\r
         {\r
             if (auto* peer = getPeer())\r
             {\r
                 *pRetVal = peer->getComponent().isCurrentlyBlockedByAnotherModalComponent()\r
-                    ? WindowInteractionState::WindowInteractionState_BlockedByModalWindow\r
-                    : WindowInteractionState::WindowInteractionState_Running;\r
+                    ? ComTypes::WindowInteractionState::WindowInteractionState_BlockedByModalWindow\r
+                    : ComTypes::WindowInteractionState::WindowInteractionState_Running;\r
 \r
                 return S_OK;\r
             }\r
index 19c8a5d772b3553c4d4f8d036c4e5d906fbac5b0..beaf8f1f821a3d4d8768424268c6989544db1f01 100644 (file)
@@ -127,7 +127,9 @@ private:
     template <typename FuncType>\r
     static FuncType getUiaFunction (HMODULE module, LPCSTR funcName)\r
     {\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wcast-function-type")\r
         return (FuncType) GetProcAddress (module, funcName);\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     //==============================================================================\r
index 21811eeac6b4388b2dee9ac487403263008472e1..c31ad58580c773e210878f2b85ac3126408da327 100644 (file)
@@ -144,6 +144,7 @@ public final class ComponentPeerView extends ViewGroup
     private native void handleMouseDown (long host, int index, float x, float y, long time);\r
     private native void handleMouseDrag (long host, int index, float x, float y, long time);\r
     private native void handleMouseUp (long host, int index, float x, float y, long time);\r
+    private native void handleAccessibilityHover (long host, int action, float x, float y, long time);\r
 \r
     @Override\r
     public boolean onTouchEvent (MotionEvent event)\r
@@ -227,35 +228,17 @@ public final class ComponentPeerView extends ViewGroup
     @Override\r
     public boolean onHoverEvent (MotionEvent event)\r
     {\r
-        if (host == 0 || ! accessibilityManager.isTouchExplorationEnabled ())\r
-            return false;\r
-\r
-        int action = event.getAction ();\r
-        long time = event.getEventTime ();\r
-\r
-        switch (action & MotionEvent.ACTION_MASK) // simulate "mouse" events when touch exploration is enabled\r
+        if (accessibilityManager.isTouchExplorationEnabled())\r
         {\r
-            case MotionEvent.ACTION_HOVER_ENTER:\r
-                handleMouseDown (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
-                return true;\r
-\r
-            case MotionEvent.ACTION_HOVER_EXIT:\r
-                handleMouseUp (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
-                return true;\r
-\r
-            case MotionEvent.ACTION_HOVER_MOVE:\r
-                handleMouseDrag (host, event.getPointerId (0), event.getRawX (), event.getRawY (), time);\r
-                return true;\r
-\r
-            default:\r
-                break;\r
+            handleAccessibilityHover (host, event.getActionMasked(), event.getRawX(), event.getRawY(), event.getEventTime());\r
+            return true;\r
         }\r
 \r
         return false;\r
     }\r
 \r
     //==============================================================================\r
-    private native void handleKeyDown (long host, int keycode, int textchar);\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
@@ -300,7 +283,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
@@ -308,7 +291,10 @@ public final class ComponentPeerView extends ViewGroup
                 break;\r
         }\r
 \r
-        handleKeyDown (host, keyCode, event.getUnicodeChar ());\r
+        handleKeyDown (host,\r
+                       keyCode,\r
+                       event.getUnicodeChar (),\r
+                       event.getMetaState ());\r
         return true;\r
     }\r
 \r
@@ -334,7 +320,11 @@ public final class ComponentPeerView extends ViewGroup
         if (event.getCharacters () != null)\r
         {\r
             int utf8Char = event.getCharacters ().codePointAt (0);\r
-            handleKeyDown (host, utf8Char, utf8Char);\r
+\r
+            handleKeyDown (host,\r
+                           keyCode,\r
+                           utf8Char,\r
+                           event.getMetaState ());\r
             return true;\r
         }\r
 \r
index 48dfbe4a4523c9775f8bf8570c1dc45a5a1c08c2..a6ba22a53ca7cecf2fbe7d5f041f0dd72612a40b 100644 (file)
@@ -28,195 +28,101 @@ namespace juce
 // 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,244,59,63,97,0,3,74,97,118,97,68,101,120,66,121,116,101,67,111,100,101,46,100,101,120,0,165,155,9,120,91,197,181,\r
-199,207,204,213,98,203,178,45,203,137,237,36,86,44,59,155,226,196,182,156,61,56,64,118,226,196,89,136,29,67,236,180,141,108,95,\r
-219,74,228,43,69,146,55,66,31,41,80,8,75,41,75,216,67,129,54,165,27,143,165,44,31,229,81,186,1,165,101,41,180,240,160,45,180,\r
-208,242,74,88,74,83,118,104,31,188,255,153,59,178,229,44,77,219,231,124,191,123,206,204,156,153,59,119,230,204,153,185,215,113,\r
-151,57,228,9,207,157,79,197,179,155,15,182,174,201,59,197,108,45,216,252,173,174,187,158,170,250,166,177,120,119,238,69,203,47,\r
-157,71,148,32,162,161,214,121,126,210,63,143,207,37,10,8,59,127,17,120,197,65,180,28,242,33,39,81,25,228,11,57,68,103,64,238,\r
-207,37,66,17,197,242,137,14,76,39,122,19,242,242,0,209,62,112,53,184,14,124,21,220,2,30,4,63,2,15,131,71,193,227,224,41,240,43,\r
-240,28,120,31,20,78,38,242,131,18,48,17,76,6,83,64,8,212,128,85,96,55,184,10,220,9,30,7,111,2,111,5,209,66,112,42,216,1,206,\r
-2,87,130,219,192,207,193,123,192,19,36,154,10,182,129,207,131,59,192,43,160,188,146,168,9,164,192,141,224,73,80,88,69,116,26,\r
-184,28,220,3,126,13,62,2,229,83,136,26,192,22,208,11,46,6,223,5,63,5,175,131,79,64,96,42,81,61,216,14,206,4,87,128,3,224,94,240,\r
-0,248,57,120,2,60,13,158,7,47,128,87,192,235,224,16,120,15,124,4,62,1,198,52,162,28,80,0,252,96,34,8,128,42,16,2,53,96,30,56,\r
-1,156,4,86,128,117,96,51,104,5,109,192,2,231,128,47,131,235,193,55,192,93,224,7,224,49,240,28,248,35,248,11,248,59,200,195,60,\r
-86,130,153,96,1,88,10,218,65,55,136,130,51,193,185,224,98,176,15,220,48,221,158,251,59,193,131,224,73,240,34,248,19,248,51,240,\r
-204,32,242,129,98,48,17,44,1,167,128,13,96,27,136,130,243,192,1,112,59,120,4,60,11,126,15,222,0,31,1,71,136,104,2,168,5,139,\r
-193,90,112,58,136,128,29,96,16,92,0,174,5,183,129,239,131,39,192,27,224,175,224,3,240,49,200,155,137,241,3,117,224,36,176,14,\r
-68,64,18,156,3,46,7,55,130,187,193,131,224,57,240,50,120,21,188,14,222,7,127,3,222,106,162,73,96,54,88,8,86,129,141,224,52,208,\r
-9,250,192,94,112,5,216,15,238,1,15,129,199,192,111,192,75,224,32,56,4,222,1,31,1,57,11,237,130,137,160,10,132,64,45,88,6,90,65,\r
-47,216,13,174,1,223,1,15,130,231,192,239,193,91,224,19,174,63,155,168,20,76,7,117,96,49,88,3,90,193,103,65,15,216,5,134,192,\r
-185,224,10,112,29,248,30,120,0,60,12,94,3,238,26,248,28,40,6,83,64,61,88,11,218,64,47,56,27,92,11,238,5,63,1,191,4,191,3,111,\r
-129,191,131,188,90,140,15,168,6,43,193,90,176,9,156,14,182,131,110,176,19,236,2,187,193,127,128,47,130,75,192,62,240,117,112,\r
-7,248,49,120,26,188,8,94,2,127,4,175,130,55,192,95,192,59,224,3,224,66,12,66,72,162,60,80,2,74,201,142,83,19,192,68,48,9,148,\r
-3,132,24,66,184,32,132,3,194,210,39,44,117,194,178,38,44,91,194,114,35,184,63,193,101,9,46,71,112,23,194,84,19,166,134,48,180,\r
-132,97,33,60,26,225,118,84,7,194,160,30,204,1,8,151,132,48,74,243,193,2,176,80,199,205,197,224,4,208,0,150,128,19,193,73,224,\r
-100,176,20,44,35,59,174,174,0,171,192,26,112,26,136,128,14,208,9,186,200,126,190,204,143,91,203,15,39,217,207,44,116,218,163,\r
-117,206,231,113,144,58,223,155,209,49,0,133,89,109,249,245,152,229,232,252,2,157,95,168,203,50,250,120,173,251,244,184,114,251,\r
-197,90,247,233,186,101,89,109,242,88,151,149,219,58,143,113,80,219,76,207,106,103,166,110,167,72,235,33,216,140,211,122,184,\r
-220,190,39,143,249,34,221,14,235,75,117,59,53,186,157,241,122,30,214,148,219,253,225,185,216,84,110,143,225,28,109,211,168,117,\r
-190,215,90,173,159,14,155,117,90,231,251,54,105,189,11,250,122,173,167,161,111,208,250,30,232,27,181,126,49,244,77,90,223,7,\r
-125,179,214,247,103,229,31,200,210,111,133,222,162,245,187,179,242,127,152,165,63,154,165,63,149,213,230,243,89,249,47,65,111,\r
-214,250,193,172,252,131,147,70,117,30,231,83,181,30,206,106,231,80,150,61,143,225,150,204,152,64,111,205,140,85,96,212,198,151,\r
-165,151,5,108,127,156,171,199,243,116,173,7,145,191,85,235,161,44,125,30,244,54,173,47,133,222,174,245,53,208,183,105,189,5,250,\r
-103,181,190,29,250,103,180,222,155,149,207,126,245,57,173,39,144,191,93,235,123,178,236,47,14,176,111,11,26,34,91,230,10,94,\r
-235,211,40,73,182,188,75,73,65,247,106,121,159,150,223,211,242,126,45,255,75,219,63,162,134,33,72,46,97,203,66,193,177,98,46,\r
-61,76,44,43,200,45,56,110,216,229,21,186,188,2,37,126,193,126,94,162,206,74,65,172,180,187,149,172,160,135,148,12,208,47,148,\r
-156,75,255,163,100,30,29,84,126,62,157,86,67,58,17,121,254,66,188,38,93,244,101,37,199,211,13,144,185,136,92,134,146,115,233,\r
-109,226,181,61,67,165,243,116,126,30,162,192,59,234,185,237,116,33,238,123,137,146,37,116,169,78,127,133,199,81,231,251,112,74,\r
-187,66,167,175,81,210,160,107,201,94,139,215,105,121,189,146,130,190,166,229,1,226,181,39,105,159,146,33,250,42,241,58,155,170,\r
-238,87,140,200,246,123,37,23,209,75,74,78,162,63,18,175,201,217,148,214,242,16,113,44,158,79,63,34,142,21,94,122,74,201,9,244,\r
-22,251,149,238,247,4,172,108,150,229,136,142,223,85,114,38,189,175,228,73,42,152,5,176,194,13,53,47,121,116,142,146,101,116,190,\r
-78,239,85,114,33,189,174,230,167,70,217,77,70,139,47,18,207,139,93,175,2,249,166,150,221,74,22,82,143,146,19,72,8,91,74,53,\r
-127,211,148,125,16,51,210,171,100,45,69,149,92,74,59,148,44,166,157,90,198,148,60,153,250,148,156,64,131,90,158,169,228,2,218,\r
-163,100,144,46,84,210,79,23,43,153,79,95,82,210,69,151,107,63,217,167,203,175,84,114,30,93,165,100,46,237,87,210,67,55,106,187,\r
-155,148,204,161,155,149,180,231,33,136,17,186,69,203,111,104,249,77,37,39,211,183,180,252,182,206,255,142,246,195,91,181,252,\r
-79,45,111,211,126,122,187,146,39,208,29,74,206,167,31,106,249,99,37,171,232,87,74,86,210,51,90,62,171,229,127,235,242,231,116,\r
-250,121,45,127,173,100,1,253,70,201,233,244,91,37,103,209,11,74,158,72,191,83,210,246,159,160,246,31,78,191,172,228,28,250,131,\r
-146,182,63,177,253,43,74,54,208,155,74,214,211,187,90,190,167,100,53,125,168,228,68,250,88,201,48,253,77,167,255,174,237,254,\r
-87,203,79,116,249,167,122,92,124,130,247,164,82,186,154,88,46,163,31,168,117,41,233,251,74,22,81,129,224,125,199,246,211,89,88,\r
-17,151,17,41,47,251,188,146,146,126,70,188,255,140,163,7,137,207,2,19,180,159,218,107,41,179,31,226,117,137,110,66,140,254,\r
-178,222,144,38,235,124,222,207,56,118,115,249,125,144,183,233,242,10,93,127,86,86,253,71,81,254,35,93,30,36,123,207,228,253,238,\r
-144,174,255,60,228,107,186,156,247,249,19,160,47,155,99,159,5,214,205,177,243,182,67,246,0,67,151,239,2,187,181,205,185,42,\r
-223,80,250,199,181,246,153,160,93,120,40,225,227,222,180,203,60,204,101,14,90,225,123,57,235,236,115,145,95,180,116,120,104,151,\r
-111,14,242,243,100,9,94,1,235,165,116,44,150,14,114,251,138,168,165,35,143,118,97,139,72,98,213,179,93,75,167,109,107,80,158,\r
-99,215,166,121,180,188,223,35,23,203,63,127,106,249,120,60,220,190,208,171,14,125,255,73,117,246,249,164,10,35,154,240,13,171,\r
-167,229,123,115,191,167,213,217,231,171,99,221,219,160,34,225,247,207,157,49,225,200,123,134,231,211,114,167,23,190,118,8,247,\r
-228,253,193,35,172,224,52,68,39,175,8,253,233,72,235,5,202,58,244,26,199,89,135,234,79,67,157,61,119,45,9,219,142,75,74,164,58,\r
-115,200,197,176,241,35,174,180,236,242,100,151,75,113,174,184,210,125,203,160,107,33,158,204,67,161,67,6,250,203,207,120,74,\r
-29,199,117,140,172,63,31,207,152,70,158,159,182,249,188,234,252,149,131,20,63,235,166,58,123,31,45,118,141,163,42,233,133,29,\r
-143,66,75,42,159,90,230,22,144,229,91,14,43,175,88,44,150,140,230,5,87,99,47,25,181,56,25,22,30,99,243,84,126,23,20,116,103,203,\r
-101,100,56,230,111,159,72,91,82,24,7,163,132,252,198,54,104,25,251,150,116,62,250,93,139,39,241,58,184,255,14,53,14,115,105,133,\r
-147,237,23,27,110,90,184,221,73,254,98,174,195,247,26,143,117,110,249,198,241,147,29,118,143,208,147,60,151,236,115,187,235,\r
-236,243,90,187,191,64,63,103,21,198,48,17,156,9,15,111,247,129,226,66,245,204,66,253,35,186,168,206,254,150,144,240,241,169,174,\r
-96,36,255,138,145,252,176,202,151,250,196,123,125,157,237,207,45,190,66,181,38,216,131,248,190,95,171,179,207,188,45,193,66,\r
-244,145,79,214,120,206,74,31,122,61,17,119,46,24,177,251,246,49,237,38,41,187,2,120,60,63,201,157,176,123,156,253,206,237,47,\r
-73,4,75,16,95,171,28,121,232,141,11,189,106,223,87,130,84,5,37,194,179,104,95,110,251,190,98,164,2,72,77,85,169,113,104,247,36,\r
-204,181,215,49,209,25,71,187,152,65,232,21,142,18,212,43,162,114,135,19,121,187,176,207,122,28,139,28,159,161,10,15,167,121,63,\r
-110,219,239,135,214,71,195,180,237,250,241,208,186,177,23,89,193,30,117,237,197,190,93,133,54,19,62,181,15,59,198,209,148,101,\r
-243,104,186,224,211,158,21,116,160,231,45,220,39,39,214,111,208,73,220,162,27,119,245,27,150,175,95,247,228,3,242,79,159,210,\r
-189,0,207,211,145,83,74,235,115,92,110,127,105,121,78,158,210,172,112,130,90,92,94,99,145,49,142,252,210,63,117,202,202,133,228,\r
-119,238,242,165,48,14,94,215,122,151,195,233,31,239,87,210,10,15,209,21,14,246,52,246,110,126,42,187,247,251,40,116,115,190,35,\r
-244,46,120,27,28,2,191,1,188,57,24,14,117,198,31,253,217,115,50,253,75,233,195,127,236,114,62,39,150,96,61,242,247,40,62,183,\r
-72,35,116,173,152,113,181,168,189,82,200,217,55,136,234,235,5,233,232,130,53,28,182,125,166,57,232,87,113,214,161,34,31,98,75,\r
-88,251,88,184,137,42,141,2,172,121,167,138,119,181,97,59,198,38,182,152,84,185,194,163,252,57,83,167,33,83,22,94,138,58,94,229,\r
-131,153,178,149,35,101,75,70,202,220,234,148,135,119,12,93,54,224,58,85,69,6,110,211,169,215,253,182,176,189,102,154,151,250,\r
-179,226,139,1,95,228,156,68,184,145,28,34,244,241,232,243,116,233,182,248,157,183,13,207,84,160,251,192,63,59,194,118,236,247,\r
-251,10,71,214,76,58,156,89,51,227,84,159,50,249,103,232,252,45,190,241,234,254,82,175,189,61,97,251,189,210,242,173,84,125,85,\r
-177,14,237,225,60,248,137,161,239,115,94,216,222,71,10,84,61,251,173,243,146,172,60,151,142,223,87,30,231,217,78,209,207,150,\r
-177,255,202,113,236,215,140,140,133,221,143,111,28,165,31,183,31,37,239,222,172,60,135,190,215,247,195,246,183,0,191,224,175,\r
-5,237,97,73,182,52,104,107,61,226,222,161,173,97,55,109,13,187,116,110,46,252,24,51,233,219,26,118,160,60,7,235,113,2,250,131,\r
-51,159,40,210,207,203,115,242,120,216,222,171,143,222,255,150,229,120,99,216,188,137,28,167,134,62,100,223,48,148,255,61,115,\r
-204,58,115,87,125,250,169,122,238,165,13,228,136,112,29,47,238,195,123,245,203,168,195,103,84,255,4,63,53,127,21,245,120,71,20,\r
-210,177,8,123,120,203,205,69,152,187,114,158,59,236,22,6,113,164,243,98,173,120,114,44,95,62,100,158,235,217,47,124,74,179,4,\r
-127,135,8,189,221,124,51,199,157,66,46,71,188,240,177,116,88,216,207,33,157,238,155,6,114,248,141,88,92,26,250,221,241,236,214,\r
-219,118,63,63,158,221,70,219,142,95,208,132,67,125,215,224,49,224,249,224,243,19,127,111,201,69,138,199,50,191,222,254,222,226,\r
-247,53,119,140,62,225,98,97,239,188,179,221,252,45,130,75,44,95,30,198,196,35,18,167,174,165,233,169,208,59,241,112,41,13,228,\r
-96,247,125,203,242,45,194,204,132,248,101,65,218,99,157,249,62,196,223,23,242,53,30,148,240,253,66,245,246,119,6,191,24,185,159,\r
-62,99,20,138,197,238,92,220,39,23,125,243,72,255,148,57,115,220,20,95,90,70,3,215,120,68,232,109,203,231,225,40,43,23,169,\r
-211,141,173,91,193,1,220,195,163,250,151,216,132,126,25,254,162,208,139,246,156,243,189,86,214,219,223,50,198,206,185,253,100,\r
-156,199,207,228,194,189,18,155,215,193,91,252,190,208,123,164,35,9,246,221,250,81,95,206,213,49,107,123,189,237,67,241,211,113,\r
-18,26,200,110,117,17,238,105,175,157,56,214,14,215,41,212,62,180,11,197,229,104,168,249,105,88,27,60,186,194,80,163,43,10,133,\r
-165,206,38,158,92,246,152,2,202,115,63,123,25,123,204,251,106,116,66,127,109,254,165,31,146,103,121,178,154,93,222,57,61,78,\r
-158,101,72,151,251,105,246,6,156,112,138,66,47,28,223,114,163,109,249,211,227,91,110,128,165,229,227,61,218,147,231,47,90,56,\r
-169,154,252,149,83,202,231,195,219,150,209,19,228,159,56,255,254,74,226,86,184,141,219,184,13,196,70,72,225,119,174,116,122,157,\r
-103,111,121,100,188,21,44,182,115,74,86,186,188,174,179,187,31,41,201,180,251,188,7,51,249,18,250,113,206,56,193,47,11,247,92,\r
-246,178,71,228,44,246,148,209,63,251,4,51,169,251,211,236,254,252,59,61,225,150,66,191,253,215,123,176,94,247,96,218,255,187,\r
-7,235,85,15,120,109,218,95,28,217,183,56,254,213,105,201,235,148,191,117,164,148,239,73,117,86,58,88,111,127,31,69,31,113,222,\r
-112,195,251,39,26,31,145,127,220,148,149,56,111,56,59,92,56,111,168,179,67,130,230,56,248,252,234,70,191,243,177,151,128,191,\r
-251,253,83,170,112,218,48,248,180,145,131,19,197,122,135,52,248,148,177,75,134,222,202,151,161,55,193,235,224,32,251,123,17,250,\r
-198,223,25,189,28,109,229,236,146,234,50,35,20,154,49,187,182,58,43,206,143,155,51,186,54,12,157,91,62,199,62,123,47,146,110,\r
-226,17,217,9,139,2,242,47,13,253,141,159,79,191,103,204,177,191,47,241,217,141,79,217,19,229,3,234,236,86,137,187,85,224,189,\r
-113,17,34,135,229,27,196,10,245,136,19,69,49,70,219,10,79,161,48,158,120,149,178,183,194,85,228,115,180,212,23,227,68,61,91,181,\r
-159,41,241,75,43,92,73,62,105,151,213,240,248,190,109,255,206,140,127,50,223,113,249,59,233,135,249,52,250,65,86,255,120,15,75,\r
-151,31,150,230,250,227,200,222,243,139,208,59,161,243,152,160,150,57,186,220,175,247,247,137,58,191,66,75,169,9,234,241,154,\r
-69,11,85,126,141,206,175,161,5,90,10,21,67,133,254,231,164,209,179,132,212,190,145,57,67,216,186,123,228,155,180,196,232,142,\r
-230,179,204,87,105,135,238,131,75,151,185,96,39,117,158,91,203,92,45,51,223,180,11,84,79,72,159,101,248,185,230,234,254,7,85,\r
-254,92,237,183,115,71,122,106,215,159,167,229,124,93,79,232,243,23,203,124,125,127,214,11,71,202,11,85,255,164,182,200,60,95,\r
-233,72,63,236,182,125,250,126,193,17,75,251,185,130,218,90,144,253,110,47,66,132,119,55,215,146,168,21,77,159,68,242,164,6,42,\r
-89,17,239,75,196,45,211,74,111,50,205,100,107,212,28,172,221,17,25,136,144,88,77,114,117,35,137,70,146,141,51,1,212,181,36,215,\r
-54,81,96,109,127,167,185,172,179,211,76,165,162,29,209,88,52,61,188,33,222,101,110,74,198,7,162,93,102,146,74,215,153,195,29,\r
-241,72,178,107,101,52,213,23,77,165,154,162,169,180,105,161,64,52,145,108,66,107,77,104,166,169,137,140,38,36,112,89,203,151,\r
-38,42,105,138,88,93,201,120,180,171,46,146,72,212,45,235,76,71,7,208,114,3,205,27,155,159,72,196,162,157,145,116,52,110,77,205,\r
-216,52,69,187,205,206,225,206,152,185,34,18,139,117,68,58,119,166,26,104,194,177,106,101,23,117,198,45,244,44,93,183,130,229,\r
-80,58,187,168,39,25,73,244,70,59,83,117,43,34,214,64,4,13,78,62,74,81,60,22,79,174,142,198,210,102,242,216,229,235,35,233,100,\r
-116,168,129,102,254,195,242,49,77,149,29,105,186,41,18,181,208,191,210,35,75,54,155,157,40,40,30,41,136,167,234,150,247,91,93,\r
-49,179,129,198,101,103,54,46,143,90,93,220,250,104,27,3,152,234,58,76,214,170,1,147,27,159,56,182,96,125,156,135,75,151,205,\r
-28,91,198,78,50,117,163,181,58,222,217,159,90,209,27,177,122,204,204,36,103,119,101,196,52,251,145,70,50,79,73,198,251,19,13,\r
-180,224,200,146,150,164,105,110,236,72,153,201,1,51,137,187,156,18,139,119,68,98,77,145,225,120,127,122,244,54,21,255,184,94,\r
-3,213,143,53,136,100,251,107,221,24,239,93,31,177,34,61,92,101,206,63,93,133,29,190,209,234,142,31,209,255,227,212,201,44,146,\r
-6,170,29,91,47,106,37,250,211,125,102,186,55,222,85,183,60,146,66,227,72,195,47,45,76,175,242,218,105,199,182,95,213,21,77,199,\r
-147,118,119,170,143,109,118,68,147,53,199,177,93,175,244,145,209,57,185,169,51,222,87,151,236,75,197,234,118,32,0,212,29,17,54,\r
-166,254,195,184,208,64,171,143,219,192,49,34,199,212,177,51,187,248,223,109,167,129,42,143,87,181,129,170,154,186,34,177,129,\r
-232,206,186,136,101,197,211,42,102,212,173,178,58,99,241,84,212,234,89,17,139,164,84,48,56,210,166,17,3,155,212,229,149,71,41,\r
-95,111,246,117,104,3,19,38,129,163,152,52,71,123,172,72,186,63,105,242,130,225,24,92,23,195,218,170,195,10,75,54,155,187,250,\r
-77,171,19,37,69,217,37,246,237,170,178,178,26,99,49,179,39,18,179,167,97,213,80,167,153,176,39,123,234,81,108,146,61,253,125,\r
-120,246,44,171,226,108,43,4,197,30,123,208,70,51,55,196,155,251,59,123,109,207,200,170,231,207,50,217,216,177,67,197,164,64,86,\r
-94,179,217,217,159,132,67,28,163,74,51,98,160,213,195,30,57,154,151,52,187,99,104,7,221,24,136,219,161,187,37,146,236,49,179,\r
-123,59,241,40,230,118,215,26,104,188,93,214,159,142,198,234,150,37,147,145,97,118,130,6,42,204,202,230,28,242,29,150,129,119,\r
-220,150,173,155,86,145,55,219,231,72,180,146,108,109,36,103,107,35,126,160,174,37,87,235,218,198,213,171,215,146,3,178,145,175,\r
-188,163,181,174,109,67,33,43,188,171,181,170,172,166,54,148,54,181,97,207,107,109,67,173,54,213,130,104,35,163,141,235,225,\r
-210,196,106,19,57,219,214,178,238,128,192,62,217,198,185,216,31,93,109,77,42,219,201,18,249,237,216,148,219,27,201,223,126,164,\r
-23,20,183,31,101,18,60,118,64,154,26,14,135,71,244,250,44,125,78,150,62,55,75,159,151,165,207,207,210,23,100,233,11,179,244,\r
-69,208,243,108,125,117,44,210,147,162,252,49,145,144,198,69,142,18,113,201,21,81,161,136,107,178,108,138,116,152,49,202,137,232,\r
-125,157,38,68,186,186,142,30,255,41,55,162,157,55,69,162,131,138,120,215,95,222,159,78,199,173,77,73,220,198,236,34,87,71,\r
-28,201,62,72,181,27,146,171,83,109,228,228,238,84,251,85,23,57,113,96,136,36,41,175,147,99,84,28,219,235,178,52,39,70,182,100,\r
-42,80,137,150,100,196,74,117,199,147,125,148,207,199,5,236,195,41,101,141,134,236,83,3,26,138,247,35,61,169,51,105,70,210,71,\r
-198,63,142,203,228,232,138,118,119,147,48,201,105,242,134,74,193,110,236,198,71,53,77,45,31,110,225,86,115,217,66,109,176,228,\r
-236,86,194,219,61,186,221,118,81,158,74,113,200,106,236,162,73,88,23,99,90,91,157,85,88,126,120,225,152,211,90,174,42,85,179,\r
-48,158,213,209,147,146,62,21,81,62,178,57,4,97,90,204,36,94,144,56,201,30,71,30,214,180,145,151,87,38,63,90,75,180,207,84,141,\r
-174,49,163,61,189,105,42,134,170,118,147,236,46,113,102,147,94,213,27,173,102,140,156,105,169,74,246,234,165,66,168,106,148,\r
-17,48,213,224,122,71,51,80,221,141,212,230,200,224,233,25,101,43,229,177,18,143,167,185,125,242,33,209,60,12,71,233,107,198,234,\r
-141,118,154,84,128,156,45,86,148,167,154,159,68,221,255,240,19,131,122,206,214,232,136,199,114,157,211,48,7,241,193,150,248,\r
-78,116,175,124,36,173,140,98,38,54,151,68,44,50,188,58,25,193,19,59,80,122,186,186,110,37,209,75,133,152,37,120,29,70,115,83,\r
-164,159,221,209,55,146,177,217,76,193,113,71,114,150,143,120,46,229,219,57,216,188,86,198,7,177,40,70,146,91,18,52,110,36,161,\r
-54,182,53,209,174,46,244,73,223,102,125,28,247,80,117,198,100,36,35,61,153,54,85,6,154,209,109,170,227,36,21,235,132,153,100,\r
-255,214,78,144,211,27,73,217,110,87,218,11,7,105,142,119,235,233,75,198,251,236,199,135,9,106,43,39,117,244,198,17,66,69,148,\r
-60,152,245,141,42,42,167,200,136,246,245,81,33,191,95,68,35,177,21,145,68,106,61,134,157,242,117,70,179,25,91,101,117,141,148,\r
-35,217,156,142,36,225,239,234,248,209,50,156,48,201,171,212,207,217,71,17,202,193,205,90,35,177,126,44,225,40,182,130,157,38,\r
-110,150,106,180,82,233,8,182,67,148,166,54,38,34,216,27,105,66,52,213,18,199,222,180,106,40,129,101,171,92,107,149,21,193,60,\r
-117,161,237,148,158,51,114,239,52,135,87,112,127,74,119,30,227,45,37,63,83,208,220,203,35,234,140,169,160,148,143,153,54,147,\r
-220,189,13,56,47,144,35,102,118,167,201,21,51,173,158,116,47,185,116,87,133,69,14,139,189,193,109,153,131,27,88,201,177,50,17,\r
-192,107,101,175,58,87,188,131,67,9,57,226,177,174,94,117,29,164,162,184,149,121,163,89,161,66,9,214,201,104,214,74,51,149,78,\r
-198,135,217,113,70,51,181,115,101,213,204,120,215,164,209,172,230,200,128,153,25,47,140,117,218,204,182,87,131,63,182,137,230,\r
-116,60,145,64,86,41,66,128,234,199,97,7,71,116,222,130,111,13,82,126,60,251,13,128,10,226,99,66,53,121,227,214,154,56,22,150,\r
-10,11,148,27,183,50,142,157,175,212,245,253,177,116,52,193,83,162,146,112,206,28,222,1,84,85,88,52,71,207,48,51,177,14,45,217,\r
-83,171,90,114,197,237,9,119,219,242,115,168,215,143,224,157,70,108,114,38,148,99,123,18,145,36,44,85,48,200,79,140,113,111,103,\r
-66,5,239,64,34,158,232,143,29,51,92,139,36,185,147,246,59,37,85,37,205,30,246,141,228,177,95,55,169,60,105,246,225,81,237,199,\r
-223,104,29,182,87,57,147,42,18,26,41,51,77,5,41,142,153,35,47,123,228,69,90,13,34,123,42,149,102,167,26,237,135,86,171,135,171,\r
-101,157,201,85,181,166,140,71,82,25,82,71,125,27,163,241,169,76,40,220,18,205,138,109,147,142,154,205,135,225,8,54,193,148,29,\r
-28,149,3,231,167,198,4,69,79,38,25,179,251,116,90,52,22,219,16,79,43,119,240,166,176,96,50,1,10,21,145,26,137,30,48,102,71,179,\r
-251,133,163,30,138,225,101,163,201,178,148,221,155,198,209,123,233,39,117,168,237,197,145,238,141,166,200,197,215,169,97,45,235,\r
-145,203,155,141,129,150,160,242,64,228,244,167,187,23,169,8,47,6,200,57,160,162,134,91,137,141,221,228,224,183,28,42,228,107,\r
-182,115,229,114,70,75,124,75,202,36,223,192,17,123,194,64,52,153,238,143,196,244,190,229,25,24,29,10,49,72,98,136,228,80,24,212,\r
-131,57,96,46,152,71,98,152,110,119,72,186,92,186,11,218,106,232,94,135,216,39,221,1,153,247,180,28,10,236,48,232,23,162,236,\r
-15,235,232,167,14,249,69,137,252,2,122,194,33,46,20,238,192,99,242,140,192,219,6,93,44,170,107,46,119,18,189,224,48,246,201,228,\r
-128,187,224,39,21,244,103,41,8,77,45,161,119,37,185,103,183,27,242,45,145,127,129,33,94,23,197,181,67,31,24,244,69,33,119,\r
-44,17,69,69,209,37,50,21,112,210,18,145,231,66,125,105,119,64,46,216,42,215,13,214,208,175,165,184,134,239,118,184,252,3,154,\r
-44,184,155,94,181,197,18,227,108,241,170,184,71,184,103,203,167,169,65,238,149,131,242,41,49,56,36,159,223,253,210,94,33,157,\r
-158,101,53,75,106,151,44,57,169,221,160,179,60,103,26,98,143,152,191,228,150,74,195,120,76,132,69,233,248,240,100,67,62,42,164,\r
-40,42,117,74,121,42,122,226,20,78,195,229,145,179,14,56,61,46,114,9,151,116,25,213,213,114,96,182,83,86,203,212,108,90,104,\r
-247,96,161,188,70,94,171,20,7,43,215,201,235,199,230,142,40,206,76,241,126,78,238,231,30,95,88,78,3,16,235,232,45,67,94,45,111,\r
-224,252,55,28,200,160,189,60,98,244,138,193,215,125,14,153,62,3,242,18,135,72,67,124,104,176,64,205,27,85,250,162,114,218,171,\r
-13,174,179,13,206,182,197,245,134,56,136,121,89,183,174,166,109,93,91,45,157,37,118,171,90,247,27,242,75,242,187,2,21,39,213,\r
-208,159,132,56,159,7,171,236,19,185,51,176,206,200,73,202,38,195,117,129,52,100,94,175,40,46,148,131,1,92,131,172,13,5,232,235,\r
-82,62,196,214,129,243,165,63,32,19,1,89,216,32,251,15,108,147,195,107,233,81,105,60,36,206,81,133,50,255,60,57,16,184,170,125,\r
-199,249,240,5,41,219,232,65,93,173,224,252,96,249,85,116,151,225,60,243,103,226,66,249,182,24,70,23,191,109,56,174,146,183,136,\r
-95,137,95,162,252,196,243,219,232,106,97,155,202,71,41,32,239,63,11,93,202,229,46,185,185,75,63,161,173,114,233,108,116,38,108,\r
-227,107,50,242,30,23,242,196,37,134,247,77,177,224,68,33,12,207,189,66,214,136,242,252,147,157,30,167,183,222,153,183,195,229,\r
-169,21,197,37,114,119,195,18,151,247,68,17,24,207,249,99,51,229,106,17,40,160,159,25,226,74,140,125,208,16,231,202,176,240,151,\r
-72,239,108,217,23,168,48,232,60,81,51,217,73,74,153,53,197,73,47,135,171,233,97,67,60,137,46,210,107,134,24,116,23,68,203,233,\r
-2,41,46,66,229,135,12,186,79,4,106,119,172,27,218,62,225,124,146,149,226,75,178,44,40,171,164,229,240,63,46,74,243,229,84,100,\r
-148,187,75,69,233,210,210,220,210,149,165,178,180,186,212,97,91,85,40,43,9,171,83,70,236,11,228,20,182,23,101,147,109,69,150,\r
-5,202,42,72,10,135,231,210,160,240,79,253,194,30,199,129,242,105,226,161,114,33,14,4,132,248,33,120,96,50,138,133,87,138,75,131,\r
-51,247,236,113,236,173,168,22,183,86,144,225,162,2,174,33,252,179,80,231,80,80,236,13,222,84,137,203,125,124,121,170,82,200,\r
-131,224,210,42,114,149,78,42,242,195,247,253,246,191,122,24,223,87,5,147,115,167,227,178,159,47,119,243,229,41,190,188,201,151,\r
-189,51,28,103,75,18,128,165,91,235,255,12,227,128,7,44,18,7,102,8,241,12,56,52,3,3,31,26,47,246,135,132,184,27,60,15,222,4,\r
-123,102,10,113,7,120,9,188,11,246,86,11,177,31,28,2,7,102,193,14,60,80,35,196,173,181,66,92,83,39,28,207,128,131,117,176,9,59,\r
-197,43,243,96,55,95,138,115,23,72,241,205,5,250,251,114,246,239,10,88,102,254,78,135,191,67,103,254,86,135,191,79,103,254,94,\r
-39,243,187,78,254,155,29,254,54,157,249,187,29,23,141,254,237,142,225,179,203,248,119,17,34,104,255,142,103,106,1,108,130,182,\r
-13,255,31,54,225,179,127,183,195,255,111,77,6,237,251,242,223,250,24,218,158,255,239,152,35,104,255,142,225,132,57,246,47,29,\r
-184,174,250,191,111,62,187,175,252,119,69,255,7,207,224,91,10,144,52,0,0,0,0};\r
+{ 31,139,8,8,217,126,216,97,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,212,213,149,199,207,189,255,255,204,36,147,215,100,18,146,64,18,50,9,175,16,72,102,8,111,19,148,183,6,18,64,18,16,18,171,76,146,127,146,\r
+  129,201,127,134,153,73,72,124,21,149,143,96,173,21,45,82,21,109,177,165,182,110,109,215,90,219,181,22,181,93,93,215,173,186,85,107,87,180,90,31,69,197,150,90,180,86,105,117,117,127,247,49,147,9,143,210,118,195,231,59,231,252,207,125,223,123,238,185,247,\r
+  63,33,221,214,144,59,48,115,54,125,253,172,186,247,86,249,42,166,141,253,112,218,236,231,195,83,47,91,120,183,99,205,99,123,255,208,184,125,22,81,148,136,134,214,207,242,146,254,57,56,147,168,146,41,251,60,240,129,73,180,4,242,121,7,81,9,228,241,12,162,\r
+  203,33,31,200,36,66,18,237,207,33,218,52,153,200,151,75,212,94,78,116,33,184,24,116,130,205,192,6,215,128,107,193,245,96,55,216,3,110,1,251,192,215,192,195,224,5,240,18,248,13,120,3,188,5,126,15,142,129,63,131,156,241,232,7,184,8,12,131,61,224,126,240,\r
+  60,248,12,140,173,32,170,7,231,130,207,129,65,112,19,120,8,60,7,142,130,137,62,162,101,96,8,220,3,14,131,194,74,162,6,208,11,246,130,23,64,69,21,198,2,46,7,119,130,159,129,195,192,152,64,84,14,2,160,13,92,2,110,0,247,129,199,193,155,224,47,160,122,34,\r
+  209,82,208,1,194,224,10,176,3,220,4,110,6,183,130,253,224,0,184,7,220,7,126,12,30,1,143,129,39,192,211,224,57,240,2,120,5,188,14,222,1,71,193,123,224,35,240,9,48,38,17,101,130,28,224,5,227,64,37,152,4,166,130,5,96,45,184,8,108,6,131,224,42,240,37,112,\r
+  27,184,11,220,7,30,6,79,130,151,192,49,112,28,56,176,174,121,160,6,204,6,243,192,74,208,10,58,64,23,8,131,56,216,14,174,7,119,128,123,192,15,193,65,240,34,120,21,188,1,222,1,89,83,136,138,64,57,152,6,230,129,117,32,14,174,0,55,128,187,192,15,193,35,224,\r
+  73,240,34,56,12,254,2,114,171,137,202,192,20,48,15,44,7,171,193,6,96,129,109,96,39,184,29,124,7,252,4,188,8,94,5,111,130,35,128,79,37,42,0,147,192,92,176,28,180,130,16,184,4,92,7,110,3,223,2,7,193,227,224,85,240,14,248,35,120,31,124,10,140,26,248,15,\r
+  152,0,102,129,115,64,11,184,0,92,12,182,128,1,176,27,236,3,7,192,67,224,41,240,75,240,6,56,2,142,129,227,224,99,192,166,17,185,65,33,168,2,53,32,0,230,128,38,112,17,136,130,171,193,126,240,3,240,56,120,21,188,13,62,4,206,233,40,15,42,64,29,152,11,22,\r
+  129,53,224,34,208,3,34,96,24,108,7,95,4,251,192,215,193,207,192,99,224,105,240,30,200,171,197,122,129,82,48,13,204,7,107,65,39,136,130,47,128,59,193,195,224,73,240,18,120,11,124,8,204,58,204,51,152,0,234,65,51,88,11,54,128,77,160,15,216,32,14,134,193,\r
+  213,224,26,112,61,216,11,110,7,223,5,15,128,159,131,23,193,155,224,8,248,61,248,35,248,19,248,8,124,12,62,3,78,196,36,132,40,202,2,69,160,152,84,220,26,11,198,129,82,80,6,16,82,8,97,131,16,22,8,97,128,176,237,9,91,156,176,125,9,219,138,224,254,4,119,\r
+  37,184,28,193,101,8,203,77,88,30,194,244,18,166,133,48,60,66,115,228,7,1,48,3,212,3,132,79,66,88,165,217,96,14,152,171,227,232,124,112,22,104,0,141,96,1,56,27,156,3,22,130,69,96,49,169,88,187,12,156,7,54,128,78,208,5,186,129,69,106,124,201,31,151,150,\r
+  247,151,170,49,51,253,236,214,186,176,139,121,224,218,158,173,245,131,176,231,165,213,229,213,115,246,152,182,231,106,123,158,78,75,234,99,180,238,209,243,42,234,47,208,250,83,186,108,73,90,157,98,174,159,47,85,186,152,227,151,117,158,201,105,245,76,\r
+  213,245,228,107,253,48,244,66,173,31,45,85,109,138,57,255,64,215,35,244,79,116,61,181,186,158,49,122,29,204,50,213,31,177,22,217,101,106,14,235,117,158,38,173,139,182,86,104,189,16,121,86,106,93,180,219,172,117,31,236,45,90,15,64,95,165,245,70,232,171,\r
+  181,126,30,244,53,90,111,131,126,190,214,47,132,222,170,245,238,52,123,56,77,79,64,95,167,245,203,210,236,187,210,244,221,105,250,45,105,117,238,79,179,127,27,122,155,214,239,77,179,31,40,29,209,197,156,175,213,186,152,207,100,61,15,164,229,23,243,185,\r
+  94,235,63,133,253,2,173,63,145,150,231,80,154,254,90,153,242,205,153,122,110,55,106,253,8,236,237,90,63,150,166,127,2,189,67,235,25,226,142,160,117,15,244,207,105,189,76,220,27,180,94,13,253,34,173,7,210,236,194,199,54,105,125,30,236,65,173,159,151,150,\r
+  191,173,92,248,57,163,97,82,50,135,137,125,63,137,226,164,228,191,73,201,232,65,45,15,106,249,144,150,15,107,249,136,206,255,115,18,177,194,71,110,166,100,1,19,113,99,38,253,23,9,89,65,89,76,196,16,149,94,161,211,43,144,82,196,132,207,23,209,86,225,79,\r
+  216,117,15,72,89,65,79,72,89,78,191,148,114,38,189,35,101,22,29,149,62,63,153,150,67,58,16,129,254,68,98,127,58,233,70,41,199,208,126,200,76,68,49,67,202,89,244,33,137,125,94,45,159,179,180,61,11,17,225,35,57,110,245,156,135,118,111,144,178,136,110,210,\r
+  207,183,106,121,167,152,127,157,46,228,110,41,77,186,89,63,239,147,210,160,219,73,237,211,59,180,252,170,148,140,238,210,242,91,36,246,37,167,189,82,78,165,111,146,216,131,147,100,251,5,136,120,191,149,114,62,29,150,178,148,222,38,177,95,107,105,64,203,\r
+  15,72,196,233,57,244,31,36,226,72,54,61,47,229,88,122,159,68,44,81,227,24,139,136,43,100,25,162,230,143,164,172,161,191,74,121,14,153,114,93,2,50,189,28,51,176,67,202,18,218,165,159,175,149,114,30,189,43,215,171,78,230,27,143,26,95,39,177,78,170,92,5,\r
+  236,61,90,246,74,153,71,125,82,142,37,7,83,210,41,215,115,178,204,239,195,10,133,164,244,211,102,41,23,209,22,41,11,40,172,101,191,148,11,201,150,114,44,13,105,121,185,148,115,233,74,41,43,233,58,41,189,116,189,148,57,244,37,41,157,180,71,251,205,94,\r
+  157,254,21,41,103,211,45,82,102,210,215,164,116,211,215,117,190,111,72,153,65,7,164,84,235,32,252,236,110,41,203,232,95,180,252,142,150,247,104,127,252,174,148,227,233,123,218,254,175,186,220,189,90,126,95,203,251,164,244,209,15,164,108,160,251,165,156,\r
+  67,143,105,249,184,148,19,232,5,41,171,232,144,150,47,106,249,146,78,255,181,126,126,89,203,87,164,204,165,223,72,57,133,94,149,114,58,189,38,229,217,244,134,148,202,143,124,218,143,196,243,155,122,255,188,37,165,242,43,145,255,136,148,141,116,76,202,\r
+  122,58,174,229,95,164,156,70,159,72,57,142,62,149,114,6,125,166,159,137,169,124,76,75,206,84,186,193,212,188,20,50,113,110,21,211,109,36,228,98,122,84,238,87,78,63,147,50,159,188,76,156,77,202,95,167,97,103,124,153,196,249,100,208,21,82,114,122,154,196,\r
+  25,85,72,255,78,226,190,48,86,251,171,218,83,201,51,19,175,88,116,33,98,220,21,250,208,26,175,237,226,204,19,49,93,164,39,32,239,208,233,21,186,252,180,180,242,59,144,126,175,78,247,145,58,87,197,153,120,143,46,191,7,242,144,78,23,119,129,169,208,3,245,\r
+  234,190,112,86,189,178,173,134,92,15,12,157,190,9,108,214,121,226,210,110,72,157,251,213,189,161,131,185,41,234,17,55,168,14,158,133,181,204,64,45,162,173,28,191,186,59,121,89,91,167,155,182,122,102,193,158,197,139,240,218,56,131,115,115,62,55,201,229,\r
+  201,167,182,206,44,218,234,171,160,24,118,191,200,215,214,165,242,26,148,101,110,93,51,135,22,15,184,249,124,254,135,207,108,143,24,143,203,83,253,182,169,219,159,224,87,119,152,42,204,104,212,115,153,28,173,104,91,244,187,214,175,238,96,167,107,219,\r
+  160,124,230,245,206,156,50,246,228,54,3,115,105,177,35,27,49,227,24,218,20,113,202,205,108,223,20,68,169,108,86,253,214,201,185,231,201,220,213,239,136,248,107,202,254,44,241,171,181,107,139,170,124,34,165,136,203,123,9,159,143,60,94,196,151,182,173,\r
+  238,244,116,206,118,176,155,93,119,109,115,206,199,200,16,215,143,25,232,175,24,227,106,191,136,247,152,89,111,14,198,184,13,54,47,93,232,201,150,119,180,12,60,137,177,110,240,171,179,182,192,89,72,85,60,27,249,196,44,180,197,115,168,109,102,46,217,158,\r
+  165,200,149,205,230,179,198,17,155,239,60,236,197,145,28,139,144,195,109,172,157,40,222,21,25,125,191,237,70,50,204,217,155,198,209,186,56,230,193,40,34,175,113,33,180,100,254,182,68,14,250,29,192,72,178,77,209,127,83,206,195,108,90,226,16,249,231,27,\r
+  46,154,187,201,65,222,2,81,70,180,85,140,56,103,123,138,196,200,78,104,163,250,191,197,90,10,159,187,218,175,238,116,29,222,92,61,206,42,204,97,212,39,246,82,135,7,20,228,201,49,51,249,143,232,203,126,245,253,67,212,35,110,123,185,41,251,190,148,189,\r
+  94,218,185,190,21,127,195,175,252,185,205,147,39,247,132,240,32,209,238,119,252,234,94,220,230,203,67,31,197,205,27,227,172,244,160,215,101,104,57,55,149,239,190,211,230,43,151,249,114,225,241,98,36,63,70,190,167,132,223,185,188,69,81,95,9,226,111,149,\r
+  153,133,222,56,209,171,142,61,69,120,170,160,104,160,150,246,100,118,236,41,192,83,57,158,38,203,167,66,212,187,16,107,157,109,142,115,68,81,47,86,16,122,133,89,132,114,249,84,102,58,96,75,32,190,187,205,121,230,231,168,194,45,158,241,158,74,237,183,\r
+  123,161,69,113,227,185,112,223,24,104,33,156,77,182,111,179,252,220,130,243,190,10,117,70,61,242,60,54,11,105,194,162,89,52,153,137,27,161,237,51,209,243,54,209,39,7,246,175,207,65,162,70,23,90,245,26,182,103,72,247,228,99,242,78,158,208,51,7,227,233,\r
+  204,40,166,150,12,167,203,91,92,150,145,37,53,59,16,167,54,103,182,49,207,40,36,47,247,78,156,176,116,46,121,29,91,61,131,152,135,108,103,139,211,116,120,199,120,165,180,3,151,210,151,77,225,105,194,187,197,168,84,239,247,80,245,157,57,102,245,7,224,\r
+  125,112,12,188,4,196,225,97,152,242,61,96,228,103,251,57,244,15,61,159,248,163,210,197,93,178,8,251,241,18,82,247,23,110,84,223,202,166,124,133,213,221,204,248,244,59,88,205,62,70,58,186,224,221,47,160,124,166,213,231,149,113,214,148,145,15,239,125,1,\r
+  237,99,129,213,84,105,228,98,207,59,100,188,155,27,80,49,54,186,174,143,42,151,184,165,63,39,203,44,77,166,5,22,163,76,182,244,193,100,90,75,42,237,236,84,154,75,222,254,16,135,117,218,160,179,77,70,6,81,167,67,239,123,43,160,246,76,235,66,111,90,124,\r
+  49,224,139,194,18,13,52,227,118,84,253,215,145,241,244,235,186,196,123,113,59,198,148,171,251,32,126,226,1,21,251,189,158,188,212,158,185,60,144,220,51,133,178,79,73,251,213,218,190,206,51,70,182,207,245,222,187,54,160,222,61,109,207,114,217,87,25,235,\r
+  80,159,151,170,63,53,116,59,55,4,212,57,146,43,203,169,55,211,175,164,217,156,58,126,127,245,12,99,91,161,199,150,204,255,173,51,228,95,153,154,11,213,143,123,79,209,143,7,78,97,123,36,205,102,234,182,30,15,168,239,11,188,76,124,163,208,17,224,164,164,\r
+  65,27,103,32,238,29,219,24,112,209,198,128,83,91,51,225,199,88,73,207,198,128,137,244,12,236,199,177,232,79,21,249,88,190,30,175,88,147,95,5,212,89,125,234,254,183,45,46,162,232,218,86,50,207,175,62,46,124,195,144,254,247,202,105,203,204,92,246,217,103,\r
+  114,220,11,23,144,25,20,101,220,104,71,156,213,191,11,168,239,57,218,182,231,99,157,196,41,229,198,73,55,142,90,175,68,20,241,228,98,215,187,177,251,189,66,154,182,167,64,72,135,141,53,204,164,44,167,107,251,96,70,147,246,17,177,166,110,180,37,124,244,\r
+  163,128,250,174,195,235,105,141,161,39,226,140,101,56,99,153,58,233,166,139,87,62,18,41,54,206,45,85,95,150,144,78,215,86,182,99,208,217,130,249,173,254,67,36,48,150,118,102,226,228,59,98,123,206,194,8,171,197,69,143,171,113,38,191,191,17,178,64,147,\r
+  173,207,218,49,51,212,123,159,151,90,175,66,219,78,217,182,115,62,51,208,242,252,204,76,180,137,158,227,4,247,86,213,87,186,40,178,112,28,221,242,32,90,121,223,246,184,97,207,102,243,152,184,89,40,221,246,13,11,191,117,136,154,68,31,179,68,31,175,100,\r
+  123,84,31,189,158,234,23,212,220,139,245,154,57,67,125,239,48,122,238,213,136,133,77,140,213,73,110,30,93,187,10,171,134,178,127,38,189,163,137,22,205,24,241,169,76,29,59,86,207,80,107,25,217,80,74,109,131,233,181,206,67,155,202,135,99,240,97,81,38,79,\r
+  175,229,38,36,151,161,162,214,103,145,219,16,35,103,134,156,117,150,199,108,79,14,234,119,103,138,181,203,165,44,215,175,110,252,140,166,177,15,165,215,86,191,215,250,156,23,210,246,229,227,140,21,235,44,98,129,88,151,2,33,157,174,103,7,51,214,136,17,\r
+  231,87,191,124,230,156,107,85,206,255,60,115,206,243,145,211,246,136,211,210,157,229,205,159,91,90,67,222,202,9,101,179,113,18,44,193,253,216,59,110,246,131,149,36,106,17,117,124,79,212,225,43,20,146,121,29,75,29,217,142,171,214,61,62,198,246,141,81,\r
+  150,162,165,206,108,231,85,61,143,23,37,235,61,228,118,179,234,215,208,143,171,113,83,199,165,254,135,55,190,238,102,25,243,221,37,244,247,142,96,42,245,124,150,222,159,127,166,39,162,166,234,95,255,227,61,88,163,123,48,233,255,221,131,53,178,7,88,102,\r
+  166,190,29,20,190,37,226,144,95,75,17,191,196,187,91,92,250,30,151,119,150,23,102,168,239,50,209,71,156,251,46,202,230,227,140,255,37,111,225,132,165,56,247,29,157,78,156,251,242,12,143,83,189,41,238,145,46,244,59,7,251,31,124,226,245,78,168,194,169,\r
+  111,136,83,63,3,39,123,139,201,13,113,218,111,229,213,239,230,240,234,163,224,119,224,136,240,247,124,244,173,84,238,93,68,61,62,189,168,166,196,168,174,158,50,189,174,38,45,222,26,245,35,123,195,208,214,172,122,117,7,158,199,93,36,102,196,70,142,92,\r
+  242,46,172,254,88,140,79,197,228,194,122,21,7,196,29,74,220,118,199,241,159,202,59,84,37,90,171,192,251,219,60,68,15,219,115,9,118,168,155,45,96,5,152,109,59,48,137,2,24,241,185,50,191,29,152,72,30,179,109,70,1,110,182,117,178,254,100,138,151,219,129,\r
+  9,228,225,42,205,47,230,247,125,146,191,239,18,63,201,239,92,197,123,206,116,216,102,37,191,60,213,63,11,79,120,94,115,194,179,40,95,72,234,236,205,71,239,152,182,9,124,90,102,232,116,175,62,103,199,105,123,133,150,92,227,211,243,53,141,230,74,123,173,\r
+  182,215,34,58,43,201,100,60,101,250,159,131,70,206,116,174,125,35,121,150,155,41,157,105,187,43,245,93,50,199,76,179,84,126,33,115,82,101,132,116,234,52,39,242,113,109,115,105,153,169,101,242,187,232,92,217,43,210,247,11,49,198,153,122,44,62,105,159,\r
+  169,125,120,102,170,215,170,252,44,45,103,235,114,201,126,10,153,163,219,23,122,94,42,61,47,109,76,57,169,177,22,167,250,161,234,246,232,246,124,169,156,106,92,62,157,155,145,122,223,102,213,132,247,41,103,99,200,14,37,206,38,126,118,3,21,45,137,244,\r
+  71,35,182,101,39,214,88,86,108,125,200,218,86,183,57,56,24,36,182,156,248,242,38,98,77,196,155,166,2,168,43,136,175,104,166,242,21,3,93,214,162,174,46,43,30,15,117,134,194,161,196,240,170,72,183,181,38,22,25,12,117,91,49,42,94,105,13,119,70,130,177,238,\r
+  165,161,120,127,40,30,111,14,197,19,150,141,4,214,76,188,25,181,53,163,154,230,102,50,154,241,128,143,21,226,163,153,138,154,131,118,119,44,18,234,246,7,163,81,255,162,174,68,104,16,53,55,208,172,209,246,104,52,28,234,10,38,66,17,123,98,50,79,115,168,\r
+  199,234,26,238,10,91,75,130,225,112,103,176,107,75,188,129,198,158,174,84,122,82,87,196,70,207,18,254,37,66,14,37,210,147,122,99,193,104,95,168,43,238,95,18,180,7,131,168,112,252,41,146,34,225,72,108,121,40,156,176,98,167,79,111,9,38,98,161,161,6,154,\r
+  250,55,211,71,85,85,114,114,214,53,193,144,141,254,21,159,156,178,214,234,66,66,65,42,33,18,247,47,30,176,187,195,86,3,21,166,27,155,22,135,236,110,81,251,72,29,131,88,106,63,22,107,217,160,37,42,31,55,58,161,37,34,166,75,167,77,29,157,38,156,100,226,\r
+  106,123,121,164,107,32,190,164,47,104,247,90,201,69,78,239,74,42,107,250,144,82,198,115,99,145,129,104,3,205,57,57,165,45,102,89,171,59,227,86,108,208,138,161,149,115,195,145,206,96,184,57,56,28,25,72,140,52,83,241,183,203,53,208,140,209,25,130,233,254,\r
+  234,31,229,189,45,65,59,216,43,138,212,255,221,69,132,195,55,217,61,145,147,250,127,134,50,201,77,210,64,117,163,203,133,236,232,64,162,223,74,244,69,186,253,139,131,113,84,142,103,248,165,141,229,149,94,59,233,244,249,151,117,135,18,145,152,234,78,205,\r
+  233,179,157,84,101,237,25,242,182,72,61,53,59,231,52,119,69,250,253,177,254,120,216,191,25,1,192,127,82,216,152,248,55,227,66,3,45,63,99,5,167,137,28,19,71,175,236,252,127,182,158,6,170,60,83,209,6,170,106,238,14,134,7,67,91,252,65,219,142,36,100,204,\r
+  240,47,179,187,194,145,120,200,238,93,18,14,198,101,48,56,57,79,19,38,54,166,211,43,79,145,222,98,245,119,234,12,22,178,148,159,34,75,107,168,215,14,38,6,98,150,216,48,34,6,251,195,216,91,126,236,176,88,171,181,117,192,178,187,144,146,159,158,162,154,\r
+  171,74,51,53,133,195,86,111,48,172,150,97,217,80,151,21,85,139,61,241,20,121,98,189,3,253,24,123,90,174,130,244,92,8,138,189,106,210,70,140,171,34,173,3,93,125,202,51,210,202,121,211,178,172,238,220,44,99,82,121,154,173,213,234,26,136,193,33,78,83,164,\r
+  21,49,208,238,21,30,57,98,139,89,61,97,212,131,110,12,70,84,232,110,11,198,122,173,244,222,142,59,69,118,213,181,6,26,163,210,6,18,161,176,127,81,44,22,28,22,78,208,64,121,105,102,97,33,207,9,134,6,50,219,54,174,89,70,217,233,62,71,108,61,241,245,77,\r
+  228,88,223,132,31,168,43,200,185,126,69,211,242,229,120,155,135,20,9,43,68,2,30,196,193,182,126,69,59,242,8,69,28,110,235,165,169,185,29,169,205,237,56,250,214,183,163,112,187,172,136,181,147,209,46,202,225,163,89,168,205,228,104,95,33,116,19,2,199,101,\r
+  187,176,226,152,116,182,55,75,179,67,72,216,59,112,54,119,52,145,183,227,100,103,40,232,56,197,90,184,85,92,154,24,8,4,82,250,140,52,189,62,77,159,153,166,207,74,211,103,167,233,115,210,244,185,105,250,60,232,89,74,95,30,14,246,198,41,103,84,64,164,194,\r
+  224,41,2,47,57,131,50,34,137,146,66,54,7,59,173,48,101,4,245,241,78,99,131,221,221,167,62,6,40,51,168,125,56,78,172,147,242,197,225,191,120,32,145,136,216,107,98,104,198,234,38,103,103,4,143,253,144,242,80,36,103,151,60,207,201,213,37,143,173,110,114,\r
+  224,222,16,140,81,86,151,8,85,17,156,178,139,18,226,33,117,50,83,174,124,104,139,5,237,120,79,36,214,79,57,226,214,128,227,56,46,115,163,34,117,121,64,69,145,1,60,151,118,197,172,96,226,228,48,40,194,51,153,221,161,158,30,98,22,57,44,113,174,146,175,\r
+  7,135,242,41,179,198,23,15,183,137,90,51,69,14,121,206,146,163,71,138,236,158,145,83,183,155,178,228,147,136,92,77,221,84,138,237,49,170,182,229,105,137,101,39,38,142,186,180,101,202,84,185,10,121,41,181,37,24,223,130,54,198,8,195,200,13,74,223,150,40,\r
+  7,102,17,154,176,78,86,44,78,25,226,81,184,32,185,133,166,51,101,139,29,43,198,218,22,234,183,100,43,231,89,161,222,190,4,21,64,149,167,76,122,31,133,177,89,239,246,213,118,43,166,210,178,101,21,216,213,193,86,68,73,85,133,218,227,178,163,114,17,16,86,\r
+  229,220,103,143,24,80,153,11,79,107,131,219,54,36,149,141,148,37,148,72,36,33,90,35,15,30,90,135,225,71,253,173,216,227,161,46,139,114,97,89,103,135,132,39,136,113,201,222,156,120,175,144,163,94,31,74,57,180,40,115,1,150,40,178,173,45,178,5,157,45,75,\r
+  61,203,76,97,11,71,80,52,28,28,94,30,11,98,252,38,82,55,200,207,141,196,250,168,4,139,8,167,28,181,42,231,69,68,43,121,58,37,26,93,19,28,16,126,236,73,25,214,90,113,120,124,202,178,56,229,242,148,163,44,56,252,150,70,182,97,55,165,30,215,69,169,48,245,\r
+  32,15,198,243,66,221,221,232,173,110,166,37,130,54,100,153,81,134,88,176,55,89,167,52,160,26,93,167,188,142,82,129,126,176,98,98,99,104,239,201,232,11,198,149,191,22,247,193,179,90,35,61,122,153,99,145,126,53,49,200,130,210,210,187,205,190,8,66,48,11,\r
+  145,27,222,177,90,70,245,56,25,161,254,126,202,19,239,39,161,96,120,73,48,26,111,193,130,80,142,54,180,90,225,101,118,119,42,29,143,240,139,24,54,138,188,190,180,13,71,45,202,150,234,197,234,42,67,25,104,108,125,48,60,128,189,31,194,81,178,197,66,99,\r
+  241,38,59,158,8,226,56,69,106,124,117,52,136,179,149,198,134,226,109,17,156,109,203,134,162,216,239,210,5,151,217,65,172,96,55,234,142,235,213,36,215,22,107,120,137,232,79,241,150,211,188,229,228,36,19,90,251,196,140,58,194,50,154,229,192,7,172,152,232,\r
+  222,42,220,55,200,12,91,61,9,114,134,45,187,55,209,71,78,221,85,102,147,105,11,63,113,217,214,182,85,66,201,176,147,161,35,219,78,223,174,206,72,167,136,65,100,70,194,221,125,242,115,27,229,71,236,228,27,209,18,25,131,176,159,70,76,75,173,120,34,22,25,\r
+  22,142,51,98,212,206,149,86,50,233,93,165,35,166,214,224,160,149,156,47,181,7,211,242,203,201,31,93,69,107,34,18,141,194,84,140,80,33,251,113,194,197,19,157,183,225,91,219,40,39,146,254,6,65,185,145,81,49,158,178,35,182,220,12,50,124,80,102,196,78,58,\r
+  118,142,84,91,6,194,137,80,84,44,137,124,132,115,102,136,163,67,22,69,142,214,208,37,86,50,72,162,38,181,180,178,38,103,68,45,184,75,201,139,81,110,0,81,63,129,24,230,136,74,199,118,71,131,49,228,148,97,34,39,58,202,189,29,81,25,245,203,163,145,232,64,\r
+  248,180,113,158,197,200,21,83,239,164,84,21,179,122,133,111,196,78,255,186,74,101,49,171,31,67,85,195,95,109,159,112,200,57,98,50,98,26,113,43,65,185,113,17,91,83,47,139,148,141,103,57,137,194,83,169,56,253,169,73,13,90,238,30,81,44,237,78,47,139,53,\r
+  39,61,146,74,240,116,202,183,57,26,19,79,6,201,117,161,180,168,87,122,74,179,184,76,7,113,122,198,85,216,148,14,156,19,31,21,46,221,201,199,176,234,211,5,161,112,120,85,36,33,221,33,59,142,13,147,12,80,40,136,167,84,244,64,102,225,104,170,95,184,42,34,\r
+  25,94,54,242,88,18,87,189,105,26,105,75,143,212,148,199,144,153,232,11,197,201,41,62,39,6,180,156,1,171,56,148,12,212,4,85,76,68,198,64,162,103,158,140,253,108,144,28,131,50,106,184,164,88,221,67,166,120,75,162,60,241,153,238,92,153,194,208,22,89,23,\r
+  183,200,51,120,210,105,49,24,138,37,6,130,97,125,190,185,7,71,166,130,109,35,54,68,124,40,0,102,128,122,48,19,204,34,54,76,223,52,57,237,229,174,220,246,90,186,199,100,183,112,87,57,207,122,150,15,149,111,54,232,151,172,228,141,149,244,144,201,175,229,\r
+  176,231,210,163,38,187,142,185,202,159,228,151,148,191,111,208,245,172,166,246,38,7,209,115,166,113,11,143,111,115,229,62,90,65,191,229,140,80,85,35,253,142,147,107,122,135,193,223,103,57,215,26,236,93,86,80,55,244,145,65,215,48,190,185,145,229,231,135,\r
+  26,121,188,220,65,141,44,203,137,242,92,117,128,207,217,200,87,110,171,165,95,112,118,187,104,237,68,121,8,85,230,222,79,175,40,209,104,92,205,126,207,126,204,92,211,249,179,212,192,63,101,219,248,51,108,219,16,127,227,210,215,118,49,238,112,47,170,109,\r
+  172,107,108,60,187,195,160,237,204,125,153,193,174,100,179,27,239,170,52,140,95,176,0,43,30,19,24,111,240,167,24,103,249,197,14,206,207,71,87,28,204,97,56,221,124,218,1,135,219,73,78,230,228,78,163,166,134,15,78,119,240,26,30,159,78,115,85,23,230,242,\r
+  219,249,29,82,49,133,242,85,254,181,209,214,148,226,72,38,239,23,143,215,137,46,127,161,140,6,33,86,210,97,131,239,227,119,10,251,235,38,12,180,75,76,25,189,100,136,207,47,152,124,224,82,200,29,38,27,128,120,215,16,2,37,111,150,207,215,149,209,167,134,\r
+  202,176,91,101,56,46,51,208,141,6,59,138,133,89,185,178,182,125,101,123,29,125,158,93,38,75,221,107,240,27,249,143,24,10,150,214,210,219,140,237,130,186,139,21,229,249,104,15,231,79,136,199,242,157,124,76,57,239,47,231,121,13,117,43,45,62,176,226,66,\r
+  62,188,130,30,228,198,19,108,135,76,231,249,215,240,88,249,222,142,205,187,12,199,110,206,253,214,57,116,175,46,155,187,211,87,182,151,238,54,28,151,63,205,190,196,63,100,151,160,35,251,13,243,54,126,55,123,129,253,15,210,23,236,108,167,91,84,171,59,\r
+  249,19,84,206,31,252,124,249,74,35,51,206,155,13,215,245,220,224,143,210,70,190,112,58,43,200,11,40,60,205,70,214,51,140,47,104,52,178,143,177,57,11,24,51,220,15,50,94,203,202,114,206,113,184,29,217,51,28,89,155,157,238,58,86,80,196,47,109,104,116,102,\r
+  47,96,229,99,132,125,180,145,47,103,229,185,244,136,193,110,197,12,251,12,182,139,7,152,183,136,103,79,199,40,43,12,218,201,106,199,59,72,42,211,38,56,232,245,64,13,253,196,96,207,161,139,244,170,193,134,92,185,161,50,58,206,216,13,40,252,152,65,7,89,\r
+  121,221,230,149,67,155,198,238,36,94,201,110,228,37,62,94,197,35,166,247,25,86,156,195,39,194,80,230,42,102,197,11,139,51,139,151,22,243,226,154,98,83,229,170,144,185,224,143,197,231,166,242,231,242,9,34,63,43,25,175,20,94,82,94,82,65,156,153,238,221,\r
+  62,230,157,124,229,118,243,80,217,20,118,188,140,177,67,229,140,125,0,142,141,71,50,203,230,108,183,111,218,246,237,230,193,138,233,236,181,10,50,156,148,43,74,48,111,45,202,28,168,100,187,124,207,139,143,163,226,99,71,21,227,183,131,199,170,200,89,82,\r
+  154,239,133,135,123,213,191,153,200,124,180,10,89,30,152,140,143,103,196,199,17,241,177,99,10,62,246,139,143,131,83,204,171,56,49,32,164,75,235,127,47,133,192,13,206,98,135,166,96,201,171,25,59,80,109,176,7,170,139,216,51,208,143,128,47,78,101,108,63,\r
+  184,31,28,6,123,106,24,251,54,56,8,158,1,7,166,97,232,224,139,211,25,123,13,188,92,203,216,243,117,204,220,237,103,230,1,63,210,252,14,182,127,22,99,247,204,230,236,167,224,240,108,79,218,239,7,146,50,249,119,57,226,251,234,228,223,230,136,239,177,147,\r
+  127,159,147,252,93,169,248,27,29,241,29,118,242,239,116,156,52,242,183,58,134,71,127,191,157,139,58,125,234,247,66,27,160,59,125,42,143,248,255,103,204,163,236,226,255,156,113,159,106,87,252,109,143,161,243,139,255,247,101,250,212,239,37,166,214,171,\r
+  95,84,136,178,242,255,173,121,84,95,197,223,17,253,31,67,245,215,66,128,52,0,0,0,0 };\r
 \r
 //==============================================================================\r
 #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
@@ -309,6 +215,135 @@ static BorderSize<int> androidDisplayCutoutToBorderSize (LocalRef<jobject> displ
              getInset (AndroidDisplayCutout.getSafeInsetRight) };\r
 }\r
 \r
+/* The usage of the KeyPress class relies on its keyCode member having the standard ASCII values\r
+   represent ASCII keycodes. However in the native Android keycodes the values for special keys\r
+   e.g. RETURN, F1-F12 overlap with the ASCII range. Hence we need to translate them.\r
+*/\r
+static constexpr int translateAndroidKeyCode (int keyCode) noexcept\r
+{\r
+    switch (keyCode)\r
+    {\r
+        case 7:   return '0';\r
+        case 8:   return '1';\r
+        case 9:   return '2';\r
+        case 10:  return '3';\r
+        case 11:  return '4';\r
+        case 12:  return '5';\r
+        case 13:  return '6';\r
+        case 14:  return '7';\r
+        case 15:  return '8';\r
+        case 16:  return '9';\r
+        case 17:  return '*';\r
+        case 18:  return '#';\r
+        case 19:  return KeyPress::upKey;             // KEYCODE_DPAD_UP\r
+        case 20:  return KeyPress::downKey;           // KEYCODE_DPAD_DOWN\r
+        case 21:  return KeyPress::leftKey;           // KEYCODE_DPAD_LEFT\r
+        case 22:  return KeyPress::rightKey;          // KEYCODE_DPAD_RIGHT\r
+        case 29:  return 'A';\r
+        case 30:  return 'B';\r
+        case 31:  return 'C';\r
+        case 32:  return 'D';\r
+        case 33:  return 'E';\r
+        case 34:  return 'F';\r
+        case 35:  return 'G';\r
+        case 36:  return 'H';\r
+        case 37:  return 'I';\r
+        case 38:  return 'J';\r
+        case 39:  return 'K';\r
+        case 40:  return 'L';\r
+        case 41:  return 'M';\r
+        case 42:  return 'N';\r
+        case 43:  return 'O';\r
+        case 44:  return 'P';\r
+        case 45:  return 'Q';\r
+        case 46:  return 'R';\r
+        case 47:  return 'S';\r
+        case 48:  return 'T';\r
+        case 49:  return 'U';\r
+        case 50:  return 'V';\r
+        case 51:  return 'W';\r
+        case 52:  return 'X';\r
+        case 53:  return 'Y';\r
+        case 54:  return 'Z';\r
+        case 55:  return ',';\r
+        case 56:  return '.';\r
+        case 61:  return KeyPress::tabKey;            // KEYCODE_TAB\r
+        case 62:  return KeyPress::spaceKey;          // KEYCODE_SPACE\r
+        case 66:  return KeyPress::returnKey;         // KEYCODE_ENTER\r
+        case 67:  return KeyPress::backspaceKey;      // KEYCODE_DEL\r
+        case 68:  return '`';\r
+        case 69:  return '-';\r
+        case 70:  return '=';\r
+        case 71:  return '[';\r
+        case 72:  return ']';\r
+        case 73:  return '\\';\r
+        case 74:  return ';';\r
+        case 75:  return '\'';\r
+        case 76:  return '/';\r
+        case 77:  return '@';\r
+        case 81:  return '+';\r
+        case 85:  return KeyPress::playKey;           // KEYCODE_MEDIA_PLAY_PAUSE\r
+        case 86:  return KeyPress::stopKey;           // KEYCODE_MEDIA_STOP\r
+        case 87:  return KeyPress::fastForwardKey;    // KEYCODE_MEDIA_NEXT\r
+        case 88:  return KeyPress::rewindKey;         // KEYCODE_MEDIA_PREVIOUS\r
+        case 92:  return KeyPress::pageUpKey;         // KEYCODE_PAGE_UP\r
+        case 93:  return KeyPress::pageDownKey;       // KEYCODE_PAGE_DOWN\r
+        case 111: return KeyPress::escapeKey;         // KEYCODE_ESCAPE\r
+        case 112: return KeyPress::deleteKey;         // KEYCODE_FORWARD_DEL\r
+        case 122: return KeyPress::homeKey;           // KEYCODE_MOVE_HOME\r
+        case 123: return KeyPress::endKey;            // KEYCODE_MOVE_END\r
+        case 124: return KeyPress::insertKey;         // KEYCODE_INSERT\r
+        case 131: return KeyPress::F1Key;             // KEYCODE_F1\r
+        case 132: return KeyPress::F2Key;             // KEYCODE_F2\r
+        case 133: return KeyPress::F3Key;             // KEYCODE_F3\r
+        case 134: return KeyPress::F4Key;             // KEYCODE_F4\r
+        case 135: return KeyPress::F5Key;             // KEYCODE_F5\r
+        case 136: return KeyPress::F6Key;             // KEYCODE_F6\r
+        case 137: return KeyPress::F7Key;             // KEYCODE_F7\r
+        case 138: return KeyPress::F8Key;             // KEYCODE_F8\r
+        case 139: return KeyPress::F9Key;             // KEYCODE_F9\r
+        case 140: return KeyPress::F10Key;            // KEYCODE_F10\r
+        case 141: return KeyPress::F11Key;            // KEYCODE_F11\r
+        case 142: return KeyPress::F12Key;            // KEYCODE_F12\r
+        case 144: return '0';\r
+        case 145: return '1';\r
+        case 146: return '2';\r
+        case 147: return '3';\r
+        case 148: return '4';\r
+        case 149: return '5';\r
+        case 150: return '6';\r
+        case 151: return '7';\r
+        case 152: return '8';\r
+        case 153: return '9';\r
+        case 154: return '/';\r
+        case 155: return '*';\r
+        case 156: return '-';\r
+        case 157: return '+';\r
+        case 158: return '.';\r
+        case 159: return ',';\r
+        case 161: return '=';\r
+        case 162: return '(';\r
+        case 163: return ')';\r
+\r
+        default:  return 0;\r
+    }\r
+}\r
+\r
+static constexpr int translateAndroidKeyboardFlags (int javaFlags) noexcept\r
+{\r
+    constexpr int metaShiftOn = 0x1;\r
+    constexpr int metaAltOn   = 0x02;\r
+    constexpr int metaCtrlOn  = 0x1000;\r
+\r
+    int flags = 0;\r
+\r
+    if ((javaFlags & metaShiftOn) != 0) flags |= ModifierKeys::shiftModifier;\r
+    if ((javaFlags & metaAltOn) != 0)   flags |= ModifierKeys::altModifier;\r
+    if ((javaFlags & metaCtrlOn) != 0)  flags |= ModifierKeys::ctrlModifier;\r
+\r
+    return flags;\r
+}\r
+\r
 //==============================================================================\r
 class AndroidComponentPeer  : public ComponentPeer,\r
                               private Timer\r
@@ -689,9 +724,42 @@ public:
                           index);\r
     }\r
 \r
-    void handleKeyDownCallback (int k, int kc)\r
+    void handleAccessibilityHoverCallback (int command, Point<float> sysPos, int64)\r
+    {\r
+        enum\r
+        {\r
+            TYPE_VIEW_HOVER_ENTER = 0x00000080,\r
+            TYPE_VIEW_HOVER_EXIT  = 0x00000100,\r
+\r
+            ACTION_HOVER_ENTER    = 0x00000009,\r
+            ACTION_HOVER_MOVE     = 0x00000007,\r
+            ACTION_HOVER_EXIT     = 0x0000000a\r
+        };\r
+\r
+        if (auto* topHandler = component.getAccessibilityHandler())\r
+        {\r
+            if (auto* virtualHandler = topHandler->getChildAt ((sysPos / scale).roundToInt()))\r
+            {\r
+                switch (command)\r
+                {\r
+                    case ACTION_HOVER_ENTER:\r
+                    case ACTION_HOVER_MOVE:\r
+                        sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_ENTER, 0);\r
+                        break;\r
+\r
+                    case ACTION_HOVER_EXIT:\r
+                        sendAccessibilityEventImpl (*virtualHandler, TYPE_VIEW_HOVER_EXIT, 0);\r
+                        break;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    void handleKeyDownCallback (int k, int kc, int kbFlags)\r
     {\r
-        handleKeyPress (k, static_cast<juce_wchar> (kc));\r
+        ModifierKeys::currentModifiers = ModifierKeys::currentModifiers.withOnlyMouseButtons()\r
+                                                                       .withFlags (translateAndroidKeyboardFlags (kbFlags));\r
+        handleKeyPress (translateAndroidKeyCode (k), static_cast<juce_wchar> (kc));\r
     }\r
 \r
     void handleKeyUpCallback (int /*k*/, int /*kc*/)\r
@@ -984,7 +1052,8 @@ private:
      CALLBACK (handleMouseDownJni,               "handleMouseDown",               "(JIFFJ)V") \\r
      CALLBACK (handleMouseDragJni,               "handleMouseDrag",               "(JIFFJ)V") \\r
      CALLBACK (handleMouseUpJni,                 "handleMouseUp",                 "(JIFFJ)V") \\r
-     CALLBACK (handleKeyDownJni,                 "handleKeyDown",                 "(JII)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
@@ -1004,9 +1073,10 @@ private:
     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)                         { if (auto* myself = reinterpret_cast<AndroidComponentPeer*> (host)) myself->handleKeyDownCallback ((int) k, (int) kc); }\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
@@ -1933,80 +2003,80 @@ String SystemClipboard::getTextFromClipboard()
 }\r
 \r
 //==============================================================================\r
-const int extendedKeyModifier       = 0x10000;\r
-\r
-const int KeyPress::spaceKey        = ' ';\r
-const int KeyPress::returnKey       = 66;\r
-const int KeyPress::escapeKey       = 4;\r
-const int KeyPress::backspaceKey    = 67;\r
-const int KeyPress::leftKey         = extendedKeyModifier + 1;\r
-const int KeyPress::rightKey        = extendedKeyModifier + 2;\r
-const int KeyPress::upKey           = extendedKeyModifier + 3;\r
-const int KeyPress::downKey         = extendedKeyModifier + 4;\r
-const int KeyPress::pageUpKey       = extendedKeyModifier + 5;\r
-const int KeyPress::pageDownKey     = extendedKeyModifier + 6;\r
-const int KeyPress::endKey          = extendedKeyModifier + 7;\r
-const int KeyPress::homeKey         = extendedKeyModifier + 8;\r
-const int KeyPress::deleteKey       = extendedKeyModifier + 9;\r
-const int KeyPress::insertKey       = -1;\r
-const int KeyPress::tabKey          = 61;\r
-const int KeyPress::F1Key           = extendedKeyModifier + 10;\r
-const int KeyPress::F2Key           = extendedKeyModifier + 11;\r
-const int KeyPress::F3Key           = extendedKeyModifier + 12;\r
-const int KeyPress::F4Key           = extendedKeyModifier + 13;\r
-const int KeyPress::F5Key           = extendedKeyModifier + 14;\r
-const int KeyPress::F6Key           = extendedKeyModifier + 16;\r
-const int KeyPress::F7Key           = extendedKeyModifier + 17;\r
-const int KeyPress::F8Key           = extendedKeyModifier + 18;\r
-const int KeyPress::F9Key           = extendedKeyModifier + 19;\r
-const int KeyPress::F10Key          = extendedKeyModifier + 20;\r
-const int KeyPress::F11Key          = extendedKeyModifier + 21;\r
-const int KeyPress::F12Key          = extendedKeyModifier + 22;\r
-const int KeyPress::F13Key          = extendedKeyModifier + 23;\r
-const int KeyPress::F14Key          = extendedKeyModifier + 24;\r
-const int KeyPress::F15Key          = extendedKeyModifier + 25;\r
-const int KeyPress::F16Key          = extendedKeyModifier + 26;\r
-const int KeyPress::F17Key          = extendedKeyModifier + 50;\r
-const int KeyPress::F18Key          = extendedKeyModifier + 51;\r
-const int KeyPress::F19Key          = extendedKeyModifier + 52;\r
-const int KeyPress::F20Key          = extendedKeyModifier + 53;\r
-const int KeyPress::F21Key          = extendedKeyModifier + 54;\r
-const int KeyPress::F22Key          = extendedKeyModifier + 55;\r
-const int KeyPress::F23Key          = extendedKeyModifier + 56;\r
-const int KeyPress::F24Key          = extendedKeyModifier + 57;\r
-const int KeyPress::F25Key          = extendedKeyModifier + 58;\r
-const int KeyPress::F26Key          = extendedKeyModifier + 59;\r
-const int KeyPress::F27Key          = extendedKeyModifier + 60;\r
-const int KeyPress::F28Key          = extendedKeyModifier + 61;\r
-const int KeyPress::F29Key          = extendedKeyModifier + 62;\r
-const int KeyPress::F30Key          = extendedKeyModifier + 63;\r
-const int KeyPress::F31Key          = extendedKeyModifier + 64;\r
-const int KeyPress::F32Key          = extendedKeyModifier + 65;\r
-const int KeyPress::F33Key          = extendedKeyModifier + 66;\r
-const int KeyPress::F34Key          = extendedKeyModifier + 67;\r
-const int KeyPress::F35Key          = extendedKeyModifier + 68;\r
-const int KeyPress::numberPad0      = extendedKeyModifier + 27;\r
-const int KeyPress::numberPad1      = extendedKeyModifier + 28;\r
-const int KeyPress::numberPad2      = extendedKeyModifier + 29;\r
-const int KeyPress::numberPad3      = extendedKeyModifier + 30;\r
-const int KeyPress::numberPad4      = extendedKeyModifier + 31;\r
-const int KeyPress::numberPad5      = extendedKeyModifier + 32;\r
-const int KeyPress::numberPad6      = extendedKeyModifier + 33;\r
-const int KeyPress::numberPad7      = extendedKeyModifier + 34;\r
-const int KeyPress::numberPad8      = extendedKeyModifier + 35;\r
-const int KeyPress::numberPad9      = extendedKeyModifier + 36;\r
-const int KeyPress::numberPadAdd            = extendedKeyModifier + 37;\r
-const int KeyPress::numberPadSubtract       = extendedKeyModifier + 38;\r
-const int KeyPress::numberPadMultiply       = extendedKeyModifier + 39;\r
-const int KeyPress::numberPadDivide         = extendedKeyModifier + 40;\r
-const int KeyPress::numberPadSeparator      = extendedKeyModifier + 41;\r
-const int KeyPress::numberPadDecimalPoint   = extendedKeyModifier + 42;\r
-const int KeyPress::numberPadEquals         = extendedKeyModifier + 43;\r
-const int KeyPress::numberPadDelete         = extendedKeyModifier + 44;\r
-const int KeyPress::playKey         = extendedKeyModifier + 45;\r
-const int KeyPress::stopKey         = extendedKeyModifier + 46;\r
-const int KeyPress::fastForwardKey  = extendedKeyModifier + 47;\r
-const int KeyPress::rewindKey       = extendedKeyModifier + 48;\r
+constexpr int extendedKeyModifier           = 0x10000;\r
+\r
+const int KeyPress::spaceKey                = ' ';\r
+const int KeyPress::returnKey               = extendedKeyModifier + 2;\r
+const int KeyPress::escapeKey               = extendedKeyModifier + 3;\r
+const int KeyPress::backspaceKey            = extendedKeyModifier + 4;\r
+const int KeyPress::leftKey                 = extendedKeyModifier + 5;\r
+const int KeyPress::rightKey                = extendedKeyModifier + 6;\r
+const int KeyPress::upKey                   = extendedKeyModifier + 7;\r
+const int KeyPress::downKey                 = extendedKeyModifier + 8;\r
+const int KeyPress::pageUpKey               = extendedKeyModifier + 9;\r
+const int KeyPress::pageDownKey             = extendedKeyModifier + 10;\r
+const int KeyPress::endKey                  = extendedKeyModifier + 11;\r
+const int KeyPress::homeKey                 = extendedKeyModifier + 12;\r
+const int KeyPress::deleteKey               = extendedKeyModifier + 13;\r
+const int KeyPress::insertKey               = extendedKeyModifier + 14;\r
+const int KeyPress::tabKey                  = extendedKeyModifier + 15;\r
+const int KeyPress::F1Key                   = extendedKeyModifier + 16;\r
+const int KeyPress::F2Key                   = extendedKeyModifier + 17;\r
+const int KeyPress::F3Key                   = extendedKeyModifier + 18;\r
+const int KeyPress::F4Key                   = extendedKeyModifier + 19;\r
+const int KeyPress::F5Key                   = extendedKeyModifier + 20;\r
+const int KeyPress::F6Key                   = extendedKeyModifier + 21;\r
+const int KeyPress::F7Key                   = extendedKeyModifier + 22;\r
+const int KeyPress::F8Key                   = extendedKeyModifier + 23;\r
+const int KeyPress::F9Key                   = extendedKeyModifier + 24;\r
+const int KeyPress::F10Key                  = extendedKeyModifier + 25;\r
+const int KeyPress::F11Key                  = extendedKeyModifier + 26;\r
+const int KeyPress::F12Key                  = extendedKeyModifier + 27;\r
+const int KeyPress::F13Key                  = extendedKeyModifier + 28;\r
+const int KeyPress::F14Key                  = extendedKeyModifier + 29;\r
+const int KeyPress::F15Key                  = extendedKeyModifier + 30;\r
+const int KeyPress::F16Key                  = extendedKeyModifier + 31;\r
+const int KeyPress::F17Key                  = extendedKeyModifier + 32;\r
+const int KeyPress::F18Key                  = extendedKeyModifier + 33;\r
+const int KeyPress::F19Key                  = extendedKeyModifier + 34;\r
+const int KeyPress::F20Key                  = extendedKeyModifier + 35;\r
+const int KeyPress::F21Key                  = extendedKeyModifier + 36;\r
+const int KeyPress::F22Key                  = extendedKeyModifier + 37;\r
+const int KeyPress::F23Key                  = extendedKeyModifier + 38;\r
+const int KeyPress::F24Key                  = extendedKeyModifier + 39;\r
+const int KeyPress::F25Key                  = extendedKeyModifier + 40;\r
+const int KeyPress::F26Key                  = extendedKeyModifier + 41;\r
+const int KeyPress::F27Key                  = extendedKeyModifier + 42;\r
+const int KeyPress::F28Key                  = extendedKeyModifier + 43;\r
+const int KeyPress::F29Key                  = extendedKeyModifier + 44;\r
+const int KeyPress::F30Key                  = extendedKeyModifier + 45;\r
+const int KeyPress::F31Key                  = extendedKeyModifier + 46;\r
+const int KeyPress::F32Key                  = extendedKeyModifier + 47;\r
+const int KeyPress::F33Key                  = extendedKeyModifier + 48;\r
+const int KeyPress::F34Key                  = extendedKeyModifier + 49;\r
+const int KeyPress::F35Key                  = extendedKeyModifier + 50;\r
+const int KeyPress::numberPad0              = extendedKeyModifier + 51;\r
+const int KeyPress::numberPad1              = extendedKeyModifier + 52;\r
+const int KeyPress::numberPad2              = extendedKeyModifier + 53;\r
+const int KeyPress::numberPad3              = extendedKeyModifier + 54;\r
+const int KeyPress::numberPad4              = extendedKeyModifier + 55;\r
+const int KeyPress::numberPad5              = extendedKeyModifier + 56;\r
+const int KeyPress::numberPad6              = extendedKeyModifier + 57;\r
+const int KeyPress::numberPad7              = extendedKeyModifier + 58;\r
+const int KeyPress::numberPad8              = extendedKeyModifier + 59;\r
+const int KeyPress::numberPad9              = extendedKeyModifier + 60;\r
+const int KeyPress::numberPadAdd            = extendedKeyModifier + 61;\r
+const int KeyPress::numberPadSubtract       = extendedKeyModifier + 62;\r
+const int KeyPress::numberPadMultiply       = extendedKeyModifier + 63;\r
+const int KeyPress::numberPadDivide         = extendedKeyModifier + 64;\r
+const int KeyPress::numberPadSeparator      = extendedKeyModifier + 65;\r
+const int KeyPress::numberPadDecimalPoint   = extendedKeyModifier + 66;\r
+const int KeyPress::numberPadEquals         = extendedKeyModifier + 67;\r
+const int KeyPress::numberPadDelete         = extendedKeyModifier + 68;\r
+const int KeyPress::playKey                 = extendedKeyModifier + 69;\r
+const int KeyPress::stopKey                 = extendedKeyModifier + 70;\r
+const int KeyPress::fastForwardKey          = extendedKeyModifier + 71;\r
+const int KeyPress::rewindKey               = extendedKeyModifier + 72;\r
 \r
 //==============================================================================\r
 #ifdef JUCE_PUSH_NOTIFICATIONS_ACTIVITY\r
index 3a3f017d09ee45a765bdd988e863ebb2c62fc7a4..0474ec345a751af49ef2a70e9b7ccbd7ee997367 100644 (file)
@@ -434,7 +434,7 @@ MimeTypeTableEntry MimeTypeTableEntry::table[641] =
     {"psd",      "application/octet-stream"},\r
     {"pvu",      "paleovu/x-pv"},\r
     {"pwz",      "application/vnd.ms-powerpoint"},\r
-    {"py",       "text/x-script.phyton"},\r
+    {"py",       "text/x-script.python"},\r
     {"pyc",      "application/x-bytecode.python"},\r
     {"qcp",      "audio/vnd.qcelp"},\r
     {"qd3",      "x-world/x-3dmf"},\r
index b11b9c7e1e487e195a4df212d00c7a100fbb022e..f3b50115e8ab0227a639146671f4e1432c798812 100644 (file)
@@ -131,6 +131,16 @@ public:
     ~Native() override\r
     {\r
         exitModalState (0);\r
+\r
+        // Our old peer may not have received a becomeFirstResponder call at this point,\r
+        // so the static currentlyFocusedPeer may be null.\r
+        // We'll try to find an appropriate peer to focus.\r
+\r
+        for (auto i = 0; i < ComponentPeer::getNumPeers(); ++i)\r
+            if (auto* p = ComponentPeer::getPeer (i))\r
+                if (p != getPeer())\r
+                    if (auto* view = (UIView*) p->getNativeHandle())\r
+                        [view becomeFirstResponder];\r
     }\r
 \r
     void launch() override\r
@@ -300,9 +310,8 @@ private:
     void pickerWasCancelled()\r
     {\r
         cancelPendingUpdate();\r
-\r
         owner.finished ({});\r
-        exitModalState (0);\r
+        // Calling owner.finished will delete this Pimpl instance, so don't call any more member functions here!\r
     }\r
 \r
     //==============================================================================\r
index d52eadaebc10632d8d4f2f26b716c35e251bc7ac..8ff1ddfc070b25371a25a9355b2afd58cd3a9f94 100644 (file)
@@ -283,6 +283,11 @@ public:
     static MultiTouchMapper<UITouch*> currentTouches;\r
 \r
 private:\r
+    void appStyleChanged() override\r
+    {\r
+        [controller setNeedsStatusBarAppearanceUpdate];\r
+    }\r
+\r
     //==============================================================================\r
     class AsyncRepaintMessage  : public CallbackMessage\r
     {\r
@@ -395,6 +400,24 @@ MultiTouchMapper<UITouch*> UIViewComponentPeer::currentTouches;
 \r
 - (UIStatusBarStyle) preferredStatusBarStyle\r
 {\r
+   #if defined (__IPHONE_13_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0\r
+    if (@available (iOS 13.0, *))\r
+    {\r
+        if (auto* peer = getViewPeer (self))\r
+        {\r
+            switch (peer->getAppStyle())\r
+            {\r
+                case ComponentPeer::Style::automatic:\r
+                    return UIStatusBarStyleDefault;\r
+                case ComponentPeer::Style::light:\r
+                    return UIStatusBarStyleDarkContent;\r
+                case ComponentPeer::Style::dark:\r
+                    return UIStatusBarStyleLightContent;\r
+            }\r
+        }\r
+    }\r
+   #endif\r
+\r
     return UIStatusBarStyleDefault;\r
 }\r
 \r
@@ -680,8 +703,13 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp, int windowStyleFlags,
     Desktop::getInstance().addFocusChangeListener (this);\r
 }\r
 \r
+static UIViewComponentPeer* currentlyFocusedPeer = nullptr;\r
+\r
 UIViewComponentPeer::~UIViewComponentPeer()\r
 {\r
+    if (currentlyFocusedPeer == this)\r
+        currentlyFocusedPeer = nullptr;\r
+\r
     currentTouches.deleteAllTouchesForPeer (this);\r
     Desktop::getInstance().removeFocusChangeListener (this);\r
 \r
@@ -1007,8 +1035,6 @@ void UIViewComponentPeer::onScroll (UIPanGestureRecognizer* gesture)
 #endif\r
 \r
 //==============================================================================\r
-static UIViewComponentPeer* currentlyFocusedPeer = nullptr;\r
-\r
 void UIViewComponentPeer::viewFocusGain()\r
 {\r
     if (currentlyFocusedPeer != this)\r
index d351642fda95a39dcd3d02ea121d629b4d06e2e7..1ed8e31ade1352d6e4fd5eaae6f2454e1dace818 100644 (file)
@@ -40,6 +40,66 @@ namespace juce
 namespace juce\r
 {\r
 \r
+//==============================================================================\r
+static constexpr int translateVirtualToAsciiKeyCode (int keyCode) noexcept\r
+{\r
+    switch (keyCode)\r
+    {\r
+        // The virtual keycodes are from HIToolbox/Events.h\r
+        case 0x00: return 'A';\r
+        case 0x01: return 'S';\r
+        case 0x02: return 'D';\r
+        case 0x03: return 'F';\r
+        case 0x04: return 'H';\r
+        case 0x05: return 'G';\r
+        case 0x06: return 'Z';\r
+        case 0x07: return 'X';\r
+        case 0x08: return 'C';\r
+        case 0x09: return 'V';\r
+        case 0x0B: return 'B';\r
+        case 0x0C: return 'Q';\r
+        case 0x0D: return 'W';\r
+        case 0x0E: return 'E';\r
+        case 0x0F: return 'R';\r
+        case 0x10: return 'Y';\r
+        case 0x11: return 'T';\r
+        case 0x12: return '1';\r
+        case 0x13: return '2';\r
+        case 0x14: return '3';\r
+        case 0x15: return '4';\r
+        case 0x16: return '6';\r
+        case 0x17: return '5';\r
+        case 0x18: return '=';  // kVK_ANSI_Equal\r
+        case 0x19: return '9';\r
+        case 0x1A: return '7';\r
+        case 0x1B: return '-';  // kVK_ANSI_Minus\r
+        case 0x1C: return '8';\r
+        case 0x1D: return '0';\r
+        case 0x1E: return ']';  // kVK_ANSI_RightBracket\r
+        case 0x1F: return 'O';\r
+        case 0x20: return 'U';\r
+        case 0x21: return '[';  // kVK_ANSI_LeftBracket\r
+        case 0x22: return 'I';\r
+        case 0x23: return 'P';\r
+        case 0x25: return 'L';\r
+        case 0x26: return 'J';\r
+        case 0x27: return '"';  // kVK_ANSI_Quote\r
+        case 0x28: return 'K';\r
+        case 0x29: return ';';  // kVK_ANSI_Semicolon\r
+        case 0x2A: return '\\'; // kVK_ANSI_Backslash\r
+        case 0x2B: return ',';  // kVK_ANSI_Comma\r
+        case 0x2C: return '/';  // kVK_ANSI_Slash\r
+        case 0x2D: return 'N';\r
+        case 0x2E: return 'M';\r
+        case 0x2F: return '.';  // kVK_ANSI_Period\r
+        case 0x32: return '`';  // kVK_ANSI_Grave\r
+\r
+        default:   return keyCode;\r
+    }\r
+}\r
+\r
+constexpr int extendedKeyModifier = 0x30000;\r
+\r
 //==============================================================================\r
 class NSViewComponentPeer  : public ComponentPeer,\r
                              private Timer\r
@@ -137,8 +197,7 @@ public:
             [window setExcludedFromWindowsMenu: (windowStyleFlags & windowIsTemporary) != 0];\r
             [window setIgnoresMouseEvents: (windowStyleFlags & windowIgnoresMouseClicks) != 0];\r
 \r
-            if ((windowStyleFlags & windowHasMaximiseButton) == windowHasMaximiseButton)\r
-                [window setCollectionBehavior: NSWindowCollectionBehaviorFullScreenPrimary];\r
+            setCollectionBehaviour (false);\r
 \r
             [window setRestorable: NO];\r
 \r
@@ -347,22 +406,42 @@ public:
         return [window isMiniaturized];\r
     }\r
 \r
+    NSWindowCollectionBehavior getCollectionBehavior (bool forceFullScreen) const\r
+    {\r
+        if (forceFullScreen)\r
+            return NSWindowCollectionBehaviorFullScreenPrimary;\r
+\r
+        // Some SDK versions don't define NSWindowCollectionBehaviorFullScreenNone\r
+        constexpr auto fullScreenNone = (NSUInteger) (1 << 9);\r
+\r
+        return (getStyleFlags() & (windowHasMaximiseButton | windowIsResizable)) == (windowHasMaximiseButton | windowIsResizable)\r
+             ? NSWindowCollectionBehaviorFullScreenPrimary\r
+             : fullScreenNone;\r
+    }\r
+\r
+    void setCollectionBehaviour (bool forceFullScreen) const\r
+    {\r
+        [window setCollectionBehavior: getCollectionBehavior (forceFullScreen)];\r
+    }\r
+\r
     void setFullScreen (bool shouldBeFullScreen) override\r
     {\r
-        if (! isSharedWindow)\r
-        {\r
-            if (isMinimised())\r
-                setMinimised (false);\r
+        if (isSharedWindow)\r
+            return;\r
 \r
-            if (hasNativeTitleBar())\r
-            {\r
-                if (shouldBeFullScreen != isFullScreen())\r
-                    [window toggleFullScreen: nil];\r
-            }\r
-            else\r
-            {\r
-                [window zoom: nil];\r
-            }\r
+        setCollectionBehaviour (shouldBeFullScreen);\r
+\r
+        if (isMinimised())\r
+            setMinimised (false);\r
+\r
+        if (hasNativeTitleBar())\r
+        {\r
+            if (shouldBeFullScreen != isFullScreen())\r
+                [window toggleFullScreen: nil];\r
+        }\r
+        else\r
+        {\r
+            [window zoom: nil];\r
         }\r
     }\r
 \r
@@ -1259,6 +1338,19 @@ public:
         else\r
             keyCode = (int) CharacterFunctions::toUpperCase ((juce_wchar) keyCode);\r
 \r
+        // The purpose of the keyCode is to provide information about non-printing characters to facilitate\r
+        // keyboard control over the application.\r
+        //\r
+        // So when keyCode is decoded as a printing character outside the ASCII range we need to replace it.\r
+        // This holds when the keyCode is larger than 0xff and not part one of the two MacOS specific\r
+        // non-printing ranges.\r
+        if (keyCode > 0xff\r
+            && ! (keyCode >= NSUpArrowFunctionKey && keyCode <= NSModeSwitchFunctionKey)\r
+            && ! (keyCode >= extendedKeyModifier))\r
+        {\r
+            keyCode = translateVirtualToAsciiKeyCode ([ev keyCode]);\r
+        }\r
+\r
         if (([ev modifierFlags] & NSEventModifierFlagNumericPad) != 0)\r
         {\r
             const int numPadConversions[] = { '0', KeyPress::numberPad0, '1', KeyPress::numberPad1,\r
@@ -1458,6 +1550,15 @@ public:
 \r
     void textInputRequired (Point<int>, TextInputTarget&) override {}\r
 \r
+    void dismissPendingTextInput() override\r
+    {\r
+        stringBeingComposed.clear();\r
+        const auto* inputContext = [NSTextInputContext currentInputContext];\r
+\r
+        if (inputContext != nil)\r
+            [inputContext discardMarkedText];\r
+    }\r
+\r
     void resetWindowPresentation()\r
     {\r
         if (hasNativeTitleBar())\r
@@ -1467,6 +1568,7 @@ public:
         }\r
 \r
         [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
+        setCollectionBehaviour (isFullScreen());\r
     }\r
 \r
     void setHasChangedSinceSaved (bool b) override\r
@@ -2215,6 +2317,8 @@ struct JuceNSWindowClass   : public NSViewComponentPeerWrapper<ObjCClass<NSWindo
         addMethod (@selector (accessibilityRole),                   getAccessibilityRole);\r
         addMethod (@selector (accessibilitySubrole),                getAccessibilitySubrole);\r
 \r
+        addMethod (@selector (keyDown:),                            keyDown);\r
+\r
         addMethod (@selector (window:shouldDragDocumentWithEvent:from:withPasteboard:), shouldAllowIconDrag);\r
 \r
         addProtocol (@protocol (NSWindowDelegate));\r
@@ -2226,23 +2330,52 @@ private:
     //==============================================================================\r
     static BOOL isFlipped (id, SEL) { return true; }\r
 \r
-    static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow*, NSRect)\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
+    static void 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
+    static NSRect windowWillUseStandardFrame (id self, SEL, NSWindow*, NSRect r)\r
     {\r
         if (auto* owner = getOwner (self))\r
         {\r
             if (auto* constrainer = owner->getConstrainer())\r
             {\r
-                return flippedScreenRect (makeNSRect (owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()\r
-                                                                                                          .withWidth (constrainer->getMaximumWidth())\r
-                                                                                                          .withHeight (constrainer->getMaximumHeight()))));\r
+                const auto originalBounds = owner->getFrameSize().addedTo (owner->getComponent().getScreenBounds()).toFloat();\r
+                const auto expanded = originalBounds.withWidth  ((float) constrainer->getMaximumWidth())\r
+                                                    .withHeight ((float) constrainer->getMaximumHeight());\r
+                const auto constrained = expanded.constrainedWithin (convertToRectFloat (flippedScreenRect (r)));\r
+                return flippedScreenRect (makeNSRect (constrained));\r
             }\r
         }\r
 \r
-        return makeNSRect (Rectangle<int> (10000, 10000));\r
+        return r;\r
     }\r
 \r
-    static BOOL windowShouldZoomToFrame (id, SEL, NSWindow* window, NSRect frame)\r
+    static BOOL windowShouldZoomToFrame (id self, SEL, NSWindow* window, NSRect frame)\r
     {\r
+        if (auto* owner = getOwner (self))\r
+            if (owner->hasNativeTitleBar() && (owner->getStyleFlags() & ComponentPeer::windowIsResizable) == 0)\r
+                return NO;\r
+\r
         return convertToRectFloat ([window frame]).withZeroOrigin() != convertToRectFloat (frame).withZeroOrigin();\r
     }\r
 \r
@@ -2463,7 +2596,7 @@ void Desktop::setKioskComponent (Component* kioskComp, bool shouldBeEnabled, boo
         else if (! shouldBeEnabled)\r
             [NSApp setPresentationOptions: NSApplicationPresentationDefault];\r
 \r
-        [peer->window toggleFullScreen: nil];\r
+        peer->setFullScreen (true);\r
     }\r
     else\r
     {\r
@@ -2542,27 +2675,27 @@ const int KeyPress::F33Key          = NSF33FunctionKey;
 const int KeyPress::F34Key          = NSF34FunctionKey;\r
 const int KeyPress::F35Key          = NSF35FunctionKey;\r
 \r
-const int KeyPress::numberPad0      = 0x30020;\r
-const int KeyPress::numberPad1      = 0x30021;\r
-const int KeyPress::numberPad2      = 0x30022;\r
-const int KeyPress::numberPad3      = 0x30023;\r
-const int KeyPress::numberPad4      = 0x30024;\r
-const int KeyPress::numberPad5      = 0x30025;\r
-const int KeyPress::numberPad6      = 0x30026;\r
-const int KeyPress::numberPad7      = 0x30027;\r
-const int KeyPress::numberPad8      = 0x30028;\r
-const int KeyPress::numberPad9      = 0x30029;\r
-const int KeyPress::numberPadAdd            = 0x3002a;\r
-const int KeyPress::numberPadSubtract       = 0x3002b;\r
-const int KeyPress::numberPadMultiply       = 0x3002c;\r
-const int KeyPress::numberPadDivide         = 0x3002d;\r
-const int KeyPress::numberPadSeparator      = 0x3002e;\r
-const int KeyPress::numberPadDecimalPoint   = 0x3002f;\r
-const int KeyPress::numberPadEquals         = 0x30030;\r
-const int KeyPress::numberPadDelete         = 0x30031;\r
-const int KeyPress::playKey         = 0x30000;\r
-const int KeyPress::stopKey         = 0x30001;\r
-const int KeyPress::fastForwardKey  = 0x30002;\r
-const int KeyPress::rewindKey       = 0x30003;\r
+const int KeyPress::numberPad0              = extendedKeyModifier + 0x20;\r
+const int KeyPress::numberPad1              = extendedKeyModifier + 0x21;\r
+const int KeyPress::numberPad2              = extendedKeyModifier + 0x22;\r
+const int KeyPress::numberPad3              = extendedKeyModifier + 0x23;\r
+const int KeyPress::numberPad4              = extendedKeyModifier + 0x24;\r
+const int KeyPress::numberPad5              = extendedKeyModifier + 0x25;\r
+const int KeyPress::numberPad6              = extendedKeyModifier + 0x26;\r
+const int KeyPress::numberPad7              = extendedKeyModifier + 0x27;\r
+const int KeyPress::numberPad8              = extendedKeyModifier + 0x28;\r
+const int KeyPress::numberPad9              = extendedKeyModifier + 0x29;\r
+const int KeyPress::numberPadAdd            = extendedKeyModifier + 0x2a;\r
+const int KeyPress::numberPadSubtract       = extendedKeyModifier + 0x2b;\r
+const int KeyPress::numberPadMultiply       = extendedKeyModifier + 0x2c;\r
+const int KeyPress::numberPadDivide         = extendedKeyModifier + 0x2d;\r
+const int KeyPress::numberPadSeparator      = extendedKeyModifier + 0x2e;\r
+const int KeyPress::numberPadDecimalPoint   = extendedKeyModifier + 0x2f;\r
+const int KeyPress::numberPadEquals         = extendedKeyModifier + 0x30;\r
+const int KeyPress::numberPadDelete         = extendedKeyModifier + 0x31;\r
+const int KeyPress::playKey                 = extendedKeyModifier + 0x00;\r
+const int KeyPress::stopKey                 = extendedKeyModifier + 0x01;\r
+const int KeyPress::fastForwardKey          = extendedKeyModifier + 0x02;\r
+const int KeyPress::rewindKey               = extendedKeyModifier + 0x03;\r
 \r
 } // namespace juce\r
index 4a213680cadda6bf63189a046920ab6880f0fc3a..d00412b355d9b0581325ebf8fd54d3697f0001fa 100644 (file)
   ==============================================================================\r
 */\r
 \r
-#if JUCE_MINGW\r
-LWSTDAPI IUnknown_GetWindow (IUnknown* punk, HWND* phwnd);\r
-#endif\r
-\r
 namespace juce\r
 {\r
 \r
@@ -253,7 +249,9 @@ private:
             JUCE_COMRESULT updateHwnd (IFileDialog* d)\r
             {\r
                 HWND hwnd = nullptr;\r
-                IUnknown_GetWindow (d, &hwnd);\r
+\r
+                if (auto window = ComSmartPtr<IFileDialog> { d }.getInterface<IOleWindow>())\r
+                    window->GetWindow (&hwnd);\r
 \r
                 ScopedLock lock (owner.deletingDialog);\r
 \r
@@ -501,13 +499,11 @@ private:
 \r
         const Remover remover (*this);\r
 \r
-       #if ! JUCE_MINGW\r
         if (SystemStats::getOperatingSystemType() >= SystemStats::WinVista\r
             && customComponent == nullptr)\r
         {\r
             return openDialogVistaAndUp (async);\r
         }\r
-       #endif\r
 \r
         return openDialogPreVista (async);\r
     }\r
@@ -781,9 +777,9 @@ class FileChooser::Native     : public std::enable_shared_from_this<Native>,
                                 public FileChooser::Pimpl\r
 {\r
 public:\r
-    Native (FileChooser& fileChooser, int flags, FilePreviewComponent* previewComp)\r
+    Native (FileChooser& fileChooser, int flagsIn, FilePreviewComponent* previewComp)\r
         : owner (fileChooser),\r
-          nativeFileChooser (std::make_unique<Win32NativeFileChooser> (this, flags, previewComp, fileChooser.startingFile,\r
+          nativeFileChooser (std::make_unique<Win32NativeFileChooser> (this, flagsIn, previewComp, fileChooser.startingFile,\r
                                                                        fileChooser.title, fileChooser.filters))\r
     {\r
         auto mainMon = Desktop::getInstance().getDisplays().getPrimaryDisplay()->userArea;\r
index ea0c256b209564f1945a15d718a6cd74344b57b6..c58995d0cc4fba7b014d5cd51a25c1797e1019c9 100644 (file)
@@ -1133,7 +1133,6 @@ namespace IconConverters
 \r
         if (auto* dc = ::CreateCompatibleDC (deviceContext.dc))\r
         {\r
-            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wfour-char-constants")\r
             BITMAPV5HEADER header = {};\r
             header.bV5Size = sizeof (BITMAPV5HEADER);\r
             header.bV5Width = bm.bmWidth;\r
@@ -1145,15 +1144,8 @@ namespace IconConverters
             header.bV5GreenMask = 0x0000FF00;\r
             header.bV5BlueMask = 0x000000FF;\r
             header.bV5AlphaMask = 0xFF000000;\r
-\r
-           #if JUCE_MINGW\r
-            header.bV5CSType = 'Win ';\r
-           #else\r
-            header.bV5CSType = LCS_WINDOWS_COLOR_SPACE;\r
-           #endif\r
-\r
+            header.bV5CSType = 0x57696E20; // 'Win '\r
             header.bV5Intent = LCS_GM_IMAGES;\r
-            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
             uint32* bitmapImageData = nullptr;\r
 \r
@@ -1244,6 +1236,15 @@ JUCE_IUNKNOWNCLASS (ITipInvocation, "37c994e7-432b-4834-a2f7-dce1f13b834b")
     JUCE_COMCALL Toggle (HWND) = 0;\r
 };\r
 \r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::ITipInvocation, 0x37c994e7, 0x432b, 0x4834, 0xa2, 0xf7, 0xdc, 0xe1, 0xf1, 0x3b, 0x83, 0x4b)\r
+#endif\r
+\r
+namespace juce\r
+{\r
+\r
 struct OnScreenKeyboard   : public DeletedAtShutdown,\r
                             private Timer\r
 {\r
@@ -1358,7 +1359,15 @@ JUCE_COMCLASS (IUIViewSettings, "c63657f6-8850-470d-88f8-455e16ea2c26")  : publi
     JUCE_COMCALL GetUserInteractionMode (UserInteractionMode*) = 0;\r
 };\r
 \r
+} // namespace juce\r
 \r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::IUIViewSettingsInterop, 0x3694dbf9, 0x8f68, 0x44be, 0x8f, 0xf5, 0x19, 0x5c, 0x98, 0xed, 0xe8, 0xa6)\r
+__CRT_UUID_DECL (juce::IUIViewSettings,        0xc63657f6, 0x8850, 0x470d, 0x88, 0xf8, 0x45, 0x5e, 0x16, 0xea, 0x2c, 0x26)\r
+#endif\r
+\r
+namespace juce\r
+{\r
 struct UWPUIViewSettings\r
 {\r
     UWPUIViewSettings()\r
@@ -2443,7 +2452,7 @@ private:
         if (! component.isCurrentlyModal() && (styleFlags & windowHasDropShadow) != 0\r
             && ((! hasTitleBar()) || SystemStats::getOperatingSystemType() < SystemStats::WinVista))\r
         {\r
-            shadower.reset (component.getLookAndFeel().createDropShadowerForComponent (&component));\r
+            shadower = component.getLookAndFeel().createDropShadowerForComponent (component);\r
 \r
             if (shadower != nullptr)\r
                 shadower->setOwner (&component);\r
@@ -4528,8 +4537,8 @@ class PreVistaMessageBox  : public WindowsMessageBoxBase
 public:\r
     PreVistaMessageBox (const MessageBoxOptions& opts,\r
                         UINT extraFlags,\r
-                        std::unique_ptr<ModalComponentManager::Callback>&& callback)\r
-        : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (callback)),\r
+                        std::unique_ptr<ModalComponentManager::Callback>&& cb)\r
+        : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (cb)),\r
           flags (extraFlags | getMessageBoxFlags (opts.getIconType())),\r
           title (opts.getTitle()), message (opts.getMessage())\r
     {\r
@@ -4581,8 +4590,8 @@ class WindowsTaskDialog  : public WindowsMessageBoxBase
 {\r
 public:\r
     WindowsTaskDialog (const MessageBoxOptions& opts,\r
-                       std::unique_ptr<ModalComponentManager::Callback>&& callback)\r
-        : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (callback)),\r
+                       std::unique_ptr<ModalComponentManager::Callback>&& cb)\r
+        : WindowsMessageBoxBase (opts.getAssociatedComponent(), std::move (cb)),\r
           iconType (opts.getIconType()),\r
           title (opts.getTitle()), message (opts.getMessage()),\r
           button1 (opts.getButtonText (0)), button2 (opts.getButtonText (1)), button3 (opts.getButtonText (2))\r
@@ -4594,6 +4603,7 @@ public:
         TASKDIALOGCONFIG config{};\r
 \r
         config.cbSize         = sizeof (config);\r
+        config.hwndParent     = getParentHWND();\r
         config.pszWindowTitle = title.toWideCharPointer();\r
         config.pszContent     = message.toWideCharPointer();\r
         config.hInstance      = (HINSTANCE) Process::getCurrentModuleInstanceHandle();\r
@@ -5199,17 +5209,18 @@ private:
             if (iter != cursorsBySize.end())\r
                 return iter->second;\r
 \r
-            const auto img = info.image.getImage();\r
-            const auto imgW = jmax (1, img.getWidth());\r
-            const auto imgH = jmax (1, img.getHeight());\r
-\r
+            const auto logicalSize = info.image.getScaledBounds();\r
             const auto scale = (float) size / (float) unityCursorSize;\r
-            const auto scaleToUse = scale * jmin (1.0f, jmin ((float) unityCursorSize / (float) imgW,\r
-                                                              (float) unityCursorSize / (float) imgH)) / info.image.getScale();\r
-            const auto rescaled = img.rescaled (roundToInt (scaleToUse * (float) imgW),\r
-                                                roundToInt (scaleToUse * (float) imgH));\r
-            const auto hx = jlimit (0, rescaled.getWidth(),  roundToInt (scaleToUse * (float) info.hotspot.x));\r
-            const auto hy = jlimit (0, rescaled.getHeight(), roundToInt (scaleToUse * (float) info.hotspot.y));\r
+            const auto physicalSize = logicalSize * scale;\r
+\r
+            const auto& image = info.image.getImage();\r
+            const auto rescaled = image.rescaled (roundToInt ((float) physicalSize.getWidth()),\r
+                                                  roundToInt ((float) physicalSize.getHeight()));\r
+\r
+            const auto effectiveScale = rescaled.getWidth() / logicalSize.getWidth();\r
+\r
+            const auto hx = jlimit (0, rescaled.getWidth(),  roundToInt ((float) info.hotspot.x * effectiveScale));\r
+            const auto hy = jlimit (0, rescaled.getHeight(), roundToInt ((float) info.hotspot.y * effectiveScale));\r
 \r
             return cursorsBySize.emplace (size, IconConverters::createHICONFromImage (rescaled, false, hx, hy)).first->second;\r
         }\r
index 384005f9f53b0355279f03d4d185a3aa40958795..8e9a87d5710d424e7c473419fcaa29db4f3a8401 100644 (file)
@@ -179,15 +179,21 @@ XWindowSystemUtilities::GetXProperty::~GetXProperty()
 }\r
 \r
 //==============================================================================\r
-XWindowSystemUtilities::XSettings::XSettings (::Display* d)\r
-    : display (d)\r
+std::unique_ptr<XWindowSystemUtilities::XSettings> XWindowSystemUtilities::XSettings::createXSettings (::Display* d)\r
 {\r
-    settingsAtom = Atoms::getCreating (display, "_XSETTINGS_SETTINGS");\r
+    const auto settingsAtom = Atoms::getCreating (d, "_XSETTINGS_SETTINGS");\r
+    const auto settingsWindow = X11Symbols::getInstance()->xGetSelectionOwner (d,\r
+                                                                               Atoms::getCreating (d, "_XSETTINGS_S0"));\r
 \r
-    settingsWindow = X11Symbols::getInstance()->xGetSelectionOwner (display,\r
-                                                                    Atoms::getCreating (display, "_XSETTINGS_S0"));\r
+    if (settingsWindow == None)\r
+        return {};\r
+\r
+    return rawToUniquePtr (new XWindowSystemUtilities::XSettings (d, settingsWindow, settingsAtom));\r
+}\r
 \r
-    jassert (settingsWindow != None);\r
+XWindowSystemUtilities::XSettings::XSettings (::Display* d, ::Window settingsWindowIn, Atom settingsAtomIn)\r
+    : display (d), settingsWindow (settingsWindowIn), settingsAtom (settingsAtomIn)\r
+{\r
     update();\r
 }\r
 \r
@@ -1345,18 +1351,22 @@ namespace ClipboardHelpers
             {\r
                 auto localContent = XWindowSystem::getInstance()->getLocalClipboardContent();\r
 \r
-                // translate to utf8\r
-                numDataItems = localContent.getNumBytesAsUTF8() + 1;\r
-                data.calloc (numDataItems);\r
-                localContent.copyToUTF8 (data, numDataItems);\r
-                propertyFormat = 8; // bits/item\r
+                // Translate to utf8\r
+                numDataItems = localContent.getNumBytesAsUTF8();\r
+                auto numBytesRequiredToStore = numDataItems + 1;\r
+                data.calloc (numBytesRequiredToStore);\r
+                localContent.copyToUTF8 (data, numBytesRequiredToStore);\r
+                propertyFormat = 8;   // bits per item\r
             }\r
             else if (evt.target == atoms.targets)\r
             {\r
-                // another application wants to know what we are able to send\r
+                // Another application wants to know what we are able to send\r
+\r
                 numDataItems = 2;\r
-                propertyFormat = 32; // atoms are 32-bit\r
-                data.calloc (numDataItems * 4);\r
+                data.calloc (numDataItems * sizeof (Atom));\r
+\r
+                // Atoms are flagged as 32-bit irrespective of sizeof (Atom)\r
+                propertyFormat = 32;\r
 \r
                 auto* dataAtoms = unalignedPointerCast<Atom*> (data.getData());\r
 \r
@@ -1380,7 +1390,7 @@ namespace ClipboardHelpers
             {\r
                 X11Symbols::getInstance()->xChangeProperty (evt.display, evt.requestor,\r
                                                             evt.property, evt.target,\r
-                                                            propertyFormat /* 8 or 32 */, PropModeReplace,\r
+                                                            propertyFormat, PropModeReplace,\r
                                                             reinterpret_cast<const unsigned char*> (data.getData()), (int) numDataItems);\r
                 reply.property = evt.property; // " == success"\r
             }\r
@@ -3030,11 +3040,12 @@ long XWindowSystem::getUserTime (::Window windowH) const
 \r
 void XWindowSystem::initialiseXSettings()\r
 {\r
-    xSettings = std::make_unique<XWindowSystemUtilities::XSettings> (display);\r
+    xSettings = XWindowSystemUtilities::XSettings::createXSettings (display);\r
 \r
-    X11Symbols::getInstance()->xSelectInput (display,\r
-                                             xSettings->getSettingsWindow(),\r
-                                             StructureNotifyMask | PropertyChangeMask);\r
+    if (xSettings != nullptr)\r
+        X11Symbols::getInstance()->xSelectInput (display,\r
+                                                 xSettings->getSettingsWindow(),\r
+                                                 StructureNotifyMask | PropertyChangeMask);\r
 }\r
 \r
 XWindowSystem::DisplayVisuals::DisplayVisuals (::Display* xDisplay)\r
index 9bc284a407d78bb969779c78aaec03be48ecbee7..9369f8244af45f2c62f45eee2a0e5e2ac9055d32 100644 (file)
@@ -130,7 +130,7 @@ namespace XWindowSystemUtilities
     class XSettings\r
     {\r
     public:\r
-        explicit XSettings (::Display*);\r
+        static std::unique_ptr<XSettings> createXSettings (::Display*);\r
 \r
         //==============================================================================\r
         void update();\r
@@ -158,6 +158,8 @@ namespace XWindowSystemUtilities
         std::unordered_map<String, XSetting> settings;\r
         ListenerList<Listener> listeners;\r
 \r
+        XSettings (::Display*, Atom, ::Window);\r
+\r
         //==============================================================================\r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XSettings)\r
     };\r
index a7616b151cec7ac475295f9776157b0efcab23bd..df95a5f24af9b5f795ff657c37bff54920cab5e2 100644 (file)
@@ -889,7 +889,7 @@ public:
     //==============================================================================\r
     /** An RAII class for sending slider listener drag messages.\r
 \r
-        This is useful if you are programatically updating the slider's value and want\r
+        This is useful if you are programmatically updating the slider's value and want\r
         to imitate a mouse event, for example in a custom AccessibilityHandler.\r
 \r
         @see Slider::Listener\r
index 307f7ee1c2725d704d7c2c5c9fca7584f560b0d1..d5f98c2f90190dda3e46d203d8862ceb262ec07d 100644 (file)
@@ -1836,6 +1836,9 @@ void TextEditor::mouseDown (const MouseEvent& e)
         {\r
             moveCaretTo (getTextIndexAt (e.x, e.y),\r
                          e.mods.isShiftDown());\r
+\r
+            if (auto* peer = getPeer())\r
+                peer->dismissPendingTextInput();\r
         }\r
         else\r
         {\r
@@ -1956,6 +1959,10 @@ bool TextEditor::moveCaretWithTransaction (const int newPos, const bool selectin
 {\r
     newTransaction();\r
     moveCaretTo (newPos, selecting);\r
+\r
+    if (auto* peer = getPeer())\r
+        peer->dismissPendingTextInput();\r
+\r
     return true;\r
 }\r
 \r
index 1aaedce921520c7ee4fa35eb018244d6ac6df5d6..305d602385868cc1ad4722e8e2ba53cbd25554bd 100644 (file)
@@ -313,6 +313,9 @@ public:
 \r
         if (iter != itemComponents.end())\r
         {\r
+            if (itemUnderMouse == iter->get())\r
+                itemUnderMouse = nullptr;\r
+\r
             if (isMouseDraggingInChildComp (*(iter->get())))\r
                 owner.hideDragHighlight();\r
 \r
index 317c6412ae2e36630e4867a0cce7aa62d9ad968c..639e012e7259c0ca094a7d3d6e3720d1dcfc9821 100644 (file)
@@ -418,6 +418,34 @@ public:
     */\r
     virtual void setHasChangedSinceSaved (bool) {}\r
 \r
+\r
+    enum class Style\r
+    {\r
+        /** A style that matches the system-wide style. */\r
+        automatic,\r
+\r
+        /** A light style, which will probably use dark text on a light background. */\r
+        light,\r
+\r
+        /** A dark style, which will probably use light text on a dark background. */\r
+        dark\r
+    };\r
+\r
+    /** On operating systems that support it, this will update the style of this\r
+        peer as requested.\r
+\r
+        Note that this will not update the theme system-wide. This will only\r
+        update UI elements so that they display appropriately for this peer!\r
+    */\r
+    void setAppStyle (Style s)\r
+    {\r
+        if (std::exchange (style, s) != style)\r
+            appStyleChanged();\r
+    }\r
+\r
+    /** Returns the style requested for this app. */\r
+    Style getAppStyle() const { return style; }\r
+\r
 protected:\r
     //==============================================================================\r
     static void forceDisplayUpdate();\r
@@ -428,9 +456,12 @@ protected:
     ComponentBoundsConstrainer* constrainer = nullptr;\r
     static std::function<ModifierKeys()> getNativeRealtimeModifiers;\r
     ListenerList<ScaleFactorListener> scaleFactorListeners;\r
+    Style style = Style::automatic;\r
 \r
 private:\r
     //==============================================================================\r
+    virtual void appStyleChanged() {}\r
+\r
     Component* getTargetForKeyPress();\r
 \r
     WeakReference<Component> lastFocusedComponent, dragAndDropTargetComponent;\r
index 08e3b7fa3312e1fa2ce79755210eb07e5263ceb3..8f1eb5de6373fccf004b690aecb25313644ad73e 100644 (file)
@@ -71,13 +71,13 @@ void TooltipWindow::mouseEnter (const MouseEvent& e)
 void TooltipWindow::mouseDown (const MouseEvent&)\r
 {\r
     if (isVisible())\r
-        dismissalMouseEventOccured = true;\r
+        dismissalMouseEventOccurred = true;\r
 }\r
 \r
 void TooltipWindow::mouseWheelMove (const MouseEvent&, const MouseWheelDetails&)\r
 {\r
     if (isVisible())\r
-        dismissalMouseEventOccured = true;\r
+        dismissalMouseEventOccurred = true;\r
 }\r
 \r
 void TooltipWindow::updatePosition (const String& tip, Point<int> pos, Rectangle<int> parentArea)\r
@@ -145,7 +145,7 @@ void TooltipWindow::displayTipInternal (Point<int> screenPos, const String& tip,
 \r
         toFront (false);\r
         manuallyShownTip = shownManually == ShownManually::yes ? tip : String();\r
-        dismissalMouseEventOccured = false;\r
+        dismissalMouseEventOccurred = false;\r
     }\r
 }\r
 \r
@@ -168,7 +168,7 @@ void TooltipWindow::hideTip()
     {\r
         tipShowing = {};\r
         manuallyShownTip = {};\r
-        dismissalMouseEventOccured = false;\r
+        dismissalMouseEventOccurred = false;\r
 \r
         removeFromDesktop();\r
         setVisible (false);\r
@@ -201,7 +201,7 @@ void TooltipWindow::timerCallback()
 \r
     if (manuallyShownTip.isNotEmpty())\r
     {\r
-        if (dismissalMouseEventOccured || newComp == nullptr)\r
+        if (dismissalMouseEventOccurred || newComp == nullptr)\r
             hideTip();\r
 \r
         return;\r
@@ -218,7 +218,7 @@ void TooltipWindow::timerCallback()
         const auto tipChanged = (newTip != lastTipUnderMouse || newComp != lastComponentUnderMouse);\r
         const auto now = Time::getApproximateMillisecondCounter();\r
 \r
-        if (tipChanged || dismissalMouseEventOccured || mouseMovedQuickly)\r
+        if (tipChanged || dismissalMouseEventOccurred || mouseMovedQuickly)\r
             lastCompChangeTime = now;\r
 \r
         const auto showTip = [this, &mouseSource, &mousePos, &newTip]\r
@@ -231,7 +231,7 @@ void TooltipWindow::timerCallback()
         {\r
             // if a tip is currently visible (or has just disappeared), update to a new one\r
             // immediately if needed..\r
-            if (newComp == nullptr || dismissalMouseEventOccured || newTip.isEmpty())\r
+            if (newComp == nullptr || dismissalMouseEventOccurred || newTip.isEmpty())\r
                 hideTip();\r
             else if (tipChanged)\r
                 showTip();\r
index 158f0df15e524bf4852245293cd74248541d5b6d..72deb74a96871f94e329c58e5b95217fa77fd2e8 100644 (file)
@@ -140,7 +140,7 @@ private:
     String tipShowing, lastTipUnderMouse, manuallyShownTip;\r
     int millisecondsBeforeTipAppears;\r
     unsigned int lastCompChangeTime = 0, lastHideTime = 0;\r
-    bool reentrant = false, dismissalMouseEventOccured = false;\r
+    bool reentrant = false, dismissalMouseEventOccurred = false;\r
 \r
     enum ShownManually { yes, no };\r
     void displayTipInternal (Point<int>, const String&, ShownManually);\r
index 5ad7efa7d744266914a5d7d8d40087c3aceb2b36..9982ce03b1bf6c0f6bf16fe5093159d2ffc12bf8 100644 (file)
@@ -150,7 +150,7 @@ TopLevelWindow::TopLevelWindow (const String& name, const bool shouldAddToDeskto
 \r
 TopLevelWindow::~TopLevelWindow()\r
 {\r
-    shadower.reset();\r
+    shadower = nullptr;\r
     TopLevelWindowManager::getInstance()->removeWindow (this);\r
 }\r
 \r
@@ -213,7 +213,7 @@ void TopLevelWindow::setDropShadowEnabled (const bool useShadow)
 \r
     if (isOnDesktop())\r
     {\r
-        shadower.reset();\r
+        shadower = nullptr;\r
         Component::addToDesktop (getDesktopWindowStyleFlags());\r
     }\r
     else\r
@@ -222,7 +222,7 @@ void TopLevelWindow::setDropShadowEnabled (const bool useShadow)
         {\r
             if (shadower == nullptr)\r
             {\r
-                shadower.reset (getLookAndFeel().createDropShadowerForComponent (this));\r
+                shadower = getLookAndFeel().createDropShadowerForComponent (*this);\r
 \r
                 if (shadower != nullptr)\r
                     shadower->setOwner (this);\r
@@ -230,7 +230,7 @@ void TopLevelWindow::setDropShadowEnabled (const bool useShadow)
         }\r
         else\r
         {\r
-            shadower.reset();\r
+            shadower = nullptr;\r
         }\r
     }\r
 }\r
@@ -257,7 +257,7 @@ void TopLevelWindow::recreateDesktopWindow()
 \r
 void TopLevelWindow::addToDesktop()\r
 {\r
-    shadower.reset();\r
+    shadower = nullptr;\r
     Component::addToDesktop (getDesktopWindowStyleFlags());\r
     setDropShadowEnabled (isDropShadowEnabled()); // force an update to clear away any fake shadows if necessary.\r
 }\r
index f3d89931c61707f60d125c2a9e246dcb9f281455..3a421dc2a9e0f46ec605ff3ac502b746e8ffe1d3 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_gui_extra\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE extended GUI classes\r
   description:        Miscellaneous GUI classes for specialised tasks.\r
   website:            http://www.juce.com/juce\r
index 1f60aab38eb93ed68551d20c7cfc9c43054567b1..579e3aafbdbda789f2245c645bdbc8b6fdbc471d 100644 (file)
@@ -28,8 +28,8 @@ namespace juce
 \r
 struct InternalWebViewType\r
 {\r
-    InternalWebViewType() {}\r
-    virtual ~InternalWebViewType() {}\r
+    InternalWebViewType() = default;\r
+    virtual ~InternalWebViewType() = default;\r
 \r
     virtual void createBrowser() = 0;\r
     virtual bool hasBrowserBeenCreated() = 0;\r
@@ -47,20 +47,6 @@ struct InternalWebViewType
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InternalWebViewType)\r
 };\r
 \r
-#if JUCE_MINGW\r
- JUCE_DECLARE_UUID_GETTER (IOleClientSite,           "00000118-0000-0000-c000-000000000046")\r
- JUCE_DECLARE_UUID_GETTER (IDispatch,                "00020400-0000-0000-c000-000000000046")\r
-\r
- #ifndef WebBrowser\r
-  class WebBrowser;\r
- #endif\r
-#endif\r
-\r
-JUCE_DECLARE_UUID_GETTER (DWebBrowserEvents2,        "34A715A0-6587-11D0-924A-0020AFC7AC4D")\r
-JUCE_DECLARE_UUID_GETTER (IConnectionPointContainer, "B196B284-BAB4-101A-B69C-00AA00341D07")\r
-JUCE_DECLARE_UUID_GETTER (IWebBrowser2,              "D30C1661-CDAF-11D0-8A3E-00C04FC9E26E")\r
-JUCE_DECLARE_UUID_GETTER (WebBrowser,                "8856F961-340A-11D0-A96B-00C04FD705A2")\r
-\r
 //==============================================================================\r
 class Win32WebView   : public InternalWebViewType,\r
                        public ActiveXControlComponent\r
index 65782b849f9af4b427549b0798aa0fe50f1bf55d..62f58319b364301878b47c7790e0d369cabbf54b 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_opengl\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE OpenGL classes\r
   description:        Classes for rendering OpenGL in a JUCE window.\r
   website:            http://www.juce.com/juce\r
index c6bbb694a592b54ad15817ffa8480a8959d29077..fb404f6670c555e74cea9a784054cfc5a59a03a8 100644 (file)
@@ -256,9 +256,10 @@ public:
     {\r
         MouseForwardingNSOpenGLViewClass()  : ObjCClass<NSOpenGLView> ("JUCEGLView_")\r
         {\r
-            addMethod (@selector (rightMouseDown:),      rightMouseDown);\r
-            addMethod (@selector (rightMouseUp:),        rightMouseUp);\r
-            addMethod (@selector (acceptsFirstMouse:),   acceptsFirstMouse);\r
+            addMethod (@selector (rightMouseDown:),       rightMouseDown);\r
+            addMethod (@selector (rightMouseUp:),         rightMouseUp);\r
+            addMethod (@selector (acceptsFirstMouse:),    acceptsFirstMouse);\r
+            addMethod (@selector (accessibilityHitTest:), accessibilityHitTest);\r
 \r
             registerClass();\r
         }\r
@@ -267,6 +268,7 @@ public:
         static void rightMouseDown (id self, SEL, NSEvent* ev)      { [[(NSOpenGLView*) self superview] rightMouseDown: ev]; }\r
         static void rightMouseUp   (id self, SEL, NSEvent* ev)      { [[(NSOpenGLView*) self superview] rightMouseUp:   ev]; }\r
         static BOOL acceptsFirstMouse (id, SEL, NSEvent*)           { return YES; }\r
+        static id accessibilityHitTest (id self, SEL, NSPoint p)    { return [[(NSOpenGLView*) self superview] accessibilityHitTest: p]; }\r
     };\r
 \r
 \r
index 715e105d0c7cb4be3e3e64672acbd4cbb42721d1..d196b31d7ba3da40e4cdc98e47a03759663cebd9 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_osc\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE OSC classes\r
   description:        Open Sound Control implementation.\r
   website:            http://www.juce.com/juce\r
index fca551309ff3c1ed9e2b144cdaedfd35cbe6b0f9..f264eb542e10fc7a74586568e047d76d3154a79b 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_product_unlocking\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\r
   name:               JUCE Online marketplace support\r
   description:        Classes for online product authentication\r
   website:            http://www.juce.com/juce\r
index abe0e2414e75a972dc40af5f519fe9855a04400a..9aedc668c8536ef14d8f7c0ad68c31c5aa5d9e41 100644 (file)
@@ -80,7 +80,7 @@ public:
         So for example you might use this in a command line app called "unlocker" and\r
         then call it like this:\r
 \r
-        unlocker MyGreatApp Joe_Bloggs joebloggs@foobar.com 1234abcd,95432ff 22d9aec92d986dd1,923ad49e9e7ff294c\r
+        unlocker MyGreatApp joebloggs@foobar.com Joe_Bloggs 1234abcd,95432ff 22d9aec92d986dd1,923ad49e9e7ff294c\r
     */\r
     static int keyGenerationAppMain (int argc, char* argv[])\r
     {\r
index 0a72e59777a25b891644543689075b94c7c77598..a5270dc1f6594be7928e79f00d67dc79c37f870c 100644 (file)
@@ -544,10 +544,10 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
     void fetchReceiptDetailsFromAppStore (NSData* receiptData, const String& secret)\r
     {\r
         auto requestContents = [NSMutableDictionary dictionaryWithCapacity: (NSUInteger) (secret.isNotEmpty() ? 2 : 1)];\r
-        [requestContents setObject: [receiptData base64EncodedStringWithOptions:0] forKey: nsStringLiteral ("receipt-data")];\r
+        [requestContents setObject: [receiptData base64EncodedStringWithOptions:0] forKey: @"receipt-data"];\r
 \r
         if (secret.isNotEmpty())\r
-            [requestContents setObject: juceStringToNS (secret) forKey: nsStringLiteral ("password")];\r
+            [requestContents setObject: juceStringToNS (secret) forKey: @"password"];\r
 \r
         NSError* error;\r
         auto requestData = [NSJSONSerialization dataWithJSONObject: requestContents\r
@@ -559,47 +559,62 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
             return;\r
         }\r
 \r
-       #if JUCE_IN_APP_PURCHASES_USE_SANDBOX_ENVIRONMENT\r
-        auto storeURL = "https://sandbox.itunes.apple.com/verifyReceipt";\r
-       #else\r
-        auto storeURL = "https://buy.itunes.apple.com/verifyReceipt";\r
-       #endif\r
+        verifyReceipt ("https://buy.itunes.apple.com/verifyReceipt", requestData);\r
+    }\r
+\r
+    void verifyReceipt (const String& endpoint, NSData* requestData)\r
+    {\r
+        const auto nsurl = [NSURL URLWithString: juceStringToNS (endpoint)];\r
 \r
-        // TODO: use juce URL here\r
-        auto* urlPtr = [NSURL URLWithString: nsStringLiteral (storeURL)];\r
-        auto storeRequest = [NSMutableURLRequest requestWithURL: urlPtr];\r
-        [storeRequest setHTTPMethod: nsStringLiteral ("POST")];\r
+        if (nsurl == nullptr)\r
+            return;\r
+\r
+        const auto storeRequest = [NSMutableURLRequest requestWithURL: nsurl];\r
+        [storeRequest setHTTPMethod: @"POST"];\r
         [storeRequest setHTTPBody: requestData];\r
 \r
-        auto task = [[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
-                                                    completionHandler:\r
-                                                       ^(NSData* data, NSURLResponse*, NSError* connectionError)\r
-                                                       {\r
-                                                           if (connectionError != nil)\r
-                                                           {\r
-                                                               sendReceiptFetchFail();\r
-                                                           }\r
-                                                           else\r
-                                                           {\r
-                                                               NSError* err;\r
+        constexpr auto sandboxURL = "https://sandbox.itunes.apple.com/verifyReceipt";\r
+\r
+        const auto shouldRetryWithSandboxUrl = [isProduction = (endpoint != sandboxURL)] (NSDictionary* receiptDetails)\r
+        {\r
+            if (isProduction)\r
+                if (const auto* status = getAs<NSNumber> (receiptDetails[@"status"]))\r
+                    return [status intValue] == 21007;\r
+\r
+            return false;\r
+        };\r
+\r
+        [[[NSURLSession sharedSession] dataTaskWithRequest: storeRequest\r
+                                         completionHandler: ^(NSData* responseData, NSURLResponse*, NSError* connectionError)\r
+                                                            {\r
+                                                                if (connectionError == nullptr)\r
+                                                                {\r
+                                                                    NSError* err = nullptr;\r
+\r
+                                                                    if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: responseData options: 0 error: &err])\r
+                                                                    {\r
+                                                                        if (shouldRetryWithSandboxUrl (receiptDetails))\r
+                                                                        {\r
+                                                                            verifyReceipt (sandboxURL, requestData);\r
+                                                                            return;\r
+                                                                        }\r
 \r
-                                                               if (NSDictionary* receiptDetails = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &err])\r
-                                                                   processReceiptDetails (receiptDetails);\r
-                                                               else\r
-                                                                   sendReceiptFetchFail();\r
-                                                           }\r
-                                                       }];\r
+                                                                        processReceiptDetails (receiptDetails);\r
+                                                                        return;\r
+                                                                    }\r
+                                                                }\r
 \r
-        [task resume];\r
+                                                                sendReceiptFetchFail();\r
+                                                            }] resume];\r
     }\r
 \r
     void processReceiptDetails (NSDictionary* receiptDetails)\r
     {\r
-        if (auto receipt = getAs<NSDictionary> (receiptDetails[nsStringLiteral ("receipt")]))\r
+        if (auto receipt = getAs<NSDictionary> (receiptDetails[@"receipt"]))\r
         {\r
-            if (auto bundleId = getAs<NSString> (receipt[nsStringLiteral ("bundle_id")]))\r
+            if (auto bundleId = getAs<NSString> (receipt[@"bundle_id"]))\r
             {\r
-                if (auto inAppPurchases = getAs<NSArray> (receipt[nsStringLiteral ("in_app")]))\r
+                if (auto inAppPurchases = getAs<NSArray> (receipt[@"in_app"]))\r
                 {\r
                     Array<Listener::PurchaseInfo> purchases;\r
 \r
@@ -608,14 +623,14 @@ struct InAppPurchases::Pimpl   : public SKDelegateAndPaymentObserver
                         if (auto* purchaseData = getAs<NSDictionary> (inAppPurchaseData))\r
                         {\r
                             // Ignore products that were cancelled.\r
-                            if (purchaseData[nsStringLiteral ("cancellation_date")] != nil)\r
+                            if (purchaseData[@"cancellation_date"] != nil)\r
                                 continue;\r
 \r
-                            if (auto transactionId = getAs<NSString> (purchaseData[nsStringLiteral ("original_transaction_id")]))\r
+                            if (auto transactionId = getAs<NSString> (purchaseData[@"original_transaction_id"]))\r
                             {\r
-                                if (auto productId = getAs<NSString> (purchaseData[nsStringLiteral ("product_id")]))\r
+                                if (auto productId = getAs<NSString> (purchaseData[@"product_id"]))\r
                                 {\r
-                                    auto purchaseTime = getPurchaseDateMs (purchaseData[nsStringLiteral ("purchase_date_ms")]);\r
+                                    auto purchaseTime = getPurchaseDateMs (purchaseData[@"purchase_date_ms"]);\r
 \r
                                     if (purchaseTime > 0)\r
                                     {\r
index f7df267db605a90d41cbc33d37e76e5158006682..4ded38bb43a6e591113ca936723fabfbebd1a7ea 100644 (file)
  #import <AVKit/AVKit.h>\r
 \r
 //==============================================================================\r
-#elif JUCE_WINDOWS && ! JUCE_MINGW\r
- /* If you're using the camera classes, you'll need access to a few DirectShow headers.\r
-     These files are provided in the normal Windows SDK. */\r
- #include <dshow.h>\r
- #include <dshowasf.h>\r
- #include <evr.h>\r
-\r
- #if ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES\r
+#elif JUCE_WINDOWS\r
+ #include "wmsdkidl.h"\r
+ #include "native/juce_win32_ComTypes.h"\r
+\r
+ #if ! JUCE_MINGW && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES\r
   #pragma comment (lib, "strmiids.lib")\r
 \r
   #if JUCE_USE_CAMERA\r
index 9ad6611065986548f6d4d3db0e0a993c04a74945..5b2414c84fcc3638e9614996c199929e18e61b82 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_video\r
   vendor:             juce\r
-  version:            6.1.4\r
+  version:            6.1.5\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 fbe288114bf1052cdba0dde7767371abf30b14e4..49f847413b9eedda517aa1db834cd93fbb2e14f2 100644 (file)
@@ -1305,7 +1305,7 @@ struct CameraDevice::ViewerComponent  : public UIViewComponent
     {\r
         static JuceCameraDeviceViewerClass cls;\r
 \r
-        // Initial size that can be overriden later.\r
+        // Initial size that can be overridden later.\r
         setSize (640, 480);\r
 \r
         auto view = [cls.createInstance() init];\r
index 4e243130125d8690fb78e96291a4a42b614028e0..dbe86d977216ec7fdfe051a403d6a9862b313764 100644 (file)
   ==============================================================================\r
 */\r
 \r
-interface ISampleGrabberCB  : public IUnknown\r
-{\r
-    JUCE_COMCALL SampleCB (double, IMediaSample*) = 0;\r
-    JUCE_COMCALL BufferCB (double, BYTE*, long) = 0;\r
-};\r
-\r
-interface ISampleGrabber  : public IUnknown\r
-{\r
-    JUCE_COMCALL SetOneShot (BOOL) = 0;\r
-    JUCE_COMCALL SetMediaType (const AM_MEDIA_TYPE*) = 0;\r
-    JUCE_COMCALL GetConnectedMediaType (AM_MEDIA_TYPE*) = 0;\r
-    JUCE_COMCALL SetBufferSamples (BOOL) = 0;\r
-    JUCE_COMCALL GetCurrentBuffer (long*, long*) = 0;\r
-    JUCE_COMCALL GetCurrentSample (IMediaSample**) = 0;\r
-    JUCE_COMCALL SetCallback (ISampleGrabberCB*, long) = 0;\r
-};\r
-\r
-static const IID IID_ISampleGrabberCB  = { 0x0579154A, 0x2B53, 0x4994, { 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85 } };\r
-static const IID IID_ISampleGrabber    = { 0x6B652FFF, 0x11FE, 0x4fce, { 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F } };\r
-static const CLSID CLSID_SampleGrabber = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
-static const CLSID CLSID_NullRenderer  = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
-\r
-\r
 struct CameraDevice::Pimpl  : public ChangeBroadcaster\r
 {\r
     Pimpl (CameraDevice& ownerToUse, const String&, int index,\r
@@ -53,7 +30,7 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
            bool /*highQuality*/)\r
        : owner (ownerToUse)\r
     {\r
-        HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2);\r
+        HRESULT hr = captureGraphBuilder.CoCreateInstance (ComTypes::CLSID_CaptureGraphBuilder2);\r
         if (FAILED (hr))\r
             return;\r
 \r
@@ -61,7 +38,7 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         if (filter == nullptr)\r
             return;\r
 \r
-        hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph);\r
+        hr = graphBuilder.CoCreateInstance (ComTypes::CLSID_FilterGraph);\r
         if (FAILED (hr))\r
             return;\r
 \r
@@ -69,15 +46,17 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         if (FAILED (hr))\r
             return;\r
 \r
-        mediaControl = graphBuilder.getInterface<IMediaControl>();\r
+        mediaControl = graphBuilder.getInterface<ComTypes::IMediaControl>();\r
         if (mediaControl == nullptr)\r
             return;\r
 \r
         {\r
-            ComSmartPtr<IAMStreamConfig> streamConfig;\r
+            ComSmartPtr<ComTypes::IAMStreamConfig> streamConfig;\r
 \r
-            hr = captureGraphBuilder->FindInterface (&PIN_CATEGORY_CAPTURE, nullptr, filter,\r
-                                                     IID_IAMStreamConfig, (void**) streamConfig.resetAndGetPointerAddress());\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+            hr = captureGraphBuilder->FindInterface (&ComTypes::PIN_CATEGORY_CAPTURE, nullptr, filter,\r
+                                                     __uuidof (ComTypes::IAMStreamConfig), (void**) streamConfig.resetAndGetPointerAddress());\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
             if (streamConfig != nullptr)\r
             {\r
@@ -92,7 +71,7 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         if (FAILED (hr))\r
             return;\r
 \r
-        hr = smartTee.CoCreateInstance (CLSID_SmartTee);\r
+        hr = smartTee.CoCreateInstance (ComTypes::CLSID_SmartTee);\r
         if (FAILED (hr))\r
             return;\r
 \r
@@ -103,20 +82,23 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         if (! connectFilters (filter, smartTee))\r
             return;\r
 \r
-        ComSmartPtr<IBaseFilter> sampleGrabberBase;\r
-        hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber);\r
+        ComSmartPtr<ComTypes::IBaseFilter> sampleGrabberBase;\r
+        hr = sampleGrabberBase.CoCreateInstance (ComTypes::CLSID_SampleGrabber);\r
         if (FAILED (hr))\r
             return;\r
 \r
-        hr = sampleGrabberBase.QueryInterface (IID_ISampleGrabber, sampleGrabber);\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+        hr = sampleGrabberBase.QueryInterface (__uuidof (ComTypes::ISampleGrabber), sampleGrabber);\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
         if (FAILED (hr))\r
             return;\r
 \r
         {\r
-            AM_MEDIA_TYPE mt = {};\r
-            mt.majortype = MEDIATYPE_Video;\r
-            mt.subtype = MEDIASUBTYPE_RGB24;\r
-            mt.formattype = FORMAT_VideoInfo;\r
+            ComTypes::AM_MEDIA_TYPE mt = {};\r
+            mt.majortype = ComTypes::MEDIATYPE_Video;\r
+            mt.subtype = ComTypes::MEDIASUBTYPE_RGB24;\r
+            mt.formattype = ComTypes::FORMAT_VideoInfo;\r
             sampleGrabber->SetMediaType (&mt);\r
         }\r
 \r
@@ -127,27 +109,27 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         if (FAILED (hr))\r
             return;\r
 \r
-        ComSmartPtr<IPin> grabberInputPin;\r
-        if (! (getPin (smartTee, PINDIR_OUTPUT, smartTeeCaptureOutputPin, "capture")\r
-                && getPin (smartTee, PINDIR_OUTPUT, smartTeePreviewOutputPin, "preview")\r
-                && getPin (sampleGrabberBase, PINDIR_INPUT, grabberInputPin)))\r
+        ComSmartPtr<ComTypes::IPin> grabberInputPin;\r
+        if (! (getPin (smartTee, ComTypes::PINDIR_OUTPUT, smartTeeCaptureOutputPin, "capture")\r
+                && getPin (smartTee, ComTypes::PINDIR_OUTPUT, smartTeePreviewOutputPin, "preview")\r
+                && getPin (sampleGrabberBase, ComTypes::PINDIR_INPUT, grabberInputPin)))\r
             return;\r
 \r
         hr = graphBuilder->Connect (smartTeePreviewOutputPin, grabberInputPin);\r
         if (FAILED (hr))\r
             return;\r
 \r
-        AM_MEDIA_TYPE mt = {};\r
+        ComTypes::AM_MEDIA_TYPE mt = {};\r
         hr = sampleGrabber->GetConnectedMediaType (&mt);\r
 \r
-        if (auto* pVih = unalignedPointerCast<VIDEOINFOHEADER*> (mt.pbFormat))\r
+        if (auto* pVih = unalignedPointerCast<ComTypes::VIDEOINFOHEADER*> (mt.pbFormat))\r
         {\r
             width = pVih->bmiHeader.biWidth;\r
             height = pVih->bmiHeader.biHeight;\r
         }\r
 \r
-        ComSmartPtr<IBaseFilter> nullFilter;\r
-        hr = nullFilter.CoCreateInstance (CLSID_NullRenderer);\r
+        ComSmartPtr<ComTypes::IBaseFilter> nullFilter;\r
+        hr = nullFilter.CoCreateInstance (ComTypes::CLSID_NullRenderer);\r
         hr = graphBuilder->AddFilter (nullFilter, _T("Null Renderer"));\r
 \r
         if (connectFilters (sampleGrabberBase, nullFilter)\r
@@ -291,12 +273,12 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
             firstRecordedTime = Time::getCurrentTime() - RelativeTime (defaultCameraLatency);\r
             recordNextFrameTime = false;\r
 \r
-            ComSmartPtr<IPin> pin;\r
-            if (getPin (filter, PINDIR_OUTPUT, pin))\r
+            ComSmartPtr<ComTypes::IPin> pin;\r
+            if (getPin (filter, ComTypes::PINDIR_OUTPUT, pin))\r
             {\r
-                if (auto pushSource = pin.getInterface<IAMPushSource>())\r
+                if (auto pushSource = pin.getInterface<ComTypes::IAMPushSource>())\r
                 {\r
-                    REFERENCE_TIME latency = 0;\r
+                    ComTypes::REFERENCE_TIME latency = 0;\r
                     pushSource->GetLatency (&latency);\r
 \r
                     firstRecordedTime = firstRecordedTime - RelativeTime ((double) latency);\r
@@ -359,11 +341,11 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         recordNextFrameTime = true;\r
         previewMaxFPS = 60;\r
 \r
-        HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter);\r
+        HRESULT hr = asfWriter.CoCreateInstance (ComTypes::CLSID_WMAsfWriter);\r
 \r
         if (SUCCEEDED (hr))\r
         {\r
-            if (auto fileSink = asfWriter.getInterface<IFileSinkFilter>())\r
+            if (auto fileSink = asfWriter.getInterface<ComTypes::IFileSinkFilter>())\r
             {\r
                 hr = fileSink->SetFileName (file.getFullPathName().toWideCharPointer(), nullptr);\r
 \r
@@ -373,11 +355,19 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
 \r
                     if (SUCCEEDED (hr))\r
                     {\r
-                        if (auto asfConfig = asfWriter.getInterface<IConfigAsfWriter>())\r
+                        if (auto asfConfig = asfWriter.getInterface<ComTypes::IConfigAsfWriter>())\r
                         {\r
                             asfConfig->SetIndexMode (true);\r
                             ComSmartPtr<IWMProfileManager> profileManager;\r
-                            hr = WMCreateProfileManager (profileManager.resetAndGetPointerAddress());\r
+\r
+                            using Fn = HRESULT (*) (IWMProfileManager**);\r
+\r
+                            // This function is available on Windows 2000 and up, but we load it at runtime anyway\r
+                            // because some versions of MinGW ship with libraries that don't include this symbol.\r
+                            if (auto* fn = reinterpret_cast<Fn> (wmvcoreLibrary.getFunction ("WMCreateProfileManager")))\r
+                                hr = fn (profileManager.resetAndGetPointerAddress());\r
+                            else\r
+                                jassertfalse;\r
 \r
                             // This gibberish is the DirectShow profile for a video-only wmv file.\r
                             String prof ("<profile version=\"589824\" storageformat=\"1\" name=\"Quality\" description=\"Quality type for output.\">"\r
@@ -414,9 +404,9 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
 \r
                             if (SUCCEEDED (hr))\r
                             {\r
-                                ComSmartPtr<IPin> asfWriterInputPin;\r
+                                ComSmartPtr<ComTypes::IPin> asfWriterInputPin;\r
 \r
-                                if (getPin (asfWriter, PINDIR_INPUT, asfWriterInputPin, "Video Input 01"))\r
+                                if (getPin (asfWriter, ComTypes::PINDIR_INPUT, asfWriterInputPin, "Video Input 01"))\r
                                 {\r
                                     hr = graphBuilder->Connect (smartTeeCaptureOutputPin, asfWriterInputPin);\r
 \r
@@ -462,10 +452,10 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         previewMaxFPS = 60;\r
     }\r
 \r
-    static ComSmartPtr<IBaseFilter> enumerateCameras (StringArray* names, const int deviceIndexToOpen)\r
+    static ComSmartPtr<ComTypes::IBaseFilter> enumerateCameras (StringArray* names, const int deviceIndexToOpen)\r
     {\r
         int index = 0;\r
-        ComSmartPtr<ICreateDevEnum> pDevEnum;\r
+        ComSmartPtr<ComTypes::ICreateDevEnum> pDevEnum;\r
 \r
         struct Deleter\r
         {\r
@@ -474,10 +464,10 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
 \r
         using ContextPtr = std::unique_ptr<IBindCtx, Deleter>;\r
 \r
-        if (SUCCEEDED (pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum)))\r
+        if (SUCCEEDED (pDevEnum.CoCreateInstance (ComTypes::CLSID_SystemDeviceEnum)))\r
         {\r
             ComSmartPtr<IEnumMoniker> enumerator;\r
-            HRESULT hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, enumerator.resetAndGetPointerAddress(), 0);\r
+            HRESULT hr = pDevEnum->CreateClassEnumerator (ComTypes::CLSID_VideoInputDeviceCategory, enumerator.resetAndGetPointerAddress(), 0);\r
 \r
             if (SUCCEEDED (hr) && enumerator != nullptr)\r
             {\r
@@ -493,8 +483,10 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
                         return ContextPtr (ptr);\r
                     }();\r
 \r
-                    ComSmartPtr<IBaseFilter> captureFilter;\r
-                    hr = moniker->BindToObject (context.get(), nullptr, IID_IBaseFilter, (void**) captureFilter.resetAndGetPointerAddress());\r
+                    ComSmartPtr<ComTypes::IBaseFilter> captureFilter;\r
+                    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+                    hr = moniker->BindToObject (context.get(), nullptr, __uuidof (ComTypes::IBaseFilter), (void**) captureFilter.resetAndGetPointerAddress());\r
+                    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
                     if (SUCCEEDED (hr))\r
                     {\r
@@ -535,20 +527,22 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         return devs;\r
     }\r
 \r
-    struct GrabberCallback   : public ComBaseClassHelperBase<ISampleGrabberCB>\r
+    struct GrabberCallback   : public ComBaseClassHelperBase<ComTypes::ISampleGrabberCB>\r
     {\r
         GrabberCallback (Pimpl& p)\r
             : ComBaseClassHelperBase (0), owner (p) {}\r
 \r
         JUCE_COMRESULT QueryInterface (REFIID refId, void** result)\r
         {\r
-            if (refId == IID_ISampleGrabberCB)\r
-                return castToType<ISampleGrabberCB> (result);\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+            if (refId == __uuidof (ComTypes::ISampleGrabberCB))\r
+                return castToType<ComTypes::ISampleGrabberCB> (result);\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
-            return ComBaseClassHelperBase<ISampleGrabberCB>::QueryInterface (refId, result);\r
+            return ComBaseClassHelperBase<ComTypes::ISampleGrabberCB>::QueryInterface (refId, result);\r
         }\r
 \r
-        JUCE_COMRESULT SampleCB (double, IMediaSample*)  { return E_FAIL; }\r
+        JUCE_COMRESULT SampleCB (double, ComTypes::IMediaSample*)  { return E_FAIL; }\r
 \r
         JUCE_COMRESULT BufferCB (double time, BYTE* buffer, long bufferSize)\r
         {\r
@@ -561,6 +555,7 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
         JUCE_DECLARE_NON_COPYABLE (GrabberCallback)\r
     };\r
 \r
+    DynamicLibrary wmvcoreLibrary { "wmvcore" };\r
     CameraDevice& owner;\r
 \r
     ComSmartPtr<GrabberCallback> callback;\r
@@ -577,12 +572,12 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
 \r
     Array<ViewerComponent*> viewerComps;\r
 \r
-    ComSmartPtr<ICaptureGraphBuilder2> captureGraphBuilder;\r
-    ComSmartPtr<IBaseFilter> filter, smartTee, asfWriter;\r
-    ComSmartPtr<IGraphBuilder> graphBuilder;\r
-    ComSmartPtr<ISampleGrabber> sampleGrabber;\r
-    ComSmartPtr<IMediaControl> mediaControl;\r
-    ComSmartPtr<IPin> smartTeePreviewOutputPin, smartTeeCaptureOutputPin;\r
+    ComSmartPtr<ComTypes::ICaptureGraphBuilder2> captureGraphBuilder;\r
+    ComSmartPtr<ComTypes::IBaseFilter> filter, smartTee, asfWriter;\r
+    ComSmartPtr<ComTypes::IGraphBuilder> graphBuilder;\r
+    ComSmartPtr<ComTypes::ISampleGrabber> sampleGrabber;\r
+    ComSmartPtr<ComTypes::IMediaControl> mediaControl;\r
+    ComSmartPtr<ComTypes::IPin> smartTeePreviewOutputPin, smartTeeCaptureOutputPin;\r
     int activeUsers = 0;\r
     Array<int> widths, heights;\r
     DWORD graphRegistrationID;\r
@@ -597,7 +592,7 @@ struct CameraDevice::Pimpl  : public ChangeBroadcaster
     JUCE_DECLARE_WEAK_REFERENCEABLE (Pimpl)\r
 \r
 private:\r
-    void getVideoSizes (IAMStreamConfig* const streamConfig)\r
+    void getVideoSizes (ComTypes::IAMStreamConfig* const streamConfig)\r
     {\r
         widths.clear();\r
         heights.clear();\r
@@ -605,12 +600,12 @@ private:
         int count = 0, size = 0;\r
         streamConfig->GetNumberOfCapabilities (&count, &size);\r
 \r
-        if (size == sizeof (VIDEO_STREAM_CONFIG_CAPS))\r
+        if (size == (int) sizeof (ComTypes::VIDEO_STREAM_CONFIG_CAPS))\r
         {\r
             for (int i = 0; i < count; ++i)\r
             {\r
-                VIDEO_STREAM_CONFIG_CAPS scc;\r
-                AM_MEDIA_TYPE* config;\r
+                ComTypes::VIDEO_STREAM_CONFIG_CAPS scc;\r
+                ComTypes::AM_MEDIA_TYPE* config;\r
 \r
                 HRESULT hr = streamConfig->GetStreamCaps (i, &config, (BYTE*) &scc);\r
 \r
@@ -642,17 +637,17 @@ private:
         }\r
     }\r
 \r
-    bool selectVideoSize (IAMStreamConfig* const streamConfig,\r
+    bool selectVideoSize (ComTypes::IAMStreamConfig* const streamConfig,\r
                           const int minWidth, const int minHeight,\r
                           const int maxWidth, const int maxHeight)\r
     {\r
         int count = 0, size = 0, bestArea = 0, bestIndex = -1;\r
         streamConfig->GetNumberOfCapabilities (&count, &size);\r
 \r
-        if (size == sizeof (VIDEO_STREAM_CONFIG_CAPS))\r
+        if (size == (int) sizeof (ComTypes::VIDEO_STREAM_CONFIG_CAPS))\r
         {\r
-            AM_MEDIA_TYPE* config;\r
-            VIDEO_STREAM_CONFIG_CAPS scc;\r
+            ComTypes::AM_MEDIA_TYPE* config;\r
+            ComTypes::VIDEO_STREAM_CONFIG_CAPS scc;\r
 \r
             for (int i = 0; i < count; ++i)\r
             {\r
@@ -690,22 +685,22 @@ private:
         return false;\r
     }\r
 \r
-    static bool getPin (IBaseFilter* filter, const PIN_DIRECTION wantedDirection,\r
-                        ComSmartPtr<IPin>& result, const char* pinName = nullptr)\r
+    static bool getPin (ComTypes::IBaseFilter* filter, const ComTypes::PIN_DIRECTION wantedDirection,\r
+                        ComSmartPtr<ComTypes::IPin>& result, const char* pinName = nullptr)\r
     {\r
-        ComSmartPtr<IEnumPins> enumerator;\r
-        ComSmartPtr<IPin> pin;\r
+        ComSmartPtr<ComTypes::IEnumPins> enumerator;\r
+        ComSmartPtr<ComTypes::IPin> pin;\r
 \r
         filter->EnumPins (enumerator.resetAndGetPointerAddress());\r
 \r
         while (enumerator->Next (1, pin.resetAndGetPointerAddress(), nullptr) == S_OK)\r
         {\r
-            PIN_DIRECTION dir;\r
+            ComTypes::PIN_DIRECTION dir;\r
             pin->QueryDirection (&dir);\r
 \r
             if (wantedDirection == dir)\r
             {\r
-                PIN_INFO info = {};\r
+                ComTypes::PIN_INFO info = {};\r
                 pin->QueryPinInfo (&info);\r
 \r
                 if (pinName == nullptr || String (pinName).equalsIgnoreCase (String (info.achName)))\r
@@ -719,12 +714,12 @@ private:
         return false;\r
     }\r
 \r
-    bool connectFilters (IBaseFilter* const first, IBaseFilter* const second) const\r
+    bool connectFilters (ComTypes::IBaseFilter* const first, ComTypes::IBaseFilter* const second) const\r
     {\r
-        ComSmartPtr<IPin> in, out;\r
+        ComSmartPtr<ComTypes::IPin> in, out;\r
 \r
-        return getPin (first, PINDIR_OUTPUT, out)\r
-                && getPin (second, PINDIR_INPUT, in)\r
+        return getPin (first, ComTypes::PINDIR_OUTPUT, out)\r
+                && getPin (second, ComTypes::PINDIR_INPUT, in)\r
                 && SUCCEEDED (graphBuilder->Connect (out, in));\r
     }\r
 \r
@@ -754,7 +749,7 @@ private:
 \r
     void disconnectAnyViewers();\r
 \r
-    static void deleteMediaType (AM_MEDIA_TYPE* const pmt)\r
+    static void deleteMediaType (ComTypes::AM_MEDIA_TYPE* const pmt)\r
     {\r
         if (pmt->cbFormat != 0)\r
             CoTaskMemFree ((PVOID) pmt->pbFormat);\r
diff --git a/modules/juce_video/native/juce_win32_ComTypes.h b/modules/juce_video/native/juce_win32_ComTypes.h
new file mode 100644 (file)
index 0000000..93c653a
--- /dev/null
@@ -0,0 +1,512 @@
+/*\r
+  ==============================================================================\r
+\r
+   This file is part of the JUCE library.\r
+   Copyright (c) 2020 - 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 6 End-User License\r
+   Agreement and JUCE Privacy Policy (both effective as of the 16th June 2020).\r
+\r
+   End User License Agreement: www.juce.com/juce-6-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
+namespace ComTypes\r
+{\r
+/*\r
+    These interfaces would normally be included in the system platform headers.\r
+    However, those headers are likely to be incomplete when building with\r
+    MinGW. In order to allow building video applications under MinGW,\r
+    we reproduce all necessary definitions here.\r
+*/\r
+\r
+enum PIN_DIRECTION\r
+{\r
+    PINDIR_INPUT = 0,\r
+    PINDIR_OUTPUT = PINDIR_INPUT + 1\r
+};\r
+\r
+enum VMRMode\r
+{\r
+    VMRMode_Windowed = 0x1,\r
+    VMRMode_Windowless = 0x2,\r
+    VMRMode_Renderless = 0x4,\r
+    VMRMode_Mask = 0x7\r
+};\r
+\r
+enum VMR_ASPECT_RATIO_MODE\r
+{\r
+    VMR_ARMODE_NONE = 0,\r
+    VMR_ARMODE_LETTER_BOX = VMR_ARMODE_NONE + 1\r
+};\r
+\r
+enum MFVideoAspectRatioMode\r
+{\r
+    MFVideoARMode_None = 0,\r
+    MFVideoARMode_PreservePicture = 0x1,\r
+    MFVideoARMode_PreservePixel = 0x2,\r
+    MFVideoARMode_NonLinearStretch = 0x4,\r
+    MFVideoARMode_Mask = 0x7\r
+};\r
+\r
+enum FILTER_STATE\r
+{\r
+    State_Stopped = 0,\r
+    State_Paused = State_Stopped + 1,\r
+    State_Running = State_Paused + 1\r
+};\r
+\r
+enum WMT_VERSION\r
+{\r
+    WMT_VER_4_0 = 0x40000,\r
+    WMT_VER_7_0 = 0x70000,\r
+    WMT_VER_8_0 = 0x80000,\r
+    WMT_VER_9_0 = 0x90000\r
+};\r
+\r
+// We only ever refer to these through a pointer, so we don't need definitions for them.\r
+struct IAMCopyCaptureFileProgress;\r
+struct IBaseFilter;\r
+struct IEnumFilters;\r
+struct IEnumMediaTypes;\r
+struct IReferenceClock;\r
+struct IVMRImageCompositor;\r
+\r
+struct FILTER_INFO;\r
+\r
+struct AM_MEDIA_TYPE\r
+{\r
+    GUID majortype;\r
+    GUID subtype;\r
+    BOOL bFixedSizeSamples;\r
+    BOOL bTemporalCompression;\r
+    ULONG lSampleSize;\r
+    GUID formattype;\r
+    IUnknown* pUnk;\r
+    ULONG cbFormat;\r
+    BYTE* pbFormat;\r
+};\r
+\r
+typedef LONGLONG REFERENCE_TIME;\r
+typedef LONG_PTR OAEVENT;\r
+typedef LONG_PTR OAHWND;\r
+typedef double REFTIME;\r
+typedef long OAFilterState;\r
+\r
+enum Constants\r
+{\r
+    EC_STATE_CHANGE = 0x32,\r
+    EC_REPAINT = 0x05,\r
+    EC_COMPLETE = 0x01,\r
+    EC_ERRORABORT = 0x03,\r
+    EC_ERRORABORTEX = 0x45,\r
+    EC_USERABORT = 0x02,\r
+\r
+    VFW_E_INVALID_FILE_FORMAT = (HRESULT) 0x8004022FL,\r
+    VFW_E_NOT_FOUND = (HRESULT) 0x80040216L,\r
+    VFW_E_UNKNOWN_FILE_TYPE = (HRESULT) 0x80040240L,\r
+    VFW_E_UNSUPPORTED_STREAM = (HRESULT) 0x80040265L,\r
+    VFW_E_CANNOT_CONNECT = (HRESULT) 0x80040217L,\r
+    VFW_E_CANNOT_LOAD_SOURCE_FILTER = (HRESULT) 0x80040241L,\r
+    VFW_E_NOT_CONNECTED = (HRESULT) 0x80040209L\r
+};\r
+\r
+struct MFVideoNormalizedRect\r
+{\r
+    float left;\r
+    float top;\r
+    float right;\r
+    float bottom;\r
+};\r
+\r
+struct VIDEOINFOHEADER\r
+{\r
+    RECT rcSource;\r
+    RECT rcTarget;\r
+    DWORD dwBitRate;\r
+    DWORD dwBitErrorRate;\r
+    REFERENCE_TIME AvgTimePerFrame;\r
+    BITMAPINFOHEADER bmiHeader;\r
+};\r
+\r
+struct VIDEO_STREAM_CONFIG_CAPS\r
+{\r
+    GUID guid;\r
+    ULONG VideoStandard;\r
+    SIZE InputSize;\r
+    SIZE MinCroppingSize;\r
+    SIZE MaxCroppingSize;\r
+    int CropGranularityX;\r
+    int CropGranularityY;\r
+    int CropAlignX;\r
+    int CropAlignY;\r
+    SIZE MinOutputSize;\r
+    SIZE MaxOutputSize;\r
+    int OutputGranularityX;\r
+    int OutputGranularityY;\r
+    int StretchTapsX;\r
+    int StretchTapsY;\r
+    int ShrinkTapsX;\r
+    int ShrinkTapsY;\r
+    LONGLONG MinFrameInterval;\r
+    LONGLONG MaxFrameInterval;\r
+    LONG MinBitsPerSecond;\r
+    LONG MaxBitsPerSecond;\r
+};\r
+\r
+struct PIN_INFO\r
+{\r
+    IBaseFilter* pFilter;\r
+    PIN_DIRECTION dir;\r
+    WCHAR achName[128];\r
+};\r
+\r
+JUCE_COMCLASS (ICreateDevEnum, "29840822-5B84-11D0-BD3B-00A0C911CE86") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL CreateClassEnumerator (REFCLSID clsidDeviceClass, _Out_ IEnumMoniker * *ppEnumMoniker, DWORD dwFlags) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IPin, "56a86891-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Connect (IPin * pReceivePin, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0;\r
+    JUCE_COMCALL ReceiveConnection (IPin * pConnector, const AM_MEDIA_TYPE* pmt) = 0;\r
+    JUCE_COMCALL Disconnect() = 0;\r
+    JUCE_COMCALL ConnectedTo (_Out_ IPin * *pPin) = 0;\r
+    JUCE_COMCALL ConnectionMediaType (_Out_ AM_MEDIA_TYPE * pmt) = 0;\r
+    JUCE_COMCALL QueryPinInfo (_Out_ PIN_INFO * pInfo) = 0;\r
+    JUCE_COMCALL QueryDirection (_Out_ PIN_DIRECTION * pPinDir) = 0;\r
+    JUCE_COMCALL QueryId (_Out_ LPWSTR * Id) = 0;\r
+    JUCE_COMCALL QueryAccept (const AM_MEDIA_TYPE* pmt) = 0;\r
+    JUCE_COMCALL EnumMediaTypes (_Out_ IEnumMediaTypes * *ppEnum) = 0;\r
+    JUCE_COMCALL QueryInternalConnections (_Out_writes_to_opt_ (*nPin, *nPin) IPin * *apPin, ULONG * nPin) = 0;\r
+    JUCE_COMCALL EndOfStream() = 0;\r
+    JUCE_COMCALL BeginFlush() = 0;\r
+    JUCE_COMCALL EndFlush() = 0;\r
+    JUCE_COMCALL NewSegment (REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IFilterGraph, "56a8689f-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL AddFilter (IBaseFilter * pFilter, LPCWSTR pName) = 0;\r
+    JUCE_COMCALL RemoveFilter (IBaseFilter * pFilter) = 0;\r
+    JUCE_COMCALL EnumFilters (_Out_ IEnumFilters * *ppEnum) = 0;\r
+    JUCE_COMCALL FindFilterByName (LPCWSTR pName, _Out_ IBaseFilter * *ppFilter) = 0;\r
+    JUCE_COMCALL ConnectDirect (IPin * ppinOut, IPin * ppinIn, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0;\r
+    JUCE_COMCALL Reconnect (IPin * ppin) = 0;\r
+    JUCE_COMCALL Disconnect (IPin * ppin) = 0;\r
+    JUCE_COMCALL SetDefaultSyncSource() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IGraphBuilder, "56a868a9-0ad4-11ce-b03a-0020af0ba770") : public IFilterGraph\r
+{\r
+public:\r
+    JUCE_COMCALL Connect (IPin * ppinOut, IPin * ppinIn) = 0;\r
+    JUCE_COMCALL Render (IPin * ppinOut) = 0;\r
+    JUCE_COMCALL RenderFile (LPCWSTR lpcwstrFile, _In_opt_ LPCWSTR lpcwstrPlayList) = 0;\r
+    JUCE_COMCALL AddSourceFilter (LPCWSTR lpcwstrFileName, _In_opt_ LPCWSTR lpcwstrFilterName, _Out_ IBaseFilter * *ppFilter) = 0;\r
+    JUCE_COMCALL SetLogFile (DWORD_PTR hFile) = 0;\r
+    JUCE_COMCALL Abort() = 0;\r
+    JUCE_COMCALL ShouldOperationContinue() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaFilter, "56a86899-0ad4-11ce-b03a-0020af0ba770") : public IPersist\r
+{\r
+public:\r
+    JUCE_COMCALL Stop() = 0;\r
+    JUCE_COMCALL Pause() = 0;\r
+    JUCE_COMCALL Run (REFERENCE_TIME tStart) = 0;\r
+    JUCE_COMCALL GetState (DWORD dwMilliSecsTimeout, _Out_ FILTER_STATE * State) = 0;\r
+    JUCE_COMCALL SetSyncSource (_In_opt_ IReferenceClock * pClock) = 0;\r
+    JUCE_COMCALL GetSyncSource (_Outptr_result_maybenull_ IReferenceClock * *pClock) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IEnumPins, "56a86892-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL Next (ULONG cPins, _Out_writes_to_ (cPins, *pcFetched) IPin * *ppPins, _Out_opt_ ULONG * pcFetched) = 0;\r
+    JUCE_COMCALL Skip (ULONG cPins) = 0;\r
+    JUCE_COMCALL Reset() = 0;\r
+    JUCE_COMCALL Clone (_Out_ IEnumPins * *ppEnum) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IBaseFilter, "56a86895-0ad4-11ce-b03a-0020af0ba770") : public IMediaFilter\r
+{\r
+public:\r
+    JUCE_COMCALL EnumPins (_Out_ IEnumPins * *ppEnum) = 0;\r
+    JUCE_COMCALL FindPin (LPCWSTR Id, _Out_ IPin * *ppPin) = 0;\r
+    JUCE_COMCALL QueryFilterInfo (_Out_ FILTER_INFO * pInfo) = 0;\r
+    JUCE_COMCALL JoinFilterGraph (_In_opt_ IFilterGraph * pGraph, _In_opt_ LPCWSTR pName) = 0;\r
+    JUCE_COMCALL QueryVendorInfo (_Out_ LPWSTR * pVendorInfo) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IVMRWindowlessControl, "0eb1088c-4dcd-46f0-878f-39dae86a51b7") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetNativeVideoSize (LONG * lpWidth, LONG * lpHeight, LONG * lpARWidth, LONG * lpARHeight) = 0;\r
+    JUCE_COMCALL GetMinIdealVideoSize (LONG * lpWidth, LONG * lpHeight) = 0;\r
+    JUCE_COMCALL GetMaxIdealVideoSize (LONG * lpWidth, LONG * lpHeight) = 0;\r
+    JUCE_COMCALL SetVideoPosition (const LPRECT lpSRCRect, const LPRECT lpDSTRect) = 0;\r
+    JUCE_COMCALL GetVideoPosition (LPRECT lpSRCRect, LPRECT lpDSTRect) = 0;\r
+    JUCE_COMCALL GetAspectRatioMode (DWORD * lpAspectRatioMode) = 0;\r
+    JUCE_COMCALL SetAspectRatioMode (DWORD AspectRatioMode) = 0;\r
+    JUCE_COMCALL SetVideoClippingWindow (HWND hwnd) = 0;\r
+    JUCE_COMCALL RepaintVideo (HWND hwnd, HDC hdc) = 0;\r
+    JUCE_COMCALL DisplayModeChanged() = 0;\r
+    JUCE_COMCALL GetCurrentImage (BYTE * *lpDib) = 0;\r
+    JUCE_COMCALL SetBorderColor (COLORREF Clr) = 0;\r
+    JUCE_COMCALL GetBorderColor (COLORREF * lpClr) = 0;\r
+    JUCE_COMCALL SetColorKey (COLORREF Clr) = 0;\r
+    JUCE_COMCALL GetColorKey (COLORREF * lpClr) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IVMRFilterConfig, "9e5530c5-7034-48b4-bb46-0b8a6efc8e36") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL SetImageCompositor (IVMRImageCompositor * lpVMRImgCompositor) = 0;\r
+    JUCE_COMCALL SetNumberOfStreams (DWORD dwMaxStreams) = 0;\r
+    JUCE_COMCALL GetNumberOfStreams (DWORD * pdwMaxStreams) = 0;\r
+    JUCE_COMCALL SetRenderingPrefs (DWORD dwRenderFlags) = 0;\r
+    JUCE_COMCALL GetRenderingPrefs (DWORD * pdwRenderFlags) = 0;\r
+    JUCE_COMCALL SetRenderingMode (DWORD Mode) = 0;\r
+    JUCE_COMCALL GetRenderingMode (DWORD * pMode) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMFVideoDisplayControl, "a490b1e4-ab84-4d31-a1b2-181e03b1077a") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetNativeVideoSize (__RPC__inout_opt SIZE * pszVideo, __RPC__inout_opt SIZE * pszARVideo) = 0;\r
+    JUCE_COMCALL GetIdealVideoSize (__RPC__inout_opt SIZE * pszMin, __RPC__inout_opt SIZE * pszMax) = 0;\r
+    JUCE_COMCALL SetVideoPosition (__RPC__in_opt const MFVideoNormalizedRect* pnrcSource, __RPC__in_opt const LPRECT prcDest) = 0;\r
+    JUCE_COMCALL GetVideoPosition (__RPC__out MFVideoNormalizedRect * pnrcSource, __RPC__out LPRECT prcDest) = 0;\r
+    JUCE_COMCALL SetAspectRatioMode (DWORD dwAspectRatioMode) = 0;\r
+    JUCE_COMCALL GetAspectRatioMode (__RPC__out DWORD * pdwAspectRatioMode) = 0;\r
+    JUCE_COMCALL SetVideoWindow (__RPC__in HWND hwndVideo) = 0;\r
+    JUCE_COMCALL GetVideoWindow (__RPC__deref_out_opt HWND * phwndVideo) = 0;\r
+    JUCE_COMCALL RepaintVideo() = 0;\r
+    JUCE_COMCALL GetCurrentImage (__RPC__inout BITMAPINFOHEADER * pBih, __RPC__deref_out_ecount_full_opt (*pcbDib) BYTE * *pDib, __RPC__out DWORD * pcbDib, __RPC__inout_opt LONGLONG * pTimeStamp) = 0;\r
+    JUCE_COMCALL SetBorderColor (COLORREF Clr) = 0;\r
+    JUCE_COMCALL GetBorderColor (__RPC__out COLORREF * pClr) = 0;\r
+    JUCE_COMCALL SetRenderingPrefs (DWORD dwRenderFlags) = 0;\r
+    JUCE_COMCALL GetRenderingPrefs (__RPC__out DWORD * pdwRenderFlags) = 0;\r
+    JUCE_COMCALL SetFullscreen (BOOL fFullscreen) = 0;\r
+    JUCE_COMCALL GetFullscreen (__RPC__out BOOL * pfFullscreen) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMFGetService, "fa993888-4383-415a-a930-dd472a8cf6f7") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetService (__RPC__in REFGUID guidService, __RPC__in REFIID riid, __RPC__deref_out_opt LPVOID * ppvObject) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaControl, "56a868b1-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+    JUCE_COMCALL Run() = 0;\r
+    JUCE_COMCALL Pause() = 0;\r
+    JUCE_COMCALL Stop() = 0;\r
+    JUCE_COMCALL GetState (LONG msTimeout, __RPC__out OAFilterState * pfs) = 0;\r
+    JUCE_COMCALL RenderFile (__RPC__in BSTR strFilename) = 0;\r
+    JUCE_COMCALL AddSourceFilter (__RPC__in BSTR strFilename, __RPC__deref_out_opt IDispatch * *ppUnk) = 0;\r
+    JUCE_COMCALL get_FilterCollection (__RPC__deref_out_opt IDispatch * *ppUnk) = 0;\r
+    JUCE_COMCALL get_RegFilterCollection (__RPC__deref_out_opt IDispatch * *ppUnk) = 0;\r
+    JUCE_COMCALL StopWhenReady() = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaPosition, "56a868b2-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+    JUCE_COMCALL get_Duration (__RPC__out REFTIME * plength) = 0;\r
+    JUCE_COMCALL put_CurrentPosition (REFTIME llTime) = 0;\r
+    JUCE_COMCALL get_CurrentPosition (__RPC__out REFTIME * pllTime) = 0;\r
+    JUCE_COMCALL get_StopTime (__RPC__out REFTIME * pllTime) = 0;\r
+    JUCE_COMCALL put_StopTime (REFTIME llTime) = 0;\r
+    JUCE_COMCALL get_PrerollTime (__RPC__out REFTIME * pllTime) = 0;\r
+    JUCE_COMCALL put_PrerollTime (REFTIME llTime) = 0;\r
+    JUCE_COMCALL put_Rate (double dRate) = 0;\r
+    JUCE_COMCALL get_Rate (__RPC__out double* pdRate) = 0;\r
+    JUCE_COMCALL CanSeekForward (__RPC__out LONG * pCanSeekForward) = 0;\r
+    JUCE_COMCALL CanSeekBackward (__RPC__out LONG * pCanSeekBackward) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaEvent, "56a868b6-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+    JUCE_COMCALL GetEventHandle (__RPC__out OAEVENT * hEvent) = 0;\r
+    JUCE_COMCALL GetEvent (__RPC__out long* lEventCode, __RPC__out LONG_PTR* lParam1, __RPC__out LONG_PTR* lParam2, long msTimeout) = 0;\r
+    JUCE_COMCALL WaitForCompletion (long msTimeout, __RPC__out long* pEvCode) = 0;\r
+    JUCE_COMCALL CancelDefaultHandling (long lEvCode) = 0;\r
+    JUCE_COMCALL RestoreDefaultHandling (long lEvCode) = 0;\r
+    JUCE_COMCALL FreeEventParams (long lEvCode, LONG_PTR lParam1, LONG_PTR lParam2) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaEventEx, "56a868c0-0ad4-11ce-b03a-0020af0ba770") : public IMediaEvent\r
+{\r
+public:\r
+    JUCE_COMCALL SetNotifyWindow (OAHWND hwnd, long lMsg, LONG_PTR lInstanceData) = 0;\r
+    JUCE_COMCALL SetNotifyFlags (long lNoNotifyFlags) = 0;\r
+    JUCE_COMCALL GetNotifyFlags (__RPC__out long* lplNoNotifyFlags) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IBasicAudio, "56a868b3-0ad4-11ce-b03a-0020af0ba770") : public IDispatch\r
+{\r
+public:\r
+    JUCE_COMCALL put_Volume (long lVolume) = 0;\r
+    JUCE_COMCALL get_Volume (__RPC__out long* plVolume) = 0;\r
+    JUCE_COMCALL put_Balance (long lBalance) = 0;\r
+    JUCE_COMCALL get_Balance (__RPC__out long* plBalance) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IMediaSample, "56a8689a-0ad4-11ce-b03a-0020af0ba770") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetPointer (BYTE * *ppBuffer) = 0;\r
+    virtual long STDMETHODCALLTYPE GetSize() = 0;\r
+    JUCE_COMCALL GetTime (_Out_ REFERENCE_TIME * pTimeStart, _Out_ REFERENCE_TIME * pTimeEnd) = 0;\r
+    JUCE_COMCALL SetTime (_In_opt_ REFERENCE_TIME * pTimeStart, _In_opt_ REFERENCE_TIME * pTimeEnd) = 0;\r
+    JUCE_COMCALL IsSyncPoint() = 0;\r
+    JUCE_COMCALL SetSyncPoint (BOOL bIsSyncPoint) = 0;\r
+    JUCE_COMCALL IsPreroll() = 0;\r
+    JUCE_COMCALL SetPreroll (BOOL bIsPreroll) = 0;\r
+    virtual long STDMETHODCALLTYPE GetActualDataLength() = 0;\r
+    JUCE_COMCALL SetActualDataLength (long __MIDL__IMediaSample0000) = 0;\r
+    JUCE_COMCALL GetMediaType (_Out_ AM_MEDIA_TYPE * *ppMediaType) = 0;\r
+    JUCE_COMCALL SetMediaType (_In_ AM_MEDIA_TYPE * pMediaType) = 0;\r
+    JUCE_COMCALL IsDiscontinuity() = 0;\r
+    JUCE_COMCALL SetDiscontinuity (BOOL bDiscontinuity) = 0;\r
+    JUCE_COMCALL GetMediaTime (_Out_ LONGLONG * pTimeStart, _Out_ LONGLONG * pTimeEnd) = 0;\r
+    JUCE_COMCALL SetMediaTime (_In_opt_ LONGLONG * pTimeStart, _In_opt_ LONGLONG * pTimeEnd) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IFileSinkFilter, "a2104830-7c70-11cf-8bce-00aa00a3f1a6") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL SetFileName (LPCOLESTR pszFileName, _In_opt_ const AM_MEDIA_TYPE* pmt) = 0;\r
+    JUCE_COMCALL GetCurFile (_Out_ LPOLESTR * ppszFileName, _Out_ AM_MEDIA_TYPE * pmt) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ICaptureGraphBuilder2, "93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL SetFiltergraph (IGraphBuilder * pfg) = 0;\r
+    JUCE_COMCALL GetFiltergraph (_Out_ IGraphBuilder * *ppfg) = 0;\r
+    JUCE_COMCALL SetOutputFileName (const GUID* pType, LPCOLESTR lpstrFile, _Outptr_ IBaseFilter** ppf, _Outptr_opt_ IFileSinkFilter** ppSink) = 0;\r
+    JUCE_COMCALL FindInterface (_In_opt_ const GUID* pCategory, _In_opt_ const GUID* pType, IBaseFilter* pf, REFIID riid, _Out_ void** ppint) = 0;\r
+    JUCE_COMCALL RenderStream (_In_opt_ const GUID* pCategory, const GUID* pType, IUnknown* pSource, IBaseFilter* pfCompressor, IBaseFilter* pfRenderer) = 0;\r
+    JUCE_COMCALL ControlStream (const GUID* pCategory, const GUID* pType, IBaseFilter* pFilter, _In_opt_ REFERENCE_TIME* pstart, _In_opt_ REFERENCE_TIME* pstop, WORD wStartCookie, WORD wStopCookie) = 0;\r
+    JUCE_COMCALL AllocCapFile (LPCOLESTR lpstr, DWORDLONG dwlSize) = 0;\r
+    JUCE_COMCALL CopyCaptureFile (_In_ LPOLESTR lpwstrOld, _In_ LPOLESTR lpwstrNew, int fAllowEscAbort, IAMCopyCaptureFileProgress* pCallback) = 0;\r
+    JUCE_COMCALL FindPin (IUnknown * pSource, PIN_DIRECTION pindir, _In_opt_ const GUID* pCategory, _In_opt_ const GUID* pType, BOOL fUnconnected, int num, _Out_ IPin** ppPin) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IAMStreamConfig, "C6E13340-30AC-11d0-A18C-00A0C9118956") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL SetFormat (AM_MEDIA_TYPE * pmt) = 0;\r
+    JUCE_COMCALL GetFormat (_Out_ AM_MEDIA_TYPE * *ppmt) = 0;\r
+    JUCE_COMCALL GetNumberOfCapabilities (_Out_ int* piCount, _Out_ int* piSize) = 0;\r
+    JUCE_COMCALL GetStreamCaps (int iIndex, _Out_ AM_MEDIA_TYPE** ppmt, _Out_ BYTE* pSCC) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISampleGrabberCB, "0579154A-2B53-4994-B0D0-E773148EFF85") : public IUnknown\r
+{\r
+    JUCE_COMCALL SampleCB (double, ComTypes::IMediaSample*) = 0;\r
+    JUCE_COMCALL BufferCB (double, BYTE*, long) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (ISampleGrabber, "6B652FFF-11FE-4fce-92AD-0266B5D7C78F") : public IUnknown\r
+{\r
+    JUCE_COMCALL SetOneShot (BOOL) = 0;\r
+    JUCE_COMCALL SetMediaType (const ComTypes::AM_MEDIA_TYPE*) = 0;\r
+    JUCE_COMCALL GetConnectedMediaType (ComTypes::AM_MEDIA_TYPE*) = 0;\r
+    JUCE_COMCALL SetBufferSamples (BOOL) = 0;\r
+    JUCE_COMCALL GetCurrentBuffer (long*, long*) = 0;\r
+    JUCE_COMCALL GetCurrentSample (ComTypes::IMediaSample**) = 0;\r
+    JUCE_COMCALL SetCallback (ISampleGrabberCB*, long) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IAMLatency, "62EA93BA-EC62-11d2-B770-00C04FB6BD3D") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL GetLatency (_Out_ REFERENCE_TIME * prtLatency) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IAMPushSource, "F185FE76-E64E-11d2-B76E-00C04FB6BD3D") : public IAMLatency\r
+{\r
+public:\r
+    JUCE_COMCALL GetPushSourceFlags (_Out_ ULONG * pFlags) = 0;\r
+    JUCE_COMCALL SetPushSourceFlags (ULONG Flags) = 0;\r
+    JUCE_COMCALL SetStreamOffset (REFERENCE_TIME rtOffset) = 0;\r
+    JUCE_COMCALL GetStreamOffset (_Out_ REFERENCE_TIME * prtOffset) = 0;\r
+    JUCE_COMCALL GetMaxStreamOffset (_Out_ REFERENCE_TIME * prtMaxOffset) = 0;\r
+    JUCE_COMCALL SetMaxStreamOffset (REFERENCE_TIME rtMaxOffset) = 0;\r
+};\r
+\r
+JUCE_COMCLASS (IConfigAsfWriter, "45086030-F7E4-486a-B504-826BB5792A3B") : public IUnknown\r
+{\r
+public:\r
+    JUCE_COMCALL ConfigureFilterUsingProfileId (DWORD dwProfileId) = 0;\r
+    JUCE_COMCALL GetCurrentProfileId (__RPC__out DWORD * pdwProfileId) = 0;\r
+    JUCE_COMCALL ConfigureFilterUsingProfileGuid (__RPC__in REFGUID guidProfile) = 0;\r
+    JUCE_COMCALL GetCurrentProfileGuid (__RPC__out GUID * pProfileGuid) = 0;\r
+    JUCE_COMCALL ConfigureFilterUsingProfile (__RPC__in_opt IWMProfile * pProfile) = 0;\r
+    JUCE_COMCALL GetCurrentProfile (__RPC__deref_out_opt IWMProfile * *ppProfile) = 0;\r
+    JUCE_COMCALL SetIndexMode (BOOL bIndexFile) = 0;\r
+    JUCE_COMCALL GetIndexMode (__RPC__out BOOL * pbIndexFile) = 0;\r
+};\r
+\r
+constexpr CLSID CLSID_CaptureGraphBuilder2      = { 0xBF87B6E1, 0x8C27, 0x11d0, { 0xB3, 0xF0, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5 } };\r
+constexpr CLSID CLSID_EnhancedVideoRenderer     = { 0xfa10746c, 0x9b63, 0x4b6c, { 0xbc, 0x49, 0xfc, 0x30, 0x0e, 0xa5, 0xf2, 0x56 } };\r
+constexpr CLSID CLSID_FilterGraph               = { 0xe436ebb3, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } };\r
+constexpr CLSID CLSID_NullRenderer              = { 0xC1F400A4, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
+constexpr CLSID CLSID_SampleGrabber             = { 0xC1F400A0, 0x3F08, 0x11d3, { 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 } };\r
+constexpr CLSID CLSID_SmartTee                  = { 0xcc58e280, 0x8aa1, 0x11d1, { 0xb3, 0xf1, 0x00, 0xaa, 0x00, 0x37, 0x61, 0xc5 } };\r
+constexpr CLSID CLSID_SystemDeviceEnum          = { 0x62BE5D10, 0x60EB, 0x11d0, { 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 } };\r
+constexpr CLSID CLSID_VideoInputDeviceCategory  = { 0x860BB310, 0x5D01, 0x11d0, { 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 } };\r
+constexpr CLSID CLSID_VideoMixingRenderer       = { 0xb87beb7b, 0x8d29, 0x423F, { 0xae, 0x4d, 0x65, 0x82, 0xc1, 0x01, 0x75, 0xac } };\r
+constexpr CLSID CLSID_WMAsfWriter               = { 0x7c23220e, 0x55bb, 0x11d3, { 0x8b, 0x16, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d } };\r
+constexpr CLSID FORMAT_VideoInfo                = { 0x05589f80, 0xc356, 0x11ce, { 0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a } };\r
+constexpr CLSID MEDIASUBTYPE_RGB24              = { 0xe436eb7d, 0x524f, 0x11ce, { 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } };\r
+constexpr CLSID MEDIATYPE_Video                 = { 0x73646976, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } };\r
+constexpr CLSID MR_VIDEO_RENDER_SERVICE         = { 0x1092a86c, 0xab1a, 0x459a, { 0xa3, 0x36, 0x83, 0x1f, 0xbc, 0x4d, 0x11, 0xff } };\r
+constexpr CLSID PIN_CATEGORY_CAPTURE            = { 0xfb6c4281, 0x0353, 0x11d1, { 0x90, 0x5f, 0x00, 0x00, 0xc0, 0xcc, 0x16, 0xba } };\r
+\r
+} // namespace ComTypes\r
+} // namespace juce\r
+\r
+#ifdef __CRT_UUID_DECL\r
+__CRT_UUID_DECL (juce::ComTypes::IAMPushSource,               0xF185FE76, 0xE64E, 0x11d2, 0xB7, 0x6E, 0x00, 0xC0, 0x4F, 0xB6, 0xBD, 0x3D)\r
+__CRT_UUID_DECL (juce::ComTypes::IAMStreamConfig,             0xC6E13340, 0x30AC, 0x11d0, 0xA1, 0x8C, 0x00, 0xA0, 0xC9, 0x11, 0x89, 0x56)\r
+__CRT_UUID_DECL (juce::ComTypes::IBaseFilter,                 0x56a86895, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IBasicAudio,                 0x56a868b3, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::ICaptureGraphBuilder2,       0x93E5A4E0, 0x2D50, 0x11d2, 0xAB, 0xFA, 0x00, 0xA0, 0xC9, 0xC6, 0xE3, 0x8D)\r
+__CRT_UUID_DECL (juce::ComTypes::IConfigAsfWriter,            0x45086030, 0xF7E4, 0x486a, 0xB5, 0x04, 0x82, 0x6B, 0xB5, 0x79, 0x2A, 0x3B)\r
+__CRT_UUID_DECL (juce::ComTypes::ICreateDevEnum,              0x29840822, 0x5B84, 0x11D0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86)\r
+__CRT_UUID_DECL (juce::ComTypes::IFileSinkFilter,             0xa2104830, 0x7c70, 0x11cf, 0x8b, 0xce, 0x00, 0xaa, 0x00, 0xa3, 0xf1, 0xa6)\r
+__CRT_UUID_DECL (juce::ComTypes::IGraphBuilder,               0x56a868a9, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IMFGetService,               0xfa993888, 0x4383, 0x415a, 0xa9, 0x30, 0xdd, 0x47, 0x2a, 0x8c, 0xf6, 0xf7)\r
+__CRT_UUID_DECL (juce::ComTypes::IMFVideoDisplayControl,      0xa490b1e4, 0xab84, 0x4d31, 0xa1, 0xb2, 0x18, 0x1e, 0x03, 0xb1, 0x07, 0x7a)\r
+__CRT_UUID_DECL (juce::ComTypes::IMediaControl,               0x56a868b1, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IMediaEventEx,               0x56a868c0, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::IMediaPosition,              0x56a868b2, 0x0ad4, 0x11ce, 0xb0, 0x3a, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70)\r
+__CRT_UUID_DECL (juce::ComTypes::ISampleGrabber,              0x6B652FFF, 0x11FE, 0x4fce, 0x92, 0xAD, 0x02, 0x66, 0xB5, 0xD7, 0xC7, 0x8F)\r
+__CRT_UUID_DECL (juce::ComTypes::ISampleGrabberCB,            0x0579154A, 0x2B53, 0x4994, 0xB0, 0xD0, 0xE7, 0x73, 0x14, 0x8E, 0xFF, 0x85)\r
+__CRT_UUID_DECL (juce::ComTypes::IVMRFilterConfig,            0x9e5530c5, 0x7034, 0x48b4, 0xbb, 0x46, 0x0b, 0x8a, 0x6e, 0xfc, 0x8e, 0x36)\r
+__CRT_UUID_DECL (juce::ComTypes::IVMRWindowlessControl,       0x0eb1088c, 0x4dcd, 0x46f0, 0x87, 0x8f, 0x39, 0xda, 0xe8, 0x6a, 0x51, 0xb7)\r
+#endif\r
index 36d474f4a3aff8d1eae20c178ae102526693125f..da3f835bddc23bf4a0dc386be0d6f05b1989bdbe 100644 (file)
@@ -28,9 +28,9 @@ namespace VideoRenderers
     //==============================================================================\r
     struct Base\r
     {\r
-        virtual ~Base() {}\r
+        virtual ~Base() = default;\r
 \r
-        virtual HRESULT create (ComSmartPtr<IGraphBuilder>&, ComSmartPtr<IBaseFilter>&, HWND) = 0;\r
+        virtual HRESULT create (ComSmartPtr<ComTypes::IGraphBuilder>&, ComSmartPtr<ComTypes::IBaseFilter>&, HWND) = 0;\r
         virtual void setVideoWindow (HWND) = 0;\r
         virtual void setVideoPosition (HWND) = 0;\r
         virtual void repaintVideo (HWND, HDC) = 0;\r
@@ -43,19 +43,19 @@ namespace VideoRenderers
     {\r
         VMR7() {}\r
 \r
-        HRESULT create (ComSmartPtr<IGraphBuilder>& graphBuilder,\r
-                        ComSmartPtr<IBaseFilter>& baseFilter, HWND hwnd) override\r
+        HRESULT create (ComSmartPtr<ComTypes::IGraphBuilder>& graphBuilder,\r
+                        ComSmartPtr<ComTypes::IBaseFilter>& baseFilter, HWND hwnd) override\r
         {\r
-            ComSmartPtr<IVMRFilterConfig> filterConfig;\r
+            ComSmartPtr<ComTypes::IVMRFilterConfig> filterConfig;\r
 \r
-            HRESULT hr = baseFilter.CoCreateInstance (CLSID_VideoMixingRenderer);\r
+            HRESULT hr = baseFilter.CoCreateInstance (ComTypes::CLSID_VideoMixingRenderer);\r
 \r
             if (SUCCEEDED (hr))   hr = graphBuilder->AddFilter (baseFilter, L"VMR-7");\r
             if (SUCCEEDED (hr))   hr = baseFilter.QueryInterface (filterConfig);\r
-            if (SUCCEEDED (hr))   hr = filterConfig->SetRenderingMode (VMRMode_Windowless);\r
+            if (SUCCEEDED (hr))   hr = filterConfig->SetRenderingMode (ComTypes::VMRMode_Windowless);\r
             if (SUCCEEDED (hr))   hr = baseFilter.QueryInterface (windowlessControl);\r
             if (SUCCEEDED (hr))   hr = windowlessControl->SetVideoClippingWindow (hwnd);\r
-            if (SUCCEEDED (hr))   hr = windowlessControl->SetAspectRatioMode (VMR_ARMODE_LETTER_BOX);\r
+            if (SUCCEEDED (hr))   hr = windowlessControl->SetAspectRatioMode (ComTypes::VMR_ARMODE_LETTER_BOX);\r
 \r
             return hr;\r
         }\r
@@ -92,7 +92,7 @@ namespace VideoRenderers
             return windowlessControl->GetNativeVideoSize (&videoWidth, &videoHeight, nullptr, nullptr);\r
         }\r
 \r
-        ComSmartPtr<IVMRWindowlessControl> windowlessControl;\r
+        ComSmartPtr<ComTypes::IVMRWindowlessControl> windowlessControl;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VMR7)\r
     };\r
@@ -101,21 +101,23 @@ namespace VideoRenderers
     //==============================================================================\r
     struct EVR  : public Base\r
     {\r
-        EVR() {}\r
+        EVR() = default;\r
 \r
-        HRESULT create (ComSmartPtr<IGraphBuilder>& graphBuilder,\r
-                        ComSmartPtr<IBaseFilter>& baseFilter, HWND hwnd) override\r
+        HRESULT create (ComSmartPtr<ComTypes::IGraphBuilder>& graphBuilder,\r
+                        ComSmartPtr<ComTypes::IBaseFilter>& baseFilter, HWND hwnd) override\r
         {\r
-            ComSmartPtr<IMFGetService> getService;\r
+            ComSmartPtr<ComTypes::IMFGetService> getService;\r
 \r
-            HRESULT hr = baseFilter.CoCreateInstance (CLSID_EnhancedVideoRenderer);\r
+            HRESULT hr = baseFilter.CoCreateInstance (ComTypes::CLSID_EnhancedVideoRenderer);\r
 \r
             if (SUCCEEDED (hr))   hr = graphBuilder->AddFilter (baseFilter, L"EVR");\r
             if (SUCCEEDED (hr))   hr = baseFilter.QueryInterface (getService);\r
-            if (SUCCEEDED (hr))   hr = getService->GetService (MR_VIDEO_RENDER_SERVICE, IID_IMFVideoDisplayControl,\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")\r
+            if (SUCCEEDED (hr))   hr = getService->GetService (ComTypes::MR_VIDEO_RENDER_SERVICE, __uuidof (ComTypes::IMFVideoDisplayControl),\r
                                                                (void**) videoDisplayControl.resetAndGetPointerAddress());\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
             if (SUCCEEDED (hr))   hr = videoDisplayControl->SetVideoWindow (hwnd);\r
-            if (SUCCEEDED (hr))   hr = videoDisplayControl->SetAspectRatioMode (MFVideoARMode_PreservePicture);\r
+            if (SUCCEEDED (hr))   hr = videoDisplayControl->SetAspectRatioMode (ComTypes::MFVideoARMode_PreservePicture);\r
 \r
             return hr;\r
         }\r
@@ -127,7 +129,7 @@ namespace VideoRenderers
 \r
         void setVideoPosition (HWND hwnd) override\r
         {\r
-            const MFVideoNormalizedRect src = { 0.0f, 0.0f, 1.0f, 1.0f };\r
+            const ComTypes::MFVideoNormalizedRect src { 0.0f, 0.0f, 1.0f, 1.0f };\r
 \r
             RECT dest;\r
             GetClientRect (hwnd, &dest);\r
@@ -151,7 +153,7 @@ namespace VideoRenderers
             return hr;\r
         }\r
 \r
-        ComSmartPtr<IMFVideoDisplayControl> videoDisplayControl;\r
+        ComSmartPtr<ComTypes::IMFVideoDisplayControl> videoDisplayControl;\r
 \r
         JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EVR)\r
     };\r
@@ -358,6 +360,7 @@ private:
         {\r
         }\r
 \r
+        using ComponentMovementWatcher::componentMovedOrResized;\r
         void componentMovedOrResized (bool, bool) override\r
         {\r
             if (owner.videoLoaded)\r
@@ -373,6 +376,7 @@ private:
                 owner.recreateNativeWindowAsync();\r
         }\r
 \r
+        using ComponentMovementWatcher::componentVisibilityChanged;\r
         void componentVisibilityChanged() override\r
         {\r
             if (owner.videoLoaded)\r
@@ -442,8 +446,8 @@ private:
 \r
             createNativeWindow();\r
 \r
-            mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
-            mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
+            mediaEvent->CancelDefaultHandling (ComTypes::EC_STATE_CHANGE);\r
+            mediaEvent->SetNotifyWindow ((ComTypes::OAHWND) hwnd, graphEventID, 0);\r
 \r
             if (videoRenderer != nullptr)\r
                 videoRenderer->setVideoWindow (hwnd);\r
@@ -493,7 +497,7 @@ private:
             if (! createNativeWindow())\r
                 return Result::fail ("Can't create window");\r
 \r
-            HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph);\r
+            HRESULT hr = graphBuilder.CoCreateInstance (ComTypes::CLSID_FilterGraph);\r
 \r
             // basic playback interfaces\r
             if (SUCCEEDED (hr))   hr = graphBuilder.QueryInterface (mediaControl);\r
@@ -555,8 +559,8 @@ private:
             // set window to receive events\r
             if (SUCCEEDED (hr))\r
             {\r
-                mediaEvent->CancelDefaultHandling (EC_STATE_CHANGE);\r
-                hr = mediaEvent->SetNotifyWindow ((OAHWND) hwnd, graphEventID, 0);\r
+                mediaEvent->CancelDefaultHandling (ComTypes::EC_STATE_CHANGE);\r
+                hr = mediaEvent->SetNotifyWindow ((ComTypes::OAHWND) hwnd, graphEventID, 0);\r
             }\r
 \r
             if (SUCCEEDED (hr))\r
@@ -577,18 +581,18 @@ private:
         {\r
             switch (hr)\r
             {\r
-                case VFW_E_INVALID_FILE_FORMAT:         return Result::fail ("Invalid file format");\r
-                case VFW_E_NOT_FOUND:                   return Result::fail ("File not found");\r
-                case VFW_E_UNKNOWN_FILE_TYPE:           return Result::fail ("Unknown file type");\r
-                case VFW_E_UNSUPPORTED_STREAM:          return Result::fail ("Unsupported stream");\r
-                case VFW_E_CANNOT_CONNECT:              return Result::fail ("Cannot connect");\r
-                case VFW_E_CANNOT_LOAD_SOURCE_FILTER:   return Result::fail ("Cannot load source filter");\r
+                case ComTypes::VFW_E_INVALID_FILE_FORMAT:         return Result::fail ("Invalid file format");\r
+                case ComTypes::VFW_E_NOT_FOUND:                   return Result::fail ("File not found");\r
+                case ComTypes::VFW_E_UNKNOWN_FILE_TYPE:           return Result::fail ("Unknown file type");\r
+                case ComTypes::VFW_E_UNSUPPORTED_STREAM:          return Result::fail ("Unsupported stream");\r
+                case ComTypes::VFW_E_CANNOT_CONNECT:              return Result::fail ("Cannot connect");\r
+                case ComTypes::VFW_E_CANNOT_LOAD_SOURCE_FILTER:   return Result::fail ("Cannot load source filter");\r
             }\r
 \r
             TCHAR messageBuffer[512] = { 0 };\r
 \r
             FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\r
-                           nullptr, hr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
+                           nullptr, (DWORD) hr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),\r
                            messageBuffer, (DWORD) numElementsInArray (messageBuffer) - 1, nullptr);\r
 \r
             return Result::fail (String (messageBuffer));\r
@@ -633,28 +637,28 @@ private:
 \r
                 switch (ec)\r
                 {\r
-                    case EC_REPAINT:\r
+                    case ComTypes::EC_REPAINT:\r
                         component.repaint();\r
                         break;\r
 \r
-                    case EC_COMPLETE:\r
+                    case ComTypes::EC_COMPLETE:\r
                         component.stop();\r
                         component.setPosition (0.0);\r
                         break;\r
 \r
-                    case EC_ERRORABORT:\r
-                    case EC_ERRORABORTEX:\r
+                    case ComTypes::EC_ERRORABORT:\r
+                    case ComTypes::EC_ERRORABORTEX:\r
                         component.errorOccurred (getErrorMessageFromResult ((HRESULT) p1).getErrorMessage());\r
                         // intentional fallthrough\r
-                    case EC_USERABORT:\r
+                    case ComTypes::EC_USERABORT:\r
                         component.close();\r
                         break;\r
 \r
-                    case EC_STATE_CHANGE:\r
+                    case ComTypes::EC_STATE_CHANGE:\r
                         switch (p1)\r
                         {\r
-                            case State_Paused:  component.playbackStopped(); break;\r
-                            case State_Running: component.playbackStarted(); break;\r
+                            case ComTypes::State_Paused:  component.playbackStopped(); break;\r
+                            case ComTypes::State_Running: component.playbackStarted(); break;\r
                             default: break;\r
                         }\r
 \r
@@ -697,7 +701,7 @@ private:
         //==============================================================================\r
         double getDuration() const\r
         {\r
-            REFTIME duration;\r
+            ComTypes::REFTIME duration;\r
             mediaPosition->get_Duration (&duration);\r
             return duration;\r
         }\r
@@ -711,7 +715,7 @@ private:
 \r
         double getPosition() const\r
         {\r
-            REFTIME seconds;\r
+            ComTypes::REFTIME seconds;\r
             mediaPosition->get_CurrentPosition (&seconds);\r
             return seconds;\r
         }\r
@@ -747,12 +751,12 @@ private:
         HWND hwnd = {};\r
         HDC hdc = {};\r
 \r
-        ComSmartPtr<IGraphBuilder> graphBuilder;\r
-        ComSmartPtr<IMediaControl> mediaControl;\r
-        ComSmartPtr<IMediaPosition> mediaPosition;\r
-        ComSmartPtr<IMediaEventEx> mediaEvent;\r
-        ComSmartPtr<IBasicAudio> basicAudio;\r
-        ComSmartPtr<IBaseFilter> baseFilter;\r
+        ComSmartPtr<ComTypes::IGraphBuilder> graphBuilder;\r
+        ComSmartPtr<ComTypes::IMediaControl> mediaControl;\r
+        ComSmartPtr<ComTypes::IMediaPosition> mediaPosition;\r
+        ComSmartPtr<ComTypes::IMediaEventEx> mediaEvent;\r
+        ComSmartPtr<ComTypes::IBasicAudio> basicAudio;\r
+        ComSmartPtr<ComTypes::IBaseFilter> baseFilter;\r
 \r
         std::unique_ptr<VideoRenderers::Base> videoRenderer;\r
 \r
@@ -800,31 +804,31 @@ private:
 \r
         bool isRendererConnected()\r
         {\r
-            ComSmartPtr<IEnumPins> enumPins;\r
+            ComSmartPtr<ComTypes::IEnumPins> enumPins;\r
 \r
             HRESULT hr = baseFilter->EnumPins (enumPins.resetAndGetPointerAddress());\r
 \r
             if (SUCCEEDED (hr))\r
                 hr = enumPins->Reset();\r
 \r
-            ComSmartPtr<IPin> pin;\r
+            ComSmartPtr<ComTypes::IPin> pin;\r
 \r
             while (SUCCEEDED (hr)\r
                     && enumPins->Next (1, pin.resetAndGetPointerAddress(), nullptr) == S_OK)\r
             {\r
-                ComSmartPtr<IPin> otherPin;\r
+                ComSmartPtr<ComTypes::IPin> otherPin;\r
 \r
                 hr = pin->ConnectedTo (otherPin.resetAndGetPointerAddress());\r
 \r
                 if (SUCCEEDED (hr))\r
                 {\r
-                    PIN_DIRECTION direction;\r
+                    ComTypes::PIN_DIRECTION direction;\r
                     hr = pin->QueryDirection (&direction);\r
 \r
-                    if (SUCCEEDED (hr) && direction == PINDIR_INPUT)\r
+                    if (SUCCEEDED (hr) && direction == ComTypes::PINDIR_INPUT)\r
                         return true;\r
                 }\r
-                else if (hr == VFW_E_NOT_CONNECTED)\r
+                else if (hr == ComTypes::VFW_E_NOT_CONNECTED)\r
                 {\r
                     hr = S_OK;\r
                 }\r