New upstream version 6.0.7~ds0
authorIOhannes m zmölnig <zmoelnig@umlautS.umlaeute.mur.at>
Wed, 20 Jan 2021 08:34:12 +0000 (09:34 +0100)
committerIOhannes m zmölnig <zmoelnig@umlautS.umlaeute.mur.at>
Wed, 20 Jan 2021 08:34:12 +0000 (09:34 +0100)
271 files changed:
BREAKING-CHANGES.txt
CMakeLists.txt
ChangeList.txt
README.md
docs/CMake API.md
docs/Linux Dependencies.md [new file with mode: 0644]
examples/Assets/DSPDemos_Common.h
examples/CMake/AudioPlugin/CMakeLists.txt
examples/CMake/AudioPlugin/PluginProcessor.cpp
examples/DemoRunner/Builds/Android/app/CMakeLists.txt
examples/DemoRunner/Builds/Android/app/build.gradle
examples/DemoRunner/Builds/Android/app/src/main/AndroidManifest.xml
examples/DemoRunner/Builds/Android/app/src/main/assets/DSPDemos_Common.h
examples/DemoRunner/Builds/LinuxMakefile/Makefile
examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
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/iOS/DemoRunner.xcodeproj/project.pbxproj
examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
examples/DemoRunner/Builds/iOS/Info-App.plist
examples/DemoRunner/DemoRunner.jucer
examples/DemoRunner/JuceLibraryCode/JuceHeader.h
examples/Utilities/PushNotificationsDemo.h
extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
extras/AudioPerformanceTest/Builds/LinuxMakefile/Makefile
extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj
extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters
extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.pbxproj
extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
extras/AudioPluginHost/Builds/LinuxMakefile/Makefile
extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
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/iOS/AudioPluginHost.xcodeproj/project.pbxproj
extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
extras/BinaryBuilder/Builds/LinuxMakefile/Makefile
extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.pbxproj
extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj
extras/Build/CMake/JUCEUtils.cmake
extras/Build/juce_build_tools/juce_build_tools.h
extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
extras/NetworkGraphicsDemo/Builds/LinuxMakefile/Makefile
extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj
extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.pbxproj
extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
extras/Projucer/Builds/LinuxMakefile/Makefile
extras/Projucer/Builds/MacOSX/Info-App.plist
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.pbxproj
extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2015/resources.rc
extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2017/resources.rc
extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
extras/Projucer/Builds/VisualStudio2019/resources.rc
extras/Projucer/JuceLibraryCode/BinaryData.cpp
extras/Projucer/JuceLibraryCode/BinaryData.h
extras/Projucer/JuceLibraryCode/JuceHeader.h
extras/Projucer/Projucer.jucer
extras/Projucer/Source/Application/StartPage/jucer_ContentComponents.h
extras/Projucer/Source/Application/jucer_AutoUpdater.cpp
extras/Projucer/Source/BinaryData/Templates/jucer_AudioPluginFilterTemplate.cpp
extras/Projucer/Source/Project/jucer_Project.cpp
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h
extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.cpp
extras/Projucer/Source/Settings/jucer_AppearanceSettings.cpp
extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h
extras/UnitTestRunner/Builds/LinuxMakefile/Makefile
extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings [deleted file]
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/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj
extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters
modules/juce_analytics/juce_analytics.h
modules/juce_audio_basics/juce_audio_basics.h
modules/juce_audio_basics/mpe/juce_MPEInstrument.cpp
modules/juce_audio_basics/mpe/juce_MPEInstrument.h
modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp
modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h
modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h
modules/juce_audio_devices/juce_audio_devices.cpp
modules/juce_audio_devices/juce_audio_devices.h
modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPView.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h [new file with mode: 0644]
modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h [new file with mode: 0644]
modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp [deleted file]
modules/juce_audio_devices/native/juce_mac_CoreMidi.mm [new file with mode: 0644]
modules/juce_audio_devices/native/oboe/CMakeLists.txt
modules/juce_audio_devices/native/oboe/include/oboe/AudioStream.h
modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBase.h
modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamBuilder.h
modules/juce_audio_devices/native/oboe/include/oboe/AudioStreamCallback.h
modules/juce_audio_devices/native/oboe/include/oboe/LatencyTuner.h
modules/juce_audio_devices/native/oboe/include/oboe/Version.h
modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.cpp
modules/juce_audio_devices/native/oboe/src/aaudio/AudioStreamAAudio.h
modules/juce_audio_devices/native/oboe/src/common/AudioSourceCaller.cpp
modules/juce_audio_devices/native/oboe/src/common/AudioStream.cpp
modules/juce_audio_devices/native/oboe/src/common/AudioStreamBuilder.cpp
modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.cpp
modules/juce_audio_devices/native/oboe/src/common/DataConversionFlowGraph.h
modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.cpp
modules/juce_audio_devices/native/oboe/src/common/FilterAudioStream.h
modules/juce_audio_devices/native/oboe/src/common/LatencyTuner.cpp
modules/juce_audio_devices/native/oboe/src/common/QuirksManager.cpp
modules/juce_audio_devices/native/oboe/src/common/QuirksManager.h
modules/juce_audio_devices/native/oboe/src/common/Trace.h
modules/juce_audio_devices/native/oboe/src/common/Utilities.cpp
modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.cpp
modules/juce_audio_devices/native/oboe/src/fifo/FifoBuffer.h
modules/juce_audio_devices/native/oboe/src/fifo/FifoController.cpp
modules/juce_audio_devices/native/oboe/src/fifo/FifoController.h
modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.cpp
modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerBase.h
modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.cpp
modules/juce_audio_devices/native/oboe/src/fifo/FifoControllerIndirect.h
modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp [new file with mode: 0644]
modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h [new file with mode: 0644]
modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h
modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.h
modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h
modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h
modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp [new file with mode: 0644]
modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h [new file with mode: 0644]
modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h
modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.h
modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/SinkFloat.h
modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI16.h
modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/SinkI24.h
modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/SourceFloat.h
modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI16.h
modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/SourceI24.h
modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResampler.h
modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerMono.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/PolyphaseResamplerStereo.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.cpp
modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp
modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.cpp
modules/juce_audio_devices/native/oboe/src/opensles/AudioInputStreamOpenSLES.h
modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.cpp
modules/juce_audio_devices/native/oboe/src/opensles/AudioOutputStreamOpenSLES.h
modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.cpp
modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamBuffered.h
modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.cpp
modules/juce_audio_devices/native/oboe/src/opensles/AudioStreamOpenSLES.h
modules/juce_audio_devices/native/oboe/src/opensles/OpenSLESUtilities.cpp
modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp
modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp
modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp
modules/juce_audio_formats/juce_audio_formats.h
modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp
modules/juce_audio_plugin_client/juce_audio_plugin_client.h
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm
modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp
modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp
modules/juce_audio_processors/juce_audio_processors.cpp
modules/juce_audio_processors/juce_audio_processors.h
modules/juce_audio_processors/processors/juce_AudioProcessor.cpp
modules/juce_audio_processors/processors/juce_AudioProcessor.h
modules/juce_audio_utils/juce_audio_utils.h
modules/juce_blocks_basics/juce_blocks_basics.h
modules/juce_box2d/juce_box2d.h
modules/juce_core/juce_core.cpp
modules/juce_core/juce_core.h
modules/juce_core/memory/juce_Memory.h
modules/juce_core/native/juce_mac_SystemStats.mm
modules/juce_core/native/juce_posix_SharedCode.h
modules/juce_core/system/juce_StandardHeader.h
modules/juce_core/system/juce_SystemStats.h
modules/juce_core/text/juce_StringArray.cpp
modules/juce_core/text/juce_StringArray.h
modules/juce_core/text/juce_StringPairArray.cpp
modules/juce_core/text/juce_StringPairArray.h
modules/juce_core/threads/juce_HighResolutionTimer.cpp
modules/juce_cryptography/juce_cryptography.h
modules/juce_data_structures/juce_data_structures.h
modules/juce_dsp/filter_design/juce_FilterDesign.cpp
modules/juce_dsp/frequency/juce_Convolution.cpp
modules/juce_dsp/frequency/juce_Convolution_test.cpp
modules/juce_dsp/juce_dsp.cpp
modules/juce_dsp/juce_dsp.h
modules/juce_events/juce_events.cpp
modules/juce_events/juce_events.h
modules/juce_events/native/juce_mac_MessageManager.mm
modules/juce_graphics/juce_graphics.h
modules/juce_gui_basics/components/juce_ModalComponentManager.cpp
modules/juce_gui_basics/juce_gui_basics.cpp
modules/juce_gui_basics/juce_gui_basics.h
modules/juce_gui_basics/native/juce_android_Windowing.cpp
modules/juce_gui_basics/native/juce_ios_Windowing.mm
modules/juce_gui_basics/native/juce_linux_Windowing.cpp
modules/juce_gui_basics/native/juce_mac_MainMenu.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_X11_DragAndDrop.cpp
modules/juce_gui_basics/properties/juce_PropertyPanel.cpp
modules/juce_gui_basics/properties/juce_PropertyPanel.h
modules/juce_gui_extra/juce_gui_extra.cpp
modules/juce_gui_extra/juce_gui_extra.h
modules/juce_gui_extra/native/juce_android_PushNotifications.cpp
modules/juce_gui_extra/native/juce_ios_PushNotifications.cpp
modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm
modules/juce_gui_extra/native/juce_mac_PushNotifications.cpp
modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp
modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm
modules/juce_opengl/juce_opengl.cpp
modules/juce_opengl/juce_opengl.h
modules/juce_opengl/native/juce_OpenGL_osx.h
modules/juce_osc/juce_osc.h
modules/juce_osc/osc/juce_OSCAddress.h
modules/juce_osc/osc/juce_OSCArgument.h
modules/juce_product_unlocking/juce_product_unlocking.h
modules/juce_video/juce_video.h
modules/juce_video/native/juce_mac_CameraDevice.h

index 51ef929cb1ec66245915739e935387d53ccc123e..8b3cdcbfc573ac27ec4a0a57cd2bf0fd46462368 100644 (file)
@@ -1,6 +1,51 @@
 JUCE breaking changes
 =====================
 
+Version 6.0.6
+=============
+
+Change
+------
+The name of `OperatingSystemType::MacOSX_11_0` was changed to
+`OperatingSystemType::MacOS_11`.
+
+Possible Issues
+---------------
+Code using the old name will not build until it is updated to use the new name.
+
+Workaround
+----------
+Update code using the old name to use the new name instead.
+
+Rationale
+---------
+Newer versions of macOS have dropped the "X" naming. Minor version updates are
+also less significant now than they were for the X-series.
+
+
+Change
+------
+Xcode projects generated using the Projucer will now use the "New Build System"
+instead of the "Legacy Build System" by default.
+
+Possible Issues
+---------------
+Xcode 10.0 - 10.2 has some known issues when using the new build system such as
+JUCE modules not rebuilding correctly when modified, issue and file navigation
+not working, and breakpoints not being reliably set or hit.
+
+Workaround
+----------
+If you are using an affected version of Xcode then you can enable the "Use
+Legacy Build System" setting in the Projucer Xcode exporter to go back to the
+previous behaviour.
+
+Rationale
+---------
+The legacy build system has issues building arm64 binaries for Apple silicon
+and will eventually be removed altogether.
+
+
 Version 6.0.5
 =============
 
index f4b687323a7fb4a8c6036f2dfd08b735485786cf..07ae71582f25019822847d6ea778c7ba9028669b 100644 (file)
@@ -23,7 +23,7 @@
 
 cmake_minimum_required(VERSION 3.12)
 
-project(JUCE VERSION 6.0.5 LANGUAGES C CXX)
+project(JUCE VERSION 6.0.7 LANGUAGES C CXX)
 
 set_property(GLOBAL PROPERTY USE_FOLDERS YES)
 
index 3ba03f3847344d6471e5bcb42c86cfceb4023492..6b0c2428fe1a4bf8a62ee4027ab4cfc0a4f6cea7 100644 (file)
@@ -3,6 +3,18 @@
 This file just lists the more notable headline features. For more detailed info\r
 about minor changes and bugfixes, please see the git log!\r
 \r
+Version 6.0.7\r
+  - Fixed a macOS drawing issue\r
+  - Updated the DemoRunner bundle ID\r
+\r
+Version 6.0.6\r
+  - Moved to the new CoreMIDI API on supported platforms\r
+  - Added support for the "New Build System" in Xcode\r
+  - Made the audio format readers more robust\r
+  - Improved the HiResTimer implementation\r
+  - Fixed a VST3 program parameter issue\r
+  - Updated to Oboe 1.5 on Android\r
+\r
 Version 6.0.5\r
   - Added more support for styling PopupMenus\r
   - Fixed some race conditions in the IPC and name named pipe classes\r
index 60af0f08d72e6e21ee4b1b648e63d8e601f79bca..8e4098ae193dbe93a063561192f0dae6cd2ae73a 100644 (file)
--- a/README.md
+++ b/README.md
@@ -40,7 +40,7 @@ Version 3.15 or higher is required for plugin projects, and strongly
 recommended for other project types. To use CMake, you will need to install it,
 either from your system package manager or from the [official download
 page](https://cmake.org/download/). For comprehensive documentation on JUCE's
-CMake API, see the [JUCE CMake documentation](/docs/CMake API.md). For examples
+CMake API, see the [JUCE CMake documentation](/docs/CMake%20API.md). For examples
 which may be useful as starting points for new CMake projects, see the [CMake
 examples directory](/examples/CMake).
 
@@ -60,7 +60,8 @@ of the target you wish to build.
 
 - __macOS/iOS__: macOS 10.11 and Xcode 7.3.1
 - __Windows__: Windows 8.1 and Visual Studio 2015 64-bit
-- __Linux__: GCC 4.8
+- __Linux__: GCC 4.8 (for a full list of dependencies, see
+[here](/docs/Linux%20Dependencies.md)).
 - __Android__: Android Studio on Windows, macOS or Linux
 
 #### Deployment Targets
index 5328f44cd5ff4376724e08faa5616e3ddfde8002..8690721536951fd6d4240773752b5debf5bab60c 100644 (file)
@@ -412,11 +412,13 @@ attributes directly to these creation functions, rather than adding them later.
 
 - `PLUGIN_MANUFACTURER_CODE`
   - A four-character unique ID for your company. For AU compatibility, this must contain at least
-    one upper-case letter.
+    one upper-case letter. GarageBand 10.3 requires the first letter to be upper-case, and the
+    remaining letters to be lower-case.
 
 - `PLUGIN_CODE`
-  - A four-character unique ID for your plugin. For AU compatibility, this must contain at least
-    one upper-case letter.
+  - A four-character unique ID for your plugin. For AU compatibility, this must contain exactly one
+    upper-case letter. GarageBand 10.3 requires the first letter to be upper-case, and the remaining
+    letters to be lower-case.
 
 - `DESCRIPTION`
   - A short description of your plugin.
diff --git a/docs/Linux Dependencies.md b/docs/Linux Dependencies.md
new file mode 100644 (file)
index 0000000..107bce1
--- /dev/null
@@ -0,0 +1,58 @@
+# JUCE Dependencies on Linux
+
+Below is a list of the current dependencies required to build JUCE projects on
+Ubuntu, separated by module. Where the dependency is optional, the preprocessor
+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.
+
+## Compiler
+A C++ compiler is required. JUCE has been tested thoroughly with Clang and GCC:
+
+    sudo apt update
+    sudo apt install clang
+
+or
+
+    sudo apt update
+    sudo apt install g++
+
+## Packages
+
+#### juce_audio_devices
+- libasound2-dev
+- libjack-jackd2-dev (unless `JUCE_JACK=0`)
+
+#### juce_core
+- libcurl4-openssl-dev (unless `JUCE_USE_CURL=0`)
+
+#### juce_graphics
+- libfreetype6-dev (unless `JUCE_USE_FREETYPE=0`)
+
+#### juce_gui_basics
+- libx11-dev
+- libxcomposite-dev
+- libxcursor-dev (unless `JUCE_USE_XCURSOR=0`)
+- libxext-dev
+- libxinerama-dev (unless `JUCE_USE_XINERAMA=0`)
+- libxrandr-dev (unless `JUCE_USE_XRANDR=0`)
+- libxrender-dev (unless `JUCE_USE_XRENDER=0`)
+
+#### juce_gui_extra
+- webkit2gtk-4.0 (unless `JUCE_WEB_BROWSER=0`)
+
+#### juce_opengl
+- libglu1-mesa-dev
+- mesa-common-dev
+
+The full command is as follows:
+
+    sudo apt update
+    sudo apt install libasound2-dev libjack-jackd2-dev \
+        libcurl4-openssl-dev  \
+        libfreetype6-dev \
+        libx11-dev libxcomposite-dev libxcursor-dev libxcursor-dev libxext-dev libxinerama-dev libxrandr-dev libxrender-dev \
+        libwebkit2gtk-4.0-dev \
+        libglu1-mesa-dev mesa-common-dev
index 589d597be973a3f47afd428e8d17f2cc270f0fab..5bb3d966ffffd55bd6dd750be7dc6014b17f0b65 100644 (file)
@@ -587,37 +587,42 @@ private:
         {\r
             audioFileReader.stop();\r
 \r
-            if (fileChooser == nullptr)\r
+            if (fileChooser != nullptr)\r
+                return;\r
+\r
+            SafePointer<AudioPlayerHeader> safeThis (this);\r
+\r
+            if (! RuntimePermissions::isGranted (RuntimePermissions::readExternalStorage))\r
             {\r
-                SafePointer<AudioPlayerHeader> safeThis (this);\r
+                RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
+                                             [safeThis] (bool granted) mutable\r
+                                             {\r
+                                                 if (granted)\r
+                                                     safeThis->openFile();\r
+                                             });\r
+                return;\r
+            }\r
 \r
-                if (! RuntimePermissions::isGranted (RuntimePermissions::readExternalStorage))\r
-                {\r
-                    RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
-                                                 [safeThis] (bool granted) mutable\r
-                                                 {\r
-                                                     if (granted)\r
-                                                         safeThis->openFile();\r
-                                                 });\r
-                    return;\r
-                }\r
+            fileChooser.reset (new FileChooser ("Select an audio file...", File(), "*.wav;*.mp3;*.aif"));\r
 \r
-                fileChooser.reset (new FileChooser ("Select an audio file...", File(), "*.wav;*.mp3;*.aif"));\r
+            fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
+                                      [safeThis] (const FileChooser& fc) mutable\r
+                                      {\r
+                                          if (safeThis == nullptr)\r
+                                              return;\r
 \r
-                fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
-                                          [safeThis] (const FileChooser& fc) mutable\r
+                                          if (fc.getURLResults().size() > 0)\r
                                           {\r
-                                              if (safeThis != nullptr && fc.getURLResults().size() > 0)\r
-                                              {\r
-                                                  auto u = fc.getURLResult();\r
-\r
-                                                  if (! safeThis->audioFileReader.loadURL (u))\r
-                                                      NativeMessageBox::showOkCancelBox (AlertWindow::WarningIcon, "Error loading file", "Unable to load audio file", nullptr, nullptr);\r
-                                                  else\r
-                                                      safeThis->thumbnailComp.setCurrentURL (u);\r
-                                              }\r
-                                          }, nullptr);\r
-            }\r
+                                              auto u = fc.getURLResult();\r
+\r
+                                              if (! safeThis->audioFileReader.loadURL (u))\r
+                                                  NativeMessageBox::showOkCancelBox (AlertWindow::WarningIcon, "Error loading file", "Unable to load audio file", nullptr, nullptr);\r
+                                              else\r
+                                                  safeThis->thumbnailComp.setCurrentURL (u);\r
+                                          }\r
+\r
+                                          safeThis->fileChooser = nullptr;\r
+                                      }, nullptr);\r
         }\r
 \r
         void changeListenerCallback (ChangeBroadcaster*) override\r
index 645d5ecea6ce2ff7e3f1212c1af2f72a79d45ce4..c808704ed6ef2b19be96f656261bf78786354277 100644 (file)
@@ -49,7 +49,8 @@ juce_add_plugin(AudioPluginExample
     # EDITOR_WANTS_KEYBOARD_FOCUS TRUE/FALSE    # Does the editor need keyboard focus?
     # COPY_PLUGIN_AFTER_BUILD TRUE/FALSE        # Should the plugin be installed to a default location after building?
     PLUGIN_MANUFACTURER_CODE Juce               # A four-character manufacturer id with at least one upper-case character
-    PLUGIN_CODE Dem0                            # A unique four-character plugin id with at least one upper-case character
+    PLUGIN_CODE Dem0                            # A unique four-character plugin id with exactly one upper-case character
+                                                # GarageBand 10.3 requires the first letter to be upper-case, and the remaining letters to be lower-case
     FORMATS AU VST3 Standalone                  # The formats to build. Other valid formats are: AAX Unity VST AU AUv3
     PRODUCT_NAME "Audio Plugin Example")        # The name of the final executable, which can differ from the target name
 
index 31394624a957981fdf26cbf0b9c072a880361474..0dd5ac2a179d30cfc31035bc08c2efefc877d5e4 100644 (file)
@@ -105,6 +105,8 @@ bool AudioPluginAudioProcessor::isBusesLayoutSupported (const BusesLayout& layou
   #else\r
     // This is the place where you check if the layout is supported.\r
     // In this template code we only support mono or stereo.\r
+    // Some plugin hosts, such as certain GarageBand versions, will only\r
+    // load plugins that support stereo bus layouts.\r
     if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono()\r
      && layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo())\r
         return false;\r
index c3fb7461c68442458366398b600517367742a032..b517aa27b9b17edf5b0e498e4dfd4a7062320203 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.0.5" "-DJUCE_APP_VERSION_HEX=0x60005")
+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.0.7" "-DJUCE_APP_VERSION_HEX=0x60007")
 
 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=0x60005" "-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_blocks_basics=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.0.5" "-DJUCE_APP_VERSION_HEX=0x60005" "-DDEBUG=1" "-D_DEBUG=1")
+    add_definitions("-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60007" "-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_blocks_basics=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.0.7" "-DJUCE_APP_VERSION_HEX=0x60007" "-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=0x60005" "-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_blocks_basics=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.0.5" "-DJUCE_APP_VERSION_HEX=0x60005" "-DNDEBUG=1")
+    add_definitions("-DJUCE_DISPLAY_SPLASH_SCREEN=0" "-DJUCE_USE_DARK_SPLASH_SCREEN=1" "-DJUCE_PROJUCER_VERSION=0x60007" "-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_blocks_basics=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.0.7" "-DJUCE_APP_VERSION_HEX=0x60007" "-DNDEBUG=1")
 else()
     message( FATAL_ERROR "No matching build-configuration found." )
 endif()
@@ -138,6 +138,27 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
     "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
@@ -212,6 +233,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp"
@@ -220,6 +243,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp"
@@ -264,7 +289,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"
-    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp"
+    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm"
     "../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"
     "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"
@@ -1895,6 +1920,27 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1969,6 +2015,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1977,6 +2025,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -2021,7 +2071,7 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ju
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
-set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
index 555995ee0b4b7b49ebcc2f3232734341447c15b3..ac71218bdc9cb80a5b1ad3be2ff89faf05fff068 100644 (file)
@@ -18,7 +18,7 @@ android {
     }
 
     defaultConfig {
-        applicationId "com.rmsl.juce.demorunner"
+        applicationId "com.rmsl.jucedemorunner"
         minSdkVersion    23
         targetSdkVersion 29
         externalNativeBuild {
index 0400955b8b5aab6cd0deb52c0a2abeb691e8a20b..8c7426bff19503da8a2dba137ec0d8c0abc57cd0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.0.5"
-          package="com.rmsl.juce.demorunner">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="6.0.7"
+          package="com.rmsl.jucedemorunner">
   <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true"
                     android:xlargeScreens="true"/>
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
@@ -22,7 +22,7 @@
         <category android:name="android.intent.category.LAUNCHER"/>
       </intent-filter>
     </activity>
-    <provider android:name="com.rmsl.juce.JuceSharingContentProvider" android:authorities="com.rmsl.juce.demorunner.sharingcontentprovider"
+    <provider android:name="com.rmsl.juce.JuceSharingContentProvider" android:authorities="com.rmsl.jucedemorunner.sharingcontentprovider"
               android:grantUriPermissions="true" android:exported="true"/>
   </application>
 </manifest>
index 589d597be973a3f47afd428e8d17f2cc270f0fab..5bb3d966ffffd55bd6dd750be7dc6014b17f0b65 100644 (file)
@@ -587,37 +587,42 @@ private:
         {\r
             audioFileReader.stop();\r
 \r
-            if (fileChooser == nullptr)\r
+            if (fileChooser != nullptr)\r
+                return;\r
+\r
+            SafePointer<AudioPlayerHeader> safeThis (this);\r
+\r
+            if (! RuntimePermissions::isGranted (RuntimePermissions::readExternalStorage))\r
             {\r
-                SafePointer<AudioPlayerHeader> safeThis (this);\r
+                RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
+                                             [safeThis] (bool granted) mutable\r
+                                             {\r
+                                                 if (granted)\r
+                                                     safeThis->openFile();\r
+                                             });\r
+                return;\r
+            }\r
 \r
-                if (! RuntimePermissions::isGranted (RuntimePermissions::readExternalStorage))\r
-                {\r
-                    RuntimePermissions::request (RuntimePermissions::readExternalStorage,\r
-                                                 [safeThis] (bool granted) mutable\r
-                                                 {\r
-                                                     if (granted)\r
-                                                         safeThis->openFile();\r
-                                                 });\r
-                    return;\r
-                }\r
+            fileChooser.reset (new FileChooser ("Select an audio file...", File(), "*.wav;*.mp3;*.aif"));\r
 \r
-                fileChooser.reset (new FileChooser ("Select an audio file...", File(), "*.wav;*.mp3;*.aif"));\r
+            fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
+                                      [safeThis] (const FileChooser& fc) mutable\r
+                                      {\r
+                                          if (safeThis == nullptr)\r
+                                              return;\r
 \r
-                fileChooser->launchAsync (FileBrowserComponent::openMode | FileBrowserComponent::canSelectFiles,\r
-                                          [safeThis] (const FileChooser& fc) mutable\r
+                                          if (fc.getURLResults().size() > 0)\r
                                           {\r
-                                              if (safeThis != nullptr && fc.getURLResults().size() > 0)\r
-                                              {\r
-                                                  auto u = fc.getURLResult();\r
-\r
-                                                  if (! safeThis->audioFileReader.loadURL (u))\r
-                                                      NativeMessageBox::showOkCancelBox (AlertWindow::WarningIcon, "Error loading file", "Unable to load audio file", nullptr, nullptr);\r
-                                                  else\r
-                                                      safeThis->thumbnailComp.setCurrentURL (u);\r
-                                              }\r
-                                          }, nullptr);\r
-            }\r
+                                              auto u = fc.getURLResult();\r
+\r
+                                              if (! safeThis->audioFileReader.loadURL (u))\r
+                                                  NativeMessageBox::showOkCancelBox (AlertWindow::WarningIcon, "Error loading file", "Unable to load audio file", nullptr, nullptr);\r
+                                              else\r
+                                                  safeThis->thumbnailComp.setCurrentURL (u);\r
+                                          }\r
+\r
+                                          safeThis->fileChooser = nullptr;\r
+                                      }, nullptr);\r
         }\r
 \r
         void changeListenerCallback (ChangeBroadcaster*) override\r
index 25af0ad2cb585d74f3f7340d48392abc28d4efb6..3d5c2cacf19b38a5e15d0cd8a1f0b9c17799fded 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=0x60005" "-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_blocks_basics=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.0.5" "-DJUCE_APP_VERSION_HEX=0x60005" $(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=0x60007" "-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_blocks_basics=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.0.7" "-DJUCE_APP_VERSION_HEX=0x60007" $(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=0x60005" "-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_blocks_basics=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.0.5" "-DJUCE_APP_VERSION_HEX=0x60005" $(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=0x60007" "-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_blocks_basics=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.0.7" "-DJUCE_APP_VERSION_HEX=0x60007" $(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 3119b616a72c733f5ff7476f820a1dac6f5ae031..4b917a3916f8cacc6575a3d0c04afc0a0b7001b8 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "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.0.5",
-                                       "JUCE_APP_VERSION_HEX=0x60005",
+                                       "JUCE_APP_VERSION=6.0.7",
+                                       "JUCE_APP_VERSION_HEX=0x60007",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
-                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.juce.demorunner;
+                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
                                PRODUCT_NAME = "DemoRunner";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Debug;
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "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.0.5",
-                                       "JUCE_APP_VERSION_HEX=0x60005",
+                                       "JUCE_APP_VERSION=6.0.7",
+                                       "JUCE_APP_VERSION_HEX=0x60007",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
-                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.juce.demorunner;
+                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
                                PRODUCT_NAME = "DemoRunner";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Release;
                AC6F0E9A0809A184B2C2B7DE = {
                        isa = PBXProject;
                        buildConfigurationList = 80E8AD1971F52B06F4D28891;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 91A9A0FE9DF4F4E10009EEC7;
diff --git a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index e1e764e8abe239c3d14c35b752d170334f49c1e0..1965f00d068d17801af507cdb1c4ea75e025ebd0 100644 (file)
@@ -12,7 +12,7 @@
     <key>CFBundleIconFile</key>\r
     <string>Icon.icns</string>\r
     <key>CFBundleIdentifier</key>\r
-    <string>com.rmsl.juce.demorunner</string>\r
+    <string>com.rmsl.jucedemorunner</string>\r
     <key>CFBundleName</key>\r
     <string>DemoRunner</string>\r
     <key>CFBundleDisplayName</key>\r
@@ -22,9 +22,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>6.0.5</string>\r
+    <string>6.0.7</string>\r
     <key>CFBundleVersion</key>\r
-    <string>6.0.5</string>\r
+    <string>6.0.7</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index d0bb5195aa131e6c64bf607e4473ead9b6c7b74f..81be88b2a90e8dff3d2a567add8e334cba65898e 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=0x60005;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_blocks_basics=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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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_blocks_basics=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.0.7;JUCE_APP_VERSION_HEX=0x60007;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=0x60005;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_blocks_basics=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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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_blocks_basics=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.0.7;JUCE_APP_VERSION_HEX=0x60007;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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index b6b19dd2abbe7c82f2a1359f940b417d9078d4ca..9310341a14b0ce86d8babf7d77bfca843528404f 100644 (file)
@@ -53,6 +53,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index c99123eb1f3903be118879f604c56c8e26774804..04cd390a52bb2c4f602c956df0172d03253a86b5 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,0,5,0\r
+FILEVERSION  6,0,7,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.0.5\0"\r
+      VALUE "FileVersion",  "6.0.7\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "6.0.5\0"\r
+      VALUE "ProductVersion",  "6.0.7\0"\r
     END\r
   END\r
 \r
index 847d9cc277ed273c640390318d59e6cbeae9ee27..4472b572361cb2231ee7938bc0f4d4833f36b8de 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=0x60005;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_blocks_basics=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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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_blocks_basics=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.0.7;JUCE_APP_VERSION_HEX=0x60007;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=0x60005;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_blocks_basics=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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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_blocks_basics=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.0.7;JUCE_APP_VERSION_HEX=0x60007;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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index defaafed5f88fff13aebd287f414ba0a42011bde..62774310f5a32d329d02fb7c22bb8d9cd1414408 100644 (file)
@@ -53,6 +53,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index c99123eb1f3903be118879f604c56c8e26774804..04cd390a52bb2c4f602c956df0172d03253a86b5 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,0,5,0\r
+FILEVERSION  6,0,7,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.0.5\0"\r
+      VALUE "FileVersion",  "6.0.7\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "6.0.5\0"\r
+      VALUE "ProductVersion",  "6.0.7\0"\r
     END\r
   END\r
 \r
index 24f24df2285f15fa66221bf49a902b3b48c55d90..cba3bf54d6bc5959803e809aeb8b5a6d961b46f5 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=0x60005;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_blocks_basics=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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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_blocks_basics=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.0.7;JUCE_APP_VERSION_HEX=0x60007;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=0x60005;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_blocks_basics=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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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_blocks_basics=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.0.7;JUCE_APP_VERSION_HEX=0x60007;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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index 9decf19093279a72b42add91d2e5dda42af80f4f..4e0d0b75ca1501e0e1a16eef2c9e368815397df6 100644 (file)
@@ -53,6 +53,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index c99123eb1f3903be118879f604c56c8e26774804..04cd390a52bb2c4f602c956df0172d03253a86b5 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,0,5,0\r
+FILEVERSION  6,0,7,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.0.5\0"\r
+      VALUE "FileVersion",  "6.0.7\0"\r
       VALUE "ProductName",  "DemoRunner\0"\r
-      VALUE "ProductVersion",  "6.0.5\0"\r
+      VALUE "ProductVersion",  "6.0.7\0"\r
     END\r
   END\r
 \r
index 549c57a011b7bddfb225188d9bb27da13ecb9775..6ab365b6d3ef839c92e2313da27ec37afcff6850 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "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.0.5",
-                                       "JUCE_APP_VERSION_HEX=0x60005",
+                                       "JUCE_APP_VERSION=6.0.7",
+                                       "JUCE_APP_VERSION_HEX=0x60007",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
-                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.juce.demorunner;
+                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
                                PRODUCT_NAME = "DemoRunner";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGLES;
                        };
                        name = Debug;
                };
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "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.0.5",
-                                       "JUCE_APP_VERSION_HEX=0x60005",
+                                       "JUCE_APP_VERSION=6.0.7",
+                                       "JUCE_APP_VERSION_HEX=0x60007",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
-                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.juce.demorunner;
+                               PRODUCT_BUNDLE_IDENTIFIER = com.rmsl.jucedemorunner;
                                PRODUCT_NAME = "DemoRunner";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGLES;
                        };
                        name = Release;
                };
                AC6F0E9A0809A184B2C2B7DE = {
                        isa = PBXProject;
                        buildConfigurationList = 80E8AD1971F52B06F4D28891;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; com.apple.iCloud = { enabled = 1; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 291E01DCBE746A376DBFA4D1 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; com.apple.iCloud = { enabled = 1; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 91A9A0FE9DF4F4E10009EEC7;
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 5391e6212811bc4faf41ccd14fa64b28185b62f9..48b5c3be6b824698f247ae50d15d7ddfe556df46 100644 (file)
@@ -20,7 +20,7 @@
     <key>CFBundleExecutable</key>\r
     <string>${EXECUTABLE_NAME}</string>\r
     <key>CFBundleIdentifier</key>\r
-    <string>com.rmsl.juce.demorunner</string>\r
+    <string>com.rmsl.jucedemorunner</string>\r
     <key>CFBundleName</key>\r
     <string>DemoRunner</string>\r
     <key>CFBundleDisplayName</key>\r
@@ -30,9 +30,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>6.0.5</string>\r
+    <string>6.0.7</string>\r
     <key>CFBundleVersion</key>\r
-    <string>6.0.5</string>\r
+    <string>6.0.7</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Copyright (c) 2020 - Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index 2f2a0262dfbe296db20319588279ee28201274c1..d797a133a0dc9b418b3dea3d4c2fa8bf527c82bd 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.juce.demorunner" version="6.0.5" companyName="Raw Material Software Limited"\r
+              bundleIdentifier="com.rmsl.jucedemorunner" version="6.0.7" 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 8fd3ed49d37a9489c46f654e6a74fd4da66bd020..1ceb712a1f0ed95e603e880dd0fa161ca9cc78d4 100644 (file)
@@ -55,7 +55,7 @@ namespace ProjectInfo
 {\r
     const char* const  projectName    = "DemoRunner";\r
     const char* const  companyName    = "Raw Material Software Limited";\r
-    const char* const  versionString  = "6.0.5";\r
-    const int          versionNumber  = 0x60005;\r
+    const char* const  versionString  = "6.0.7";\r
+    const int          versionNumber  = 0x60007;\r
 }\r
 #endif\r
index 8d3445dc87d1c324f5265e1b9cc6b4cec9741700..e5a51e85ed21eca850acf80c21e1c8ec344a4a5c 100644 (file)
@@ -503,28 +503,34 @@ private:
 \r
     void setupAccentColour()\r
     {\r
-        paramControls.accentColourSelector = new ColourSelector();\r
-        paramControls.accentColourSelector->setName ("accent colour");\r
-        paramControls.accentColourSelector->setCurrentColour (paramControls.accentColourButton.findColour (TextButton::buttonColourId));\r
-        paramControls.accentColourSelector->setColour (ColourSelector::backgroundColourId, Colours::transparentBlack);\r
-        paramControls.accentColourSelector->setSize (200, 200);\r
-        paramControls.accentColourSelector->addComponentListener (this);\r
-        paramControls.accentColourSelector->addChangeListener (this);\r
-\r
-        CallOutBox::launchAsynchronously (paramControls.accentColourSelector, paramControls.accentColourButton.getScreenBounds(), nullptr);\r
+        auto accentColourSelector = std::make_unique<ColourSelector>();\r
+\r
+        accentColourSelector->setName ("accent colour");\r
+        accentColourSelector->setCurrentColour (paramControls.accentColourButton.findColour (TextButton::buttonColourId));\r
+        accentColourSelector->setColour (ColourSelector::backgroundColourId, Colours::transparentBlack);\r
+        accentColourSelector->setSize (200, 200);\r
+        accentColourSelector->addComponentListener (this);\r
+        accentColourSelector->addChangeListener (this);\r
+\r
+        paramControls.accentColourSelector = accentColourSelector.get();\r
+\r
+        CallOutBox::launchAsynchronously (std::move (accentColourSelector), paramControls.accentColourButton.getScreenBounds(), nullptr);\r
     }\r
 \r
     void setupLedColour()\r
     {\r
-        paramControls.ledColourSelector = new ColourSelector();\r
-        paramControls.ledColourSelector->setName ("led colour");\r
-        paramControls.ledColourSelector->setCurrentColour (paramControls.ledColourButton.findColour (TextButton::buttonColourId));\r
-        paramControls.ledColourSelector->setColour (ColourSelector::backgroundColourId, Colours::transparentBlack);\r
-        paramControls.ledColourSelector->setSize (200, 200);\r
-        paramControls.ledColourSelector->addComponentListener (this);\r
-        paramControls.ledColourSelector->addChangeListener (this);\r
-\r
-        CallOutBox::launchAsynchronously (paramControls.ledColourSelector, paramControls.accentColourButton.getScreenBounds(), nullptr);\r
+        auto ledColourSelector = std::make_unique<ColourSelector>();\r
+\r
+        ledColourSelector->setName ("led colour");\r
+        ledColourSelector->setCurrentColour (paramControls.ledColourButton.findColour (TextButton::buttonColourId));\r
+        ledColourSelector->setColour (ColourSelector::backgroundColourId, Colours::transparentBlack);\r
+        ledColourSelector->setSize (200, 200);\r
+        ledColourSelector->addComponentListener (this);\r
+        ledColourSelector->addChangeListener (this);\r
+\r
+        paramControls.ledColourSelector = ledColourSelector.get();\r
+\r
+        CallOutBox::launchAsynchronously (std::move (ledColourSelector), paramControls.accentColourButton.getScreenBounds(), nullptr);\r
     }\r
 \r
     void changeListenerCallback (ChangeBroadcaster* source) override\r
index 8fe7c02dfeb0ab9d71e4aa237bbcc768e8b7fd11..500841ffb152849c1611fdad205b3916b0286da6 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=0x60005" "-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=0x60007" "-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=0x60005" "-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=0x60007" "-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()
@@ -119,6 +119,27 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
     "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
@@ -193,6 +214,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp"
@@ -201,6 +224,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp"
@@ -245,7 +270,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"
-    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp"
+    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm"
     "../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"
     "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"
@@ -1533,6 +1558,27 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1607,6 +1653,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1615,6 +1663,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1659,7 +1709,7 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ju
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
-set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
index 6815873c95d01d63a9ca94385a62e8a6fdf66158..da58090f4808cb93cbc0d9b5ab1e259e8f4c2277 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=0x60005" "-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=0x60007" "-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=0x60005" "-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=0x60007" "-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 eb7bf237eabd2aef2a7ebb61eed49a382f973890..85724ccd989fdc7ca40a6988eaa2f877eee80f29 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
                                PRODUCT_NAME = "AudioPerformanceTest";
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
                                PRODUCT_NAME = "AudioPerformanceTest";
                9CE2A44801B5B4BE7A9667DA = {
                        isa = PBXProject;
                        buildConfigurationList = 7097CF6AC086DAC346ACCCD9;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 3BA1BA0CAFE969E99950C06B;
diff --git a/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/AudioPerformanceTest/Builds/MacOSX/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index fc08d1ab970ff29df68934eb2de5960dacecb32d..d63ea29585eea877366ea52c14dc588623e7aa16 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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index 19182a52c3ce88b61db7dbebbaab6409edad0b3c..37e04f009d9e8abacacf7c8bc4275818d401dbd2 100644 (file)
@@ -38,6 +38,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index 59acc882c91a292d566c50818e1602fea728c604..42293641cacc171d5be33c4fb7ebeef7315fe987 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
                                PRODUCT_NAME = "AudioPerformanceTest";
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.AudioPerformanceTest;
                                PRODUCT_NAME = "AudioPerformanceTest";
                9CE2A44801B5B4BE7A9667DA = {
                        isa = PBXProject;
                        buildConfigurationList = 7097CF6AC086DAC346ACCCD9;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { E9FD2656EC625C9C8DE30219 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 3BA1BA0CAFE969E99950C06B;
diff --git a/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/AudioPerformanceTest/Builds/iOS/AudioPerformanceTest.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 5811c3db46e2277478bee1a9e1583de374d7d26e..e837ae56a6103464f1d63b1b56cba294c3c37e5e 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=0x60005" "-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=0x60007" "-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=0x60005" "-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=0x60007" "-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")
@@ -136,6 +136,27 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
     "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
@@ -210,6 +231,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp"
@@ -218,6 +241,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp"
@@ -262,7 +287,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"
-    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp"
+    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm"
     "../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"
     "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"
@@ -1693,6 +1718,27 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1767,6 +1813,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1775,6 +1823,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1819,7 +1869,7 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ju
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
-set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
index 54bb46b664ae256acaad879cd1eecde62f970a11..3e70aaa513515e0b9cfd6103797abd502fc77704 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=0x60005" "-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=0x60007" "-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=0x60005" "-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=0x60007" "-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 be04d35d3a2a7233dc6c3608ddbe73b0ad28d9be..751895704b25becbd394c5377a3a9dd374b795b7 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
                                PRODUCT_NAME = "AudioPluginHost";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Debug;
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
                                PRODUCT_NAME = "AudioPluginHost";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Release;
                ADE6E539DB98A302483A82D0 = {
                        isa = PBXProject;
                        buildConfigurationList = 493C2C5E457692E5149C5525;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 65BEFC705A89E5C8A9E35C97;
diff --git a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 23802851680c795b7c1b28afe75f6d00883f5eb9..d33b4862c06bd7335410d3933e115d82c301dea2 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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index dae2e654bb108a282beb86bf4f60b871a0e1e4da..43d5b8eaec3b7e1541d9c3541d25412971bbfa1e 100644 (file)
@@ -44,6 +44,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index bff43a3263ff92ce4f167e176be5a775a9d91016..df2b66ee56f60c87b296b1b6b41ce63c9341886f 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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index 8f53d51f115eea708e4670b69201ea609efa2881..767740f41805e02c15bab09b8943b5c227791510 100644 (file)
@@ -44,6 +44,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index 0728d3b2ff0df7bf6175a858d89896b010fe429d..409331359810a4cea8291342258e9f448f36caf1 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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index 07c828622f88279f3b40d60321c922d56bc5f965..4eefc221fb2f48a1350c7060c354ade6b802ba57 100644 (file)
@@ -44,6 +44,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index bdebe197ba5fc90a3fbcbb5e27f8e16a46d7805e..05936ffe0eaecca4bfdcf5d495da3936722dd45b 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
                                PRODUCT_NAME = "Plugin Host";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGLES;
                        };
                        name = Debug;
                };
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../../../modules/juce_audio_processors/format_types/VST3_SDK",
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.pluginhost;
                                PRODUCT_NAME = "Plugin Host";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGLES;
                        };
                        name = Release;
                };
                ADE6E539DB98A302483A82D0 = {
                        isa = PBXProject;
                        buildConfigurationList = 493C2C5E457692E5149C5525;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { DE12B7643D374BFF7E4FEB1C = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 65BEFC705A89E5C8A9E35C97;
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 56637be0cd6003c1f66c110cea14ee3ee8740db8..ed12adcbd68b73ce7441fa904ef6c29b42b7cc97 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=0x60005" "-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=0x60007" "-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=0x60005" "-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=0x60007" "-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 9b235ee919cdeb5cb3d71142913a2ca4f4a80d98..4bb9f5358abf339290637bc41f328de24cbe9adb 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_core=1",
                                        "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
                                        "JUCE_STANDALONE_APPLICATION=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INSTALL_PATH = "/usr/bin";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.binarybuilder;
                                PRODUCT_NAME = "BinaryBuilder";
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_core=1",
                                        "JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1",
                                        "JUCE_STANDALONE_APPLICATION=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INSTALL_PATH = "/usr/bin";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.binarybuilder;
                                PRODUCT_NAME = "BinaryBuilder";
                36B6F402BC83F21646259DEF = {
                        isa = PBXProject;
                        buildConfigurationList = E4C85B0464A93027D035AA1F;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = C18D022743CF5BD14D6A6A9E;
diff --git a/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/BinaryBuilder/Builds/MacOSX/BinaryBuilder.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 71844699b5ef3a66de8eb2d2aee04173de57f838..f646087ea84dd1658d44fb698d0b965e3caf9669 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=0x60005;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;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;_CONSOLE;WIN32;_WINDOWS;DEBUG;_DEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60007;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;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>..\..\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=0x60005;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;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;_CONSOLE;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60007;JUCE_MODULE_AVAILABLE_juce_core=1;JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED=1;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
index 73a450e853e671c85fb7736053036e6a37b03117..4bf7206e56ffcbd14ea667063aae8f16bbcd14c8 100644 (file)
@@ -2244,12 +2244,12 @@ function(juce_set_aax_sdk_path path)
     endif()
 
     if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
-        add_library(juce_aax_sdk STATIC IMPORTED)
+        add_library(juce_aax_sdk STATIC IMPORTED GLOBAL)
         set_target_properties(juce_aax_sdk PROPERTIES
             IMPORTED_LOCATION_DEBUG "${path}/Libs/Debug/libAAXLibrary_libcpp.a"
             IMPORTED_LOCATION "${path}/Libs/Release/libAAXLibrary_libcpp.a")
     elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
-        add_library(juce_aax_sdk INTERFACE IMPORTED)
+        add_library(juce_aax_sdk INTERFACE IMPORTED GLOBAL)
     else()
         return()
     endif()
@@ -2273,7 +2273,7 @@ function(juce_set_vst2_sdk_path path)
         message(FATAL_ERROR "Could not find VST2 SDK at the specified path: ${path}")
     endif()
 
-    add_library(juce_vst2_sdk INTERFACE IMPORTED)
+    add_library(juce_vst2_sdk INTERFACE IMPORTED GLOBAL)
 
     # This is a bit of a hack, but we really need the VST2 paths to always follow the VST3 paths.
     target_include_directories(juce_vst2_sdk INTERFACE
index f67a76f808a9a135a3ae74ada779063e0dee8597..da3862cd58439e15f7e154b3d76486644b100092 100644 (file)
@@ -34,7 +34,7 @@
 \r
   ID:                 juce_build_tools\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE Build Tools\r
   description:        Classes for generating intermediate files for JUCE projects.\r
   website:            http://www.juce.com/juce\r
index 8f3ab5eb85ac1e7e79803e46d323231ed3c1686f..86b95620d397927f12072207773d3f8be79ea967 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=0x60005" "-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=0x60007" "-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=0x60005" "-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=0x60007" "-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()
@@ -123,6 +123,27 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp"
     "../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h"
     "../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp"
+    "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h"
     "../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp"
@@ -197,6 +218,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp"
@@ -205,6 +228,8 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp"
+    "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h"
     "../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp"
@@ -249,7 +274,7 @@ add_library( ${BINARY_NAME}
     "../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp"
-    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp"
+    "../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm"
     "../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h"
     "../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp"
     "../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp"
@@ -1612,6 +1637,27 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPView.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiDevices.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1686,6 +1732,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResampler.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/resampler/SincResamplerStereo.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ClipToRange.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/FlowGraphNode.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1694,6 +1742,8 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ob
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/ManyToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MonoToMultiConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/RampLinear.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/oboe/src/flowgraph/SampleRateConverter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
@@ -1738,7 +1788,7 @@ set_source_files_properties("../../../../../modules/juce_audio_devices/native/ju
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_JackAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_linux_Midi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
-set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
+set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_mac_CoreMidi.mm" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_MidiDataConcatenator.h" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_ASIO.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
 set_source_files_properties("../../../../../modules/juce_audio_devices/native/juce_win32_DirectSound.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
index 0343013dfc44d4e91c8a518b2dcbdade7ba24d5d..0b671dc1f3952a17ca70a96fd0932d1ad211607a 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=0x60005" "-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=0x60007" "-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=0x60005" "-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=0x60007" "-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 08effdccfeecefdb93924a650b548e83a55843b8..467f032a687f183d3eafb99bf67ba22aa6a591db 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.9;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Debug;
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.9;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Release;
                A5398ADB6F5B128C00EB935C = {
                        isa = PBXProject;
                        buildConfigurationList = 02715337C584F3C721251428;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = D2EB65517396C974F0415A7F;
diff --git a/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/NetworkGraphicsDemo/Builds/MacOSX/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 2bb0f746fcf427128f54044713711cf515c458b8..ac4c11e106fda9734de02322a965b00a00a8a5bc 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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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;WIN32;_WINDOWS;NDEBUG;JUCE_DISPLAY_SPLASH_SCREEN=0;JUCE_USE_DARK_SPLASH_SCREEN=1;JUCE_PROJUCER_VERSION=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index 4f6670720db98f71657302b54730d4ae29f6a059..51a8abb03dfc05bad7becb74a79d2f9c4721eb03 100644 (file)
@@ -38,6 +38,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index 0462d718032ef6a49436cdc8df198d45bc889f64..61deee9b35268e1cf1e71f68f5b91d72a05fec65 100644 (file)
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INFOPLIST_PREPROCESS = NO;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGLES;
                        };
                        name = Debug;
                };
                                        "JUCE_CONTENT_SHARING=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_formats=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                LLVM_LTO = YES;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.NetworkGraphicsDemo;
                                PRODUCT_NAME = "JUCE Network Graphics Demo";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGLES;
                        };
                        name = Release;
                };
                A5398ADB6F5B128C00EB935C = {
                        isa = PBXProject;
                        buildConfigurationList = 02715337C584F3C721251428;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 4311FBCBD02948A0ED96C7DD = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = D2EB65517396C974F0415A7F;
diff --git a/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/NetworkGraphicsDemo/Builds/iOS/NetworkGraphicsDemo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 00638ef57617fe7e9808feef76feb0f322751114..5bfbf1ac5662e0db135a22d3e7ecc16817b4d59c 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=0x60005" "-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.0.5" "-DJUCE_APP_VERSION_HEX=0x60005" $(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=0x60007" "-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.0.7" "-DJUCE_APP_VERSION_HEX=0x60007" $(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=0x60005" "-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.0.5" "-DJUCE_APP_VERSION_HEX=0x60005" $(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=0x60007" "-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.0.7" "-DJUCE_APP_VERSION_HEX=0x60007" $(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 f4f845ebaa78e5f42a31a1e80df29e922e06c569..f118438df0099984c24fa2638223235cd00a7bda 100644 (file)
@@ -22,9 +22,9 @@
     <key>CFBundleSignature</key>\r
     <string>????</string>\r
     <key>CFBundleShortVersionString</key>\r
-    <string>6.0.5</string>\r
+    <string>6.0.7</string>\r
     <key>CFBundleVersion</key>\r
-    <string>6.0.5</string>\r
+    <string>6.0.7</string>\r
     <key>NSHumanReadableCopyright</key>\r
     <string>Raw Material Software Limited</string>\r
     <key>NSHighResolutionCapable</key>\r
index 8f94d1a60003588a406f203c1179a5a1ccc9c568..01f8a59bde1fc5945185df501da330d900993889 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "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.0.5",
-                                       "JUCE_APP_VERSION_HEX=0x60005",
+                                       "JUCE_APP_VERSION=6.0.7",
+                                       "JUCE_APP_VERSION_HEX=0x60007",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../Build",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../Build",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../Build",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../Build",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer;
                                PRODUCT_NAME = "Projucer";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Debug;
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "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.0.5",
-                                       "JUCE_APP_VERSION_HEX=0x60005",
+                                       "JUCE_APP_VERSION=6.0.7",
+                                       "JUCE_APP_VERSION_HEX=0x60007",
                                        "JucePlugin_Build_VST=0",
                                        "JucePlugin_Build_VST3=0",
                                        "JucePlugin_Build_AU=0",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../Build",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../Build",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INFOPLIST_FILE = Info-App.plist;
                                INSTALL_PATH = "$(HOME)/Applications";
                                MACOSX_DEPLOYMENT_TARGET = 10.11;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../Build",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../Build",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.theprojucer;
                                PRODUCT_NAME = "Projucer";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Release;
                74EA481348A24104E6ACE009 = {
                        isa = PBXProject;
                        buildConfigurationList = F90407F24422C589DA251604;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; TargetAttributes = { 0039FE1A254FE518518BF8B8 = { SystemCapabilities = {com.apple.ApplicationGroups.iOS = { enabled = 0; }; com.apple.InAppPurchase = { enabled = 0; }; com.apple.InterAppAudio = { enabled = 0; }; com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 0; }; com.apple.HardenedRuntime = { enabled = 0; }; }; }; }; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 3CC531922CC2D398E283A845;
diff --git a/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/Projucer/Builds/MacOSX/Projucer.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index 902819b00c67f38a502fd99570cc9f5d80350793..435a7807141190f1305a464259c8f7a9e327c36a 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=0x60005;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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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.0.7;JUCE_APP_VERSION_HEX=0x60007;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=0x60005;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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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.0.7;JUCE_APP_VERSION_HEX=0x60007;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
index cb7ae4b85b1116dccfd0fe24b379fba71e492491..077ee25efda8498e4608b5452f4aa79bed64e25b 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,0,5,0\r
+FILEVERSION  6,0,7,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.0.5\0"\r
+      VALUE "FileVersion",  "6.0.7\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "6.0.5\0"\r
+      VALUE "ProductVersion",  "6.0.7\0"\r
     END\r
   END\r
 \r
index eb01454fe6c1da01fadfdd75db65f03cff28f679..9cb7fd4217332717d62fe8153a461d3fc9318003 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=0x60005;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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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.0.7;JUCE_APP_VERSION_HEX=0x60007;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=0x60005;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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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.0.7;JUCE_APP_VERSION_HEX=0x60007;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
index cb7ae4b85b1116dccfd0fe24b379fba71e492491..077ee25efda8498e4608b5452f4aa79bed64e25b 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,0,5,0\r
+FILEVERSION  6,0,7,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.0.5\0"\r
+      VALUE "FileVersion",  "6.0.7\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "6.0.5\0"\r
+      VALUE "ProductVersion",  "6.0.7\0"\r
     END\r
   END\r
 \r
index 37d7f62d1d3a1b8a8b8671c2b4474084f03e6a7f..6874ef15f1456f69d5c75fe1a3e6deca599db3e0 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=0x60005;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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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.0.7;JUCE_APP_VERSION_HEX=0x60007;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=0x60005;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.0.5;JUCE_APP_VERSION_HEX=0x60005;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=0x60007;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.0.7;JUCE_APP_VERSION_HEX=0x60007;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
index cb7ae4b85b1116dccfd0fe24b379fba71e492491..077ee25efda8498e4608b5452f4aa79bed64e25b 100644 (file)
@@ -9,7 +9,7 @@
 #include <windows.h>\r
 \r
 VS_VERSION_INFO VERSIONINFO\r
-FILEVERSION  6,0,5,0\r
+FILEVERSION  6,0,7,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.0.5\0"\r
+      VALUE "FileVersion",  "6.0.7\0"\r
       VALUE "ProductName",  "Projucer\0"\r
-      VALUE "ProductVersion",  "6.0.5\0"\r
+      VALUE "ProductVersion",  "6.0.7\0"\r
     END\r
   END\r
 \r
index da75406be317010c6c1ab8186cd5b0b555fbb0d8..9cf3def10df30306e6e6d2480dc90a09e0272e61 100644 (file)
@@ -6301,6 +6301,8 @@ static const unsigned char temp_binary_data_38[] =
 "  #else\r\n"\r
 "    // This is the place where you check if the layout is supported.\r\n"\r
 "    // In this template code we only support mono or stereo.\r\n"\r
+"    // Some plugin hosts, such as certain GarageBand versions, will only\r\n"\r
+"    // load plugins that support stereo bus layouts.\r\n"\r
 "    if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono()\r\n"\r
 "     && layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo())\r\n"\r
 "        return false;\r\n"\r
@@ -7594,7 +7596,7 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes)
         case 0x915d7304:  numBytes = 1187; return jucer_AudioComponentTemplate_h;\r
         case 0x27c5a93a:  numBytes = 1355; return jucer_AudioPluginEditorTemplate_cpp;\r
         case 0x4d0721bf:  numBytes = 973; return jucer_AudioPluginEditorTemplate_h;\r
-        case 0x51b49ac5:  numBytes = 6090; return jucer_AudioPluginFilterTemplate_cpp;\r
+        case 0x51b49ac5:  numBytes = 6218; return jucer_AudioPluginFilterTemplate_cpp;\r
         case 0x488afa0a:  numBytes = 2299; return jucer_AudioPluginFilterTemplate_h;\r
         case 0xabad7041:  numBytes = 2147; return jucer_ComponentTemplate_cpp;\r
         case 0xfc72fe86:  numBytes = 2065; return jucer_ComponentTemplate_h;\r
index e2eeae6b53f96ed1fc43e3c289f758651fe34a0b..dc4ddc834954dda27de9c6d9d281e032cc9d72f4 100644 (file)
@@ -123,7 +123,7 @@ namespace BinaryData
     const int            jucer_AudioPluginEditorTemplate_hSize = 973;\r
 \r
     extern const char*   jucer_AudioPluginFilterTemplate_cpp;\r
-    const int            jucer_AudioPluginFilterTemplate_cppSize = 6090;\r
+    const int            jucer_AudioPluginFilterTemplate_cppSize = 6218;\r
 \r
     extern const char*   jucer_AudioPluginFilterTemplate_h;\r
     const int            jucer_AudioPluginFilterTemplate_hSize = 2299;\r
index 5d2220934a515286d2853869e1ef004046e03b96..ad5d8e65b04578d7e1433bdfc7576a970888bfe2 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.0.5";\r
-    const int          versionNumber  = 0x60005;\r
+    const char* const  versionString  = "6.0.7";\r
+    const int          versionNumber  = 0x60007;\r
 }\r
 #endif\r
index 362bd5e00deb2779f55a7f707c0b96ef007f5976..74848c4330b6843bd498cac953249a5203e1a272 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 \r
 <JUCERPROJECT id="M70qfTRRk" name="Projucer" projectType="guiapp" juceFolder="../../juce"\r
-              version="6.0.5" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
+              version="6.0.7" bundleIdentifier="com.juce.theprojucer" splashScreenColour="Dark"\r
               displaySplashScreen="0" reportAppUsage="0" companyName="Raw Material Software Limited"\r
               companyCopyright="Raw Material Software Limited" cppLanguageStandard="11"\r
               useAppConfig="0" addUsingNamespaceToJuceHeader="1" jucerFormatVersion="1">\r
index 4f4fd675cdc6739872febd55e2b953ce0575630e..97badcdd0a201c09fcab71d2e55f5a0b2e928ef3 100644 (file)
@@ -127,7 +127,7 @@ public:
                               getAppSettings().getStoredPath (Ids::defaultJuceModulePath, TargetOS::getThisOS()),\r
                               TargetOS::getThisOS());\r
 \r
-        panel.addProperties (buildPropertyList());\r
+        panel.addProperties (buildPropertyList(), 2);\r
         addAndMakeVisible (panel);\r
     }\r
 \r
index d1720105b7b754e9f0a1a99ab5d36bdbedc1c789..c63c28c596af6e984b70e747b5cd6f79883fb2d6 100644 (file)
@@ -269,7 +269,8 @@ void LatestVersionCheckerAndUpdater::askUserForLocationToDownload (const Version
 \r
             if (! AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, "Overwrite Existing JUCE Folder?",\r
                                                 "Do you want to replace the folder\n\n" + targetFolderPath + "\n\nwith the latest version from juce.com?\n\n"\r
-                                                "This will move the existing folder to " + targetFolderPath + "_old."))\r
+                                                "This will move the existing folder to " + targetFolderPath + "_old.\n\n"\r
+                                                "Replacing the folder that contains the currently running Projucer executable may not work on Windows."))\r
             {\r
                 return;\r
             }\r
index 0b194bdb275aa07748ec5312dd45e7178fa4b984..053611e8f7d1f050e109e6565063412651819d40 100644 (file)
@@ -111,6 +111,8 @@ bool %%filter_class_name%%::isBusesLayoutSupported (const BusesLayout& layouts)
   #else\r
     // This is the place where you check if the layout is supported.\r
     // In this template code we only support mono or stereo.\r
+    // Some plugin hosts, such as certain GarageBand versions, will only\r
+    // load plugins that support stereo bus layouts.\r
     if (layouts.getMainOutputChannelSet() != juce::AudioChannelSet::mono()\r
      && layouts.getMainOutputChannelSet() != juce::AudioChannelSet::stereo())\r
         return false;\r
index ea8bd28835588a5df38930d90ff6017bba075e39..d2fed0b96da5e4d55c00279a67fe2211243ec2ec 100644 (file)
@@ -1394,9 +1394,11 @@ void Project::createAudioPluginPropertyEditors (PropertyListBuilder& props)
     props.add (new TextPropertyComponent (pluginManufacturerValue, "Plugin Manufacturer", 256, false),\r
                "The name of your company (cannot be blank).");\r
     props.add (new TextPropertyComponent (pluginManufacturerCodeValue, "Plugin Manufacturer Code", 4, false),\r
-               "A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!");\r
+               "A four-character unique ID for your company. Note that for AU compatibility, this must contain at least one upper-case letter!"\r
+               " GarageBand 10.3 requires the first letter to be upper-case, and the remaining letters to be lower-case.");\r
     props.add (new TextPropertyComponent (pluginCodeValue, "Plugin Code", 4, false),\r
-               "A four-character unique ID for your plugin. Note that for AU compatibility, this must contain at least one upper-case letter!");\r
+               "A four-character unique ID for your plugin. Note that for AU compatibility, this must contain exactly one upper-case letter!"\r
+               " GarageBand 10.3 requires the first letter to be upper-case, and the remaining letters to be lower-case.");\r
     props.add (new TextPropertyComponent (pluginChannelConfigsValue, "Plugin Channel Configurations", 1024, false),\r
                "This list is a comma-separated set list in the form {numIns, numOuts} and each pair indicates a valid plug-in "\r
                "configuration. For example {1, 1}, {2, 2} means that the plugin can be used either with 1 input and 1 output, "\r
index c6af8a08f2cd0329a6a848eab82feb9b3d6fb243..a5182fec71e256b14ebe44b841400935507058ec 100644 (file)
@@ -350,12 +350,14 @@ private:
         auto keys = defines.getAllKeys();\r
         auto values = defines.getAllValues();\r
 \r
+        const auto escapedQuote = isWindows() ? "\\\"" : "\\\\\"";\r
+\r
         for (int i = 0; i < defines.size(); ++i)\r
         {\r
             auto result = keys[i];\r
 \r
             if (values[i].isNotEmpty())\r
-                result += "=" + values[i];\r
+                result += "=\"" + values[i].replace ("\"", escapedQuote) + "\"";\r
 \r
             defs.add (result);\r
         }\r
@@ -569,7 +571,7 @@ private:
                 for (auto& def : getDefines (config, target))\r
                 {\r
                     if (! def.containsChar ('='))\r
-                            def << '=';\r
+                        def << '=';\r
 \r
                     flags.add ("-D" + def);\r
                 }\r
index f918ef0f7bf3a306b743089c01dfa0668e15c224..81446acab09c990fad7361c5a062ad133fb11078 100644 (file)
@@ -47,6 +47,7 @@ namespace
         v10_15,\r
         v10_16,\r
         v11_0,\r
+        v11_1,\r
     };\r
 \r
     static const char* const getName (MacOSVersion m)\r
@@ -64,6 +65,7 @@ namespace
             case MacOSVersion::v10_15:  return "10.15";\r
             case MacOSVersion::v10_16:  return "10.16";\r
             case MacOSVersion::v11_0:   return "11.0";\r
+            case MacOSVersion::v11_1:   return "11.1";\r
             default:                    break;\r
         }\r
 \r
@@ -74,7 +76,7 @@ namespace
     static String getDisplayName (MacOSVersion m) { return getName (m) + String (" SDK"); }\r
     static String getRootName    (MacOSVersion m) { return String ("macosx") + getName (m); }\r
 \r
-    constexpr auto nextMacOSVersion       = (MacOSVersion) ((int) MacOSVersion::v11_0 + 1);\r
+    constexpr auto nextMacOSVersion       = (MacOSVersion) ((int) MacOSVersion::v11_1 + 1);\r
     constexpr auto oldestDeploymentTarget = MacOSVersion::v10_7;\r
     constexpr auto macOSDefaultVersion    = MacOSVersion::v10_11;\r
     constexpr auto oldestSDKVersion       = MacOSVersion::v10_11;\r
@@ -182,7 +184,8 @@ public:
           useHeaderMapValue                            (settings, Ids::useHeaderMap,                            getUndoManager()),\r
           customLaunchStoryboardValue                  (settings, Ids::customLaunchStoryboard,                  getUndoManager()),\r
           exporterBundleIdentifierValue                (settings, Ids::bundleIdentifier,                        getUndoManager()),\r
-          suppressPlistResourceUsage                   (settings, Ids::suppressPlistResourceUsage,              getUndoManager())\r
+          suppressPlistResourceUsageValue              (settings, Ids::suppressPlistResourceUsage,              getUndoManager()),\r
+          useLegacyBuildSystemValue                    (settings, Ids::useLegacyBuildSystem,                    getUndoManager())\r
     {\r
         if (iOS)\r
         {\r
@@ -269,7 +272,9 @@ public:
     bool isDocumentBrowserEnabled() const                   { return uiSupportsDocumentBrowserValue.get(); }\r
     bool isStatusBarHidden() const                          { return uiStatusBarHiddenValue.get(); }\r
 \r
-    bool getSuppressPlistResourceUsage() const              { return suppressPlistResourceUsage.get(); }\r
+    bool getSuppressPlistResourceUsage() const              { return suppressPlistResourceUsageValue.get(); }\r
+\r
+    bool shouldUseLegacyBuildSystem() const                 { return useLegacyBuildSystemValue.get(); }\r
 \r
     String getDocumentExtensionsString() const              { return documentExtensionsValue.get(); }\r
 \r
@@ -392,6 +397,11 @@ public:
                        "Using a leading '.' is optional, and the extensions are not case-sensitive.");\r
         }\r
 \r
+        props.add (new ChoicePropertyComponent (useLegacyBuildSystemValue, "Use Legacy Build System"),\r
+                   "Enable this to use the deprecated \"Legacy Build System\" in Xcode 10 and above. "\r
+                   "This may fix build issues that were introduced with the new build system in Xcode 10 and subsequently fixed in Xcode 10.2, "\r
+                   "however the new build system is recommended for apps targeting Apple silicon.");\r
+\r
         if (isOSX())\r
         {\r
             props.add (new MultiChoicePropertyComponent (validArchsValue, "Valid Architectures", getAllArchs(), getAllArchs()),\r
@@ -570,7 +580,7 @@ public:
         props.add (new TextPropertyComponent (pListPrefixHeaderValue, "PList Prefix Header", 512, false),\r
                    "Header file containing definitions used in plist file (see PList Preprocess).");\r
 \r
-        props.add (new ChoicePropertyComponent (suppressPlistResourceUsage, "Suppress AudioUnit Plist resourceUsage Key"),\r
+        props.add (new ChoicePropertyComponent (suppressPlistResourceUsageValue, "Suppress AudioUnit Plist resourceUsage Key"),\r
                    "Suppress the resourceUsage key in the target's generated Plist. This is useful for AU"\r
                    " plugins that must access resources which cannot be declared in the resourceUsage block, such"\r
                    " as UNIX domain sockets. In particular, PACE-protected AU plugins may require this option to be enabled"\r
@@ -668,9 +678,6 @@ public:
                                         [this] (MemoryOutputStream& mo) { writeProjectFile (mo); });\r
 \r
         writeInfoPlistFiles();\r
-\r
-        // This forces the project to use the legacy build system to workaround Xcode 10 issues,\r
-        // hopefully these will be fixed in the future and this can be removed...\r
         writeWorkspaceSettings();\r
 \r
         // Deleting the .rsrc files can be needed to force Xcode to update the version number.\r
@@ -1154,7 +1161,7 @@ public:
             v->setProperty ("isa", "PBXFileReference", nullptr);\r
             v->setProperty ("explicitFileType", fileType, nullptr);\r
             v->setProperty ("includeInIndex", (int) 0, nullptr);\r
-            v->setProperty ("path", sanitisePath (binaryName), nullptr);\r
+            v->setProperty ("path", binaryName, nullptr);\r
             v->setProperty ("sourceTree", "BUILT_PRODUCTS_DIR", nullptr);\r
             owner.pbxFileReferences.add (v);\r
         }\r
@@ -1393,6 +1400,19 @@ public:
             s.set ("HEADER_SEARCH_PATHS", indentParenthesisedList (headerPaths, 1));\r
             s.set ("USE_HEADERMAP", String (static_cast<bool> (config.exporter.settings.getProperty ("useHeaderMap")) ? "YES" : "NO"));\r
 \r
+            auto frameworksToSkip = [this]() -> String\r
+            {\r
+                const String openGLFramework (owner.iOS ? "OpenGLES" : "OpenGL");\r
+\r
+                if (owner.xcodeFrameworks.contains (openGLFramework))\r
+                    return openGLFramework;\r
+\r
+                return {};\r
+            }();\r
+\r
+            if (frameworksToSkip.isNotEmpty())\r
+                s.set ("VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS", frameworksToSkip);\r
+\r
             auto frameworkSearchPaths = getFrameworkSearchPaths (config);\r
 \r
             if (! frameworkSearchPaths.isEmpty())\r
@@ -1450,7 +1470,6 @@ public:
             if (config.isFastMathEnabled())\r
                 s.set ("GCC_FAST_MATH", "YES");\r
 \r
-\r
             auto flags = (config.getRecommendedCompilerWarningFlags().joinIntoString (" ")\r
                              + " " + owner.getExtraCompilerFlagsString()).trim();\r
             flags = owner.replacePreprocessorTokens (config, flags);\r
@@ -1500,10 +1519,11 @@ public:
 \r
                 build_tools::RelativePath binaryPath (config.getTargetBinaryRelativePathString(),\r
                                                       build_tools::RelativePath::projectFolder);\r
-                configurationBuildDir = sanitisePath (binaryPath.rebased (owner.projectFolder,\r
-                                                                          owner.getTargetFolder(),\r
-                                                                          build_tools::RelativePath::buildTargetFolder)\r
-                                                                .toUnixStyle());\r
+\r
+                configurationBuildDir = expandPath (binaryPath.rebased (owner.projectFolder,\r
+                                                                        owner.getTargetFolder(),\r
+                                                                        build_tools::RelativePath::buildTargetFolder)\r
+                                                              .toUnixStyle());\r
             }\r
 \r
             s.set ("CONFIGURATION_BUILD_DIR", addQuotesIfRequired (configurationBuildDir));\r
@@ -1785,8 +1805,7 @@ public:
 \r
             for (auto& path : paths)\r
             {\r
-                // Xcode 10 can't deal with search paths starting with "~" so we need to replace them here...\r
-                path = owner.replacePreprocessorTokens (config, sanitisePath (path));\r
+                path = owner.replacePreprocessorTokens (config, expandPath (path));\r
 \r
                 if (path.containsChar (' '))\r
                     path = "\"\\\"" + path + "\\\"\""; // crazy double quotes required when there are spaces..\r
@@ -1961,12 +1980,12 @@ private:
                      uiFileSharingEnabledValue, uiSupportsDocumentBrowserValue, uiStatusBarHiddenValue, documentExtensionsValue, iosInAppPurchasesValue,\r
                      iosContentSharingValue, iosBackgroundAudioValue, iosBackgroundBleValue, iosPushNotificationsValue, iosAppGroupsValue, iCloudPermissionsValue,\r
                      iosDevelopmentTeamIDValue, iosAppGroupsIDValue, keepCustomXcodeSchemesValue, useHeaderMapValue, customLaunchStoryboardValue,\r
-                     exporterBundleIdentifierValue, suppressPlistResourceUsage;\r
+                     exporterBundleIdentifierValue, suppressPlistResourceUsageValue, useLegacyBuildSystemValue;\r
 \r
-    static String sanitisePath (const String& path)\r
+    static String expandPath (const String& path)\r
     {\r
-        if (path.startsWithChar ('~'))\r
-            return "$(HOME)" + path.substring (1);\r
+        if (! File::isAbsolutePath (path))  return "$(SRCROOT)/" + path;\r
+        if (path.startsWithChar ('~'))      return "$(HOME)" + path.substring (1);\r
 \r
         return path;\r
     }\r
@@ -2312,21 +2331,28 @@ private:
                                                     .getChildFile ("xcshareddata")\r
                                                     .getChildFile ("WorkspaceSettings.xcsettings");\r
 \r
-        build_tools::writeStreamToFile (settingsFile, [this] (MemoryOutputStream& mo)\r
+        if (shouldUseLegacyBuildSystem())\r
         {\r
-            mo.setNewLineString (getNewLineString());\r
-\r
-            mo << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"              << newLine\r
-               << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">" << newLine\r
-               << "<plist version=\"1.0\">"                                 << newLine\r
-               << "<dict>"                                                  << newLine\r
-               << "\t" << "<key>BuildSystemType</key>"                      << newLine\r
-               << "\t" << "<string>Original</string>"                       << newLine\r
-               << "\t" << "<key>DisableBuildSystemDeprecationWarning</key>" << newLine\r
-               << "\t" << "<true/>"                                         << newLine\r
-               << "</dict>"                                                 << newLine\r
-               << "</plist>"                                                << newLine;\r
-        });\r
+            build_tools::writeStreamToFile (settingsFile, [this] (MemoryOutputStream& mo)\r
+            {\r
+                mo.setNewLineString (getNewLineString());\r
+\r
+                mo << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"              << newLine\r
+                   << "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">" << newLine\r
+                   << "<plist version=\"1.0\">"                                 << newLine\r
+                   << "<dict>"                                                  << newLine\r
+                   << "\t" << "<key>BuildSystemType</key>"                      << newLine\r
+                   << "\t" << "<string>Original</string>"                       << newLine\r
+                   << "\t" << "<key>DisableBuildSystemDeprecationWarning</key>" << newLine\r
+                   << "\t" << "<true/>"                                         << newLine\r
+                   << "</dict>"                                                 << newLine\r
+                   << "</plist>"                                                << newLine;\r
+            });\r
+        }\r
+        else\r
+        {\r
+            settingsFile.deleteFile();\r
+        }\r
     }\r
 \r
     void writeInfoPlistFiles() const\r
@@ -2374,7 +2400,7 @@ private:
             searchPath = srcRoot + searchPath;\r
         }\r
 \r
-        return sanitisePath (searchPath);\r
+        return expandPath (searchPath);\r
     }\r
 \r
     String getCodeSigningIdentity (const XcodeBuildConfiguration& config) const\r
@@ -3240,7 +3266,7 @@ private:
     {\r
         String attributes;\r
 \r
-        attributes << "{ LastUpgradeCheck = 1200; "\r
+        attributes << "{ LastUpgradeCheck = 1230; "\r
                    << "ORGANIZATIONNAME = " << getProject().getCompanyNameString().quoted()\r
                    <<"; ";\r
 \r
index 544073a06d03b5dcbf3bb3853c471615385a91e6..887ffe99fd81b56485f85592d9f997c2a440e5d1 100644 (file)
@@ -410,6 +410,7 @@ StringPairArray ProjectExporter::getAllPreprocessorDefs (const BuildConfiguratio
 {\r
     auto defs = mergePreprocessorDefs (config.getAllPreprocessorDefs(),\r
                                        parsePreprocessorDefs (getExporterPreprocessorDefsString()));\r
+\r
     addDefaultPreprocessorDefs (defs);\r
     addTargetSpecificPreprocessorDefs (defs, targetType);\r
 \r
@@ -465,8 +466,8 @@ void ProjectExporter::addDefaultPreprocessorDefs (StringPairArray& defs) const
 String ProjectExporter::replacePreprocessorTokens (const ProjectExporter::BuildConfiguration& config,\r
                                                    const String& sourceString) const\r
 {\r
-    return build_tools::replacePreprocessorDefs (getAllPreprocessorDefs (config,\r
-                                                 build_tools::ProjectType::Target::unspecified), sourceString);\r
+    return build_tools::replacePreprocessorDefs (getAllPreprocessorDefs (config, build_tools::ProjectType::Target::unspecified),\r
+                                                 sourceString);\r
 }\r
 \r
 void ProjectExporter::copyMainGroupFromProject()\r
index 6d0b56cf799d549bc6a0f1975615c3f963bb85c1..5788227184b319bf874b207902980a7d62ea147a 100644 (file)
 AppearanceSettings::AppearanceSettings (bool updateAppWhenChanged)\r
     : settings ("COLOUR_SCHEME")\r
 {\r
-    if (! ProjucerApplication::getApp().isRunningCommandLine)\r
-    {\r
-        ProjucerLookAndFeel lf;\r
-\r
-        CodeDocument doc;\r
-        CPlusPlusCodeTokeniser tokeniser;\r
-        CodeEditorComponent editor (doc, &tokeniser);\r
+    CodeDocument doc;\r
+    CPlusPlusCodeTokeniser tokeniser;\r
+    CodeEditorComponent editor (doc, &tokeniser);\r
 \r
-        CodeEditorComponent::ColourScheme cs (editor.getColourScheme());\r
+    CodeEditorComponent::ColourScheme cs (editor.getColourScheme());\r
 \r
-        for (int i = cs.types.size(); --i >= 0;)\r
-        {\r
-            auto& t = cs.types.getReference(i);\r
-            getColourValue (t.name) = t.colour.toString();\r
-        }\r
+    for (int i = cs.types.size(); --i >= 0;)\r
+    {\r
+        auto& t = cs.types.getReference(i);\r
+        getColourValue (t.name) = t.colour.toString();\r
+    }\r
 \r
-        getCodeFontValue() = getDefaultCodeFont().toString();\r
+    getCodeFontValue() = getDefaultCodeFont().toString();\r
 \r
-        if (updateAppWhenChanged)\r
-            settings.addListener (this);\r
-    }\r
+    if (updateAppWhenChanged)\r
+        settings.addListener (this);\r
 }\r
 \r
 File AppearanceSettings::getSchemesFolder()\r
index b2cc932936a5500702b42e3f4ac9e28b799a5242..bcf0b048b29f12156772a920dc6bf3f0b855b288 100644 (file)
@@ -358,6 +358,7 @@ namespace Ids
     DECLARE_ID (pluginVSTNumMidiInputs);\r
     DECLARE_ID (pluginVSTNumMidiOutputs);\r
     DECLARE_ID (suppressPlistResourceUsage);\r
+    DECLARE_ID (useLegacyBuildSystem);\r
     DECLARE_ID (exporters);\r
     DECLARE_ID (website);\r
     DECLARE_ID (mainClass);\r
index 0e5d478962d35ed5e57506c5c92124a90e4a239e..5378190c398137a25a28125f2c953e243e5da967 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=0x60005" "-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_blocks_basics=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=0x60007" "-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_blocks_basics=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=0x60005" "-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_blocks_basics=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=0x60007" "-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_blocks_basics=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 721ef81c6cc070cd036e51249319eada561a402d..7295617e1c0b3db9c79cf7538aa546d23419d04d 100644 (file)
                                        "DEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INSTALL_PATH = "/usr/bin";
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.UnitTestRunner;
                                PRODUCT_NAME = "UnitTestRunner";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Debug;
                                        "NDEBUG=1",
                                        "JUCE_DISPLAY_SPLASH_SCREEN=0",
                                        "JUCE_USE_DARK_SPLASH_SCREEN=1",
-                                       "JUCE_PROJUCER_VERSION=0x60005",
+                                       "JUCE_PROJUCER_VERSION=0x60007",
                                        "JUCE_MODULE_AVAILABLE_juce_analytics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_basics=1",
                                        "JUCE_MODULE_AVAILABLE_juce_audio_devices=1",
                                );
                                GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
                                HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                        "$(inherited)",
                                );
                                INSTALL_PATH = "/usr/bin";
                                LLVM_LTO = YES;
                                MACOSX_DEPLOYMENT_TARGET = 10.10;
                                MTL_HEADER_SEARCH_PATHS = (
-                                       "../../JuceLibraryCode",
-                                       "../../../../modules",
+                                       "$(SRCROOT)/../../JuceLibraryCode",
+                                       "$(SRCROOT)/../../../../modules",
                                );
                                OTHER_CPLUSPLUSFLAGS = "-Wall -Wshadow-all -Wshorten-64-to-32 -Wstrict-aliasing -Wuninitialized -Wunused-parameter -Wconversion -Wsign-compare -Wint-conversion -Wconditional-uninitialized -Woverloaded-virtual -Wreorder -Wconstant-conversion -Wsign-conversion -Wunused-private-field -Wbool-conversion -Wextra-semi -Wunreachable-code -Wzero-as-null-pointer-constant -Wcast-align -Winconsistent-missing-destructor-override -Wshift-sign-overflow -Wnullable-to-nonnull-conversion -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wswitch-enum";
                                PRODUCT_BUNDLE_IDENTIFIER = com.juce.UnitTestRunner;
                                PRODUCT_NAME = "UnitTestRunner";
                                USE_HEADERMAP = NO;
+                               VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = OpenGL;
                                VALID_ARCHS = "i386 x86_64 arm64 arm64e";
                        };
                        name = Release;
                E1E93F2B4B2D17E011395520 = {
                        isa = PBXProject;
                        buildConfigurationList = 18FC121B1014F7999CD135D3;
-                       attributes = { LastUpgradeCheck = 1200; ORGANIZATIONNAME = "Raw Material Software Limited"; };
+                       attributes = { LastUpgradeCheck = 1230; ORGANIZATIONNAME = "Raw Material Software Limited"; };
                        compatibilityVersion = "Xcode 3.2";
                        hasScannedForEncodings = 0;
                        mainGroup = 99F3717D3FEAFDCA3C22E868;
diff --git a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
deleted file mode 100644 (file)
index f2e3cbe..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-       <key>BuildSystemType</key>
-       <string>Original</string>
-       <key>DisableBuildSystemDeprecationWarning</key>
-       <true/>
-</dict>
-</plist>
index cb48740e2bbfb01b00cb23cfbfd6f82a9de5bf10..e87d7fdc6ac4e4202fae07558c44cf020a079418 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=0x60005;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_blocks_basics=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=0x60007;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_blocks_basics=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=0x60005;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_blocks_basics=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=0x60007;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_blocks_basics=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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index 9c9ed0559c228631a35e60a9bf8f6b45a4976a95..e68a1b4a036a68f4b338bcecce6d2a46867f59a5 100644 (file)
@@ -47,6 +47,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index b41f71e3f21bf0cc427ae65ada4e812071ca8e07..6de8bb6cdae8b7b72b159e508c9267b97593d3b7 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=0x60005;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_blocks_basics=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=0x60007;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_blocks_basics=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=0x60005;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_blocks_basics=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=0x60007;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_blocks_basics=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_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index bd6ce4f92afe6ebfe1d85ae348a1b69af819d381..256ff7f9662a7d56d3ac2ce2dc4e7d1a59b7abc8 100644 (file)
@@ -47,6 +47,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index 0d61cd2f21ba475998b0da756000e579bd7bcbe0..82cbde056aba51fa339e87c5d17a5053cc5c1cb2 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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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;_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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;_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=0x60005;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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;_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=0x60007;JUCE_MODULE_AVAILABLE_juce_audio_basics=1;JUCE_MODULE_AVAILABLE_juce_audio_devices=1;JUCE_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_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;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <RuntimeTypeInfo>true</RuntimeTypeInfo>\r
       <PrecompiledHeader>NotUsing</PrecompiledHeader>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <ExcludedFromBuild>true</ExcludedFromBuild>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
-      <ExcludedFromBuild>true</ExcludedFromBuild>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
       <ExcludedFromBuild>true</ExcludedFromBuild>\r
     </ClCompile>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODevice.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiMessageCollector.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\include\oboe\AudioStream.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\PolyphaseResamplerStereo.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResampler.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\FlowGraphNode.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ManyToMultiConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h"/>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SampleRateConverter.h"/>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\SinkFloat.h"/>\r
index ed7faae811690ec38bbf29d269aae16663f210f7..74ed3bb9e2e73fc7bd566e4aa54bbfc2b69da127 100644 (file)
@@ -32,6 +32,9 @@
     <Filter Include="JUCE Modules\juce_audio_devices\audio_io">\r
       <UniqueIdentifier>{BF23FC10-1D57-2A9B-706F-6DD8A7B593D4}</UniqueIdentifier>\r
     </Filter>\r
+    <Filter Include="JUCE Modules\juce_audio_devices\midi_io\ump">\r
+      <UniqueIdentifier>{386862D5-4DCC-A4B3-5642-60A201E303EF}</UniqueIdentifier>\r
+    </Filter>\r
     <Filter Include="JUCE Modules\juce_audio_devices\midi_io">\r
       <UniqueIdentifier>{092EFC17-7C95-7E04-0ACA-0D61A462EE81}</UniqueIdentifier>\r
     </Filter>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_AudioIODeviceType.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPTests.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.cpp">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreAudio.cpp">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.cpp">\r
+    <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_mac_CoreMidi.mm">\r
       <Filter>JUCE Modules\juce_audio_devices\native</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\..\..\modules\juce_audio_devices\native\juce_win32_ASIO.cpp">\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\audio_io\juce_SystemAudioVolume.h">\r
       <Filter>JUCE Modules\juce_audio_devices\audio_io</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPacket.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPackets.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPBytestreamInputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConversion.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPConverters.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPDispatcher.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPFactory.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPIterator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToBytestreamTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPMidi1ToMidi2DefaultTranslator.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPProtocols.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPReceiver.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPSysEx7.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPU32InputHandler.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPUtils.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\ump\juce_UMPView.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\midi_io\ump</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\midi_io\juce_MidiDevices.h">\r
       <Filter>JUCE Modules\juce_audio_devices\midi_io</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\resampler\SincResamplerStereo.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph\resampler</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ChannelCountConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\ClipToRange.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MonoToMultiConverter.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\MultiToMonoConverter.h">\r
+      <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="..\..\..\..\modules\juce_audio_devices\native\oboe\src\flowgraph\RampLinear.h">\r
       <Filter>JUCE Modules\juce_audio_devices\native\oboe\src\flowgraph</Filter>\r
     </ClInclude>\r
index 81333385c0c11d5482f579c02a8f3d2f8875053a..a283bc501c31c084eb1f9a48c7e0a29ac536d845 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_analytics\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE analytics classes\r
   description:        Classes to collect analytics and send to destinations\r
   website:            http://www.juce.com/juce\r
index a3b3d41dd147300ae6a16e04f30db89a8d2b9e2e..8c207fa69083d6c9b90684801f511b1a3363b080 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_basics\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 aa155bcfc6b66f25edb6cbdec0ccd02b26e7fd3a..84df6f46931a8c1a09dd3640115380b399993450 100644 (file)
@@ -27,30 +27,33 @@ namespace
 {\r
     const uint8 noLSBValueReceived = 0xff;\r
     const Range<int> allChannels { 1, 17 };\r
+\r
+    template <typename Range, typename Value>\r
+    void mpeInstrumentFill (Range& range, const Value& value)\r
+    {\r
+        std::fill (std::begin (range), std::end (range), value);\r
+    }\r
 }\r
 \r
 //==============================================================================\r
 MPEInstrument::MPEInstrument() noexcept\r
 {\r
-    std::fill_n (lastPressureLowerBitReceivedOnChannel, 16, noLSBValueReceived);\r
-    std::fill_n (lastTimbreLowerBitReceivedOnChannel, 16, noLSBValueReceived);\r
-    std::fill_n (isMemberChannelSustained, 16, false);\r
+    mpeInstrumentFill (lastPressureLowerBitReceivedOnChannel, noLSBValueReceived);\r
+    mpeInstrumentFill (lastTimbreLowerBitReceivedOnChannel, noLSBValueReceived);\r
+    mpeInstrumentFill (isMemberChannelSustained, false);\r
 \r
     pitchbendDimension.value = &MPENote::pitchbend;\r
     pressureDimension.value = &MPENote::pressure;\r
     timbreDimension.value = &MPENote::timbre;\r
 \r
-    // the default value for pressure is 0, for all other dimension it is centre (= default MPEValue)\r
-    std::fill_n (pressureDimension.lastValueReceivedOnChannel, 16, MPEValue::minValue());\r
+    resetLastReceivedValues();\r
 \r
     legacyMode.isEnabled = false;\r
     legacyMode.pitchbendRange = 2;\r
     legacyMode.channelRange = allChannels;\r
 }\r
 \r
-MPEInstrument::~MPEInstrument()\r
-{\r
-}\r
+MPEInstrument::~MPEInstrument() = default;\r
 \r
 //==============================================================================\r
 MPEZoneLayout MPEInstrument::getZoneLayout() const noexcept\r
@@ -58,6 +61,23 @@ MPEZoneLayout MPEInstrument::getZoneLayout() const noexcept
     return zoneLayout;\r
 }\r
 \r
+void MPEInstrument::resetLastReceivedValues()\r
+{\r
+    struct Defaults\r
+    {\r
+        MPEDimension& dimension;\r
+        MPEValue defaultValue;\r
+    };\r
+\r
+    // The default value for pressure is 0, for all other dimensions it is centre\r
+    for (const auto& pair : { Defaults { pressureDimension,  MPEValue::minValue() },\r
+                              Defaults { pitchbendDimension, MPEValue::centreValue() },\r
+                              Defaults { timbreDimension,    MPEValue::centreValue() } })\r
+    {\r
+        mpeInstrumentFill (pair.dimension.lastValueReceivedOnChannel, pair.defaultValue);\r
+    }\r
+}\r
+\r
 void MPEInstrument::setZoneLayout (MPEZoneLayout newLayout)\r
 {\r
     releaseAllNotes();\r
@@ -65,6 +85,8 @@ void MPEInstrument::setZoneLayout (MPEZoneLayout newLayout)
     const ScopedLock sl (lock);\r
     legacyMode.isEnabled = false;\r
     zoneLayout = newLayout;\r
+\r
+    resetLastReceivedValues();\r
 }\r
 \r
 //==============================================================================\r
index 2653702543753dd6cc7057339924d4d6e2a04db4..3db823f5f579b09ced761ac87dc8884674d5d0ef 100644 (file)
@@ -376,6 +376,8 @@ private:
     LegacyMode legacyMode;\r
     MPEDimension pitchbendDimension, pressureDimension, timbreDimension;\r
 \r
+    void resetLastReceivedValues();\r
+\r
     void updateDimension (int midiChannel, MPEDimension&, MPEValue);\r
     void updateDimensionMaster (bool, MPEDimension&, MPEValue);\r
     void updateDimensionForNote (MPENote&, MPEDimension&, MPEValue);\r
index bc472707756f66aa97ed0c6513112754a1af7f79..a19c7b05e3aa9e1aa4aa49658968b1b2726ba81b 100644 (file)
@@ -704,7 +704,7 @@ void AudioDeviceManager::restartLastAudioDevice()
         {\r
             // This method will only reload the last device that was running\r
             // before closeAudioDevice() was called - you need to actually open\r
-            // one first, with setAudioDevice().\r
+            // one first, with setAudioDeviceSetup().\r
             jassertfalse;\r
             return;\r
         }\r
index ac490c0d239899d817125e770a4264cf365b4e07..d5c6f03fff35612195bfd7609a6152ce1cf7ce73 100644 (file)
@@ -267,7 +267,7 @@ public:
 \r
         Note that this only reloads the last device that was running before\r
         closeAudioDevice() was called - it doesn't reload any kind of saved-state,\r
-        and can only be called after a device has been opened with SetAudioDevice().\r
+        and can only be called after a device has been opened with setAudioDeviceSetup().\r
 \r
         If a device is already open, this call will do nothing.\r
     */\r
index eca32bf9f27d554545e2c4eb9841aee08b14a37c..683d038a68093720ed3d4e0bfa5834b8c20cc317 100644 (file)
@@ -80,9 +80,8 @@ public:
 \r
         The scanForDevices() method must have been called to create this list.\r
 \r
-        @param wantInputNames     only really used by DirectSound where devices are split up\r
-                                  into inputs and outputs, this indicates whether to use\r
-                                  the input or output name to refer to a pair of devices.\r
+        @param wantInputNames    for devices which have separate inputs and outputs\r
+                                 this determines which list of names is returned\r
     */\r
     virtual StringArray getDeviceNames (bool wantInputNames = false) const = 0;\r
 \r
index b3a315c9d9719ae029c26b45749a82408020c1fe..7f7e461dbe97f5c7a4615059d62a88f0c797a07c 100644 (file)
 \r
 #include "native/juce_MidiDataConcatenator.h"\r
 \r
+#include "midi_io/ump/juce_UMPProtocols.h"\r
+#include "midi_io/ump/juce_UMPUtils.h"\r
+#include "midi_io/ump/juce_UMPacket.h"\r
+#include "midi_io/ump/juce_UMPSysEx7.h"\r
+#include "midi_io/ump/juce_UMPView.h"\r
+#include "midi_io/ump/juce_UMPIterator.h"\r
+#include "midi_io/ump/juce_UMPackets.h"\r
+#include "midi_io/ump/juce_UMPFactory.h"\r
+#include "midi_io/ump/juce_UMPConversion.h"\r
+#include "midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h"\r
+#include "midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h"\r
+#include "midi_io/ump/juce_UMPConverters.h"\r
+#include "midi_io/ump/juce_UMPDispatcher.h"\r
+#include "midi_io/ump/juce_UMPReceiver.h"\r
+#include "midi_io/ump/juce_UMPBytestreamInputHandler.h"\r
+#include "midi_io/ump/juce_UMPU32InputHandler.h"\r
+\r
+#include "midi_io/ump/juce_UMPUtils.cpp"\r
+#include "midi_io/ump/juce_UMPView.cpp"\r
+#include "midi_io/ump/juce_UMPSysEx7.cpp"\r
+#include "midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp"\r
+\r
+#include "midi_io/ump/juce_UMPTests.cpp"\r
+\r
+namespace juce\r
+{\r
+namespace ump = universal_midi_packets;\r
+}\r
+\r
 //==============================================================================\r
 #if JUCE_MAC\r
  #define Point CarbonDummyPointName\r
@@ -58,7 +87,7 @@
  #undef Component\r
 \r
  #include "native/juce_mac_CoreAudio.cpp"\r
- #include "native/juce_mac_CoreMidi.cpp"\r
+ #include "native/juce_mac_CoreMidi.mm"\r
 \r
 #elif JUCE_IOS\r
  #import <AudioToolbox/AudioToolbox.h>\r
@@ -70,7 +99,7 @@
  #endif\r
 \r
  #include "native/juce_ios_Audio.cpp"\r
- #include "native/juce_mac_CoreMidi.cpp"\r
+ #include "native/juce_mac_CoreMidi.mm"\r
 \r
 //==============================================================================\r
 #elif JUCE_WINDOWS\r
index 361427c1d17f1df56def19599e89291c93f4cf61..0cc0a449630cacf994fe5d49a348f93e5f01e7d1 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_audio_devices\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPBytestreamInputHandler.h
new file mode 100644 (file)
index 0000000..49ce664
--- /dev/null
@@ -0,0 +1,134 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    A base class for classes which convert bytestream midi to other formats.\r
+*/\r
+struct BytestreamInputHandler\r
+{\r
+    virtual ~BytestreamInputHandler() noexcept = default;\r
+\r
+    virtual void reset() = 0;\r
+    virtual void pushMidiData (const void* data, int bytes, double time) = 0;\r
+};\r
+\r
+/**\r
+    Parses a continuous bytestream and emits complete MidiMessages whenever a full\r
+    message is received.\r
+*/\r
+struct BytestreamToBytestreamHandler : public BytestreamInputHandler\r
+{\r
+    BytestreamToBytestreamHandler (MidiInput& i, MidiInputCallback& c)\r
+        : input (i), callback (c), concatenator (2048) {}\r
+\r
+    /**\r
+        Provides an `operator()` which can create an input handler for a given\r
+        MidiInput.\r
+\r
+        All handler classes should have a similar Factory to facilitate\r
+        creation of handlers in generic contexts.\r
+    */\r
+    class Factory\r
+    {\r
+    public:\r
+        explicit Factory (MidiInputCallback* c)\r
+            : callback (c) {}\r
+\r
+        std::unique_ptr<BytestreamToBytestreamHandler> operator() (MidiInput& i) const\r
+        {\r
+            if (callback != nullptr)\r
+                return std::make_unique<BytestreamToBytestreamHandler> (i, *callback);\r
+\r
+            jassertfalse;\r
+            return {};\r
+        }\r
+\r
+    private:\r
+        MidiInputCallback* callback = nullptr;\r
+    };\r
+\r
+    void reset() override { concatenator.reset(); }\r
+\r
+    void pushMidiData (const void* data, int bytes, double time) override\r
+    {\r
+        concatenator.pushMidiData (data, bytes, time, &input, callback);\r
+    }\r
+\r
+    MidiInput& input;\r
+    MidiInputCallback& callback;\r
+    MidiDataConcatenator concatenator;\r
+};\r
+\r
+/**\r
+    Parses a continuous MIDI 1.0 bytestream, and emits full messages in the requested\r
+    UMP format.\r
+*/\r
+struct BytestreamToUMPHandler : public BytestreamInputHandler\r
+{\r
+    BytestreamToUMPHandler (PacketProtocol protocol, Receiver& c)\r
+        : recipient (c), dispatcher (protocol, 2048) {}\r
+\r
+    /**\r
+        Provides an `operator()` which can create an input handler for a given\r
+        MidiInput.\r
+\r
+        All handler classes should have a similar Factory to facilitate\r
+        creation of handlers in generic contexts.\r
+    */\r
+    class Factory\r
+    {\r
+    public:\r
+        Factory (PacketProtocol p, Receiver& c)\r
+            : protocol (p), callback (c) {}\r
+\r
+        std::unique_ptr<BytestreamToUMPHandler> operator() (MidiInput&) const\r
+        {\r
+            return std::make_unique<BytestreamToUMPHandler> (protocol, callback);\r
+        }\r
+\r
+    private:\r
+        PacketProtocol protocol;\r
+        Receiver& callback;\r
+    };\r
+\r
+    void reset() override { dispatcher.reset(); }\r
+\r
+    void pushMidiData (const void* data, int bytes, double time) override\r
+    {\r
+        const auto* ptr = static_cast<const uint8_t*> (data);\r
+        dispatcher.dispatch (ptr, ptr + bytes, time, [&] (const View& v)\r
+        {\r
+            recipient.packetReceived (v, time);\r
+        });\r
+    }\r
+\r
+    Receiver& recipient;\r
+    BytestreamToUMPDispatcher dispatcher;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPConversion.h
new file mode 100644 (file)
index 0000000..c85a33f
--- /dev/null
@@ -0,0 +1,326 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Functions to assist conversion of UMP messages to/from other formats,\r
+    especially older 'bytestream' formatted MidiMessages.\r
+\r
+    @tags{Audio}\r
+*/\r
+struct Conversion\r
+{\r
+    /** Converts from a MIDI 1 bytestream to MIDI 1 on Universal MIDI Packets.\r
+\r
+        `callback` is a function which accepts a single View argument.\r
+    */\r
+    template <typename PacketCallbackFunction>\r
+    static void toMidi1 (const MidiMessage& m, PacketCallbackFunction&& callback)\r
+    {\r
+        const auto* data = m.getRawData();\r
+        const auto firstByte = data[0];\r
+        const auto size = m.getRawDataSize();\r
+\r
+        if (firstByte != 0xf0)\r
+        {\r
+            const auto mask = [size]() -> uint32_t\r
+            {\r
+                switch (size)\r
+                {\r
+                    case 0: return 0xff000000;\r
+                    case 1: return 0xffff0000;\r
+                    case 2: return 0xffffff00;\r
+                    case 3: return 0xffffffff;\r
+                }\r
+\r
+                return 0x00000000;\r
+            }();\r
+\r
+            const auto extraByte = (uint8_t) ((((firstByte & 0xf0) == 0xf0) ? 0x1 : 0x2) << 0x4);\r
+            const PacketX1 packet { mask & Utils::bytesToWord (extraByte, data[0], data[1], data[2]) };\r
+            callback (View (packet.data()));\r
+            return;\r
+        }\r
+\r
+        const auto numSysExBytes = m.getSysExDataSize();\r
+        const auto numMessages = SysEx7::getNumPacketsRequiredForDataSize ((uint32_t) numSysExBytes);\r
+        auto* dataOffset = m.getSysExData();\r
+\r
+        if (numMessages <= 1)\r
+        {\r
+            const auto packet = Factory::makeSysExIn1Packet (0, (uint8_t) numSysExBytes, dataOffset);\r
+            callback (View (packet.data()));\r
+            return;\r
+        }\r
+\r
+        constexpr auto byteIncrement = 6;\r
+\r
+        for (auto i = numSysExBytes; i > 0; i -= byteIncrement, dataOffset += byteIncrement)\r
+        {\r
+            const auto func = [&]\r
+            {\r
+                if (i == numSysExBytes)\r
+                    return Factory::makeSysExStart;\r
+\r
+                if (i <= byteIncrement)\r
+                    return Factory::makeSysExEnd;\r
+\r
+                return Factory::makeSysExContinue;\r
+            }();\r
+\r
+            const auto bytesNow = std::min (byteIncrement, i);\r
+            const auto packet = func (0, (uint8_t) bytesNow, dataOffset);\r
+            callback (View (packet.data()));\r
+        }\r
+    }\r
+\r
+    /** Converts a MidiMessage to one or more messages in UMP format, using\r
+        the MIDI 1.0 Protocol.\r
+\r
+        `packets` is an out-param to allow the caller to control\r
+        allocation/deallocation. Returning a new Packets object would\r
+        require every call to toMidi1 to allocate. With this version, no\r
+        allocations will occur, provided that `packets` has adequate reserved\r
+        space.\r
+    */\r
+    static void toMidi1 (const MidiMessage& m, Packets& packets)\r
+    {\r
+        toMidi1 (m, [&] (const View& view) { packets.add (view); });\r
+    }\r
+\r
+    /** Widens a 7-bit MIDI 1.0 value to a 8-bit MIDI 2.0 value. */\r
+    static uint8_t scaleTo8 (uint8_t word7Bit)\r
+    {\r
+        const auto shifted = (uint8_t) (word7Bit << 0x1);\r
+        const auto repeat = (uint8_t) (word7Bit & 0x3f);\r
+        const auto mask = (uint8_t) (word7Bit <= 0x40 ? 0x0 : 0xff);\r
+        return (uint8_t) (shifted | ((repeat >> 5) & mask));\r
+    }\r
+\r
+    /** Widens a 7-bit MIDI 1.0 value to a 16-bit MIDI 2.0 value. */\r
+    static uint16_t scaleTo16 (uint8_t word7Bit)\r
+    {\r
+        const auto shifted = (uint16_t) (word7Bit << 0x9);\r
+        const auto repeat = (uint16_t) (word7Bit & 0x3f);\r
+        const auto mask = (uint16_t) (word7Bit <= 0x40 ? 0x0 : 0xffff);\r
+        return (uint16_t) (shifted | (((repeat << 3) | (repeat >> 3)) & mask));\r
+    }\r
+\r
+    /** Widens a 14-bit MIDI 1.0 value to a 16-bit MIDI 2.0 value. */\r
+    static uint16_t scaleTo16 (uint16_t word14Bit)\r
+    {\r
+        const auto shifted = (uint16_t) (word14Bit << 0x2);\r
+        const auto repeat = (uint16_t) (word14Bit & 0x1fff);\r
+        const auto mask = (uint16_t) (word14Bit <= 0x2000 ? 0x0 : 0xffff);\r
+        return (uint16_t) (shifted | ((repeat >> 11) & mask));\r
+    }\r
+\r
+    /** Widens a 7-bit MIDI 1.0 value to a 32-bit MIDI 2.0 value. */\r
+    static uint32_t scaleTo32 (uint8_t word7Bit)\r
+    {\r
+        const auto shifted = (uint32_t) (word7Bit << 0x19);\r
+        const auto repeat = (uint32_t) (word7Bit & 0x3f);\r
+        const auto mask = (uint32_t) (word7Bit <= 0x40 ? 0x0 : 0xffffffff);\r
+        return (uint32_t) (shifted | (((repeat << 19)\r
+                                     | (repeat << 13)\r
+                                     | (repeat << 7)\r
+                                     | (repeat << 1)\r
+                                     | (repeat >> 5)) & mask));\r
+    }\r
+\r
+    /** Widens a 14-bit MIDI 1.0 value to a 32-bit MIDI 2.0 value. */\r
+    static uint32_t scaleTo32 (uint16_t word14Bit)\r
+    {\r
+        const auto shifted = (uint32_t) (word14Bit << 0x12);\r
+        const auto repeat = (uint32_t) (word14Bit & 0x1fff);\r
+        const auto mask = (uint32_t) (word14Bit <= 0x2000 ? 0x0 : 0xffffffff);\r
+        return (uint32_t) (shifted | (((repeat << 5) | (repeat >> 8)) & mask));\r
+    }\r
+\r
+    /** Narrows a 16-bit MIDI 2.0 value to a 7-bit MIDI 1.0 value. */\r
+    static uint8_t scaleTo7 (uint8_t word8Bit) { return (uint8_t) (word8Bit >> 1); }\r
+\r
+    /** Narrows a 16-bit MIDI 2.0 value to a 7-bit MIDI 1.0 value. */\r
+    static uint8_t scaleTo7 (uint16_t word16Bit) { return (uint8_t) (word16Bit >> 9); }\r
+\r
+    /** Narrows a 32-bit MIDI 2.0 value to a 7-bit MIDI 1.0 value. */\r
+    static uint8_t scaleTo7 (uint32_t word32Bit) { return (uint8_t) (word32Bit >> 25); }\r
+\r
+    /** Narrows a 32-bit MIDI 2.0 value to a 14-bit MIDI 1.0 value. */\r
+    static uint16_t scaleTo14 (uint16_t word16Bit) { return (uint16_t) (word16Bit >> 2); }\r
+\r
+    /** Narrows a 32-bit MIDI 2.0 value to a 14-bit MIDI 1.0 value. */\r
+    static uint16_t scaleTo14 (uint32_t word32Bit) { return (uint16_t) (word32Bit >> 18); }\r
+\r
+    /** Converts UMP messages which may include MIDI 2.0 channel voice messages into\r
+        equivalent MIDI 1.0 messages (still in UMP format).\r
+\r
+        `callback` is a function that accepts a single View argument and will be\r
+        called with each converted packet.\r
+\r
+        Note that not all MIDI 2.0 messages have MIDI 1.0 equivalents, so such\r
+        messages will be ignored.\r
+    */\r
+    template <typename Callback>\r
+    static void midi2ToMidi1DefaultTranslation (const View& v, Callback&& callback)\r
+    {\r
+        const auto firstWord = v[0];\r
+\r
+        if (Utils::getMessageType (firstWord) != 0x4)\r
+        {\r
+            callback (v);\r
+            return;\r
+        }\r
+\r
+        const auto status = Utils::getStatus (firstWord);\r
+        const auto typeAndGroup = (uint8_t) ((0x2 << 0x4) | Utils::getGroup (firstWord));\r
+\r
+        switch (status)\r
+        {\r
+            case 0x8:   // note off\r
+            case 0x9:   // note on\r
+            case 0xa:   // poly pressure\r
+            case 0xb:   // control change\r
+            {\r
+                const auto statusAndChannel = (uint8_t) ((firstWord >> 0x10) & 0xff);\r
+                const auto byte2 = (uint8_t) ((firstWord >> 0x08) & 0xff);\r
+                const auto byte3 = scaleTo7 (v[1]);\r
+\r
+                // If this is a note-on, and the scaled byte is 0,\r
+                // the scaled velocity should be 1 instead of 0\r
+                const auto needsCorrection = status == 0x9 && byte3 == 0;\r
+                const auto correctedByte = (uint8_t) (needsCorrection ? 1 : byte3);\r
+\r
+                const auto shouldIgnore = status == 0xb && [&]\r
+                {\r
+                    switch (byte2)\r
+                    {\r
+                        case 0:\r
+                        case 6:\r
+                        case 32:\r
+                        case 38:\r
+                        case 98:\r
+                        case 99:\r
+                        case 100:\r
+                        case 101:\r
+                            return true;\r
+                    }\r
+\r
+                    return false;\r
+                }();\r
+\r
+                if (shouldIgnore)\r
+                    return;\r
+\r
+                const PacketX1 packet { Utils::bytesToWord (typeAndGroup,\r
+                                                            statusAndChannel,\r
+                                                            byte2,\r
+                                                            correctedByte) };\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            case 0xd: // channel pressure\r
+            {\r
+                const auto statusAndChannel = (uint8_t) ((firstWord >> 0x10) & 0xff);\r
+                const auto byte2 = scaleTo7 (v[1]);\r
+\r
+                const PacketX1 packet { Utils::bytesToWord (typeAndGroup,\r
+                                                            statusAndChannel,\r
+                                                            byte2,\r
+                                                            0) };\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            case 0x2:   // rpn\r
+            case 0x3:   // nrpn\r
+            {\r
+                const auto ccX = (uint8_t) (status == 0x2 ? 101 : 99);\r
+                const auto ccY = (uint8_t) (status == 0x2 ? 100 : 98);\r
+                const auto statusAndChannel = (uint8_t) ((0xb << 0x4) | Utils::getChannel (firstWord));\r
+                const auto data = scaleTo14 (v[1]);\r
+\r
+                const PacketX1 packets[]\r
+                {\r
+                    PacketX1 { Utils::bytesToWord (typeAndGroup, statusAndChannel, ccX, (uint8_t) ((firstWord >> 0x8) & 0x7f)) },\r
+                    PacketX1 { Utils::bytesToWord (typeAndGroup, statusAndChannel, ccY, (uint8_t) ((firstWord >> 0x0) & 0x7f)) },\r
+                    PacketX1 { Utils::bytesToWord (typeAndGroup, statusAndChannel, 6,   (uint8_t) ((data >> 0x7) & 0x7f)) },\r
+                    PacketX1 { Utils::bytesToWord (typeAndGroup, statusAndChannel, 38,  (uint8_t) ((data >> 0x0) & 0x7f)) },\r
+                };\r
+\r
+                for (const auto& packet : packets)\r
+                    callback (View (packet.data()));\r
+\r
+                return;\r
+            }\r
+\r
+            case 0xc: // program change / bank select\r
+            {\r
+                if (firstWord & 1)\r
+                {\r
+                    const auto statusAndChannel = (uint8_t) ((0xb << 0x4) | Utils::getChannel (firstWord));\r
+                    const auto secondWord = v[1];\r
+\r
+                    const PacketX1 packets[]\r
+                    {\r
+                        PacketX1 { Utils::bytesToWord (typeAndGroup, statusAndChannel, 0,  (uint8_t) ((secondWord >> 0x8) & 0x7f)) },\r
+                        PacketX1 { Utils::bytesToWord (typeAndGroup, statusAndChannel, 32, (uint8_t) ((secondWord >> 0x0) & 0x7f)) },\r
+                    };\r
+\r
+                    for (const auto& packet : packets)\r
+                        callback (View (packet.data()));\r
+                }\r
+\r
+                const auto statusAndChannel = (uint8_t) ((0xc << 0x4) | Utils::getChannel (firstWord));\r
+                const PacketX1 packet { Utils::bytesToWord (typeAndGroup,\r
+                                                            statusAndChannel,\r
+                                                            (uint8_t) ((v[1] >> 0x18) & 0x7f),\r
+                                                            0) };\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            case 0xe: // pitch bend\r
+            {\r
+                const auto data = scaleTo14 (v[1]);\r
+                const auto statusAndChannel = (uint8_t) ((firstWord >> 0x10) & 0xff);\r
+                const PacketX1 packet { Utils::bytesToWord (typeAndGroup,\r
+                                                            statusAndChannel,\r
+                                                            (uint8_t) (data & 0x7f),\r
+                                                            (uint8_t) ((data >> 7) & 0x7f)) };\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            default: // other message types do not translate\r
+                return;\r
+        }\r
+    }\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPConverters.h
new file mode 100644 (file)
index 0000000..d47927b
--- /dev/null
@@ -0,0 +1,165 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+    /**\r
+        Allows conversion from bytestream- or Universal MIDI Packet-formatted\r
+        messages to MIDI 1.0 messages in UMP format.\r
+\r
+        @tags{Audio}\r
+    */\r
+    struct ToUMP1Converter\r
+    {\r
+        template <typename Fn>\r
+        void convert (const MidiMessage& m, Fn&& fn)\r
+        {\r
+            Conversion::toMidi1 (m, std::forward<Fn> (fn));\r
+        }\r
+\r
+        template <typename Fn>\r
+        void convert (const View& v, Fn&& fn)\r
+        {\r
+            Conversion::midi2ToMidi1DefaultTranslation (v, std::forward<Fn> (fn));\r
+        }\r
+    };\r
+\r
+    /**\r
+        Allows conversion from bytestream- or Universal MIDI Packet-formatted\r
+        messages to MIDI 2.0 messages in UMP format.\r
+\r
+        @tags{Audio}\r
+    */\r
+    struct ToUMP2Converter\r
+    {\r
+        template <typename Fn>\r
+        void convert (const MidiMessage& m, Fn&& fn)\r
+        {\r
+            Conversion::toMidi1 (m, [&] (const View& v)\r
+            {\r
+                translator.dispatch (v, fn);\r
+            });\r
+        }\r
+\r
+        template <typename Fn>\r
+        void convert (const View& v, Fn&& fn)\r
+        {\r
+            translator.dispatch (v, std::forward<Fn> (fn));\r
+        }\r
+\r
+        void reset()\r
+        {\r
+            translator.reset();\r
+        }\r
+\r
+        Midi1ToMidi2DefaultTranslator translator;\r
+    };\r
+\r
+    /**\r
+        Allows conversion from bytestream- or Universal MIDI Packet-formatted\r
+        messages to UMP format.\r
+\r
+        The packet protocol can be selected using the constructor parameter.\r
+\r
+        @tags{Audio}\r
+    */\r
+    class GenericUMPConverter\r
+    {\r
+    public:\r
+        explicit GenericUMPConverter (PacketProtocol m)\r
+            : mode (m) {}\r
+\r
+        void reset()\r
+        {\r
+            std::get<1> (converters).reset();\r
+        }\r
+\r
+        template <typename Fn>\r
+        void convert (const MidiMessage& m, Fn&& fn)\r
+        {\r
+            switch (mode)\r
+            {\r
+                case PacketProtocol::MIDI_1_0: return std::get<0> (converters).convert (m, std::forward<Fn> (fn));\r
+                case PacketProtocol::MIDI_2_0: return std::get<1> (converters).convert (m, std::forward<Fn> (fn));\r
+            }\r
+        }\r
+\r
+        template <typename Fn>\r
+        void convert (const View& v, Fn&& fn)\r
+        {\r
+            switch (mode)\r
+            {\r
+                case PacketProtocol::MIDI_1_0: return std::get<0> (converters).convert (v, std::forward<Fn> (fn));\r
+                case PacketProtocol::MIDI_2_0: return std::get<1> (converters).convert (v, std::forward<Fn> (fn));\r
+            }\r
+        }\r
+\r
+        template <typename Fn>\r
+        void convert (Iterator begin, Iterator end, Fn&& fn)\r
+        {\r
+            std::for_each (begin, end, [&] (const View& v)\r
+            {\r
+                convert (v, fn);\r
+            });\r
+        }\r
+\r
+        PacketProtocol getProtocol() const noexcept { return mode; }\r
+\r
+    private:\r
+        std::tuple<ToUMP1Converter, ToUMP2Converter> converters;\r
+        const PacketProtocol mode{};\r
+    };\r
+\r
+    /**\r
+        Allows conversion from bytestream- or Universal MIDI Packet-formatted\r
+        messages to bytestream format.\r
+\r
+        @tags{Audio}\r
+    */\r
+    struct ToBytestreamConverter\r
+    {\r
+        explicit ToBytestreamConverter (int storageSize)\r
+            : translator (storageSize) {}\r
+\r
+        template <typename Fn>\r
+        void convert (const MidiMessage& m, Fn&& fn)\r
+        {\r
+            fn (m);\r
+        }\r
+\r
+        template <typename Fn>\r
+        void convert (const View& v, double time, Fn&& fn)\r
+        {\r
+            Conversion::midi2ToMidi1DefaultTranslation (v, [&] (const View& midi1)\r
+            {\r
+                translator.dispatch (midi1, time, fn);\r
+            });\r
+        }\r
+\r
+        void reset() { translator.reset(); }\r
+\r
+        Midi1ToBytestreamTranslator translator;\r
+    };\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPDispatcher.h
new file mode 100644 (file)
index 0000000..a365b4f
--- /dev/null
@@ -0,0 +1,190 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Parses a raw stream of uint32_t, and calls a user-provided callback every time\r
+    a full Universal MIDI Packet is encountered.\r
+\r
+    @tags{Audio}\r
+*/\r
+class Dispatcher\r
+{\r
+public:\r
+    /** Clears the dispatcher. */\r
+    void reset() { currentPacketLen = 0; }\r
+\r
+    /** Calls `callback` with a View of each packet encountered in the range delimited\r
+        by `begin` and `end`.\r
+\r
+        If the range ends part-way through a packet, the next call to `dispatch` will\r
+        continue from that point in the packet (unless `reset` is called first).\r
+    */\r
+    template <typename PacketCallbackFunction>\r
+    void dispatch (const uint32_t* begin,\r
+                   const uint32_t* end,\r
+                   double timeStamp,\r
+                   PacketCallbackFunction&& callback)\r
+    {\r
+        std::for_each (begin, end, [&] (uint32_t word)\r
+        {\r
+            nextPacket[currentPacketLen++] = word;\r
+\r
+            if (currentPacketLen == Utils::getNumWordsForMessageType (nextPacket.front()))\r
+            {\r
+                callback (View (nextPacket.data()), timeStamp);\r
+                currentPacketLen = 0;\r
+            }\r
+        });\r
+    }\r
+\r
+private:\r
+    std::array<uint32_t, 4> nextPacket;\r
+    size_t currentPacketLen = 0;\r
+};\r
+\r
+//==============================================================================\r
+/**\r
+    Parses a stream of bytes representing a sequence of bytestream-encoded MIDI 1.0 messages,\r
+    converting the messages to UMP format and passing the packets to a user-provided callback\r
+    as they become ready.\r
+\r
+    @tags{Audio}\r
+*/\r
+class BytestreamToUMPDispatcher\r
+{\r
+public:\r
+    /** Initialises the dispatcher.\r
+\r
+        Channel messages will be converted to the requested protocol format `pp`.\r
+        `storageSize` bytes will be allocated to store incomplete messages.\r
+    */\r
+    explicit BytestreamToUMPDispatcher (PacketProtocol pp, int storageSize)\r
+        : concatenator (storageSize),\r
+          converter (pp)\r
+    {}\r
+\r
+    void reset()\r
+    {\r
+        concatenator.reset();\r
+        converter.reset();\r
+    }\r
+\r
+    /** Calls `callback` with a View of each converted packet as it becomes ready.\r
+\r
+        @param begin        the first byte in a range of bytes representing bytestream-encoded MIDI messages.\r
+        @param end          one-past the last byte in a range of bytes representing bytestream-encoded MIDI messages.\r
+        @param timestamp    a timestamp to apply to the created packets.\r
+        @param callback     a callback which will be passed a View pointing to each new packet as it becomes ready.\r
+    */\r
+    template <typename PacketCallbackFunction>\r
+    void dispatch (const uint8_t* begin,\r
+                   const uint8_t* end,\r
+                   double timestamp,\r
+                   PacketCallbackFunction&& callback)\r
+    {\r
+        using CallbackPtr = decltype (std::addressof (callback));\r
+\r
+        struct Callback\r
+        {\r
+            Callback (BytestreamToUMPDispatcher& d, CallbackPtr c)\r
+                : dispatch (d), callbackPtr (c) {}\r
+\r
+            void handleIncomingMidiMessage (void*, const MidiMessage& msg) const\r
+            {\r
+                Conversion::toMidi1 (msg, [&] (const View& view)\r
+                {\r
+                    dispatch.converter.convert (view, *callbackPtr);\r
+                });\r
+            }\r
+\r
+            void handlePartialSysexMessage (void*, const uint8_t*, int, double) const {}\r
+\r
+            BytestreamToUMPDispatcher& dispatch;\r
+            CallbackPtr callbackPtr = nullptr;\r
+        };\r
+\r
+        Callback inputCallback { *this, &callback };\r
+        concatenator.pushMidiData (begin, int (end - begin), timestamp, (void*) nullptr, inputCallback);\r
+    }\r
+\r
+private:\r
+    MidiDataConcatenator concatenator;\r
+    GenericUMPConverter converter;\r
+};\r
+\r
+//==============================================================================\r
+/**\r
+    Parses a stream of 32-bit words representing a sequence of UMP-encoded MIDI messages,\r
+    converting the messages to MIDI 1.0 bytestream format and passing them to a user-provided\r
+    callback as they become ready.\r
+\r
+    @tags{Audio}\r
+*/\r
+class ToBytestreamDispatcher\r
+{\r
+public:\r
+    /** Initialises the dispatcher.\r
+\r
+        `storageSize` bytes will be allocated to store incomplete messages.\r
+    */\r
+    explicit ToBytestreamDispatcher (int storageSize)\r
+        : converter (storageSize) {}\r
+\r
+    /** Clears the dispatcher. */\r
+    void reset()\r
+    {\r
+        dispatcher.reset();\r
+        converter.reset();\r
+    }\r
+\r
+    /** Calls `callback` with converted bytestream-formatted MidiMessage whenever\r
+        a new message becomes available.\r
+\r
+        @param begin        the first word in a stream of words representing UMP-encoded MIDI packets.\r
+        @param end          one-past the last word in a stream of words representing UMP-encoded MIDI packets.\r
+        @param timestamp    a timestamp to apply to converted messages.\r
+        @param callback     a callback which will be passed a MidiMessage each time a new message becomes ready.\r
+    */\r
+    template <typename BytestreamMessageCallback>\r
+    void dispatch (const uint32_t* begin,\r
+                   const uint32_t* end,\r
+                   double timestamp,\r
+                   BytestreamMessageCallback&& callback)\r
+    {\r
+        dispatcher.dispatch (begin, end, timestamp, [&] (const View& view, double time)\r
+        {\r
+            converter.convert (view, time, callback);\r
+        });\r
+    }\r
+\r
+private:\r
+    Dispatcher dispatcher;\r
+    ToBytestreamConverter converter;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPFactory.h
new file mode 100644 (file)
index 0000000..acfcc6c
--- /dev/null
@@ -0,0 +1,534 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    This struct holds functions that can be used to create different kinds\r
+    of Universal MIDI Packet.\r
+\r
+    @tags{Audio}\r
+*/\r
+struct Factory\r
+{\r
+    /** @internal */\r
+    struct Detail\r
+    {\r
+        static PacketX1 makeSystem()   { return PacketX1{}.withMessageType (1); }\r
+        static PacketX1 makeV1()       { return PacketX1{}.withMessageType (2); }\r
+        static PacketX2 makeV2()       { return PacketX2{}.withMessageType (4); }\r
+\r
+        static PacketX2 makeSysEx (uint8_t group,\r
+                                   uint8_t status,\r
+                                   uint8_t numBytes,\r
+                                   const uint8_t* data)\r
+        {\r
+            jassert (numBytes <= 6);\r
+\r
+            std::array<uint8_t, 8> bytes{{}};\r
+            bytes[0] = (0x3 << 0x4) | group;\r
+            bytes[1] = (uint8_t) (status << 0x4) | numBytes;\r
+\r
+            std::memcpy (bytes.data() + 2, data, numBytes);\r
+\r
+            std::array<uint32_t, 2> words;\r
+\r
+            size_t index = 0;\r
+\r
+            for (auto& word : words)\r
+                word = ByteOrder::bigEndianInt (bytes.data() + 4 * index++);\r
+\r
+            return PacketX2 { words };\r
+        }\r
+\r
+        static PacketX4 makeSysEx8 (uint8_t group,\r
+                                    uint8_t status,\r
+                                    uint8_t numBytes,\r
+                                    uint8_t dataStart,\r
+                                    const uint8_t* data)\r
+        {\r
+            jassert (numBytes <= 16 - dataStart);\r
+\r
+            std::array<uint8_t, 16> bytes{{}};\r
+            bytes[0] = (0x5 << 0x4) | group;\r
+            bytes[1] = (uint8_t) (status << 0x4) | numBytes;\r
+\r
+            std::memcpy (bytes.data() + dataStart, data, numBytes);\r
+\r
+            std::array<uint32_t, 4> words;\r
+\r
+            size_t index = 0;\r
+\r
+            for (auto& word : words)\r
+                word = ByteOrder::bigEndianInt (bytes.data() + 4 * index++);\r
+\r
+            return PacketX4 { words };\r
+        }\r
+    };\r
+\r
+    static PacketX1 makeNoop (uint8_t group)\r
+    {\r
+        return PacketX1{}.withGroup (group);\r
+    }\r
+\r
+    static PacketX1 makeJRClock (uint8_t group, uint16_t time)\r
+    {\r
+        return PacketX1 { time }.withStatus (1).withGroup (group);\r
+    }\r
+\r
+    static PacketX1 makeJRTimestamp (uint8_t group, uint16_t time)\r
+    {\r
+        return PacketX1 { time }.withStatus (2).withGroup (group);\r
+    }\r
+\r
+    static PacketX1 makeTimeCode (uint8_t group, uint8_t code)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xf1)\r
+                                   .withU8<2> (code & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makeSongPositionPointer (uint8_t group, uint16_t pos)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xf2)\r
+                                   .withU8<2> (pos & 0x7f)\r
+                                   .withU8<3> ((pos >> 7) & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makeSongSelect (uint8_t group, uint8_t song)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xf3)\r
+                                   .withU8<2> (song & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makeTuneRequest (uint8_t group)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xf6);\r
+    }\r
+\r
+    static PacketX1 makeTimingClock (uint8_t group)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xf8);\r
+    }\r
+\r
+    static PacketX1 makeStart (uint8_t group)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xfa);\r
+    }\r
+\r
+    static PacketX1 makeContinue (uint8_t group)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xfb);\r
+    }\r
+\r
+    static PacketX1 makeStop (uint8_t group)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xfc);\r
+    }\r
+\r
+    static PacketX1 makeActiveSensing (uint8_t group)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xfe);\r
+    }\r
+\r
+    static PacketX1 makeReset (uint8_t group)\r
+    {\r
+        return Detail::makeSystem().withGroup (group)\r
+                                   .withU8<1> (0xff);\r
+    }\r
+\r
+    static PacketX1 makeNoteOffV1 (uint8_t group,\r
+                                   uint8_t channel,\r
+                                   uint8_t note,\r
+                                   uint8_t velocity)\r
+    {\r
+        return Detail::makeV1().withGroup (group)\r
+                               .withStatus (0x8)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU8<3> (velocity & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makeNoteOnV1 (uint8_t group,\r
+                                  uint8_t channel,\r
+                                  uint8_t note,\r
+                                  uint8_t velocity)\r
+    {\r
+        return Detail::makeV1().withGroup (group)\r
+                               .withStatus (0x9)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU8<3> (velocity & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makePolyPressureV1 (uint8_t group,\r
+                                        uint8_t channel,\r
+                                        uint8_t note,\r
+                                        uint8_t pressure)\r
+    {\r
+        return Detail::makeV1().withGroup (group)\r
+                               .withStatus (0xa)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU8<3> (pressure & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makeControlChangeV1 (uint8_t group,\r
+                                         uint8_t channel,\r
+                                         uint8_t controller,\r
+                                         uint8_t value)\r
+    {\r
+        return Detail::makeV1().withGroup (group)\r
+                               .withStatus (0xb)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (controller & 0x7f)\r
+                               .withU8<3> (value & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makeProgramChangeV1 (uint8_t group,\r
+                                         uint8_t channel,\r
+                                         uint8_t program)\r
+    {\r
+        return Detail::makeV1().withGroup (group)\r
+                               .withStatus (0xc)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (program & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makeChannelPressureV1 (uint8_t group,\r
+                                           uint8_t channel,\r
+                                           uint8_t pressure)\r
+    {\r
+        return Detail::makeV1().withGroup (group)\r
+                               .withStatus (0xd)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (pressure & 0x7f);\r
+    }\r
+\r
+    static PacketX1 makePitchBend (uint8_t group,\r
+                                   uint8_t channel,\r
+                                   uint16_t pitchbend)\r
+    {\r
+        return Detail::makeV1().withGroup (group)\r
+                               .withStatus (0xe)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (pitchbend & 0x7f)\r
+                               .withU8<3> ((pitchbend >> 7) & 0x7f);\r
+    }\r
+\r
+    static PacketX2 makeSysExIn1Packet (uint8_t group,\r
+                                        uint8_t numBytes,\r
+                                        const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx (group, 0x0, numBytes, data);\r
+    }\r
+\r
+    static PacketX2 makeSysExStart (uint8_t group,\r
+                                    uint8_t numBytes,\r
+                                    const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx (group, 0x1, numBytes, data);\r
+    }\r
+\r
+    static PacketX2 makeSysExContinue (uint8_t group,\r
+                                       uint8_t numBytes,\r
+                                       const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx (group, 0x2, numBytes, data);\r
+    }\r
+\r
+    static PacketX2 makeSysExEnd (uint8_t group,\r
+                                  uint8_t numBytes,\r
+                                  const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx (group, 0x3, numBytes, data);\r
+    }\r
+\r
+    static PacketX2 makeRegisteredPerNoteControllerV2 (uint8_t group,\r
+                                                       uint8_t channel,\r
+                                                       uint8_t note,\r
+                                                       uint8_t controller,\r
+                                                       uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x0)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU8<3> (controller & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makeAssignablePerNoteControllerV2 (uint8_t group,\r
+                                                       uint8_t channel,\r
+                                                       uint8_t note,\r
+                                                       uint8_t controller,\r
+                                                       uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x1)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU8<3> (controller & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makeRegisteredControllerV2 (uint8_t group,\r
+                                                uint8_t channel,\r
+                                                uint8_t bank,\r
+                                                uint8_t index,\r
+                                                uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x2)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (bank & 0x7f)\r
+                               .withU8<3> (index & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makeAssignableControllerV2 (uint8_t group,\r
+                                                uint8_t channel,\r
+                                                uint8_t bank,\r
+                                                uint8_t index,\r
+                                                uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x3)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (bank & 0x7f)\r
+                               .withU8<3> (index & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makeRelativeRegisteredControllerV2 (uint8_t group,\r
+                                                        uint8_t channel,\r
+                                                        uint8_t bank,\r
+                                                        uint8_t index,\r
+                                                        uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x4)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (bank & 0x7f)\r
+                               .withU8<3> (index & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makeRelativeAssignableControllerV2 (uint8_t group,\r
+                                                        uint8_t channel,\r
+                                                        uint8_t bank,\r
+                                                        uint8_t index,\r
+                                                        uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x5)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (bank & 0x7f)\r
+                               .withU8<3> (index & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makePerNotePitchBendV2 (uint8_t group,\r
+                                            uint8_t channel,\r
+                                            uint8_t note,\r
+                                            uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x6)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    enum class NoteAttributeKind : uint8_t\r
+    {\r
+        none            = 0x00,\r
+        manufacturer    = 0x01,\r
+        profile         = 0x02,\r
+        pitch7_9        = 0x03\r
+    };\r
+\r
+    static PacketX2 makeNoteOffV2 (uint8_t group,\r
+                                   uint8_t channel,\r
+                                   uint8_t note,\r
+                                   NoteAttributeKind attribute,\r
+                                   uint16_t velocity,\r
+                                   uint16_t attributeValue)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x8)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU8<3> ((uint8_t) attribute)\r
+                               .withU16<2> (velocity)\r
+                               .withU16<3> (attributeValue);\r
+    }\r
+\r
+    static PacketX2 makeNoteOnV2 (uint8_t group,\r
+                                  uint8_t channel,\r
+                                  uint8_t note,\r
+                                  NoteAttributeKind attribute,\r
+                                  uint16_t velocity,\r
+                                  uint16_t attributeValue)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0x9)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU8<3> ((uint8_t) attribute)\r
+                               .withU16<2> (velocity)\r
+                               .withU16<3> (attributeValue);\r
+    }\r
+\r
+    static PacketX2 makePolyPressureV2 (uint8_t group,\r
+                                        uint8_t channel,\r
+                                        uint8_t note,\r
+                                        uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0xa)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makeControlChangeV2 (uint8_t group,\r
+                                         uint8_t channel,\r
+                                         uint8_t controller,\r
+                                         uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0xb)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (controller & 0x7f)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makeProgramChangeV2 (uint8_t group,\r
+                                         uint8_t channel,\r
+                                         uint8_t optionFlags,\r
+                                         uint8_t program,\r
+                                         uint8_t bankMsb,\r
+                                         uint8_t bankLsb)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0xc)\r
+                               .withChannel (channel)\r
+                               .withU8<3> (optionFlags)\r
+                               .withU8<4> (program)\r
+                               .withU8<6> (bankMsb)\r
+                               .withU8<7> (bankLsb);\r
+    }\r
+\r
+    static PacketX2 makeChannelPressureV2 (uint8_t group,\r
+                                           uint8_t channel,\r
+                                           uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0xd)\r
+                               .withChannel (channel)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makePitchBendV2 (uint8_t group,\r
+                                     uint8_t channel,\r
+                                     uint32_t data)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0xe)\r
+                               .withChannel (channel)\r
+                               .withU32<1> (data);\r
+    }\r
+\r
+    static PacketX2 makePerNoteManagementV2 (uint8_t group,\r
+                                             uint8_t channel,\r
+                                             uint8_t note,\r
+                                             uint8_t optionFlags)\r
+    {\r
+        return Detail::makeV2().withGroup (group)\r
+                               .withStatus (0xf)\r
+                               .withChannel (channel)\r
+                               .withU8<2> (note)\r
+                               .withU8<3> (optionFlags);\r
+    }\r
+\r
+\r
+    static PacketX4 makeSysEx8in1Packet (uint8_t group,\r
+                                         uint8_t numBytes,\r
+                                         uint8_t streamId,\r
+                                         const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx8 (group, 0x0, numBytes, 3, data).withU8<2> (streamId);\r
+    }\r
+\r
+    static PacketX4 makeSysEx8Start (uint8_t group,\r
+                                     uint8_t numBytes,\r
+                                     uint8_t streamId,\r
+                                     const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx8 (group, 0x1, numBytes, 3, data).withU8<2> (streamId);\r
+    }\r
+\r
+    static PacketX4 makeSysEx8Continue (uint8_t group,\r
+                                        uint8_t numBytes,\r
+                                        uint8_t streamId,\r
+                                        const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx8 (group, 0x2, numBytes, 3, data).withU8<2> (streamId);\r
+    }\r
+\r
+    static PacketX4 makeSysEx8End (uint8_t group,\r
+                                   uint8_t numBytes,\r
+                                   uint8_t streamId,\r
+                                   const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx8 (group, 0x3, numBytes, 3, data).withU8<2> (streamId);\r
+    }\r
+\r
+    static PacketX4 makeMixedDataSetHeader (uint8_t group,\r
+                                            uint8_t dataSetId,\r
+                                            const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx8 (group, 0x8, 14, 2, data).withChannel (dataSetId);\r
+    }\r
+\r
+    static PacketX4 makeDataSetPayload (uint8_t group,\r
+                                        uint8_t dataSetId,\r
+                                        const uint8_t* data)\r
+    {\r
+        return Detail::makeSysEx8 (group, 0x9, 14, 2, data).withChannel (dataSetId);\r
+    }\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPIterator.h
new file mode 100644 (file)
index 0000000..a91b115
--- /dev/null
@@ -0,0 +1,126 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Enables iteration over a collection of Universal MIDI Packets stored as\r
+    a contiguous range of 32-bit words.\r
+\r
+    This iterator is used by Packets to allow access to the messages\r
+    that it contains.\r
+\r
+    @tags{Audio}\r
+*/\r
+class Iterator\r
+{\r
+public:\r
+    /** Creates an invalid (singular) iterator. */\r
+    Iterator() noexcept = default;\r
+\r
+    /** Creates an iterator pointing at `ptr`. */\r
+    explicit Iterator (const uint32_t* ptr, size_t bytes) noexcept\r
+        : view (ptr)\r
+       #if JUCE_DEBUG\r
+        , bytesRemaining (bytes)\r
+       #endif\r
+    {\r
+        ignoreUnused (bytes);\r
+    }\r
+\r
+    using difference_type    = std::iterator_traits<const uint32_t*>::difference_type;\r
+    using value_type         = View;\r
+    using reference          = const View&;\r
+    using pointer            = const View*;\r
+    using iterator_category  = std::input_iterator_tag;\r
+\r
+    /** Moves this iterator to the next packet in the range. */\r
+    Iterator& operator++() noexcept\r
+    {\r
+        const auto increment = view.size();\r
+\r
+       #if JUCE_DEBUG\r
+        // If you hit this, the memory region contained a truncated or otherwise\r
+        // malformed Universal MIDI Packet.\r
+        // The Iterator can only be used on regions containing complete packets!\r
+        jassert (increment <= bytesRemaining);\r
+        bytesRemaining -= increment;\r
+       #endif\r
+\r
+        view = View (view.data() + increment);\r
+        return *this;\r
+    }\r
+\r
+    /** Moves this iterator to the next packet in the range,\r
+        returning the value of the iterator before it was\r
+        incremented.\r
+    */\r
+    Iterator operator++ (int) noexcept\r
+    {\r
+        auto copy = *this;\r
+        ++(*this);\r
+        return copy;\r
+    }\r
+\r
+    /** Returns true if this iterator points to the same address\r
+        as another iterator.\r
+    */\r
+    bool operator== (const Iterator& other) const noexcept\r
+    {\r
+        return view == other.view;\r
+    }\r
+\r
+    /** Returns false if this iterator points to the same address\r
+        as another iterator.\r
+    */\r
+    bool operator!= (const Iterator& other) const noexcept\r
+    {\r
+        return ! operator== (other);\r
+    }\r
+\r
+    /** Returns a reference to a View of the packet currently\r
+        pointed-to by this iterator.\r
+\r
+        The View can be queried for its size and content.\r
+    */\r
+    reference operator*() noexcept { return view; }\r
+\r
+    /** Returns a pointer to a View of the packet currently\r
+        pointed-to by this iterator.\r
+\r
+        The View can be queried for its size and content.\r
+    */\r
+    pointer operator->() noexcept { return &view; }\r
+\r
+private:\r
+    View view;\r
+\r
+   #if JUCE_DEBUG\r
+    size_t bytesRemaining = 0;\r
+   #endif\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToBytestreamTranslator.h
new file mode 100644 (file)
index 0000000..5debeef
--- /dev/null
@@ -0,0 +1,213 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Parses a raw stream of uint32_t holding a series of Universal MIDI Packets using\r
+    the MIDI 1.0 Protocol, converting to plain (non-UMP) MidiMessages.\r
+\r
+    @tags{Audio}\r
+*/\r
+class Midi1ToBytestreamTranslator\r
+{\r
+public:\r
+    /** Ensures that there is room in the internal buffer for a sysex message of at least\r
+        `initialBufferSize` bytes.\r
+    */\r
+    explicit Midi1ToBytestreamTranslator (int initialBufferSize)\r
+    {\r
+        pendingSysExData.reserve (size_t (initialBufferSize));\r
+    }\r
+\r
+    /** Clears the concatenator. */\r
+    void reset()\r
+    {\r
+        pendingSysExData.clear();\r
+        pendingSysExTime = 0.0;\r
+    }\r
+\r
+    /** Converts a Universal MIDI Packet using the MIDI 1.0 Protocol to\r
+        an equivalent MidiMessage. Accumulates SysEx packets into a single\r
+        MidiMessage, as appropriate.\r
+\r
+        @param packet       a packet which is using the MIDI 1.0 Protocol.\r
+        @param time         the timestamp to be applied to these messages.\r
+        @param callback     a callback which will be called with each converted MidiMessage.\r
+    */\r
+    template <typename MessageCallback>\r
+    void dispatch (const View& packet, double time, MessageCallback&& callback)\r
+    {\r
+        const auto firstWord = *packet.data();\r
+\r
+        if (! pendingSysExData.empty() && shouldPacketTerminateSysExEarly (firstWord))\r
+            pendingSysExData.clear();\r
+\r
+        switch (packet.size())\r
+        {\r
+            case 1:\r
+            {\r
+                // Utility messages don't translate to bytestream format\r
+                if (Utils::getMessageType (firstWord) != 0x00)\r
+                    callback (fromUmp (PacketX1 { firstWord }, time));\r
+\r
+                break;\r
+            }\r
+\r
+            case 2:\r
+            {\r
+                if (Utils::getMessageType (firstWord) == 0x3)\r
+                    processSysEx (PacketX2 { packet[0], packet[1] }, time, callback);\r
+\r
+                break;\r
+            }\r
+\r
+            case 3:  // no 3-word packets in the current spec\r
+            case 4:  // no 4-word packets translate to bytestream format\r
+            default:\r
+                break;\r
+        }\r
+    }\r
+\r
+    /** Converts from a Universal MIDI Packet to MIDI 1 bytestream format.\r
+\r
+        This is only capable of converting a single Universal MIDI Packet to\r
+        an equivalent bytestream MIDI message. This function cannot understand\r
+        multi-packet messages, like SysEx7 messages.\r
+\r
+        To convert multi-packet messages, use `Midi1ToBytestreamTranslator`\r
+        to convert from a UMP MIDI 1.0 stream, or `ToBytestreamDispatcher`\r
+        to convert from both MIDI 2.0 and MIDI 1.0.\r
+    */\r
+    static MidiMessage fromUmp (const PacketX1& m, double time = 0)\r
+    {\r
+        const auto word = m.front();\r
+        jassert (Utils::getNumWordsForMessageType (word) == 1);\r
+\r
+        const std::array<uint8_t, 3> bytes { { uint8_t ((word >> 0x10) & 0xff),\r
+                                               uint8_t ((word >> 0x08) & 0xff),\r
+                                               uint8_t ((word >> 0x00) & 0xff) } };\r
+        const auto numBytes = MidiMessage::getMessageLengthFromFirstByte (bytes.front());\r
+        return MidiMessage (bytes.data(), numBytes, time);\r
+    }\r
+\r
+private:\r
+    template <typename MessageCallback>\r
+    void processSysEx (const PacketX2& packet,\r
+                       double time,\r
+                       MessageCallback&& callback)\r
+    {\r
+        switch (getSysEx7Kind (packet[0]))\r
+        {\r
+            case SysEx7::Kind::complete:\r
+                startSysExMessage (time);\r
+                pushBytes (packet);\r
+                terminateSysExMessage (callback);\r
+                break;\r
+\r
+            case SysEx7::Kind::begin:\r
+                startSysExMessage (time);\r
+                pushBytes (packet);\r
+                break;\r
+\r
+            case SysEx7::Kind::continuation:\r
+                if (pendingSysExData.empty())\r
+                    break;\r
+\r
+                pushBytes (packet);\r
+                break;\r
+\r
+            case SysEx7::Kind::end:\r
+                if (pendingSysExData.empty())\r
+                    break;\r
+\r
+                pushBytes (packet);\r
+                terminateSysExMessage (callback);\r
+                break;\r
+        }\r
+    }\r
+\r
+    void pushBytes (const PacketX2& packet)\r
+    {\r
+        const auto bytes = SysEx7::getDataBytes (packet);\r
+        pendingSysExData.insert (pendingSysExData.end(),\r
+                                 bytes.data.begin(),\r
+                                 bytes.data.begin() + bytes.size);\r
+    }\r
+\r
+    void startSysExMessage (double time)\r
+    {\r
+        pendingSysExTime = time;\r
+        pendingSysExData.push_back (0xf0);\r
+    }\r
+\r
+    template <typename MessageCallback>\r
+    void terminateSysExMessage (MessageCallback&& callback)\r
+    {\r
+        pendingSysExData.push_back (0xf7);\r
+        callback (MidiMessage (pendingSysExData.data(),\r
+                               int (pendingSysExData.size()),\r
+                               pendingSysExTime));\r
+        pendingSysExData.clear();\r
+    }\r
+\r
+    static bool shouldPacketTerminateSysExEarly (uint32_t firstWord)\r
+    {\r
+        return ! (isSysExContinuation (firstWord)\r
+                  || isSystemRealTime (firstWord)\r
+                  || isJROrNOP (firstWord));\r
+    }\r
+\r
+    static SysEx7::Kind getSysEx7Kind (uint32_t word)\r
+    {\r
+        return SysEx7::Kind ((word >> 0x14) & 0xf);\r
+    }\r
+\r
+    static bool isJROrNOP (uint32_t word)\r
+    {\r
+        return Utils::getMessageType (word) == 0x0;\r
+    }\r
+\r
+    static bool isSysExContinuation (uint32_t word)\r
+    {\r
+        if (Utils::getMessageType (word) != 0x3)\r
+            return false;\r
+\r
+        const auto kind = getSysEx7Kind (word);\r
+        return kind == SysEx7::Kind::continuation || kind == SysEx7::Kind::end;\r
+    }\r
+\r
+    static bool isSystemRealTime (uint32_t word)\r
+    {\r
+        return Utils::getMessageType (word) == 0x1 && ((word >> 0x10) & 0xff) >= 0xf8;\r
+    }\r
+\r
+    std::vector<uint8_t> pendingSysExData;\r
+\r
+    double pendingSysExTime = 0.0;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.cpp
new file mode 100644 (file)
index 0000000..9da72c3
--- /dev/null
@@ -0,0 +1,195 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+PacketX2 Midi1ToMidi2DefaultTranslator::processNoteOnOrOff (const HelperValues helpers)\r
+{\r
+    const auto velocity = helpers.byte2;\r
+    const auto needsConversion = (helpers.byte0 >> 0x4) == 0x9 && velocity == 0;\r
+    const auto firstByte = needsConversion ? (uint8_t) ((0x8 << 0x4) | (helpers.byte0 & 0xf))\r
+                                           : helpers.byte0;\r
+\r
+    return PacketX2\r
+    {\r
+        Utils::bytesToWord (helpers.typeAndGroup, firstByte, helpers.byte1, 0),\r
+        (uint32_t) (Conversion::scaleTo16 (velocity) << 0x10)\r
+    };\r
+}\r
+\r
+PacketX2 Midi1ToMidi2DefaultTranslator::processPolyPressure (const HelperValues helpers)\r
+{\r
+    return PacketX2\r
+    {\r
+        Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, helpers.byte1, 0),\r
+        Conversion::scaleTo32 (helpers.byte2)\r
+    };\r
+}\r
+\r
+bool Midi1ToMidi2DefaultTranslator::processControlChange (const HelperValues helpers,\r
+                                                          PacketX2& packet)\r
+{\r
+    const auto statusAndChannel = helpers.byte0;\r
+    const auto cc               = helpers.byte1;\r
+\r
+    const auto shouldAccumulate = [&]\r
+    {\r
+        switch (cc)\r
+        {\r
+            case 6:\r
+            case 38:\r
+            case 98:\r
+            case 99:\r
+            case 100:\r
+            case 101:\r
+                return true;\r
+        }\r
+\r
+        return false;\r
+    }();\r
+\r
+    const auto group   = (uint8_t) (helpers.typeAndGroup & 0xf);\r
+    const auto channel = (uint8_t) (statusAndChannel & 0xf);\r
+    const auto byte    = helpers.byte2;\r
+\r
+    if (shouldAccumulate)\r
+    {\r
+        auto& accumulator = groupAccumulators[group][channel];\r
+\r
+        if (accumulator.addByte (cc, byte))\r
+        {\r
+            const auto& bytes = accumulator.getBytes();\r
+            const auto bank   = bytes[0];\r
+            const auto index  = bytes[1];\r
+            const auto msb    = bytes[2];\r
+            const auto lsb    = bytes[3];\r
+\r
+            const auto value = (uint16_t) (((msb & 0x7f) << 7) | (lsb & 0x7f));\r
+\r
+            const auto newStatus = (uint8_t) (accumulator.getKind() == PnKind::nrpn ? 0x3 : 0x2);\r
+\r
+            packet = PacketX2\r
+            {\r
+                Utils::bytesToWord (helpers.typeAndGroup, (uint8_t) ((newStatus << 0x4) | channel), bank, index),\r
+                Conversion::scaleTo32 (value)\r
+            };\r
+            return true;\r
+        }\r
+\r
+        return false;\r
+    }\r
+\r
+    if (cc == 0)\r
+    {\r
+        groupBanks[group][channel].setMsb (byte);\r
+        return false;\r
+    }\r
+\r
+    if (cc == 32)\r
+    {\r
+        groupBanks[group][channel].setLsb (byte);\r
+        return false;\r
+    }\r
+\r
+    packet = PacketX2\r
+    {\r
+        Utils::bytesToWord (helpers.typeAndGroup, statusAndChannel, cc, 0),\r
+        Conversion::scaleTo32 (helpers.byte2)\r
+    };\r
+    return true;\r
+}\r
+\r
+PacketX2 Midi1ToMidi2DefaultTranslator::processProgramChange (const HelperValues helpers) const\r
+{\r
+    const auto group   = (uint8_t) (helpers.typeAndGroup & 0xf);\r
+    const auto channel = (uint8_t) (helpers.byte0 & 0xf);\r
+    const auto bank    = groupBanks[group][channel];\r
+    const auto valid   = bank.isValid();\r
+\r
+    return PacketX2\r
+    {\r
+        Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, valid ? 1 : 0),\r
+        Utils::bytesToWord (helpers.byte1, 0, valid ? bank.getMsb() : 0, valid ? bank.getLsb() : 0)\r
+    };\r
+}\r
+\r
+PacketX2 Midi1ToMidi2DefaultTranslator::processChannelPressure (const HelperValues helpers)\r
+{\r
+    return PacketX2\r
+    {\r
+        Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, 0),\r
+        Conversion::scaleTo32 (helpers.byte1)\r
+    };\r
+}\r
+\r
+PacketX2 Midi1ToMidi2DefaultTranslator::processPitchBend (const HelperValues helpers)\r
+{\r
+    const auto lsb   = helpers.byte1;\r
+    const auto msb   = helpers.byte2;\r
+    const auto value = (uint16_t) (msb << 7 | lsb);\r
+\r
+    return PacketX2\r
+    {\r
+        Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, 0),\r
+        Conversion::scaleTo32 (value)\r
+    };\r
+}\r
+\r
+bool Midi1ToMidi2DefaultTranslator::PnAccumulator::addByte (uint8_t cc, uint8_t byte)\r
+{\r
+    const auto isStart = cc == 99 || cc == 101;\r
+\r
+    if (isStart)\r
+    {\r
+        kind = cc == 99 ? PnKind::nrpn : PnKind::rpn;\r
+        index = 0;\r
+    }\r
+\r
+    bytes[index] = byte;\r
+\r
+    const auto shouldContinue = [&]\r
+    {\r
+        switch (index)\r
+        {\r
+            case 0: return isStart;\r
+            case 1: return kind == PnKind::nrpn ? cc == 98 : cc == 100;\r
+            case 2: return cc == 6;\r
+            case 3: return cc == 38;\r
+        }\r
+\r
+        return false;\r
+    }();\r
+\r
+    index = shouldContinue ? index + 1 : 0;\r
+\r
+    if (index != bytes.size())\r
+        return false;\r
+\r
+    index = 0;\r
+    return true;\r
+}\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPMidi1ToMidi2DefaultTranslator.h
new file mode 100644 (file)
index 0000000..61d566f
--- /dev/null
@@ -0,0 +1,187 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Translates a series of MIDI 1 Universal MIDI Packets to corresponding MIDI 2\r
+    packets.\r
+\r
+    @tags{Audio}\r
+*/\r
+class Midi1ToMidi2DefaultTranslator\r
+{\r
+public:\r
+    Midi1ToMidi2DefaultTranslator() = default;\r
+\r
+    /** Converts MIDI 1 Universal MIDI Packets to corresponding MIDI 2 packets,\r
+        calling `callback` with each converted packet.\r
+\r
+        In some cases (such as RPN/NRPN messages) multiple MIDI 1 packets will\r
+        convert to a single MIDI 2 packet. In these cases, the translator will\r
+        accumulate the full message internally, and send a single callback with\r
+        the completed message, once all the individual MIDI 1 packets have been\r
+        processed.\r
+    */\r
+    template <typename PacketCallback>\r
+    void dispatch (const View& v, PacketCallback&& callback)\r
+    {\r
+        const auto firstWord = v[0];\r
+        const auto messageType = Utils::getMessageType (firstWord);\r
+\r
+        if (messageType != 0x2)\r
+        {\r
+            callback (v);\r
+            return;\r
+        }\r
+\r
+        const HelperValues helperValues\r
+        {\r
+            (uint8_t) ((0x4 << 0x4) | Utils::getGroup (firstWord)),\r
+            (uint8_t) ((firstWord >> 0x10) & 0xff),\r
+            (uint8_t) ((firstWord >> 0x08) & 0x7f),\r
+            (uint8_t) ((firstWord >> 0x00) & 0x7f),\r
+        };\r
+\r
+        switch (Utils::getStatus (firstWord))\r
+        {\r
+            case 0x8:\r
+            case 0x9:\r
+            {\r
+                const auto packet = processNoteOnOrOff (helperValues);\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            case 0xa:\r
+            {\r
+                const auto packet = processPolyPressure (helperValues);\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            case 0xb:\r
+            {\r
+                PacketX2 packet;\r
+\r
+                if (processControlChange (helperValues, packet))\r
+                    callback (View (packet.data()));\r
+\r
+                return;\r
+            }\r
+\r
+            case 0xc:\r
+            {\r
+                const auto packet = processProgramChange (helperValues);\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            case 0xd:\r
+            {\r
+                const auto packet = processChannelPressure (helperValues);\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+\r
+            case 0xe:\r
+            {\r
+                const auto packet = processPitchBend (helperValues);\r
+                callback (View (packet.data()));\r
+                return;\r
+            }\r
+        }\r
+    }\r
+\r
+    void reset()\r
+    {\r
+        groupAccumulators = {};\r
+        groupBanks = {};\r
+    }\r
+\r
+private:\r
+    enum class PnKind { nrpn, rpn };\r
+\r
+    struct HelperValues\r
+    {\r
+        uint8_t typeAndGroup;\r
+        uint8_t byte0;\r
+        uint8_t byte1;\r
+        uint8_t byte2;\r
+    };\r
+\r
+    static PacketX2 processNoteOnOrOff (const HelperValues helpers);\r
+    static PacketX2 processPolyPressure (const HelperValues helpers);\r
+\r
+    bool processControlChange (const HelperValues helpers, PacketX2& packet);\r
+\r
+    PacketX2 processProgramChange (const HelperValues helpers) const;\r
+\r
+    static PacketX2 processChannelPressure (const HelperValues helpers);\r
+    static PacketX2 processPitchBend (const HelperValues helpers);\r
+\r
+    class PnAccumulator\r
+    {\r
+    public:\r
+        bool addByte (uint8_t cc, uint8_t byte);\r
+\r
+        const std::array<uint8_t, 4>& getBytes() const noexcept { return bytes; }\r
+        PnKind getKind() const noexcept { return kind; }\r
+\r
+    private:\r
+        std::array<uint8_t, 4> bytes;\r
+        uint8_t index = 0;\r
+        PnKind kind = PnKind::nrpn;\r
+    };\r
+\r
+    class Bank\r
+    {\r
+    public:\r
+        bool isValid() const noexcept { return ! (msb & 0x80); }\r
+\r
+        uint8_t getMsb() const noexcept { return msb & 0x7f; }\r
+        uint8_t getLsb() const noexcept { return lsb & 0x7f; }\r
+\r
+        void setMsb (uint8_t i) noexcept { msb = i & 0x7f; }\r
+        void setLsb (uint8_t i) noexcept { msb &= 0x7f; lsb = i & 0x7f; }\r
+\r
+    private:\r
+        // We use the top bit to indicate whether this bank is valid.\r
+        // After reading the spec, it's not clear how we should determine whether\r
+        // there are valid values, so we'll just assume that the bank is valid\r
+        // once either the lsb or msb have been written.\r
+        uint8_t msb = 0x80;\r
+        uint8_t lsb = 0x00;\r
+    };\r
+\r
+    using ChannelAccumulators = std::array<PnAccumulator, 16>;\r
+    std::array<ChannelAccumulators, 16> groupAccumulators;\r
+\r
+    using ChannelBanks = std::array<Bank, 16>;\r
+    std::array<ChannelBanks, 16> groupBanks;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPProtocols.h
new file mode 100644 (file)
index 0000000..a5b5ca9
--- /dev/null
@@ -0,0 +1,44 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/** The kinds of MIDI protocol that can be formatted into Universal MIDI Packets. */\r
+enum class PacketProtocol\r
+{\r
+    MIDI_1_0,\r
+    MIDI_2_0,\r
+};\r
+\r
+/** All kinds of MIDI protocol understood by JUCE. */\r
+enum class MidiProtocol\r
+{\r
+    bytestream,\r
+    UMP_MIDI_1_0,\r
+    UMP_MIDI_2_0,\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPReceiver.h
new file mode 100644 (file)
index 0000000..469efd3
--- /dev/null
@@ -0,0 +1,40 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    A base class for classes which receive Universal MIDI Packets from an input.\r
+*/\r
+struct Receiver\r
+{\r
+    virtual ~Receiver() noexcept = default;\r
+\r
+    /** This will be called each time a new packet is ready for processing. */\r
+    virtual void packetReceived (const View& packet, double time) = 0;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.cpp
new file mode 100644 (file)
index 0000000..bf4f790
--- /dev/null
@@ -0,0 +1,53 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+uint32_t SysEx7::getNumPacketsRequiredForDataSize (uint32_t size)\r
+{\r
+    constexpr auto denom = 6;\r
+    return (size / denom) + ((size % denom) != 0);\r
+}\r
+\r
+SysEx7::PacketBytes SysEx7::getDataBytes (const PacketX2& packet)\r
+{\r
+    const auto numBytes = Utils::getChannel (packet[0]);\r
+    constexpr uint8_t maxBytes = 6;\r
+    jassert (numBytes <= maxBytes);\r
+\r
+    return\r
+    {\r
+        { packet.getU8<2>(),\r
+          packet.getU8<3>(),\r
+          packet.getU8<4>(),\r
+          packet.getU8<5>(),\r
+          packet.getU8<6>(),\r
+          packet.getU8<7>() },\r
+        jmin (numBytes, maxBytes)\r
+    };\r
+}\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPSysEx7.h
new file mode 100644 (file)
index 0000000..f5f898a
--- /dev/null
@@ -0,0 +1,73 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    This struct acts as a single-file namespace for Univeral MIDI Packet\r
+    functionality related to 7-bit SysEx.\r
+\r
+    @tags{Audio}\r
+*/\r
+struct SysEx7\r
+{\r
+    /** Returns the number of 64-bit packets required to hold a series of\r
+        SysEx bytes.\r
+\r
+        The number passed to this function should exclude the leading/trailing\r
+        SysEx bytes used in an old midi bytestream, as these are not required\r
+        when using Universal MIDI Packets.\r
+    */\r
+    static uint32_t getNumPacketsRequiredForDataSize (uint32_t);\r
+\r
+    /** The different kinds of UMP SysEx-7 message. */\r
+    enum class Kind : uint8_t\r
+    {\r
+        /** The whole message fits in a single 2-word packet. */\r
+        complete     = 0,\r
+\r
+        /** The packet begins a SysEx message that will continue in subsequent packets. */\r
+        begin        = 1,\r
+\r
+        /** The packet is a continuation of an ongoing SysEx message. */\r
+        continuation = 2,\r
+\r
+        /** The packet terminates an ongoing SysEx message. */\r
+        end          = 3\r
+    };\r
+\r
+    /** Holds the bytes from a single SysEx-7 packet. */\r
+    struct PacketBytes\r
+    {\r
+        std::array<uint8_t, 6> data;\r
+        uint8_t size;\r
+    };\r
+\r
+    /** Extracts the data bytes from a 64-bit data message. */\r
+    static PacketBytes getDataBytes (const PacketX2& packet);\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPTests.cpp
new file mode 100644 (file)
index 0000000..0ac2cce
--- /dev/null
@@ -0,0 +1,1020 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+#if JUCE_UNIT_TESTS\r
+\r
+constexpr uint8_t  operator""_u8  (unsigned long long int i) { return static_cast<uint8_t>  (i); }\r
+constexpr uint16_t operator""_u16 (unsigned long long int i) { return static_cast<uint16_t> (i); }\r
+constexpr uint32_t operator""_u32 (unsigned long long int i) { return static_cast<uint32_t> (i); }\r
+constexpr uint64_t operator""_u64 (unsigned long long int i) { return static_cast<uint64_t> (i); }\r
+\r
+class UniversalMidiPacketTests : public UnitTest\r
+{\r
+public:\r
+    UniversalMidiPacketTests()\r
+        : UnitTest ("Universal MIDI Packet", UnitTestCategories::midi)\r
+    {\r
+    }\r
+\r
+    void runTest() override\r
+    {\r
+        auto random = getRandom();\r
+\r
+        beginTest ("Short bytestream midi messages can be round-tripped through the UMP converter");\r
+        {\r
+            Midi1ToBytestreamTranslator translator (0);\r
+\r
+            forEachNonSysExTestMessage (random, [&] (const MidiMessage& m)\r
+            {\r
+                Packets packets;\r
+                Conversion::toMidi1 (m, packets);\r
+                expect (packets.size() == 1);\r
+\r
+                // Make sure that the message type is correct\r
+                expect (Utils::getMessageType (packets.data()[0]) == ((m.getRawData()[0] >> 0x4) == 0xf ? 0x1 : 0x2));\r
+\r
+                translator.dispatch (View {packets.data() },\r
+                                     0,\r
+                                     [&] (const MidiMessage& roundTripped)\r
+                                     {\r
+                                         expect (equal (m, roundTripped));\r
+                                     });\r
+            });\r
+        }\r
+\r
+        beginTest ("Bytestream SysEx converts to universal packets");\r
+        {\r
+            {\r
+                // Zero length message\r
+                Packets packets;\r
+                Conversion::toMidi1 (createRandomSysEx (random, 0), packets);\r
+                expect (packets.size() == 2);\r
+\r
+                expect (packets.data()[0] == 0x30000000);\r
+                expect (packets.data()[1] == 0x00000000);\r
+            }\r
+\r
+            {\r
+                const auto message = createRandomSysEx (random, 1);\r
+                Packets packets;\r
+                Conversion::toMidi1 (message, packets);\r
+                expect (packets.size() == 2);\r
+\r
+                const auto* sysEx = message.getSysExData();\r
+                expect (packets.data()[0] == Utils::bytesToWord (0x30, 0x01, sysEx[0], 0));\r
+                expect (packets.data()[1] == 0x00000000);\r
+            }\r
+\r
+            {\r
+                const auto message = createRandomSysEx (random, 6);\r
+                Packets packets;\r
+                Conversion::toMidi1 (message, packets);\r
+                expect (packets.size() == 2);\r
+\r
+                const auto* sysEx = message.getSysExData();\r
+                expect (packets.data()[0] == Utils::bytesToWord (0x30,     0x06,     sysEx[0], sysEx[1]));\r
+                expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4], sysEx[5]));\r
+            }\r
+\r
+            {\r
+                const auto message = createRandomSysEx (random, 12);\r
+                Packets packets;\r
+                Conversion::toMidi1 (message, packets);\r
+                expect (packets.size() == 4);\r
+\r
+                const auto* sysEx = message.getSysExData();\r
+                expect (packets.data()[0] == Utils::bytesToWord (0x30,     0x16,     sysEx[0],  sysEx[1]));\r
+                expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4],  sysEx[5]));\r
+                expect (packets.data()[2] == Utils::bytesToWord (0x30,     0x36,     sysEx[6],  sysEx[7]));\r
+                expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11]));\r
+            }\r
+\r
+            {\r
+                const auto message = createRandomSysEx (random, 13);\r
+                Packets packets;\r
+                Conversion::toMidi1 (message, packets);\r
+                expect (packets.size() == 6);\r
+\r
+                const auto* sysEx = message.getSysExData();\r
+                expect (packets.data()[0] == Utils::bytesToWord (0x30,     0x16,     sysEx[0],  sysEx[1]));\r
+                expect (packets.data()[1] == Utils::bytesToWord (sysEx[2], sysEx[3], sysEx[4],  sysEx[5]));\r
+                expect (packets.data()[2] == Utils::bytesToWord (0x30,     0x26,     sysEx[6],  sysEx[7]));\r
+                expect (packets.data()[3] == Utils::bytesToWord (sysEx[8], sysEx[9], sysEx[10], sysEx[11]));\r
+                expect (packets.data()[4] == Utils::bytesToWord (0x30,     0x31,     sysEx[12], 0));\r
+                expect (packets.data()[5] == 0x00000000);\r
+            }\r
+        }\r
+\r
+        ToBytestreamDispatcher converter (0);\r
+        Packets packets;\r
+\r
+        const auto checkRoundTrip = [&] (const MidiBuffer& expected)\r
+        {\r
+            for (const auto meta : expected)\r
+                Conversion::toMidi1 (meta.getMessage(), packets);\r
+\r
+            MidiBuffer output;\r
+            converter.dispatch (packets.data(),\r
+                                packets.data() + packets.size(),\r
+                                0,\r
+                                [&] (const MidiMessage& roundTripped)\r
+                                {\r
+                                    output.addEvent (roundTripped, int (roundTripped.getTimeStamp()));\r
+                                });\r
+            packets.clear();\r
+\r
+            expect (equal (expected, output));\r
+        };\r
+\r
+        beginTest ("Long SysEx bytestream midi messages can be round-tripped through the UMP converter");\r
+        {\r
+            for (auto length : { 0, 1, 2, 3, 4, 5, 6, 7, 13, 20, 100, 1000 })\r
+            {\r
+                MidiBuffer expected;\r
+                expected.addEvent (createRandomSysEx (random, size_t (length)), 0);\r
+                checkRoundTrip (expected);\r
+            }\r
+        }\r
+\r
+        beginTest ("UMP SysEx7 messages interspersed with utility messages convert to bytestream");\r
+        {\r
+            const auto sysEx = createRandomSysEx (random, 100);\r
+            Packets originalPackets;\r
+            Conversion::toMidi1 (sysEx, originalPackets);\r
+\r
+            Packets modifiedPackets;\r
+\r
+            const auto addRandomUtilityUMP = [&]\r
+            {\r
+                const auto newPacket = createRandomUtilityUMP (random);\r
+                modifiedPackets.add (View (newPacket.data()));\r
+            };\r
+\r
+            for (const auto& packet : originalPackets)\r
+            {\r
+                addRandomUtilityUMP();\r
+                modifiedPackets.add (packet);\r
+                addRandomUtilityUMP();\r
+            }\r
+\r
+            MidiBuffer output;\r
+            converter.dispatch (modifiedPackets.data(),\r
+                                modifiedPackets.data() + modifiedPackets.size(),\r
+                                0,\r
+                                [&] (const MidiMessage& roundTripped)\r
+                                {\r
+                                    output.addEvent (roundTripped, int (roundTripped.getTimeStamp()));\r
+                                });\r
+\r
+            // All Utility messages should have been ignored\r
+            expect (output.getNumEvents() == 1);\r
+\r
+            for (const auto meta : output)\r
+                expect (equal (meta.getMessage(), sysEx));\r
+        }\r
+\r
+        beginTest ("UMP SysEx7 messages interspersed with System Realtime messages convert to bytestream");\r
+        {\r
+            const auto sysEx = createRandomSysEx (random, 200);\r
+            Packets originalPackets;\r
+            Conversion::toMidi1 (sysEx, originalPackets);\r
+\r
+            Packets modifiedPackets;\r
+            MidiBuffer realtimeMessages;\r
+\r
+            const auto addRandomRealtimeUMP = [&]\r
+            {\r
+                const auto newPacket = createRandomRealtimeUMP (random);\r
+                modifiedPackets.add (View (newPacket.data()));\r
+                realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0);\r
+            };\r
+\r
+            for (const auto& packet : originalPackets)\r
+            {\r
+                addRandomRealtimeUMP();\r
+                modifiedPackets.add (packet);\r
+                addRandomRealtimeUMP();\r
+            }\r
+\r
+            MidiBuffer output;\r
+            converter.dispatch (modifiedPackets.data(),\r
+                                modifiedPackets.data() + modifiedPackets.size(),\r
+                                0,\r
+                                [&] (const MidiMessage& roundTripped)\r
+                                {\r
+                                    output.addEvent (roundTripped, int (roundTripped.getTimeStamp()));\r
+                                });\r
+\r
+            const auto numOutputs = output.getNumEvents();\r
+            const auto numInputs = realtimeMessages.getNumEvents();\r
+            expect (numOutputs == numInputs + 1);\r
+\r
+            if (numOutputs == numInputs + 1)\r
+            {\r
+                const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a,\r
+                                                      const MidiMessageMetadata& b)\r
+                {\r
+                    return equal (a.getMessage(), b.getMessage());\r
+                };\r
+\r
+                auto it = output.begin();\r
+\r
+                for (const auto meta : realtimeMessages)\r
+                {\r
+                    if (! isMetadataEquivalent (*it, meta))\r
+                    {\r
+                        expect (equal ((*it).getMessage(), sysEx));\r
+                        ++it;\r
+                    }\r
+\r
+                    expect (isMetadataEquivalent (*it, meta));\r
+                    ++it;\r
+                }\r
+            }\r
+        }\r
+\r
+        beginTest ("UMP SysEx7 messages interspersed with System Realtime and Utility messages convert to bytestream");\r
+        {\r
+            const auto sysEx = createRandomSysEx (random, 300);\r
+            Packets originalPackets;\r
+            Conversion::toMidi1 (sysEx, originalPackets);\r
+\r
+            Packets modifiedPackets;\r
+            MidiBuffer realtimeMessages;\r
+\r
+            const auto addRandomRealtimeUMP = [&]\r
+            {\r
+                const auto newPacket = createRandomRealtimeUMP (random);\r
+                modifiedPackets.add (View (newPacket.data()));\r
+                realtimeMessages.addEvent (Midi1ToBytestreamTranslator::fromUmp (newPacket), 0);\r
+            };\r
+\r
+            const auto addRandomUtilityUMP = [&]\r
+            {\r
+                const auto newPacket = createRandomUtilityUMP (random);\r
+                modifiedPackets.add (View (newPacket.data()));\r
+            };\r
+\r
+            for (const auto& packet : originalPackets)\r
+            {\r
+                addRandomRealtimeUMP();\r
+                addRandomUtilityUMP();\r
+                modifiedPackets.add (packet);\r
+                addRandomRealtimeUMP();\r
+                addRandomUtilityUMP();\r
+            }\r
+\r
+            MidiBuffer output;\r
+            converter.dispatch (modifiedPackets.data(),\r
+                                modifiedPackets.data() + modifiedPackets.size(),\r
+                                0,\r
+                                [&] (const MidiMessage& roundTripped)\r
+                                {\r
+                                    output.addEvent (roundTripped, int (roundTripped.getTimeStamp()));\r
+                                });\r
+\r
+            const auto numOutputs = output.getNumEvents();\r
+            const auto numInputs = realtimeMessages.getNumEvents();\r
+            expect (numOutputs == numInputs + 1);\r
+\r
+            if (numOutputs == numInputs + 1)\r
+            {\r
+                const auto isMetadataEquivalent = [] (const MidiMessageMetadata& a, const MidiMessageMetadata& b)\r
+                {\r
+                    return equal (a.getMessage(), b.getMessage());\r
+                };\r
+\r
+                auto it = output.begin();\r
+\r
+                for (const auto meta : realtimeMessages)\r
+                {\r
+                    if (! isMetadataEquivalent (*it, meta))\r
+                    {\r
+                        expect (equal ((*it).getMessage(), sysEx));\r
+                        ++it;\r
+                    }\r
+\r
+                    expect (isMetadataEquivalent (*it, meta));\r
+                    ++it;\r
+                }\r
+            }\r
+        }\r
+\r
+        beginTest ("SysEx messages are terminated by non-Utility, non-Realtime messages");\r
+        {\r
+            const auto noteOn = [&]\r
+            {\r
+                MidiBuffer b;\r
+                b.addEvent (MidiMessage::noteOn (1, uint8_t (64), uint8_t (64)), 0);\r
+                return b;\r
+            }();\r
+\r
+            const auto noteOnPackets = [&]\r
+            {\r
+                Packets p;\r
+\r
+                for (const auto meta : noteOn)\r
+                    Conversion::toMidi1 (meta.getMessage(), p);\r
+\r
+                return p;\r
+            }();\r
+\r
+            const auto sysEx = createRandomSysEx (random, 300);\r
+\r
+            const auto originalPackets = [&]\r
+            {\r
+                Packets p;\r
+                Conversion::toMidi1 (sysEx, p);\r
+                return p;\r
+            }();\r
+\r
+            const auto modifiedPackets = [&]\r
+            {\r
+                Packets p;\r
+\r
+                const auto insertionPoint = std::next (originalPackets.begin(), 10);\r
+                std::for_each (originalPackets.begin(),\r
+                               insertionPoint,\r
+                               [&] (const View& view) { p.add (view); });\r
+\r
+                for (const auto& view : noteOnPackets)\r
+                    p.add (view);\r
+\r
+                std::for_each (insertionPoint,\r
+                               originalPackets.end(),\r
+                               [&] (const View& view) { p.add (view); });\r
+\r
+                return p;\r
+            }();\r
+\r
+            // modifiedPackets now contains some SysEx packets interrupted by a MIDI 1 noteOn\r
+\r
+            MidiBuffer output;\r
+\r
+            const auto pushToOutput = [&] (const Packets& p)\r
+            {\r
+                converter.dispatch (p.data(),\r
+                                    p.data() + p.size(),\r
+                                    0,\r
+                                    [&] (const MidiMessage& roundTripped)\r
+                                    {\r
+                                        output.addEvent (roundTripped, int (roundTripped.getTimeStamp()));\r
+                                    });\r
+            };\r
+\r
+            pushToOutput (modifiedPackets);\r
+\r
+            // Interrupted sysEx shouldn't be present\r
+            expect (equal (output, noteOn));\r
+\r
+            const auto newSysEx = createRandomSysEx (random, 300);\r
+            Packets newSysExPackets;\r
+            Conversion::toMidi1 (newSysEx, newSysExPackets);\r
+\r
+            // If we push another midi event without interrupting it,\r
+            // it should get through without being modified,\r
+            // and it shouldn't be affected by the previous (interrupted) sysex.\r
+\r
+            output.clear();\r
+            pushToOutput (newSysExPackets);\r
+\r
+            expect (output.getNumEvents() == 1);\r
+\r
+            for (const auto meta : output)\r
+                expect (equal (meta.getMessage(), newSysEx));\r
+        }\r
+\r
+        beginTest ("Widening conversions work");\r
+        {\r
+            // This is similar to the 'slow' example code from the MIDI 2.0 spec\r
+            const auto baselineScale = [] (uint32_t srcVal, uint32_t srcBits, uint32_t dstBits)\r
+            {\r
+                const auto scaleBits = (uint32_t) (dstBits - srcBits);\r
+\r
+                auto bitShiftedValue = (uint32_t) (srcVal << scaleBits);\r
+\r
+                const auto srcCenter = (uint32_t) (1 << (srcBits - 1));\r
+\r
+                if (srcVal <= srcCenter)\r
+                    return bitShiftedValue;\r
+\r
+                const auto repeatBits = (uint32_t) (srcBits - 1);\r
+                const auto repeatMask = (uint32_t) ((1 << repeatBits) - 1);\r
+\r
+                auto repeatValue = (uint32_t) (srcVal & repeatMask);\r
+\r
+                if (scaleBits > repeatBits)\r
+                    repeatValue <<= scaleBits - repeatBits;\r
+                else\r
+                    repeatValue >>= repeatBits - scaleBits;\r
+\r
+                while (repeatValue != 0)\r
+                {\r
+                    bitShiftedValue |= repeatValue;\r
+                    repeatValue >>= repeatBits;\r
+                }\r
+\r
+                return bitShiftedValue;\r
+            };\r
+\r
+            const auto baselineScale7To8 = [&] (uint8_t in)\r
+            {\r
+                return baselineScale (in, 7, 8);\r
+            };\r
+\r
+            const auto baselineScale7To16 = [&] (uint8_t in)\r
+            {\r
+                return baselineScale (in, 7, 16);\r
+            };\r
+\r
+            const auto baselineScale14To16 = [&] (uint16_t in)\r
+            {\r
+                return baselineScale (in, 14, 16);\r
+            };\r
+\r
+            const auto baselineScale7To32 = [&] (uint8_t in)\r
+            {\r
+                return baselineScale (in, 7, 32);\r
+            };\r
+\r
+            const auto baselineScale14To32 = [&] (uint16_t in)\r
+            {\r
+                return baselineScale (in, 14, 32);\r
+            };\r
+\r
+            for (auto i = 0; i != 100; ++i)\r
+            {\r
+                const auto rand = (uint8_t) random.nextInt (0x80);\r
+                expectEquals ((int64_t) Conversion::scaleTo8 (rand),\r
+                              (int64_t) baselineScale7To8 (rand));\r
+            }\r
+\r
+            expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x00), (int64_t) 0x0000);\r
+            expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x0a), (int64_t) 0x1400);\r
+            expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x40), (int64_t) 0x8000);\r
+            expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x57), (int64_t) 0xaeba);\r
+            expectEquals ((int64_t) Conversion::scaleTo16 ((uint8_t) 0x7f), (int64_t) 0xffff);\r
+\r
+            for (auto i = 0; i != 100; ++i)\r
+            {\r
+                const auto rand = (uint8_t) random.nextInt (0x80);\r
+                expectEquals ((int64_t) Conversion::scaleTo16 (rand),\r
+                              (int64_t) baselineScale7To16 (rand));\r
+            }\r
+\r
+            for (auto i = 0; i != 100; ++i)\r
+            {\r
+                const auto rand = (uint16_t) random.nextInt (0x4000);\r
+                expectEquals ((int64_t) Conversion::scaleTo16 (rand),\r
+                              (int64_t) baselineScale14To16 (rand));\r
+            }\r
+\r
+            for (auto i = 0; i != 100; ++i)\r
+            {\r
+                const auto rand = (uint8_t) random.nextInt (0x80);\r
+                expectEquals ((int64_t) Conversion::scaleTo32 (rand),\r
+                              (int64_t) baselineScale7To32 (rand));\r
+            }\r
+\r
+            expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x0000), (int64_t) 0x00000000);\r
+            expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x2000), (int64_t) 0x80000000);\r
+            expectEquals ((int64_t) Conversion::scaleTo32 ((uint16_t) 0x3fff), (int64_t) 0xffffffff);\r
+\r
+            for (auto i = 0; i != 100; ++i)\r
+            {\r
+                const auto rand = (uint16_t) random.nextInt (0x4000);\r
+                expectEquals ((int64_t) Conversion::scaleTo32 (rand),\r
+                              (int64_t) baselineScale14To32 (rand));\r
+            }\r
+        }\r
+\r
+        beginTest ("Round-trip widening/narrowing conversions work");\r
+        {\r
+            for (auto i = 0; i != 100; ++i)\r
+            {\r
+                {\r
+                    const auto rand = (uint8_t) random.nextInt (0x80);\r
+                    expectEquals (Conversion::scaleTo7 (Conversion::scaleTo8 (rand)), rand);\r
+                }\r
+\r
+                {\r
+                    const auto rand = (uint8_t) random.nextInt (0x80);\r
+                    expectEquals (Conversion::scaleTo7 (Conversion::scaleTo16 (rand)), rand);\r
+                }\r
+\r
+                {\r
+                    const auto rand = (uint8_t) random.nextInt (0x80);\r
+                    expectEquals (Conversion::scaleTo7 (Conversion::scaleTo32 (rand)), rand);\r
+                }\r
+\r
+                {\r
+                    const auto rand = (uint16_t) random.nextInt (0x4000);\r
+                    expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo16 (rand)), (uint64_t) rand);\r
+                }\r
+\r
+                {\r
+                    const auto rand = (uint16_t) random.nextInt (0x4000);\r
+                    expectEquals ((uint64_t) Conversion::scaleTo14 (Conversion::scaleTo32 (rand)), (uint64_t) rand);\r
+                }\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 note on conversions");\r
+        {\r
+            {\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x41946410, 0x12345678 });\r
+\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x21946409 });\r
+\r
+                checkMidi2ToMidi1Conversion (midi2, midi1);\r
+            }\r
+\r
+            {\r
+                // If the velocity is close to 0, the output velocity should still be 1\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x4295327f, 0x00345678 });\r
+\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x22953201 });\r
+\r
+                checkMidi2ToMidi1Conversion (midi2, midi1);\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 note off conversion");\r
+        {\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x448b0520, 0xfedcba98 });\r
+\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x248b057f });\r
+\r
+            checkMidi2ToMidi1Conversion (midi2, midi1);\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 poly pressure conversion");\r
+        {\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x49af0520, 0x80dcba98 });\r
+\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x29af0540 });\r
+\r
+            checkMidi2ToMidi1Conversion (midi2, midi1);\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 control change conversion");\r
+        {\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x49b00520, 0x80dcba98 });\r
+\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x29b00540 });\r
+\r
+            checkMidi2ToMidi1Conversion (midi2, midi1);\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 channel pressure conversion");\r
+        {\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x40d20520, 0x80dcba98 });\r
+\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x20d24000 });\r
+\r
+            checkMidi2ToMidi1Conversion (midi2, midi1);\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 nrpn rpn conversion");\r
+        {\r
+            {\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x44240123, 0x456789ab });\r
+\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x24b46501 });\r
+                midi1.add (PacketX1 { 0x24b46423 });\r
+                midi1.add (PacketX1 { 0x24b40622 });\r
+                midi1.add (PacketX1 { 0x24b42659 });\r
+\r
+                checkMidi2ToMidi1Conversion (midi2, midi1);\r
+            }\r
+\r
+            {\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x48347f7f, 0xffffffff });\r
+\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x28b4637f });\r
+                midi1.add (PacketX1 { 0x28b4627f });\r
+                midi1.add (PacketX1 { 0x28b4067f });\r
+                midi1.add (PacketX1 { 0x28b4267f });\r
+\r
+                checkMidi2ToMidi1Conversion (midi2, midi1);\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 program change and bank select conversion");\r
+        {\r
+            {\r
+                // If the bank valid bit is 0, just emit a program change\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x4cc10000, 0x70004020 });\r
+\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x2cc17000 });\r
+\r
+                checkMidi2ToMidi1Conversion (midi2, midi1);\r
+            }\r
+\r
+            {\r
+                // If the bank valid bit is 1, emit bank select control changes and a program change\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x4bc20001, 0x70004020 });\r
+\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x2bb20040 });\r
+                midi1.add (PacketX1 { 0x2bb22020 });\r
+                midi1.add (PacketX1 { 0x2bc27000 });\r
+\r
+                checkMidi2ToMidi1Conversion (midi2, midi1);\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 pitch bend conversion");\r
+        {\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x4eee0000, 0x12340000 });\r
+\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x2eee0d09 });\r
+\r
+            checkMidi2ToMidi1Conversion (midi2, midi1);\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 messages which don't convert");\r
+        {\r
+            const uint8_t opcodes[] { 0x0, 0x1, 0x4, 0x5, 0x6, 0xf };\r
+\r
+            for (const auto opcode : opcodes)\r
+            {\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { Utils::bytesToWord (0x40, (uint8_t) (opcode << 0x4), 0, 0), 0x0 });\r
+                checkMidi2ToMidi1Conversion (midi2, {});\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 messages which are passed through");\r
+        {\r
+            const uint8_t typecodesX1[] { 0x0, 0x1, 0x2 };\r
+\r
+            for (const auto typecode : typecodesX1)\r
+            {\r
+                Packets p;\r
+                p.add (PacketX1 { (uint32_t) (typecode << 0x1c | (random.nextInt64() & 0xffffff)) });\r
+\r
+                checkMidi2ToMidi1Conversion (p, p);\r
+            }\r
+\r
+            {\r
+                Packets p;\r
+                p.add (PacketX2 { (uint32_t) (0x3 << 0x1c | (random.nextInt64() & 0xffffff)),\r
+                                  (uint32_t) (random.nextInt64() & 0xffffffff) });\r
+\r
+                checkMidi2ToMidi1Conversion (p, p);\r
+            }\r
+\r
+            {\r
+                Packets p;\r
+                p.add (PacketX4 { (uint32_t) (0x5 << 0x1c | (random.nextInt64() & 0xffffff)),\r
+                                  (uint32_t) (random.nextInt64() & 0xffffffff),\r
+                                  (uint32_t) (random.nextInt64() & 0xffffffff),\r
+                                  (uint32_t) (random.nextInt64() & 0xffffffff) });\r
+\r
+                checkMidi2ToMidi1Conversion (p, p);\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 2 -> 1 control changes which should be ignored");\r
+        {\r
+            const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 };\r
+\r
+            for (const auto cc : CCs)\r
+            {\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { (uint32_t) (0x40b00000 | (cc << 0x8)), 0x00000000 });\r
+\r
+                checkMidi2ToMidi1Conversion (midi2, {});\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 1 -> 2 note on conversions");\r
+        {\r
+            {\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x20904040 });\r
+\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x40904000, static_cast<uint32_t> (Conversion::scaleTo16 (0x40_u8)) << 0x10 });\r
+\r
+                checkMidi1ToMidi2Conversion (midi1, midi2);\r
+            }\r
+\r
+            // If velocity is 0, convert to a note-off\r
+            {\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x23935100 });\r
+\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x43835100, 0x0 });\r
+\r
+                checkMidi1ToMidi2Conversion (midi1, midi2);\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 1 -> 2 note off conversions");\r
+        {\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x21831020 });\r
+\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x41831000, static_cast<uint32_t> (Conversion::scaleTo16 (0x20_u8)) << 0x10 });\r
+\r
+            checkMidi1ToMidi2Conversion (midi1, midi2);\r
+        }\r
+\r
+        beginTest ("MIDI 1 -> 2 poly pressure conversions");\r
+        {\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x20af7330 });\r
+\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x40af7300, Conversion::scaleTo32 (0x30_u8) });\r
+\r
+            checkMidi1ToMidi2Conversion (midi1, midi2);\r
+        }\r
+\r
+        beginTest ("individual MIDI 1 -> 2 control changes which should be ignored");\r
+        {\r
+            const uint8_t CCs[] { 6, 38, 98, 99, 100, 101, 0, 32 };\r
+\r
+            for (const auto cc : CCs)\r
+            {\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { Utils::bytesToWord (0x20, 0xb0, cc, 0x00) });\r
+\r
+                checkMidi1ToMidi2Conversion (midi1, {});\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 1 -> 2 control change conversions");\r
+        {\r
+            // normal control change\r
+            {\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x29b1017f });\r
+\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x49b10100, Conversion::scaleTo32 (0x7f_u8) });\r
+\r
+                checkMidi1ToMidi2Conversion (midi1, midi2);\r
+            }\r
+\r
+            // nrpn\r
+            {\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x20b06301 });\r
+                midi1.add (PacketX1 { 0x20b06223 });\r
+                midi1.add (PacketX1 { 0x20b00645 });\r
+                midi1.add (PacketX1 { 0x20b02667 });\r
+\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x40300123, Conversion::scaleTo32 (static_cast<uint16_t> ((0x45 << 7) | 0x67)) });\r
+\r
+                checkMidi1ToMidi2Conversion (midi1, midi2);\r
+            }\r
+\r
+            // rpn\r
+            {\r
+                Packets midi1;\r
+                midi1.add (PacketX1 { 0x20b06543 });\r
+                midi1.add (PacketX1 { 0x20b06421 });\r
+                midi1.add (PacketX1 { 0x20b00601 });\r
+                midi1.add (PacketX1 { 0x20b02623 });\r
+\r
+                Packets midi2;\r
+                midi2.add (PacketX2 { 0x40204321, Conversion::scaleTo32 (static_cast<uint16_t> ((0x01 << 7) | 0x23)) });\r
+\r
+                checkMidi1ToMidi2Conversion (midi1, midi2);\r
+            }\r
+        }\r
+\r
+        beginTest ("MIDI 1 -> MIDI 2 program change and bank select");\r
+        {\r
+            Packets midi1;\r
+            // program change with bank\r
+            midi1.add (PacketX1 { 0x2bb20030 });\r
+            midi1.add (PacketX1 { 0x2bb22010 });\r
+            midi1.add (PacketX1 { 0x2bc24000 });\r
+            // program change without bank (different group and channel)\r
+            midi1.add (PacketX1 { 0x20c01000 });\r
+\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x4bc20001, 0x40003010 });\r
+            midi2.add (PacketX2 { 0x40c00000, 0x10000000 });\r
+\r
+            checkMidi1ToMidi2Conversion (midi1, midi2);\r
+        }\r
+\r
+        beginTest ("MIDI 1 -> MIDI 2 channel pressure conversions");\r
+        {\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x20df3000 });\r
+\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x40df0000, Conversion::scaleTo32 (0x30_u8) });\r
+\r
+            checkMidi1ToMidi2Conversion (midi1, midi2);\r
+        }\r
+\r
+        beginTest ("MIDI 1 -> MIDI 2 pitch bend conversions");\r
+        {\r
+            Packets midi1;\r
+            midi1.add (PacketX1 { 0x20e74567 });\r
+\r
+            Packets midi2;\r
+            midi2.add (PacketX2 { 0x40e70000, Conversion::scaleTo32 (static_cast<uint16_t> ((0x67 << 7) | 0x45)) });\r
+\r
+            checkMidi1ToMidi2Conversion (midi1, midi2);\r
+        }\r
+    }\r
+\r
+private:\r
+    static Packets convertMidi2ToMidi1 (const Packets& midi2)\r
+    {\r
+        Packets r;\r
+\r
+        for (const auto& packet : midi2)\r
+            Conversion::midi2ToMidi1DefaultTranslation (packet, [&r] (const View& v) { r.add (v); });\r
+\r
+        return r;\r
+    }\r
+\r
+    static Packets convertMidi1ToMidi2 (const Packets& midi1)\r
+    {\r
+        Packets r;\r
+        Midi1ToMidi2DefaultTranslator translator;\r
+\r
+        for (const auto& packet : midi1)\r
+            translator.dispatch (packet, [&r] (const View& v) { r.add (v); });\r
+\r
+        return r;\r
+    }\r
+\r
+    void checkBytestreamConversion (const Packets& actual, const Packets& expected)\r
+    {\r
+        expectEquals ((int) actual.size(), (int) expected.size());\r
+\r
+        if (actual.size() != expected.size())\r
+            return;\r
+\r
+        auto actualPtr = actual.data();\r
+\r
+        std::for_each (expected.data(),\r
+                       expected.data() + expected.size(),\r
+                       [&] (const uint32_t word) { expectEquals ((uint64_t) *actualPtr++, (uint64_t) word); });\r
+    }\r
+\r
+    void checkMidi2ToMidi1Conversion (const Packets& midi2, const Packets& expected)\r
+    {\r
+        checkBytestreamConversion (convertMidi2ToMidi1 (midi2), expected);\r
+    }\r
+\r
+    void checkMidi1ToMidi2Conversion (const Packets& midi1, const Packets& expected)\r
+    {\r
+        checkBytestreamConversion (convertMidi1ToMidi2 (midi1), expected);\r
+    }\r
+\r
+    MidiMessage createRandomSysEx (Random& random, size_t sysExBytes)\r
+    {\r
+        std::vector<uint8_t> data;\r
+        data.reserve (sysExBytes);\r
+\r
+        for (size_t i = 0; i != sysExBytes; ++i)\r
+            data.push_back (uint8_t (random.nextInt (0x80)));\r
+\r
+        return MidiMessage::createSysExMessage (data.data(), int (data.size()));\r
+    }\r
+\r
+    PacketX1 createRandomUtilityUMP (Random& random)\r
+    {\r
+        const auto status = random.nextInt (3);\r
+\r
+        return PacketX1 { Utils::bytesToWord (0,\r
+                                              uint8_t (status << 0x4),\r
+                                              uint8_t (status == 0 ? 0 : random.nextInt (0x100)),\r
+                                              uint8_t (status == 0 ? 0 : random.nextInt (0x100))) };\r
+    }\r
+\r
+    PacketX1 createRandomRealtimeUMP (Random& random)\r
+    {\r
+        const auto status = [&]\r
+        {\r
+            switch (random.nextInt (6))\r
+            {\r
+                case 0: return 0xf8;\r
+                case 1: return 0xfa;\r
+                case 2: return 0xfb;\r
+                case 3: return 0xfc;\r
+                case 4: return 0xfe;\r
+                case 5: return 0xff;\r
+            }\r
+\r
+            jassertfalse;\r
+            return 0x00;\r
+        }();\r
+\r
+        return PacketX1 { Utils::bytesToWord (0x10, uint8_t (status), 0x00, 0x00) };\r
+    }\r
+\r
+    template <typename Fn>\r
+    void forEachNonSysExTestMessage (Random& random, Fn&& fn)\r
+    {\r
+        for (uint8_t firstByte = 0x80; firstByte != 0x00; ++firstByte)\r
+        {\r
+            if (firstByte == 0xf0 || firstByte == 0xf7)\r
+                continue; // sysEx is tested separately\r
+\r
+            const auto length = MidiMessage::getMessageLengthFromFirstByte (firstByte);\r
+            const auto getDataByte = [&] { return uint8_t (random.nextInt (256) & 0x7f); };\r
+\r
+            const auto message = [&]\r
+            {\r
+                switch (length)\r
+                {\r
+                    case 1: return MidiMessage (firstByte);\r
+                    case 2: return MidiMessage (firstByte, getDataByte());\r
+                    case 3: return MidiMessage (firstByte, getDataByte(), getDataByte());\r
+                }\r
+\r
+                return MidiMessage();\r
+            }();\r
+\r
+            fn (message);\r
+        }\r
+    }\r
+\r
+   #if JUCE_WINDOWS\r
+    #define JUCE_CHECKED_ITERATOR(msg, size) \\r
+        stdext::checked_array_iterator<typename std::remove_reference<decltype (msg)>::type> ((msg), (size))\r
+   #else\r
+    #define JUCE_CHECKED_ITERATOR(msg, size) (msg)\r
+   #endif\r
+\r
+    static bool equal (const MidiMessage& a, const MidiMessage& b) noexcept\r
+    {\r
+        return a.getRawDataSize() == b.getRawDataSize()\r
+               && std::equal (a.getRawData(), a.getRawData() + a.getRawDataSize(),\r
+                              JUCE_CHECKED_ITERATOR (b.getRawData(), b.getRawDataSize()));\r
+    }\r
+\r
+    #undef JUCE_CHECKED_ITERATOR\r
+\r
+    static bool equal (const MidiBuffer& a, const MidiBuffer& b) noexcept\r
+    {\r
+        return a.data == b.data;\r
+    }\r
+};\r
+\r
+static UniversalMidiPacketTests universalMidiPacketTests;\r
+\r
+#endif\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPU32InputHandler.h
new file mode 100644 (file)
index 0000000..b5471aa
--- /dev/null
@@ -0,0 +1,145 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    A base class for classes which convert Universal MIDI Packets to other\r
+    formats.\r
+*/\r
+struct U32InputHandler\r
+{\r
+    virtual ~U32InputHandler() noexcept = default;\r
+\r
+    virtual void reset() = 0;\r
+    virtual void pushMidiData (const uint32_t* begin, const uint32_t* end, double time) = 0;\r
+};\r
+\r
+/**\r
+    Parses a continuous stream of U32 words and emits complete MidiMessages whenever a full\r
+    message is received.\r
+*/\r
+struct U32ToBytestreamHandler : public U32InputHandler\r
+{\r
+    U32ToBytestreamHandler (MidiInput& i, MidiInputCallback& c)\r
+        : input (i), callback (c), dispatcher (2048) {}\r
+\r
+    /**\r
+        Provides an `operator()` which can create an input handler for a given\r
+        MidiInput.\r
+\r
+        All handler classes should have a similar Factory to facilitate\r
+        creation of handlers in generic contexts.\r
+    */\r
+    class Factory\r
+    {\r
+    public:\r
+        explicit Factory (MidiInputCallback* c)\r
+            : callback (c) {}\r
+\r
+        std::unique_ptr<U32ToBytestreamHandler> operator() (MidiInput& i) const\r
+        {\r
+            if (callback != nullptr)\r
+                return std::make_unique<U32ToBytestreamHandler> (i, *callback);\r
+\r
+            jassertfalse;\r
+            return {};\r
+        }\r
+\r
+    private:\r
+        MidiInputCallback* callback = nullptr;\r
+    };\r
+\r
+    void reset() override { dispatcher.reset(); }\r
+\r
+    void pushMidiData (const uint32_t* begin, const uint32_t* end, double time) override\r
+    {\r
+        dispatcher.dispatch (begin, end, time, [this] (const MidiMessage& m)\r
+        {\r
+            callback.handleIncomingMidiMessage (&input, m);\r
+        });\r
+    }\r
+\r
+    MidiInput& input;\r
+    MidiInputCallback& callback;\r
+    ToBytestreamDispatcher dispatcher;\r
+};\r
+\r
+/**\r
+    Parses a continuous stream of U32 words and emits full messages in the requested\r
+    UMP format.\r
+*/\r
+struct U32ToUMPHandler : public U32InputHandler\r
+{\r
+    U32ToUMPHandler (PacketProtocol protocol, Receiver& c)\r
+        : recipient (c), converter (protocol) {}\r
+\r
+    /**\r
+        Provides an `operator()` which can create an input handler for a given\r
+        MidiInput.\r
+\r
+        All handler classes should have a similar Factory to facilitate\r
+        creation of handlers in generic contexts.\r
+    */\r
+    class Factory\r
+    {\r
+    public:\r
+        Factory (PacketProtocol p, Receiver& c)\r
+            : protocol (p), callback (c) {}\r
+\r
+        std::unique_ptr<U32ToUMPHandler> operator() (MidiInput&) const\r
+        {\r
+            return std::make_unique<U32ToUMPHandler> (protocol, callback);\r
+        }\r
+\r
+    private:\r
+        PacketProtocol protocol;\r
+        Receiver& callback;\r
+    };\r
+\r
+    void reset() override\r
+    {\r
+        dispatcher.reset();\r
+        converter.reset();\r
+    }\r
+\r
+    void pushMidiData (const uint32_t* begin, const uint32_t* end, double time) override\r
+    {\r
+        dispatcher.dispatch (begin, end, time, [this] (const View& view, double thisTime)\r
+        {\r
+            converter.convert (view, [&] (const View& converted)\r
+            {\r
+                recipient.packetReceived (converted, thisTime);\r
+            });\r
+        });\r
+    }\r
+\r
+    Receiver& recipient;\r
+    Dispatcher dispatcher;\r
+    GenericUMPConverter converter;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.cpp
new file mode 100644 (file)
index 0000000..166c4bf
--- /dev/null
@@ -0,0 +1,59 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+uint32_t Utils::getNumWordsForMessageType (uint32_t mt)\r
+{\r
+    switch (Utils::getMessageType (mt))\r
+    {\r
+        case 0x0:\r
+        case 0x1:\r
+        case 0x2:\r
+        case 0x6:\r
+        case 0x7:\r
+            return 1;\r
+        case 0x3:\r
+        case 0x4:\r
+        case 0x8:\r
+        case 0x9:\r
+        case 0xa:\r
+            return 2;\r
+        case 0xb:\r
+        case 0xc:\r
+            return 3;\r
+        case 0x5:\r
+        case 0xd:\r
+        case 0xe:\r
+        case 0xf:\r
+            return 4;\r
+    }\r
+\r
+    jassertfalse;\r
+    return 1;\r
+}\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPUtils.h
new file mode 100644 (file)
index 0000000..9bac9e4
--- /dev/null
@@ -0,0 +1,113 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Helpful types and functions for interacting with Universal MIDI Packets.\r
+\r
+    @tags{Audio}\r
+*/\r
+struct Utils\r
+{\r
+    /** Joins 4 bytes into a single 32-bit word. */\r
+    static constexpr uint32_t bytesToWord (uint8_t a, uint8_t b, uint8_t c, uint8_t d)\r
+    {\r
+        return uint32_t (a << 0x18 | b << 0x10 | c << 0x08 | d << 0x00);\r
+    }\r
+\r
+    /** Returns the expected number of 32-bit words in a Universal MIDI Packet, given\r
+        the first word of the packet.\r
+\r
+        The result will be between 1 and 4 inclusive.\r
+        A result of 1 means that the word is itself a complete packet.\r
+    */\r
+    static uint32_t getNumWordsForMessageType (uint32_t);\r
+\r
+    /**\r
+        Helper functions for setting/getting 4-bit ranges inside a 32-bit word.\r
+    */\r
+    template <size_t Index>\r
+    struct U4\r
+    {\r
+        static constexpr uint32_t shift = (uint32_t) 0x1c - Index * 4;\r
+\r
+        static constexpr uint32_t set (uint32_t word, uint8_t value)\r
+        {\r
+            return (word & ~((uint32_t) 0xf << shift)) | (uint32_t) ((value & 0xf) << shift);\r
+        }\r
+\r
+        static constexpr uint8_t get (uint32_t word)\r
+        {\r
+            return (uint8_t) ((word >> shift) & 0xf);\r
+        }\r
+    };\r
+\r
+    /**\r
+        Helper functions for setting/getting 8-bit ranges inside a 32-bit word.\r
+    */\r
+    template <size_t Index>\r
+    struct U8\r
+    {\r
+        static constexpr uint32_t shift = (uint32_t) 0x18 - Index * 8;\r
+\r
+        static constexpr uint32_t set (uint32_t word, uint8_t value)\r
+        {\r
+            return (word & ~((uint32_t) 0xff << shift)) | (uint32_t) (value << shift);\r
+        }\r
+\r
+        static constexpr uint8_t get (uint32_t word)\r
+        {\r
+            return (uint8_t) ((word >> shift) & 0xff);\r
+        }\r
+    };\r
+\r
+    /**\r
+        Helper functions for setting/getting 16-bit ranges inside a 32-bit word.\r
+    */\r
+    template <size_t Index>\r
+    struct U16\r
+    {\r
+        static constexpr uint32_t shift = (uint32_t) 0x10 - Index * 16;\r
+\r
+        static constexpr uint32_t set (uint32_t word, uint16_t value)\r
+        {\r
+            return (word & ~((uint32_t) 0xffff << shift)) | (uint32_t) (value << shift);\r
+        }\r
+\r
+        static constexpr uint16_t get (uint32_t word)\r
+        {\r
+            return (uint16_t) ((word >> shift) & 0xffff);\r
+        }\r
+    };\r
+\r
+    static constexpr uint8_t getMessageType (uint32_t w) noexcept { return U4<0>::get (w); }\r
+    static constexpr uint8_t getGroup       (uint32_t w) noexcept { return U4<1>::get (w); }\r
+    static constexpr uint8_t getStatus      (uint32_t w) noexcept { return U4<2>::get (w); }\r
+    static constexpr uint8_t getChannel     (uint32_t w) noexcept { return U4<3>::get (w); }\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp b/modules/juce_audio_devices/midi_io/ump/juce_UMPView.cpp
new file mode 100644 (file)
index 0000000..c5f3db8
--- /dev/null
@@ -0,0 +1,35 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+uint32_t View::size() const noexcept\r
+{\r
+    jassert (ptr != nullptr);\r
+    return Utils::getNumWordsForMessageType (*ptr);\r
+}\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPView.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPView.h
new file mode 100644 (file)
index 0000000..504e024
--- /dev/null
@@ -0,0 +1,88 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Points to a single Universal MIDI Packet.\r
+\r
+    The packet must be well-formed for member functions to work correctly.\r
+\r
+    Specifically, the constructor argument must be the beginning of a region of\r
+    uint32_t that contains at least `getNumWordsForMessageType(*ddata)` items,\r
+    where `data` is the constructor argument.\r
+\r
+    NOTE: Instances of this class do not own the memory that they point to!\r
+    If you need to store a packet pointed-to by a View for later use, copy\r
+    the view contents to a Packets collection, or use the Utils::PacketX types.\r
+\r
+    @tags{Audio}\r
+*/\r
+class View\r
+{\r
+public:\r
+    /** Create an invalid view. */\r
+    View() noexcept = default;\r
+\r
+    /** Create a view of the packet starting at address `d`. */\r
+    explicit View (const uint32_t* data) noexcept : ptr (data) {}\r
+\r
+    /** Get a pointer to the first word in the Universal MIDI Packet currently\r
+        pointed-to by this view.\r
+    */\r
+    const uint32_t* data() const noexcept { return ptr; }\r
+\r
+    /** Get the number of 32-words (between 1 and 4 inclusive) in the Universal\r
+        MIDI Packet currently pointed-to by this view.\r
+    */\r
+    uint32_t size() const noexcept;\r
+\r
+    /** Get a specific word from this packet.\r
+\r
+        Passing an `index` that is greater than or equal to the result of `size`\r
+        will cause undefined behaviour.\r
+    */\r
+    const uint32_t& operator[] (size_t index) const noexcept { return ptr[index]; }\r
+\r
+    /** Get an iterator pointing to the first word in the packet. */\r
+    const uint32_t* begin() const noexcept { return ptr; }\r
+    const uint32_t* cbegin() const noexcept { return ptr; }\r
+\r
+    /** Get an iterator pointing one-past the last word in the packet. */\r
+    const uint32_t* end() const noexcept { return ptr + size(); }\r
+    const uint32_t* cend() const noexcept { return ptr + size(); }\r
+\r
+    /** Return true if this view is pointing to the same address as another view. */\r
+    bool operator== (const View& other) const noexcept { return ptr == other.ptr; }\r
+\r
+    /** Return false if this view is pointing to the same address as another view. */\r
+    bool operator!= (const View& other) const noexcept { return ! operator== (other); }\r
+\r
+private:\r
+    const uint32_t* ptr = nullptr;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPacket.h
new file mode 100644 (file)
index 0000000..b58304d
--- /dev/null
@@ -0,0 +1,187 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Holds a single Universal MIDI Packet.\r
+*/\r
+template <size_t numWords>\r
+class Packet\r
+{\r
+public:\r
+    Packet() = default;\r
+\r
+    template <size_t w = numWords, typename std::enable_if<w == 1, int>::type = 0>\r
+    Packet (uint32_t a)\r
+        : contents { { a } }\r
+    {\r
+        jassert (Utils::getNumWordsForMessageType (a) == 1);\r
+    }\r
+\r
+    template <size_t w = numWords, typename std::enable_if<w == 2, int>::type = 0>\r
+    Packet (uint32_t a, uint32_t b)\r
+        : contents { { a, b } }\r
+    {\r
+        jassert (Utils::getNumWordsForMessageType (a) == 2);\r
+    }\r
+\r
+    template <size_t w = numWords, typename std::enable_if<w == 3, int>::type = 0>\r
+    Packet (uint32_t a, uint32_t b, uint32_t c)\r
+        : contents { { a, b, c } }\r
+    {\r
+        jassert (Utils::getNumWordsForMessageType (a) == 3);\r
+    }\r
+\r
+    template <size_t w = numWords, typename std::enable_if<w == 4, int>::type = 0>\r
+    Packet (uint32_t a, uint32_t b, uint32_t c, uint32_t d)\r
+        : contents { { a, b, c, d } }\r
+    {\r
+        jassert (Utils::getNumWordsForMessageType (a) == 4);\r
+    }\r
+\r
+    template <size_t w, typename std::enable_if<w == numWords, int>::type = 0>\r
+    explicit Packet (const std::array<uint32_t, w>& fullPacket)\r
+        : contents (fullPacket)\r
+    {\r
+        jassert (Utils::getNumWordsForMessageType (fullPacket.front()) == numWords);\r
+    }\r
+\r
+    Packet withMessageType (uint8_t type) const noexcept\r
+    {\r
+        return withU4<0> (type);\r
+    }\r
+\r
+    Packet withGroup (uint8_t group) const noexcept\r
+    {\r
+        return withU4<1> (group);\r
+    }\r
+\r
+    Packet withStatus (uint8_t status) const noexcept\r
+    {\r
+        return withU4<2> (status);\r
+    }\r
+\r
+    Packet withChannel (uint8_t channel) const noexcept\r
+    {\r
+        return withU4<3> (channel);\r
+    }\r
+\r
+    uint8_t getMessageType() const noexcept { return getU4<0>(); }\r
+\r
+    uint8_t getGroup() const noexcept { return getU4<1>(); }\r
+\r
+    uint8_t getStatus() const noexcept { return getU4<2>(); }\r
+\r
+    uint8_t getChannel() const noexcept { return getU4<3>(); }\r
+\r
+    template <size_t index>\r
+    Packet withU4 (uint8_t value) const noexcept\r
+    {\r
+        constexpr auto word = index / 8;\r
+        auto copy = *this;\r
+        std::get<word> (copy.contents) = Utils::U4<index % 8>::set (copy.template getU32<word>(), value);\r
+        return copy;\r
+    }\r
+\r
+    template <size_t index>\r
+    Packet withU8 (uint8_t value) const noexcept\r
+    {\r
+        constexpr auto word = index / 4;\r
+        auto copy = *this;\r
+        std::get<word> (copy.contents) = Utils::U8<index % 4>::set (copy.template getU32<word>(), value);\r
+        return copy;\r
+    }\r
+\r
+    template <size_t index>\r
+    Packet withU16 (uint16_t value) const noexcept\r
+    {\r
+        constexpr auto word = index / 2;\r
+        auto copy = *this;\r
+        std::get<word> (copy.contents) = Utils::U16<index % 2>::set (copy.template getU32<word>(), value);\r
+        return copy;\r
+    }\r
+\r
+    template <size_t index>\r
+    Packet withU32 (uint32_t value) const noexcept\r
+    {\r
+        auto copy = *this;\r
+        std::get<index> (copy.contents) = value;\r
+        return copy;\r
+    }\r
+\r
+    template <size_t index>\r
+    uint8_t getU4() const noexcept\r
+    {\r
+        return Utils::U4<index % 8>::get (this->template getU32<index / 8>());\r
+    }\r
+\r
+    template <size_t index>\r
+    uint8_t getU8() const noexcept\r
+    {\r
+        return Utils::U8<index % 4>::get (this->template getU32<index / 4>());\r
+    }\r
+\r
+    template <size_t index>\r
+    uint16_t getU16() const noexcept\r
+    {\r
+        return Utils::U16<index % 2>::get (this->template getU32<index / 2>());\r
+    }\r
+\r
+    template <size_t index>\r
+    uint32_t getU32() const noexcept\r
+    {\r
+        return std::get<index> (contents);\r
+    }\r
+\r
+    //==============================================================================\r
+    using Contents = std::array<uint32_t, numWords>;\r
+\r
+    using const_iterator    = typename Contents::const_iterator;\r
+\r
+    const_iterator  begin()                   const noexcept { return contents.begin(); }\r
+    const_iterator cbegin()                   const noexcept { return contents.begin(); }\r
+\r
+    const_iterator  end()                     const noexcept { return contents.end(); }\r
+    const_iterator cend()                     const noexcept { return contents.end(); }\r
+\r
+    const uint32_t* data()                    const noexcept { return contents.data(); }\r
+\r
+    const uint32_t& front()                   const noexcept { return contents.front(); }\r
+    const uint32_t& back()                    const noexcept { return contents.back(); }\r
+\r
+    const uint32_t& operator[] (size_t index) const noexcept { return contents[index]; }\r
+\r
+private:\r
+    Contents contents { {} };\r
+};\r
+\r
+using PacketX1 = Packet<1>;\r
+using PacketX2 = Packet<2>;\r
+using PacketX3 = Packet<3>;\r
+using PacketX4 = Packet<4>;\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPackets.h
new file mode 100644 (file)
index 0000000..2a0a1b8
--- /dev/null
@@ -0,0 +1,92 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+namespace universal_midi_packets\r
+{\r
+\r
+/**\r
+    Holds a collection of Universal MIDI Packets.\r
+\r
+    Unlike MidiBuffer, this collection does not store any additional information\r
+    (e.g. timestamps) alongside the raw messages.\r
+\r
+    If timestamps are required, these can be added to the container in UMP format,\r
+    as Jitter Reduction Utility messages.\r
+\r
+    @tags{Audio}\r
+*/\r
+class Packets\r
+{\r
+public:\r
+    /** Adds a single packet to the collection.\r
+\r
+        The View must be valid for this to work. If the view\r
+        points to a malformed message, or if the view points to a region\r
+        too short for the contained message, this call will result in\r
+        undefined behaviour.\r
+    */\r
+    void add (const View& v) { storage.insert (storage.end(), v.cbegin(), v.cend()); }\r
+\r
+    void add (const PacketX1& p) { addImpl (p); }\r
+    void add (const PacketX2& p) { addImpl (p); }\r
+    void add (const PacketX3& p) { addImpl (p); }\r
+    void add (const PacketX4& p) { addImpl (p); }\r
+\r
+    /** Pre-allocates space for at least `numWords` 32-bit words in this collection. */\r
+    void reserve (size_t numWords)          { storage.reserve (numWords); }\r
+\r
+    /** Removes all previously-added packets from this collection. */\r
+    void clear()                            { storage.clear(); }\r
+\r
+    /** Gets an iterator pointing to the first packet in this collection. */\r
+    Iterator cbegin() const noexcept     { return Iterator (data(), size()); }\r
+    Iterator begin() const noexcept      { return cbegin(); }\r
+\r
+    /** Gets an iterator pointing one-past the last packet in this collection. */\r
+    Iterator cend() const noexcept       { return Iterator (data() + size(), 0); }\r
+    Iterator end() const noexcept        { return cend(); }\r
+\r
+    /** Gets a pointer to the contents of the collection as a range of raw 32-bit words. */\r
+    const uint32_t* data() const noexcept   { return storage.data(); }\r
+\r
+    /** Returns the number of uint32_t words in storage.\r
+\r
+        Note that this is likely to be larger than the number of packets\r
+        currently being stored, as some packets span multiple words.\r
+    */\r
+    size_t size() const noexcept            { return storage.size(); }\r
+\r
+private:\r
+    template <size_t numWords>\r
+    void addImpl (const Packet<numWords>& p)\r
+    {\r
+        jassert (Utils::getNumWordsForMessageType (p[0]) == numWords);\r
+        add (View (p.data()));\r
+    }\r
+\r
+    std::vector<uint32_t> storage;\r
+};\r
+\r
+}\r
+}\r
diff --git a/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp b/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp
deleted file mode 100644 (file)
index 704a057..0000000
+++ /dev/null
@@ -1,732 +0,0 @@
-/*\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
-   The code included in this file is provided under the terms of the ISC license\r
-   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
-   To use, copy, modify, and/or distribute this software for any purpose with or\r
-   without fee is hereby granted provided that the above copyright notice and\r
-   this permission notice appear in all copies.\r
-\r
-   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
-   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
-   DISCLAIMED.\r
-\r
-  ==============================================================================\r
-*/\r
-\r
-namespace juce\r
-{\r
-\r
-#ifndef JUCE_LOG_COREMIDI_ERRORS\r
- #define JUCE_LOG_COREMIDI_ERRORS 1\r
-#endif\r
-\r
-namespace CoreMidiHelpers\r
-{\r
-    //==============================================================================\r
-    static bool checkError (OSStatus err, int lineNum)\r
-    {\r
-        if (err == noErr)\r
-            return true;\r
-\r
-       #if JUCE_LOG_COREMIDI_ERRORS\r
-        Logger::writeToLog ("CoreMIDI error: " + String (lineNum) + " - " + String::toHexString ((int) err));\r
-       #endif\r
-\r
-        ignoreUnused (lineNum);\r
-        return false;\r
-    }\r
-\r
-    #undef CHECK_ERROR\r
-    #define CHECK_ERROR(a) CoreMidiHelpers::checkError (a, __LINE__)\r
-\r
-    static MidiDeviceInfo getMidiObjectInfo (MIDIObjectRef entity)\r
-    {\r
-        MidiDeviceInfo info;\r
-\r
-        {\r
-            ScopedCFString str;\r
-\r
-            if (CHECK_ERROR (MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str.cfString)))\r
-                info.name = String::fromCFString (str.cfString);\r
-        }\r
-\r
-        SInt32 objectID = 0;\r
-\r
-        if (CHECK_ERROR (MIDIObjectGetIntegerProperty (entity, kMIDIPropertyUniqueID, &objectID)))\r
-        {\r
-            info.identifier = String (objectID);\r
-        }\r
-        else\r
-        {\r
-            ScopedCFString str;\r
-\r
-            if (CHECK_ERROR (MIDIObjectGetStringProperty (entity, kMIDIPropertyUniqueID, &str.cfString)))\r
-                info.identifier = String::fromCFString (str.cfString);\r
-        }\r
-\r
-        return info;\r
-    }\r
-\r
-    static MidiDeviceInfo getEndpointInfo (MIDIEndpointRef endpoint, bool isExternal)\r
-    {\r
-        // NB: don't attempt to use nullptr for refs - it fails in some types of build.\r
-        MIDIEntityRef entity = 0;\r
-        MIDIEndpointGetEntity (endpoint, &entity);\r
-\r
-        // probably virtual\r
-        if (entity == 0)\r
-            return getMidiObjectInfo (endpoint);\r
-\r
-        auto result = getMidiObjectInfo (endpoint);\r
-\r
-        // endpoint is empty - try the entity\r
-        if (result == MidiDeviceInfo())\r
-            result = getMidiObjectInfo (entity);\r
-\r
-        // now consider the device\r
-        MIDIDeviceRef device = 0;\r
-        MIDIEntityGetDevice (entity, &device);\r
-\r
-        if (device != 0)\r
-        {\r
-            auto info = getMidiObjectInfo (device);\r
-\r
-            if (info != MidiDeviceInfo())\r
-            {\r
-                // if an external device has only one entity, throw away\r
-                // the endpoint name and just use the device name\r
-                if (isExternal && MIDIDeviceGetNumberOfEntities (device) < 2)\r
-                {\r
-                    result = info;\r
-                }\r
-                else if (! result.name.startsWithIgnoreCase (info.name))\r
-                {\r
-                    // prepend the device name and identifier to the entity's\r
-                    result.name = (info.name + " " + result.name).trimEnd();\r
-                    result.identifier = info.identifier + " " + result.identifier;\r
-                }\r
-            }\r
-        }\r
-\r
-        return result;\r
-    }\r
-\r
-    static MidiDeviceInfo getConnectedEndpointInfo (MIDIEndpointRef endpoint)\r
-    {\r
-        MidiDeviceInfo result;\r
-\r
-        // Does the endpoint have connections?\r
-        CFDataRef connections = nullptr;\r
-        int numConnections = 0;\r
-\r
-        MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections);\r
-\r
-        if (connections != nullptr)\r
-        {\r
-            numConnections = ((int) CFDataGetLength (connections)) / (int) sizeof (MIDIUniqueID);\r
-\r
-            if (numConnections > 0)\r
-            {\r
-                auto* pid = reinterpret_cast<const SInt32*> (CFDataGetBytePtr (connections));\r
-\r
-                for (int i = 0; i < numConnections; ++i, ++pid)\r
-                {\r
-                    auto id = (MIDIUniqueID) ByteOrder::swapIfLittleEndian ((uint32) *pid);\r
-                    MIDIObjectRef connObject;\r
-                    MIDIObjectType connObjectType;\r
-                    auto err = MIDIObjectFindByUniqueID (id, &connObject, &connObjectType);\r
-\r
-                    if (err == noErr)\r
-                    {\r
-                        MidiDeviceInfo deviceInfo;\r
-\r
-                        if (connObjectType == kMIDIObjectType_ExternalSource\r
-                             || connObjectType == kMIDIObjectType_ExternalDestination)\r
-                        {\r
-                            // Connected to an external device's endpoint (10.3 and later).\r
-                            deviceInfo = getEndpointInfo (static_cast<MIDIEndpointRef> (connObject), true);\r
-                        }\r
-                        else\r
-                        {\r
-                            // Connected to an external device (10.2) (or something else, catch-all)\r
-                            deviceInfo = getMidiObjectInfo (connObject);\r
-                        }\r
-\r
-                        if (deviceInfo != MidiDeviceInfo())\r
-                        {\r
-                            if (result.name.isNotEmpty())        result.name += ", ";\r
-                            if (result.identifier.isNotEmpty())  result.identifier += ", ";\r
-\r
-                            result.name       += deviceInfo.name;\r
-                            result.identifier += deviceInfo.identifier;\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-\r
-            CFRelease (connections);\r
-        }\r
-\r
-        // Here, either the endpoint had no connections, or we failed to obtain names for them.\r
-        if (result == MidiDeviceInfo())\r
-            return getEndpointInfo (endpoint, false);\r
-\r
-        return result;\r
-    }\r
-\r
-    static int createUniqueIDForMidiPort (String deviceName, bool isInput)\r
-    {\r
-        String uniqueID;\r
-\r
-       #ifdef JucePlugin_CFBundleIdentifier\r
-        uniqueID = JUCE_STRINGIFY (JucePlugin_CFBundleIdentifier);\r
-       #else\r
-        auto appBundle = File::getSpecialLocation (File::currentApplicationFile);\r
-        ScopedCFString appBundlePath (appBundle.getFullPathName());\r
-\r
-        if (auto bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault, appBundlePath.cfString, kCFURLPOSIXPathStyle, true))\r
-        {\r
-            auto bundleRef = CFBundleCreate (kCFAllocatorDefault, bundleURL);\r
-            CFRelease (bundleURL);\r
-\r
-            if (bundleRef != nullptr)\r
-            {\r
-                if (auto bundleId = CFBundleGetIdentifier (bundleRef))\r
-                    uniqueID = String::fromCFString (bundleId);\r
-\r
-                CFRelease (bundleRef);\r
-            }\r
-        }\r
-       #endif\r
-\r
-        if (uniqueID.isEmpty())\r
-            uniqueID = String (Random::getSystemRandom().nextInt (1024));\r
-\r
-        uniqueID += "." + deviceName + (isInput ? ".input" : ".output");\r
-        return uniqueID.hashCode();\r
-    }\r
-\r
-    static void enableSimulatorMidiSession()\r
-    {\r
-       #if TARGET_OS_SIMULATOR\r
-        static bool hasEnabledNetworkSession = false;\r
-\r
-        if (! hasEnabledNetworkSession)\r
-        {\r
-            MIDINetworkSession* session = [MIDINetworkSession defaultSession];\r
-            session.enabled = YES;\r
-            session.connectionPolicy = MIDINetworkConnectionPolicy_Anyone;\r
-\r
-            hasEnabledNetworkSession = true;\r
-        }\r
-       #endif\r
-    }\r
-\r
-    static void globalSystemChangeCallback (const MIDINotification*, void*)\r
-    {\r
-        // TODO.. Should pass-on this notification..\r
-    }\r
-\r
-    static String getGlobalMidiClientName()\r
-    {\r
-        if (auto* app = JUCEApplicationBase::getInstance())\r
-            return app->getApplicationName();\r
-\r
-        return "JUCE";\r
-    }\r
-\r
-    static MIDIClientRef getGlobalMidiClient()\r
-    {\r
-        static MIDIClientRef globalMidiClient = 0;\r
-\r
-        if (globalMidiClient == 0)\r
-        {\r
-            // Since OSX 10.6, the MIDIClientCreate function will only work\r
-            // correctly when called from the message thread!\r
-            JUCE_ASSERT_MESSAGE_THREAD\r
-\r
-            enableSimulatorMidiSession();\r
-\r
-            ScopedCFString name (getGlobalMidiClientName());\r
-            CHECK_ERROR (MIDIClientCreate (name.cfString, &globalSystemChangeCallback, nullptr, &globalMidiClient));\r
-        }\r
-\r
-        return globalMidiClient;\r
-    }\r
-\r
-    static Array<MidiDeviceInfo> findDevices (bool forInput)\r
-    {\r
-        // It seems that OSX can be a bit picky about the thread that's first used to\r
-        // search for devices. It's safest to use the message thread for calling this.\r
-        JUCE_ASSERT_MESSAGE_THREAD\r
-\r
-        if (getGlobalMidiClient() == 0)\r
-        {\r
-            jassertfalse;\r
-            return {};\r
-        }\r
-\r
-        enableSimulatorMidiSession();\r
-\r
-        Array<MidiDeviceInfo> devices;\r
-        auto numDevices = (forInput ? MIDIGetNumberOfSources() : MIDIGetNumberOfDestinations());\r
-\r
-        for (ItemCount i = 0; i < numDevices; ++i)\r
-        {\r
-            MidiDeviceInfo deviceInfo;\r
-\r
-            if (auto dest = forInput ? MIDIGetSource (i) : MIDIGetDestination (i))\r
-                deviceInfo = getConnectedEndpointInfo (dest);\r
-\r
-            if (deviceInfo == MidiDeviceInfo())\r
-                deviceInfo.name = deviceInfo.identifier = "<error>";\r
-\r
-            devices.add (deviceInfo);\r
-        }\r
-\r
-        return devices;\r
-    }\r
-\r
-    //==============================================================================\r
-    class MidiPortAndEndpoint\r
-    {\r
-    public:\r
-        MidiPortAndEndpoint (MIDIPortRef p, MIDIEndpointRef ep) noexcept\r
-            : port (p), endpoint (ep)\r
-        {\r
-        }\r
-\r
-        ~MidiPortAndEndpoint() noexcept\r
-        {\r
-            if (port != 0)\r
-                MIDIPortDispose (port);\r
-\r
-            // if port == nullptr, it means we created the endpoint, so it's safe to delete it\r
-            if (port == 0 && endpoint != 0)\r
-                MIDIEndpointDispose (endpoint);\r
-        }\r
-\r
-        void send (const MIDIPacketList* packets) noexcept\r
-        {\r
-            if (port != 0)\r
-                MIDISend (port, endpoint, packets);\r
-            else\r
-                MIDIReceived (endpoint, packets);\r
-        }\r
-\r
-        MIDIPortRef port;\r
-        MIDIEndpointRef endpoint;\r
-    };\r
-\r
-    //==============================================================================\r
-    struct MidiPortAndCallback;\r
-    CriticalSection callbackLock;\r
-    Array<MidiPortAndCallback*> activeCallbacks;\r
-\r
-    struct MidiPortAndCallback\r
-    {\r
-        MidiPortAndCallback (MidiInputCallback& cb)  : callback (cb) {}\r
-\r
-        ~MidiPortAndCallback()\r
-        {\r
-            active = false;\r
-\r
-            {\r
-                const ScopedLock sl (callbackLock);\r
-                activeCallbacks.removeFirstMatchingValue (this);\r
-            }\r
-\r
-            if (portAndEndpoint != nullptr && portAndEndpoint->port != 0)\r
-                CHECK_ERROR (MIDIPortDisconnectSource (portAndEndpoint->port, portAndEndpoint->endpoint));\r
-        }\r
-\r
-        void handlePackets (const MIDIPacketList* pktlist)\r
-        {\r
-            auto time = Time::getMillisecondCounterHiRes() * 0.001;\r
-\r
-            const ScopedLock sl (callbackLock);\r
-\r
-            if (activeCallbacks.contains (this) && active)\r
-            {\r
-                auto* packet = &pktlist->packet[0];\r
-\r
-                for (unsigned int i = 0; i < pktlist->numPackets; ++i)\r
-                {\r
-                    auto len = readUnaligned<decltype (packet->length)> (&(packet->length));\r
-                    concatenator.pushMidiData (packet->data, (int) len, time, input, callback);\r
-\r
-                    packet = MIDIPacketNext (packet);\r
-                }\r
-            }\r
-        }\r
-\r
-        MidiInput* input = nullptr;\r
-        std::unique_ptr<MidiPortAndEndpoint> portAndEndpoint;\r
-        std::atomic<bool> active { false };\r
-\r
-    private:\r
-        MidiInputCallback& callback;\r
-        MidiDataConcatenator concatenator { 2048 };\r
-    };\r
-\r
-    static void midiInputProc (const MIDIPacketList* pktlist, void* readProcRefCon, void* /*srcConnRefCon*/)\r
-    {\r
-        static_cast<MidiPortAndCallback*> (readProcRefCon)->handlePackets (pktlist);\r
-    }\r
-\r
-    static Array<MIDIEndpointRef> getEndpoints (bool isInput)\r
-    {\r
-        Array<MIDIEndpointRef> endpoints;\r
-        auto numDevices = (isInput ? MIDIGetNumberOfSources() : MIDIGetNumberOfDestinations());\r
-\r
-        for (ItemCount i = 0; i < numDevices; ++i)\r
-            endpoints.add (isInput ? MIDIGetSource (i) : MIDIGetDestination (i));\r
-\r
-        return endpoints;\r
-    }\r
-}\r
-\r
-class MidiInput::Pimpl : public CoreMidiHelpers::MidiPortAndCallback\r
-{\r
-public:\r
-    using MidiPortAndCallback::MidiPortAndCallback;\r
-};\r
-\r
-//==============================================================================\r
-Array<MidiDeviceInfo> MidiInput::getAvailableDevices()\r
-{\r
-    return CoreMidiHelpers::findDevices (true);\r
-}\r
-\r
-MidiDeviceInfo MidiInput::getDefaultDevice()\r
-{\r
-    return getAvailableDevices().getFirst();\r
-}\r
-\r
-std::unique_ptr<MidiInput> MidiInput::openDevice (const String& deviceIdentifier, MidiInputCallback* callback)\r
-{\r
-    if (deviceIdentifier.isEmpty())\r
-        return nullptr;\r
-\r
-    using namespace CoreMidiHelpers;\r
-\r
-    if (auto client = getGlobalMidiClient())\r
-    {\r
-        for (auto& endpoint : getEndpoints (true))\r
-        {\r
-            auto endpointInfo = getConnectedEndpointInfo (endpoint);\r
-\r
-            if (deviceIdentifier == endpointInfo.identifier)\r
-            {\r
-                ScopedCFString cfName;\r
-\r
-                if (CHECK_ERROR (MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &cfName.cfString)))\r
-                {\r
-                    MIDIPortRef port;\r
-                    auto mpc = std::make_unique<Pimpl> (*callback);\r
-\r
-                    if (CHECK_ERROR (MIDIInputPortCreate (client, cfName.cfString, midiInputProc, mpc.get(), &port)))\r
-                    {\r
-                        if (CHECK_ERROR (MIDIPortConnectSource (port, endpoint, nullptr)))\r
-                        {\r
-                            mpc->portAndEndpoint = std::make_unique<MidiPortAndEndpoint> (port, endpoint);\r
-\r
-                            std::unique_ptr<MidiInput> midiInput (new MidiInput (endpointInfo.name, endpointInfo.identifier));\r
-\r
-                            mpc->input = midiInput.get();\r
-                            auto* ptr = mpc.get();\r
-                            midiInput->internal = std::move (mpc);\r
-\r
-                            const ScopedLock sl (callbackLock);\r
-                            activeCallbacks.add (ptr);\r
-\r
-                            return midiInput;\r
-                        }\r
-                        else\r
-                        {\r
-                            CHECK_ERROR (MIDIPortDispose (port));\r
-                        }\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    return {};\r
-}\r
-\r
-std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)\r
-{\r
-    using namespace CoreMidiHelpers;\r
-    jassert (callback != nullptr);\r
-\r
-    if (auto client = getGlobalMidiClient())\r
-    {\r
-        auto mpc = std::make_unique<Pimpl> (*callback);\r
-        mpc->active = false;\r
-\r
-        MIDIEndpointRef endpoint;\r
-        ScopedCFString name (deviceName);\r
-\r
-        auto err = MIDIDestinationCreate (client, name.cfString, midiInputProc, mpc.get(), &endpoint);\r
-\r
-       #if JUCE_IOS\r
-        if (err == kMIDINotPermitted)\r
-        {\r
-            // If you've hit this assertion then you probably haven't enabled the "Audio Background Capability"\r
-            // setting in the iOS exporter for your app - this is required if you want to create a MIDI device!\r
-            jassertfalse;\r
-            return nullptr;\r
-        }\r
-       #endif\r
-\r
-        if (CHECK_ERROR (err))\r
-        {\r
-            auto deviceIdentifier = createUniqueIDForMidiPort (deviceName, true);\r
-\r
-            if (CHECK_ERROR (MIDIObjectSetIntegerProperty (endpoint, kMIDIPropertyUniqueID, (SInt32) deviceIdentifier)))\r
-            {\r
-                mpc->portAndEndpoint = std::make_unique<MidiPortAndEndpoint> ((UInt32) 0, endpoint);\r
-\r
-                std::unique_ptr<MidiInput> midiInput (new MidiInput (deviceName, String (deviceIdentifier)));\r
-\r
-                mpc->input = midiInput.get();\r
-                auto* ptr = mpc.get();\r
-                midiInput->internal = std::move (mpc);\r
-\r
-                const ScopedLock sl (callbackLock);\r
-                activeCallbacks.add (ptr);\r
-\r
-                return midiInput;\r
-            }\r
-        }\r
-    }\r
-\r
-    return {};\r
-}\r
-\r
-StringArray MidiInput::getDevices()\r
-{\r
-    StringArray deviceNames;\r
-\r
-    for (auto& d : getAvailableDevices())\r
-        deviceNames.add (d.name);\r
-\r
-    return deviceNames;\r
-}\r
-\r
-int MidiInput::getDefaultDeviceIndex()\r
-{\r
-    return 0;\r
-}\r
-\r
-std::unique_ptr<MidiInput> MidiInput::openDevice (int index, MidiInputCallback* callback)\r
-{\r
-    return openDevice (getAvailableDevices()[index].identifier, callback);\r
-}\r
-\r
-MidiInput::MidiInput (const String& deviceName, const String& deviceIdentifier)\r
-    : deviceInfo (deviceName, deviceIdentifier)\r
-{\r
-}\r
-\r
-MidiInput::~MidiInput() = default;\r
-\r
-void MidiInput::start()\r
-{\r
-    const ScopedLock sl (CoreMidiHelpers::callbackLock);\r
-    internal->active = true;\r
-}\r
-\r
-void MidiInput::stop()\r
-{\r
-    const ScopedLock sl (CoreMidiHelpers::callbackLock);\r
-    internal->active = false;\r
-}\r
-\r
-//==============================================================================\r
-class MidiOutput::Pimpl : public CoreMidiHelpers::MidiPortAndEndpoint\r
-{\r
-public:\r
-    using MidiPortAndEndpoint::MidiPortAndEndpoint;\r
-};\r
-\r
-Array<MidiDeviceInfo> MidiOutput::getAvailableDevices()\r
-{\r
-    return CoreMidiHelpers::findDevices (false);\r
-}\r
-\r
-MidiDeviceInfo MidiOutput::getDefaultDevice()\r
-{\r
-    return getAvailableDevices().getFirst();\r
-}\r
-\r
-std::unique_ptr<MidiOutput> MidiOutput::openDevice (const String& deviceIdentifier)\r
-{\r
-    if (deviceIdentifier.isEmpty())\r
-        return nullptr;\r
-\r
-    using namespace CoreMidiHelpers;\r
-\r
-    if (auto client = getGlobalMidiClient())\r
-    {\r
-        for (auto& endpoint : getEndpoints (false))\r
-        {\r
-            auto endpointInfo = getConnectedEndpointInfo (endpoint);\r
-\r
-            if (deviceIdentifier == endpointInfo.identifier)\r
-            {\r
-                ScopedCFString cfName;\r
-\r
-                if (CHECK_ERROR (MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &cfName.cfString)))\r
-                {\r
-                    MIDIPortRef port;\r
-\r
-                    if (CHECK_ERROR (MIDIOutputPortCreate (client, cfName.cfString, &port)))\r
-                    {\r
-                        std::unique_ptr<MidiOutput> midiOutput (new MidiOutput (endpointInfo.name, endpointInfo.identifier));\r
-                        midiOutput->internal = std::make_unique<Pimpl> (port, endpoint);\r
-\r
-                        return midiOutput;\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    }\r
-\r
-    return {};\r
-}\r
-\r
-std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String& deviceName)\r
-{\r
-    using namespace CoreMidiHelpers;\r
-\r
-    if (auto client = getGlobalMidiClient())\r
-    {\r
-        MIDIEndpointRef endpoint;\r
-\r
-        ScopedCFString name (deviceName);\r
-\r
-        auto err = MIDISourceCreate (client, name.cfString, &endpoint);\r
-\r
-       #if JUCE_IOS\r
-        if (err == kMIDINotPermitted)\r
-        {\r
-            // If you've hit this assertion then you probably haven't enabled the "Audio Background Capability"\r
-            // setting in the iOS exporter for your app - this is required if you want to create a MIDI device!\r
-            jassertfalse;\r
-            return nullptr;\r
-        }\r
-       #endif\r
-\r
-        if (CHECK_ERROR (err))\r
-        {\r
-            auto deviceIdentifier = createUniqueIDForMidiPort (deviceName, false);\r
-\r
-            if (CHECK_ERROR (MIDIObjectSetIntegerProperty (endpoint, kMIDIPropertyUniqueID, (SInt32) deviceIdentifier)))\r
-            {\r
-                std::unique_ptr<MidiOutput> midiOutput (new MidiOutput (deviceName, String (deviceIdentifier)));\r
-                midiOutput->internal = std::make_unique<Pimpl> ((UInt32) 0, endpoint);\r
-\r
-                return midiOutput;\r
-            }\r
-        }\r
-    }\r
-\r
-    return {};\r
-}\r
-\r
-StringArray MidiOutput::getDevices()\r
-{\r
-    StringArray deviceNames;\r
-\r
-    for (auto& d : getAvailableDevices())\r
-        deviceNames.add (d.name);\r
-\r
-    return deviceNames;\r
-}\r
-\r
-int MidiOutput::getDefaultDeviceIndex()\r
-{\r
-    return 0;\r
-}\r
-\r
-std::unique_ptr<MidiOutput> MidiOutput::openDevice (int index)\r
-{\r
-    return openDevice (getAvailableDevices()[index].identifier);\r
-}\r
-\r
-MidiOutput::~MidiOutput()\r
-{\r
-    stopBackgroundThread();\r
-}\r
-\r
-void MidiOutput::sendMessageNow (const MidiMessage& message)\r
-{\r
-   #if JUCE_IOS\r
-    const MIDITimeStamp timeStamp = mach_absolute_time();\r
-   #else\r
-    const MIDITimeStamp timeStamp = AudioGetCurrentHostTime();\r
-   #endif\r
-\r
-    HeapBlock<MIDIPacketList> allocatedPackets;\r
-    MIDIPacketList stackPacket;\r
-    auto* packetToSend = &stackPacket;\r
-    auto dataSize = (size_t) message.getRawDataSize();\r
-\r
-    if (message.isSysEx())\r
-    {\r
-        const int maxPacketSize = 256;\r
-        int pos = 0, bytesLeft = (int) dataSize;\r
-        const int numPackets = (bytesLeft + maxPacketSize - 1) / maxPacketSize;\r
-        allocatedPackets.malloc ((size_t) (32 * (size_t) numPackets + dataSize), 1);\r
-        packetToSend = allocatedPackets;\r
-        packetToSend->numPackets = (UInt32) numPackets;\r
-\r
-        auto* p = packetToSend->packet;\r
-\r
-        for (int i = 0; i < numPackets; ++i)\r
-        {\r
-            p->timeStamp = timeStamp;\r
-            p->length = (UInt16) jmin (maxPacketSize, bytesLeft);\r
-            memcpy (p->data, message.getRawData() + pos, p->length);\r
-            pos += p->length;\r
-            bytesLeft -= p->length;\r
-            p = MIDIPacketNext (p);\r
-        }\r
-    }\r
-    else if (dataSize < 65536) // max packet size\r
-    {\r
-        auto stackCapacity = sizeof (stackPacket.packet->data);\r
-\r
-        if (dataSize > stackCapacity)\r
-        {\r
-            allocatedPackets.malloc ((sizeof (MIDIPacketList) - stackCapacity) + dataSize, 1);\r
-            packetToSend = allocatedPackets;\r
-        }\r
-\r
-        packetToSend->numPackets = 1;\r
-        auto& p = *(packetToSend->packet);\r
-        p.timeStamp = timeStamp;\r
-        p.length = (UInt16) dataSize;\r
-        memcpy (p.data, message.getRawData(), dataSize);\r
-    }\r
-    else\r
-    {\r
-        jassertfalse; // packet too large to send!\r
-        return;\r
-    }\r
-\r
-    internal->send (packetToSend);\r
-}\r
-\r
-#undef CHECK_ERROR\r
-\r
-} // namespace juce\r
diff --git a/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm b/modules/juce_audio_devices/native/juce_mac_CoreMidi.mm
new file mode 100644 (file)
index 0000000..4c24bcc
--- /dev/null
@@ -0,0 +1,1269 @@
+/*\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
+   The code included in this file is provided under the terms of the ISC license\r
+   http://www.isc.org/downloads/software-support-policy/isc-license. Permission\r
+   To use, copy, modify, and/or distribute this software for any purpose with or\r
+   without fee is hereby granted provided that the above copyright notice and\r
+   this permission notice appear in all copies.\r
+\r
+   JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER\r
+   EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE\r
+   DISCLAIMED.\r
+\r
+  ==============================================================================\r
+*/\r
+\r
+namespace juce\r
+{\r
+\r
+#ifndef JUCE_LOG_COREMIDI_ERRORS\r
+ #define JUCE_LOG_COREMIDI_ERRORS 1\r
+#endif\r
+\r
+namespace CoreMidiHelpers\r
+{\r
+    static bool checkError (OSStatus err, int lineNum)\r
+    {\r
+        if (err == noErr)\r
+            return true;\r
+\r
+       #if JUCE_LOG_COREMIDI_ERRORS\r
+        Logger::writeToLog ("CoreMIDI error: " + String (lineNum) + " - " + String::toHexString ((int) err));\r
+       #endif\r
+\r
+        ignoreUnused (lineNum);\r
+        return false;\r
+    }\r
+\r
+    #undef CHECK_ERROR\r
+    #define CHECK_ERROR(a) CoreMidiHelpers::checkError (a, __LINE__)\r
+\r
+    enum class ImplementationStrategy\r
+    {\r
+        onlyNew,\r
+        both,\r
+        onlyOld\r
+    };\r
+\r
+    #if (defined (MAC_OS_VERSION_11_0) || defined (__IPHONE_14_0))\r
+     #if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_VERSION_11_0 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_14_0)\r
+      #define JUCE_HAS_NEW_COREMIDI_API 1\r
+      #define JUCE_HAS_OLD_COREMIDI_API 0\r
+      constexpr auto implementationStrategy = ImplementationStrategy::onlyNew;\r
+     #else\r
+      #define JUCE_HAS_NEW_COREMIDI_API 1\r
+      #define JUCE_HAS_OLD_COREMIDI_API 1\r
+      constexpr auto implementationStrategy = ImplementationStrategy::both;\r
+     #endif\r
+    #else\r
+     #define JUCE_HAS_NEW_COREMIDI_API 0\r
+     #define JUCE_HAS_OLD_COREMIDI_API 1\r
+     constexpr auto implementationStrategy = ImplementationStrategy::onlyOld;\r
+    #endif\r
+\r
+    struct SenderBase\r
+    {\r
+        virtual ~SenderBase() noexcept = default;\r
+\r
+        virtual void send (MIDIPortRef port, MIDIEndpointRef endpoint, const MidiMessage& m) = 0;\r
+        virtual void send (MIDIPortRef port, MIDIEndpointRef endpoint, ump::Iterator b, ump::Iterator e) = 0;\r
+\r
+        virtual ump::MidiProtocol getProtocol() const noexcept = 0;\r
+    };\r
+\r
+    template <ImplementationStrategy>\r
+    struct Sender;\r
+\r
+   #if JUCE_HAS_NEW_COREMIDI_API\r
+    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability-new")\r
+\r
+    template <>\r
+    struct Sender<ImplementationStrategy::onlyNew> : public SenderBase\r
+    {\r
+        explicit Sender (MIDIEndpointRef ep)\r
+            : umpConverter (getProtocolForEndpoint (ep))\r
+        {}\r
+\r
+        void send (MIDIPortRef port, MIDIEndpointRef endpoint, const MidiMessage& m) override\r
+        {\r
+            newSendImpl (port, endpoint, m);\r
+        }\r
+\r
+        void send (MIDIPortRef port, MIDIEndpointRef endpoint, ump::Iterator b, ump::Iterator e) override\r
+        {\r
+            newSendImpl (port, endpoint, b, e);\r
+        }\r
+\r
+        ump::MidiProtocol getProtocol() const noexcept override\r
+        {\r
+            return umpConverter.getProtocol() == ump::PacketProtocol::MIDI_2_0 ? ump::MidiProtocol::UMP_MIDI_2_0\r
+                                                                               : ump::MidiProtocol::UMP_MIDI_1_0;\r
+        }\r
+\r
+    private:\r
+        ump::GenericUMPConverter umpConverter;\r
+\r
+        static ump::PacketProtocol getProtocolForEndpoint (MIDIEndpointRef ep) noexcept\r
+        {\r
+            SInt32 protocol = 0;\r
+            CHECK_ERROR (MIDIObjectGetIntegerProperty (ep, kMIDIPropertyProtocolID, &protocol));\r
+\r
+            return protocol == kMIDIProtocol_2_0 ? ump::PacketProtocol::MIDI_2_0\r
+                                                 : ump::PacketProtocol::MIDI_1_0;\r
+        }\r
+\r
+        template <typename... Params>\r
+        void newSendImpl (MIDIPortRef port, MIDIEndpointRef endpoint, Params&&... params)\r
+        {\r
+            // The converter protocol got out-of-sync with the device protocol\r
+            jassert (getProtocolForEndpoint (endpoint) == umpConverter.getProtocol());\r
+\r
+           #if JUCE_IOS\r
+            const MIDITimeStamp timeStamp = mach_absolute_time();\r
+           #else\r
+            const MIDITimeStamp timeStamp = AudioGetCurrentHostTime();\r
+           #endif\r
+\r
+            MIDIEventList stackList = {};\r
+            MIDIEventPacket* end = nullptr;\r
+\r
+            const auto init = [&]\r
+            {\r
+                end = MIDIEventListInit (&stackList,\r
+                                         umpConverter.getProtocol() == ump::PacketProtocol::MIDI_2_0 ? kMIDIProtocol_2_0\r
+                                                                                                     : kMIDIProtocol_1_0);\r
+            };\r
+\r
+            const auto send = [&]\r
+            {\r
+                CHECK_ERROR (port != 0 ? MIDISendEventList (port, endpoint, &stackList)\r
+                                       : MIDIReceivedEventList (endpoint, &stackList));\r
+            };\r
+\r
+            const auto add = [&] (const ump::View& view)\r
+            {\r
+                static_assert (sizeof (uint32_t) == sizeof (UInt32)\r
+                               && alignof (uint32_t) == alignof (UInt32),\r
+                               "If this fails, the cast below will be broken too!");\r
+                end = MIDIEventListAdd (&stackList,\r
+                                        sizeof (MIDIEventList::packet),\r
+                                        end,\r
+                                        timeStamp,\r
+                                        view.size(),\r
+                                        reinterpret_cast<const UInt32*> (view.data()));\r
+            };\r
+\r
+            init();\r
+\r
+            umpConverter.convert (params..., [&] (const ump::View& view)\r
+            {\r
+                add (view);\r
+\r
+                if (end != nullptr)\r
+                    return;\r
+\r
+                send();\r
+                init();\r
+                add (view);\r
+            });\r
+\r
+            send();\r
+        }\r
+    };\r
+\r
+    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+   #endif\r
+\r
+   #if JUCE_HAS_OLD_COREMIDI_API\r
+    template <>\r
+    struct Sender<ImplementationStrategy::onlyOld> : public SenderBase\r
+    {\r
+        explicit Sender (MIDIEndpointRef) {}\r
+\r
+        void send (MIDIPortRef port, MIDIEndpointRef endpoint, const MidiMessage& m) override\r
+        {\r
+            oldSendImpl (port, endpoint, m);\r
+        }\r
+\r
+        void send (MIDIPortRef port, MIDIEndpointRef endpoint, ump::Iterator b, ump::Iterator e) override\r
+        {\r
+            std::for_each (b, e, [&] (const ump::View& v)\r
+            {\r
+                bytestreamConverter.convert (v, 0.0, [&] (const MidiMessage& m)\r
+                {\r
+                    send (port, endpoint, m);\r
+                });\r
+            });\r
+        }\r
+\r
+        ump::MidiProtocol getProtocol() const noexcept override\r
+        {\r
+            return ump::MidiProtocol::bytestream;\r
+        }\r
+\r
+    private:\r
+        ump::ToBytestreamConverter bytestreamConverter { 2048 };\r
+\r
+        void oldSendImpl (MIDIPortRef port, MIDIEndpointRef endpoint, const MidiMessage& message)\r
+        {\r
+           #if JUCE_IOS\r
+            const MIDITimeStamp timeStamp = mach_absolute_time();\r
+           #else\r
+            const MIDITimeStamp timeStamp = AudioGetCurrentHostTime();\r
+           #endif\r
+\r
+            HeapBlock<MIDIPacketList> allocatedPackets;\r
+            MIDIPacketList stackPacket;\r
+            auto* packetToSend = &stackPacket;\r
+            auto dataSize = (size_t) message.getRawDataSize();\r
+\r
+            if (message.isSysEx())\r
+            {\r
+                const int maxPacketSize = 256;\r
+                int pos = 0, bytesLeft = (int) dataSize;\r
+                const int numPackets = (bytesLeft + maxPacketSize - 1) / maxPacketSize;\r
+                allocatedPackets.malloc ((size_t) (32 * (size_t) numPackets + dataSize), 1);\r
+                packetToSend = allocatedPackets;\r
+                packetToSend->numPackets = (UInt32) numPackets;\r
+\r
+                auto* p = packetToSend->packet;\r
+\r
+                for (int i = 0; i < numPackets; ++i)\r
+                {\r
+                    p->timeStamp = timeStamp;\r
+                    p->length = (UInt16) jmin (maxPacketSize, bytesLeft);\r
+                    memcpy (p->data, message.getRawData() + pos, p->length);\r
+                    pos += p->length;\r
+                    bytesLeft -= p->length;\r
+                    p = MIDIPacketNext (p);\r
+                }\r
+            }\r
+            else if (dataSize < 65536) // max packet size\r
+            {\r
+                auto stackCapacity = sizeof (stackPacket.packet->data);\r
+\r
+                if (dataSize > stackCapacity)\r
+                {\r
+                    allocatedPackets.malloc ((sizeof (MIDIPacketList) - stackCapacity) + dataSize, 1);\r
+                    packetToSend = allocatedPackets;\r
+                }\r
+\r
+                packetToSend->numPackets = 1;\r
+                auto& p = *(packetToSend->packet);\r
+                p.timeStamp = timeStamp;\r
+                p.length = (UInt16) dataSize;\r
+                memcpy (p.data, message.getRawData(), dataSize);\r
+            }\r
+            else\r
+            {\r
+                jassertfalse; // packet too large to send!\r
+                return;\r
+            }\r
+\r
+            if (port != 0)\r
+                MIDISend (port, endpoint, packetToSend);\r
+            else\r
+                MIDIReceived (endpoint, packetToSend);\r
+        }\r
+    };\r
+   #endif\r
+\r
+   #if JUCE_HAS_NEW_COREMIDI_API && JUCE_HAS_OLD_COREMIDI_API\r
+    template <>\r
+    struct Sender<ImplementationStrategy::both>\r
+    {\r
+        explicit Sender (MIDIEndpointRef ep)\r
+            : sender (makeImpl (ep))\r
+        {}\r
+\r
+        void send (MIDIPortRef port, MIDIEndpointRef endpoint, const MidiMessage& m)\r
+        {\r
+            sender->send (port, endpoint, m);\r
+        }\r
+\r
+        void send (MIDIPortRef port, MIDIEndpointRef endpoint, ump::Iterator b, ump::Iterator e)\r
+        {\r
+            sender->send (port, endpoint, b, e);\r
+        }\r
+\r
+        ump::MidiProtocol getProtocol() const noexcept\r
+        {\r
+            return sender->getProtocol();\r
+        }\r
+\r
+    private:\r
+        static std::unique_ptr<SenderBase> makeImpl (MIDIEndpointRef ep)\r
+        {\r
+            if (@available (macOS 11, iOS 14, *))\r
+                return std::make_unique<Sender<ImplementationStrategy::onlyNew>> (ep);\r
+\r
+            return std::make_unique<Sender<ImplementationStrategy::onlyOld>> (ep);\r
+        }\r
+\r
+        std::unique_ptr<SenderBase> sender;\r
+    };\r
+   #endif\r
+\r
+    using SenderToUse = Sender<implementationStrategy>;\r
+\r
+    //==============================================================================\r
+    class MidiPortAndEndpoint\r
+    {\r
+    public:\r
+        MidiPortAndEndpoint (MIDIPortRef p, MIDIEndpointRef ep) noexcept\r
+            : port (p), endpoint (ep), sender (ep)\r
+        {}\r
+\r
+        ~MidiPortAndEndpoint() noexcept\r
+        {\r
+            if (port != 0)\r
+                MIDIPortDispose (port);\r
+\r
+            // if port == nullptr, it means we created the endpoint, so it's safe to delete it\r
+            if (port == 0 && endpoint != 0)\r
+                MIDIEndpointDispose (endpoint);\r
+        }\r
+\r
+        void send (const MidiMessage& m)\r
+        {\r
+            sender.send (port, endpoint, m);\r
+        }\r
+\r
+        void send (ump::Iterator b, ump::Iterator e)\r
+        {\r
+            sender.send (port, endpoint, b, e);\r
+        }\r
+\r
+        bool canStop() const noexcept  { return port != 0; }\r
+        void stop() const              { CHECK_ERROR (MIDIPortDisconnectSource (port, endpoint)); }\r
+\r
+        ump::MidiProtocol getProtocol() const noexcept\r
+        {\r
+            return sender.getProtocol();\r
+        }\r
+\r
+    private:\r
+        MIDIPortRef port;\r
+        MIDIEndpointRef endpoint;\r
+\r
+        SenderToUse sender;\r
+    };\r
+\r
+    static MidiDeviceInfo getMidiObjectInfo (MIDIObjectRef entity)\r
+    {\r
+        MidiDeviceInfo info;\r
+\r
+        {\r
+            ScopedCFString str;\r
+\r
+            if (CHECK_ERROR (MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str.cfString)))\r
+                info.name = String::fromCFString (str.cfString);\r
+        }\r
+\r
+        SInt32 objectID = 0;\r
+\r
+        if (CHECK_ERROR (MIDIObjectGetIntegerProperty (entity, kMIDIPropertyUniqueID, &objectID)))\r
+        {\r
+            info.identifier = String (objectID);\r
+        }\r
+        else\r
+        {\r
+            ScopedCFString str;\r
+\r
+            if (CHECK_ERROR (MIDIObjectGetStringProperty (entity, kMIDIPropertyUniqueID, &str.cfString)))\r
+                info.identifier = String::fromCFString (str.cfString);\r
+        }\r
+\r
+        return info;\r
+    }\r
+\r
+    static MidiDeviceInfo getEndpointInfo (MIDIEndpointRef endpoint, bool isExternal)\r
+    {\r
+        // NB: don't attempt to use nullptr for refs - it fails in some types of build.\r
+        MIDIEntityRef entity = 0;\r
+        MIDIEndpointGetEntity (endpoint, &entity);\r
+\r
+        // probably virtual\r
+        if (entity == 0)\r
+            return getMidiObjectInfo (endpoint);\r
+\r
+        auto result = getMidiObjectInfo (endpoint);\r
+\r
+        // endpoint is empty - try the entity\r
+        if (result == MidiDeviceInfo())\r
+            result = getMidiObjectInfo (entity);\r
+\r
+        // now consider the device\r
+        MIDIDeviceRef device = 0;\r
+        MIDIEntityGetDevice (entity, &device);\r
+\r
+        if (device != 0)\r
+        {\r
+            auto info = getMidiObjectInfo (device);\r
+\r
+            if (info != MidiDeviceInfo())\r
+            {\r
+                // if an external device has only one entity, throw away\r
+                // the endpoint name and just use the device name\r
+                if (isExternal && MIDIDeviceGetNumberOfEntities (device) < 2)\r
+                {\r
+                    result = info;\r
+                }\r
+                else if (! result.name.startsWithIgnoreCase (info.name))\r
+                {\r
+                    // prepend the device name and identifier to the entity's\r
+                    result.name = (info.name + " " + result.name).trimEnd();\r
+                    result.identifier = info.identifier + " " + result.identifier;\r
+                }\r
+            }\r
+        }\r
+\r
+        return result;\r
+    }\r
+\r
+    static MidiDeviceInfo getConnectedEndpointInfo (MIDIEndpointRef endpoint)\r
+    {\r
+        MidiDeviceInfo result;\r
+\r
+        // Does the endpoint have connections?\r
+        CFDataRef connections = nullptr;\r
+        int numConnections = 0;\r
+\r
+        MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections);\r
+\r
+        if (connections != nullptr)\r
+        {\r
+            numConnections = ((int) CFDataGetLength (connections)) / (int) sizeof (MIDIUniqueID);\r
+\r
+            if (numConnections > 0)\r
+            {\r
+                auto* pid = reinterpret_cast<const SInt32*> (CFDataGetBytePtr (connections));\r
+\r
+                for (int i = 0; i < numConnections; ++i, ++pid)\r
+                {\r
+                    auto id = (MIDIUniqueID) ByteOrder::swapIfLittleEndian ((uint32) *pid);\r
+                    MIDIObjectRef connObject;\r
+                    MIDIObjectType connObjectType;\r
+                    auto err = MIDIObjectFindByUniqueID (id, &connObject, &connObjectType);\r
+\r
+                    if (err == noErr)\r
+                    {\r
+                        MidiDeviceInfo deviceInfo;\r
+\r
+                        if (connObjectType == kMIDIObjectType_ExternalSource\r
+                             || connObjectType == kMIDIObjectType_ExternalDestination)\r
+                        {\r
+                            // Connected to an external device's endpoint (10.3 and later).\r
+                            deviceInfo = getEndpointInfo (static_cast<MIDIEndpointRef> (connObject), true);\r
+                        }\r
+                        else\r
+                        {\r
+                            // Connected to an external device (10.2) (or something else, catch-all)\r
+                            deviceInfo = getMidiObjectInfo (connObject);\r
+                        }\r
+\r
+                        if (deviceInfo != MidiDeviceInfo())\r
+                        {\r
+                            if (result.name.isNotEmpty())        result.name += ", ";\r
+                            if (result.identifier.isNotEmpty())  result.identifier += ", ";\r
+\r
+                            result.name       += deviceInfo.name;\r
+                            result.identifier += deviceInfo.identifier;\r
+                        }\r
+                    }\r
+                }\r
+            }\r
+\r
+            CFRelease (connections);\r
+        }\r
+\r
+        // Here, either the endpoint had no connections, or we failed to obtain names for them.\r
+        if (result == MidiDeviceInfo())\r
+            return getEndpointInfo (endpoint, false);\r
+\r
+        return result;\r
+    }\r
+\r
+    static int createUniqueIDForMidiPort (String deviceName, bool isInput)\r
+    {\r
+        String uniqueID;\r
+\r
+       #ifdef JucePlugin_CFBundleIdentifier\r
+        uniqueID = JUCE_STRINGIFY (JucePlugin_CFBundleIdentifier);\r
+       #else\r
+        auto appBundle = File::getSpecialLocation (File::currentApplicationFile);\r
+        ScopedCFString appBundlePath (appBundle.getFullPathName());\r
+\r
+        if (auto bundleURL = CFURLCreateWithFileSystemPath (kCFAllocatorDefault,\r
+                                                            appBundlePath.cfString,\r
+                                                            kCFURLPOSIXPathStyle,\r
+                                                            true))\r
+        {\r
+            auto bundleRef = CFBundleCreate (kCFAllocatorDefault, bundleURL);\r
+            CFRelease (bundleURL);\r
+\r
+            if (bundleRef != nullptr)\r
+            {\r
+                if (auto bundleId = CFBundleGetIdentifier (bundleRef))\r
+                    uniqueID = String::fromCFString (bundleId);\r
+\r
+                CFRelease (bundleRef);\r
+            }\r
+        }\r
+       #endif\r
+\r
+        if (uniqueID.isEmpty())\r
+            uniqueID = String (Random::getSystemRandom().nextInt (1024));\r
+\r
+        uniqueID += "." + deviceName + (isInput ? ".input" : ".output");\r
+        return uniqueID.hashCode();\r
+    }\r
+\r
+    static void enableSimulatorMidiSession()\r
+    {\r
+       #if TARGET_OS_SIMULATOR\r
+        static bool hasEnabledNetworkSession = false;\r
+\r
+        if (! hasEnabledNetworkSession)\r
+        {\r
+            MIDINetworkSession* session = [MIDINetworkSession defaultSession];\r
+            session.enabled = YES;\r
+            session.connectionPolicy = MIDINetworkConnectionPolicy_Anyone;\r
+\r
+            hasEnabledNetworkSession = true;\r
+        }\r
+       #endif\r
+    }\r
+\r
+    static void globalSystemChangeCallback (const MIDINotification*, void*)\r
+    {\r
+        // TODO.. Should pass-on this notification..\r
+    }\r
+\r
+    static String getGlobalMidiClientName()\r
+    {\r
+        if (auto* app = JUCEApplicationBase::getInstance())\r
+            return app->getApplicationName();\r
+\r
+        return "JUCE";\r
+    }\r
+\r
+    static MIDIClientRef getGlobalMidiClient()\r
+    {\r
+        static MIDIClientRef globalMidiClient = 0;\r
+\r
+        if (globalMidiClient == 0)\r
+        {\r
+            // Since OSX 10.6, the MIDIClientCreate function will only work\r
+            // correctly when called from the message thread!\r
+            JUCE_ASSERT_MESSAGE_THREAD\r
+\r
+            enableSimulatorMidiSession();\r
+\r
+            ScopedCFString name (getGlobalMidiClientName());\r
+            CHECK_ERROR (MIDIClientCreate (name.cfString, &globalSystemChangeCallback, nullptr, &globalMidiClient));\r
+        }\r
+\r
+        return globalMidiClient;\r
+    }\r
+\r
+    static Array<MidiDeviceInfo> findDevices (bool forInput)\r
+    {\r
+        // It seems that OSX can be a bit picky about the thread that's first used to\r
+        // search for devices. It's safest to use the message thread for calling this.\r
+        JUCE_ASSERT_MESSAGE_THREAD\r
+\r
+        if (getGlobalMidiClient() == 0)\r
+        {\r
+            jassertfalse;\r
+            return {};\r
+        }\r
+\r
+        enableSimulatorMidiSession();\r
+\r
+        Array<MidiDeviceInfo> devices;\r
+        auto numDevices = (forInput ? MIDIGetNumberOfSources() : MIDIGetNumberOfDestinations());\r
+\r
+        for (ItemCount i = 0; i < numDevices; ++i)\r
+        {\r
+            MidiDeviceInfo deviceInfo;\r
+\r
+            if (auto dest = forInput ? MIDIGetSource (i) : MIDIGetDestination (i))\r
+                deviceInfo = getConnectedEndpointInfo (dest);\r
+\r
+            if (deviceInfo == MidiDeviceInfo())\r
+                deviceInfo.name = deviceInfo.identifier = "<error>";\r
+\r
+            devices.add (deviceInfo);\r
+        }\r
+\r
+        return devices;\r
+    }\r
+\r
+    //==============================================================================\r
+    template <ImplementationStrategy>\r
+    struct Receiver;\r
+\r
+   #if JUCE_HAS_NEW_COREMIDI_API\r
+    template <>\r
+    struct Receiver<ImplementationStrategy::onlyNew>\r
+    {\r
+        Receiver (ump::PacketProtocol protocol, ump::Receiver& receiver)\r
+            : u32InputHandler (std::make_unique<ump::U32ToUMPHandler> (protocol, receiver))\r
+        {}\r
+\r
+        Receiver (MidiInput& input, MidiInputCallback& callback)\r
+            : u32InputHandler (std::make_unique<ump::U32ToBytestreamHandler> (input, callback))\r
+        {}\r
+\r
+        void dispatch (const MIDIEventList& list, double time) const\r
+        {\r
+            auto* packet = &list.packet[0];\r
+\r
+            for (uint32_t i = 0; i < list.numPackets; ++i)\r
+            {\r
+                static_assert (sizeof (uint32_t) == sizeof (UInt32)\r
+                               && alignof (uint32_t) == alignof (UInt32),\r
+                               "If this fails, the cast below will be broken too!");\r
+                u32InputHandler->pushMidiData (reinterpret_cast<const uint32_t*> (packet->words),\r
+                                               reinterpret_cast<const uint32_t*> (packet->words + packet->wordCount),\r
+                                               time);\r
+\r
+                packet = MIDIEventPacketNext (packet);\r
+            }\r
+        }\r
+\r
+    private:\r
+        std::unique_ptr<ump::U32InputHandler> u32InputHandler;\r
+    };\r
+   #endif\r
+\r
+   #if JUCE_HAS_OLD_COREMIDI_API\r
+    template <>\r
+    struct Receiver<ImplementationStrategy::onlyOld>\r
+    {\r
+        Receiver (ump::PacketProtocol protocol, ump::Receiver& receiver)\r
+            : bytestreamInputHandler (std::make_unique<ump::BytestreamToUMPHandler> (protocol, receiver))\r
+        {}\r
+\r
+        Receiver (MidiInput& input, MidiInputCallback& callback)\r
+            : bytestreamInputHandler (std::make_unique<ump::BytestreamToBytestreamHandler> (input, callback))\r
+        {}\r
+\r
+        void dispatch (const MIDIPacketList& list, double time) const\r
+        {\r
+            auto* packet = &list.packet[0];\r
+\r
+            for (unsigned int i = 0; i < list.numPackets; ++i)\r
+            {\r
+                auto len = readUnaligned<decltype (packet->length)> (&(packet->length));\r
+                bytestreamInputHandler->pushMidiData (packet->data, len, time);\r
+\r
+                packet = MIDIPacketNext (packet);\r
+            }\r
+        }\r
+\r
+    private:\r
+        std::unique_ptr<ump::BytestreamInputHandler> bytestreamInputHandler;\r
+    };\r
+   #endif\r
+\r
+   #if JUCE_HAS_NEW_COREMIDI_API && JUCE_HAS_OLD_COREMIDI_API\r
+    template <>\r
+    struct Receiver<ImplementationStrategy::both>\r
+    {\r
+        Receiver (ump::PacketProtocol protocol, ump::Receiver& receiver)\r
+            : newReceiver (protocol, receiver), oldReceiver (protocol, receiver)\r
+        {}\r
+\r
+        Receiver (MidiInput& input, MidiInputCallback& callback)\r
+            : newReceiver (input, callback), oldReceiver (input, callback)\r
+        {}\r
+\r
+        void dispatch (const MIDIEventList& list, double time) const\r
+        {\r
+            newReceiver.dispatch (list, time);\r
+        }\r
+\r
+        void dispatch (const MIDIPacketList& list, double time) const\r
+        {\r
+            oldReceiver.dispatch (list, time);\r
+        }\r
+\r
+    private:\r
+        Receiver<ImplementationStrategy::onlyNew> newReceiver;\r
+        Receiver<ImplementationStrategy::onlyOld> oldReceiver;\r
+    };\r
+   #endif\r
+\r
+    using ReceiverToUse = Receiver<implementationStrategy>;\r
+\r
+    class MidiPortAndCallback;\r
+    CriticalSection callbackLock;\r
+    Array<MidiPortAndCallback*> activeCallbacks;\r
+\r
+    class MidiPortAndCallback\r
+    {\r
+    public:\r
+        MidiPortAndCallback (MidiInput& inputIn, ReceiverToUse receiverIn)\r
+            : input (&inputIn), receiver (std::move (receiverIn))\r
+        {}\r
+\r
+        ~MidiPortAndCallback()\r
+        {\r
+            active = false;\r
+\r
+            {\r
+                const ScopedLock sl (callbackLock);\r
+                activeCallbacks.removeFirstMatchingValue (this);\r
+            }\r
+\r
+            if (portAndEndpoint != nullptr && portAndEndpoint->canStop())\r
+                portAndEndpoint->stop();\r
+        }\r
+\r
+        template <typename EventList>\r
+        void handlePackets (const EventList& list)\r
+        {\r
+            const auto time = Time::getMillisecondCounterHiRes() * 0.001;\r
+\r
+            const ScopedLock sl (callbackLock);\r
+\r
+            if (activeCallbacks.contains (this) && active)\r
+                receiver.dispatch (list, time);\r
+        }\r
+\r
+        MidiInput* input = nullptr;\r
+        std::atomic<bool> active { false };\r
+\r
+        ReceiverToUse receiver;\r
+\r
+        std::unique_ptr<MidiPortAndEndpoint> portAndEndpoint;\r
+\r
+    private:\r
+        JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiPortAndCallback)\r
+    };\r
+\r
+    //==============================================================================\r
+    static Array<MIDIEndpointRef> getEndpoints (bool isInput)\r
+    {\r
+        Array<MIDIEndpointRef> endpoints;\r
+        auto numDevices = (isInput ? MIDIGetNumberOfSources() : MIDIGetNumberOfDestinations());\r
+\r
+        for (ItemCount i = 0; i < numDevices; ++i)\r
+            endpoints.add (isInput ? MIDIGetSource (i) : MIDIGetDestination (i));\r
+\r
+        return endpoints;\r
+    }\r
+\r
+    struct CreatorFunctionPointers\r
+    {\r
+        OSStatus (*createInputPort) (ump::PacketProtocol protocol,\r
+                                     MIDIClientRef client,\r
+                                     CFStringRef portName,\r
+                                     void* refCon,\r
+                                     MIDIPortRef* outPort);\r
+\r
+        OSStatus (*createDestination) (ump::PacketProtocol protocol,\r
+                                       MIDIClientRef client,\r
+                                       CFStringRef name,\r
+                                       void* refCon,\r
+                                       MIDIEndpointRef* outDest);\r
+\r
+        OSStatus (*createSource) (ump::PacketProtocol protocol,\r
+                                  MIDIClientRef client,\r
+                                  CFStringRef name,\r
+                                  MIDIEndpointRef* outSrc);\r
+    };\r
+\r
+    template <ImplementationStrategy>\r
+    struct CreatorFunctions;\r
+\r
+   #if JUCE_HAS_NEW_COREMIDI_API\r
+    JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wunguarded-availability-new")\r
+\r
+    template <>\r
+    struct CreatorFunctions<ImplementationStrategy::onlyNew>\r
+    {\r
+        static OSStatus createInputPort (ump::PacketProtocol protocol,\r
+                                         MIDIClientRef client,\r
+                                         CFStringRef portName,\r
+                                         void* refCon,\r
+                                         MIDIPortRef* outPort)\r
+        {\r
+            return MIDIInputPortCreateWithProtocol (client,\r
+                                                    portName,\r
+                                                    convertToPacketProtocol (protocol),\r
+                                                    outPort,\r
+                                                    ^void (const MIDIEventList* l, void* src)\r
+                                                    {\r
+                                                        newMidiInputProc (l, refCon, src);\r
+                                                    });\r
+        }\r
+\r
+        static OSStatus createDestination (ump::PacketProtocol protocol,\r
+                                           MIDIClientRef client,\r
+                                           CFStringRef name,\r
+                                           void* refCon,\r
+                                           MIDIEndpointRef* outDest)\r
+        {\r
+            return MIDIDestinationCreateWithProtocol (client,\r
+                                                      name,\r
+                                                      convertToPacketProtocol (protocol),\r
+                                                      outDest,\r
+                                                      ^void (const MIDIEventList* l, void* src)\r
+                                                      {\r
+                                                          newMidiInputProc (l, refCon, src);\r
+                                                      });\r
+        }\r
+\r
+        static OSStatus createSource (ump::PacketProtocol protocol,\r
+                                      MIDIClientRef client,\r
+                                      CFStringRef name,\r
+                                      MIDIEndpointRef* outSrc)\r
+        {\r
+            return MIDISourceCreateWithProtocol (client,\r
+                                                 name,\r
+                                                 convertToPacketProtocol (protocol),\r
+                                                 outSrc);\r
+        }\r
+\r
+        static constexpr CreatorFunctionPointers getCreatorFunctionPointers()\r
+        {\r
+            return { createInputPort, createDestination, createSource };\r
+        }\r
+\r
+    private:\r
+        static constexpr MIDIProtocolID convertToPacketProtocol (ump::PacketProtocol p)\r
+        {\r
+            return p == ump::PacketProtocol::MIDI_2_0 ? kMIDIProtocol_2_0\r
+                                                      : kMIDIProtocol_1_0;\r
+        }\r
+\r
+        static void newMidiInputProc (const MIDIEventList* list, void* readProcRefCon, void*)\r
+        {\r
+            static_cast<MidiPortAndCallback*> (readProcRefCon)->handlePackets (*list);\r
+        }\r
+    };\r
+\r
+    JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+   #endif\r
+\r
+   #if JUCE_HAS_OLD_COREMIDI_API\r
+    template <>\r
+    struct CreatorFunctions<ImplementationStrategy::onlyOld>\r
+    {\r
+        static OSStatus createInputPort (ump::PacketProtocol,\r
+                                         MIDIClientRef client,\r
+                                         CFStringRef portName,\r
+                                         void* refCon,\r
+                                         MIDIPortRef* outPort)\r
+        {\r
+            return MIDIInputPortCreate (client, portName, oldMidiInputProc, refCon, outPort);\r
+        }\r
+\r
+        static OSStatus createDestination (ump::PacketProtocol,\r
+                                           MIDIClientRef client,\r
+                                           CFStringRef name,\r
+                                           void* refCon,\r
+                                           MIDIEndpointRef* outDest)\r
+        {\r
+            return MIDIDestinationCreate (client, name, oldMidiInputProc, refCon, outDest);\r
+        }\r
+\r
+        static OSStatus createSource (ump::PacketProtocol,\r
+                                      MIDIClientRef client,\r
+                                      CFStringRef name,\r
+                                      MIDIEndpointRef* outSrc)\r
+        {\r
+            return MIDISourceCreate (client, name, outSrc);\r
+        }\r
+\r
+        static constexpr CreatorFunctionPointers getCreatorFunctionPointers()\r
+        {\r
+            return { createInputPort, createDestination, createSource };\r
+        }\r
+\r
+    private:\r
+        static void oldMidiInputProc (const MIDIPacketList* list, void* readProcRefCon, void*)\r
+        {\r
+            static_cast<MidiPortAndCallback*> (readProcRefCon)->handlePackets (*list);\r
+        }\r
+    };\r
+   #endif\r
+\r
+   #if JUCE_HAS_NEW_COREMIDI_API && JUCE_HAS_OLD_COREMIDI_API\r
+    template <>\r
+    struct CreatorFunctions<ImplementationStrategy::both>\r
+    {\r
+        static OSStatus createInputPort (ump::PacketProtocol protocol,\r
+                                         MIDIClientRef client,\r
+                                         CFStringRef portName,\r
+                                         void* refCon,\r
+                                         MIDIPortRef* outPort)\r
+        {\r
+            return getCreatorFunctionPointers().createInputPort (protocol, client, portName, refCon, outPort);\r
+        }\r
+\r
+        static OSStatus createDestination (ump::PacketProtocol protocol,\r
+                                           MIDIClientRef client,\r
+                                           CFStringRef name,\r
+                                           void* refCon,\r
+                                           MIDIEndpointRef* outDest)\r
+        {\r
+            return getCreatorFunctionPointers().createDestination (protocol, client, name, refCon, outDest);\r
+        }\r
+\r
+        static OSStatus createSource (ump::PacketProtocol protocol,\r
+                                      MIDIClientRef client,\r
+                                      CFStringRef name,\r
+                                      MIDIEndpointRef* outSrc)\r
+        {\r
+            return getCreatorFunctionPointers().createSource (protocol, client, name, outSrc);\r
+        }\r
+\r
+    private:\r
+        static CreatorFunctionPointers getCreatorFunctionPointers()\r
+        {\r
+            if (@available (macOS 11, iOS 14, *))\r
+                return CreatorFunctions<ImplementationStrategy::onlyNew>::getCreatorFunctionPointers();\r
+\r
+            return CreatorFunctions<ImplementationStrategy::onlyOld>::getCreatorFunctionPointers();\r
+        }\r
+    };\r
+   #endif\r
+\r
+    using CreatorFunctionsToUse = CreatorFunctions<implementationStrategy>;\r
+}\r
+\r
+//==============================================================================\r
+class MidiInput::Pimpl : public CoreMidiHelpers::MidiPortAndCallback\r
+{\r
+public:\r
+    using MidiPortAndCallback::MidiPortAndCallback;\r
+\r
+    static std::unique_ptr<Pimpl> makePimpl (MidiInput& midiInput,\r
+                                             ump::PacketProtocol packetProtocol,\r
+                                             ump::Receiver& umpReceiver)\r
+    {\r
+        return std::make_unique<Pimpl> (midiInput, CoreMidiHelpers::ReceiverToUse (packetProtocol, umpReceiver));\r
+    }\r
+\r
+    static std::unique_ptr<Pimpl> makePimpl (MidiInput& midiInput,\r
+                                             MidiInputCallback* midiInputCallback)\r
+    {\r
+        if (midiInputCallback == nullptr)\r
+            return {};\r
+\r
+        return std::make_unique<Pimpl> (midiInput, CoreMidiHelpers::ReceiverToUse (midiInput, *midiInputCallback));\r
+    }\r
+\r
+    template <typename... Args>\r
+    static std::unique_ptr<MidiInput> makeInput (const String& name,\r
+                                                 const String& identifier,\r
+                                                 Args&&... args)\r
+    {\r
+        using namespace CoreMidiHelpers;\r
+\r
+        if (auto midiInput = rawToUniquePtr (new MidiInput (name, identifier)))\r
+        {\r
+            if ((midiInput->internal = makePimpl (*midiInput, std::forward<Args> (args)...)))\r
+            {\r
+                const ScopedLock sl (callbackLock);\r
+                activeCallbacks.add (midiInput->internal.get());\r
+\r
+                return midiInput;\r
+            }\r
+        }\r
+\r
+        return {};\r
+    }\r
+\r
+    template <typename... Args>\r
+    static std::unique_ptr<MidiInput> openDevice (ump::PacketProtocol protocol,\r
+                                                  const String& deviceIdentifier,\r
+                                                  Args&&... args)\r
+    {\r
+        using namespace CoreMidiHelpers;\r
+\r
+        if (deviceIdentifier.isEmpty())\r
+            return {};\r
+\r
+        if (auto client = getGlobalMidiClient())\r
+        {\r
+            for (auto& endpoint : getEndpoints (true))\r
+            {\r
+                auto endpointInfo = getConnectedEndpointInfo (endpoint);\r
+\r
+                if (deviceIdentifier != endpointInfo.identifier)\r
+                    continue;\r
+\r
+                ScopedCFString cfName;\r
+\r
+                if (! CHECK_ERROR (MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &cfName.cfString)))\r
+                    continue;\r
+\r
+                if (auto input = makeInput (endpointInfo.name, endpointInfo.identifier, std::forward<Args> (args)...))\r
+                {\r
+                    MIDIPortRef port;\r
+\r
+                    if (! CHECK_ERROR (CreatorFunctionsToUse::createInputPort (protocol, client, cfName.cfString, input->internal.get(), &port)))\r
+                        continue;\r
+\r
+                    if (! CHECK_ERROR (MIDIPortConnectSource (port, endpoint, nullptr)))\r
+                    {\r
+                        CHECK_ERROR (MIDIPortDispose (port));\r
+                        continue;\r
+                    }\r
+\r
+                    input->internal->portAndEndpoint = std::make_unique<MidiPortAndEndpoint> (port, endpoint);\r
+                    return input;\r
+                }\r
+            }\r
+        }\r
+\r
+        return {};\r
+    }\r
+\r
+    template <typename... Args>\r
+    static std::unique_ptr<MidiInput> createDevice (ump::PacketProtocol protocol,\r
+                                                    const String& deviceName,\r
+                                                    Args&&... args)\r
+    {\r
+        using namespace CoreMidiHelpers;\r
+\r
+        if (auto client = getGlobalMidiClient())\r
+        {\r
+            auto deviceIdentifier = createUniqueIDForMidiPort (deviceName, true);\r
+\r
+            if (auto input = makeInput (deviceName, String (deviceIdentifier), std::forward<Args> (args)...))\r
+            {\r
+                MIDIEndpointRef endpoint;\r
+                ScopedCFString name (deviceName);\r
+\r
+                auto err = CreatorFunctionsToUse::createDestination (protocol, client, name.cfString, input->internal.get(), &endpoint);\r
+\r
+               #if JUCE_IOS\r
+                if (err == kMIDINotPermitted)\r
+                {\r
+                    // If you've hit this assertion then you probably haven't enabled the "Audio Background Capability"\r
+                    // setting in the iOS exporter for your app - this is required if you want to create a MIDI device!\r
+                    jassertfalse;\r
+                    return {};\r
+                }\r
+               #endif\r
+\r
+                if (! CHECK_ERROR (err))\r
+                    return {};\r
+\r
+                if (! CHECK_ERROR (MIDIObjectSetIntegerProperty (endpoint, kMIDIPropertyUniqueID, (SInt32) deviceIdentifier)))\r
+                    return {};\r
+\r
+                input->internal->portAndEndpoint = std::make_unique<MidiPortAndEndpoint> ((MIDIPortRef) 0, endpoint);\r
+                return input;\r
+            }\r
+        }\r
+\r
+        return {};\r
+    }\r
+};\r
+\r
+//==============================================================================\r
+Array<MidiDeviceInfo> MidiInput::getAvailableDevices()\r
+{\r
+    return CoreMidiHelpers::findDevices (true);\r
+}\r
+\r
+MidiDeviceInfo MidiInput::getDefaultDevice()\r
+{\r
+    return getAvailableDevices().getFirst();\r
+}\r
+\r
+std::unique_ptr<MidiInput> MidiInput::openDevice (const String& deviceIdentifier, MidiInputCallback* callback)\r
+{\r
+    if (callback == nullptr)\r
+        return nullptr;\r
+\r
+    return Pimpl::openDevice (ump::PacketProtocol::MIDI_1_0,\r
+                              deviceIdentifier,\r
+                              callback);\r
+}\r
+\r
+std::unique_ptr<MidiInput> MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback)\r
+{\r
+    return Pimpl::createDevice (ump::PacketProtocol::MIDI_1_0,\r
+                                deviceName,\r
+                                callback);\r
+}\r
+\r
+StringArray MidiInput::getDevices()\r
+{\r
+    StringArray deviceNames;\r
+\r
+    for (auto& d : getAvailableDevices())\r
+        deviceNames.add (d.name);\r
+\r
+    return deviceNames;\r
+}\r
+\r
+int MidiInput::getDefaultDeviceIndex()\r
+{\r
+    return 0;\r
+}\r
+\r
+std::unique_ptr<MidiInput> MidiInput::openDevice (int index, MidiInputCallback* callback)\r
+{\r
+    return openDevice (getAvailableDevices()[index].identifier, callback);\r
+}\r
+\r
+MidiInput::MidiInput (const String& deviceName, const String& deviceIdentifier)\r
+    : deviceInfo (deviceName, deviceIdentifier)\r
+{\r
+}\r
+\r
+MidiInput::~MidiInput() = default;\r
+\r
+void MidiInput::start()\r
+{\r
+    const ScopedLock sl (CoreMidiHelpers::callbackLock);\r
+    internal->active = true;\r
+}\r
+\r
+void MidiInput::stop()\r
+{\r
+    const ScopedLock sl (CoreMidiHelpers::callbackLock);\r
+    internal->active = false;\r
+}\r
+\r
+//==============================================================================\r
+class MidiOutput::Pimpl : public CoreMidiHelpers::MidiPortAndEndpoint\r
+{\r
+public:\r
+    using MidiPortAndEndpoint::MidiPortAndEndpoint;\r
+};\r
+\r
+Array<MidiDeviceInfo> MidiOutput::getAvailableDevices()\r
+{\r
+    return CoreMidiHelpers::findDevices (false);\r
+}\r
+\r
+MidiDeviceInfo MidiOutput::getDefaultDevice()\r
+{\r
+    return getAvailableDevices().getFirst();\r
+}\r
+\r
+std::unique_ptr<MidiOutput> MidiOutput::openDevice (const String& deviceIdentifier)\r
+{\r
+    if (deviceIdentifier.isEmpty())\r
+        return {};\r
+\r
+    using namespace CoreMidiHelpers;\r
+\r
+    if (auto client = getGlobalMidiClient())\r
+    {\r
+        for (auto& endpoint : getEndpoints (false))\r
+        {\r
+            auto endpointInfo = getConnectedEndpointInfo (endpoint);\r
+\r
+            if (deviceIdentifier != endpointInfo.identifier)\r
+                continue;\r
+\r
+            ScopedCFString cfName;\r
+\r
+            if (! CHECK_ERROR (MIDIObjectGetStringProperty (endpoint, kMIDIPropertyName, &cfName.cfString)))\r
+                continue;\r
+\r
+            MIDIPortRef port;\r
+\r
+            if (! CHECK_ERROR (MIDIOutputPortCreate (client, cfName.cfString, &port)))\r
+                continue;\r
+\r
+            auto midiOutput = rawToUniquePtr (new MidiOutput (endpointInfo.name, endpointInfo.identifier));\r
+            midiOutput->internal = std::make_unique<Pimpl> (port, endpoint);\r
+\r
+            return midiOutput;\r
+        }\r
+    }\r
+\r
+    return {};\r
+}\r
+\r
+std::unique_ptr<MidiOutput> MidiOutput::createNewDevice (const String& deviceName)\r
+{\r
+    using namespace CoreMidiHelpers;\r
+\r
+    if (auto client = getGlobalMidiClient())\r
+    {\r
+        MIDIEndpointRef endpoint;\r
+\r
+        ScopedCFString name (deviceName);\r
+\r
+        auto err = CreatorFunctionsToUse::createSource (ump::PacketProtocol::MIDI_1_0, client, name.cfString, &endpoint);\r
+\r
+       #if JUCE_IOS\r
+        if (err == kMIDINotPermitted)\r
+        {\r
+            // If you've hit this assertion then you probably haven't enabled the "Audio Background Capability"\r
+            // setting in the iOS exporter for your app - this is required if you want to create a MIDI device!\r
+            jassertfalse;\r
+            return {};\r
+        }\r
+       #endif\r
+\r
+        if (! CHECK_ERROR (err))\r
+            return {};\r
+\r
+        auto deviceIdentifier = createUniqueIDForMidiPort (deviceName, false);\r
+\r
+        if (! CHECK_ERROR (MIDIObjectSetIntegerProperty (endpoint, kMIDIPropertyUniqueID, (SInt32) deviceIdentifier)))\r
+            return {};\r
+\r
+        auto midiOutput = rawToUniquePtr (new MidiOutput (deviceName, String (deviceIdentifier)));\r
+        midiOutput->internal = std::make_unique<Pimpl> ((UInt32) 0, endpoint);\r
+\r
+        return midiOutput;\r
+    }\r
+\r
+    return {};\r
+}\r
+\r
+StringArray MidiOutput::getDevices()\r
+{\r
+    StringArray deviceNames;\r
+\r
+    for (auto& d : getAvailableDevices())\r
+        deviceNames.add (d.name);\r
+\r
+    return deviceNames;\r
+}\r
+\r
+int MidiOutput::getDefaultDeviceIndex()\r
+{\r
+    return 0;\r
+}\r
+\r
+std::unique_ptr<MidiOutput> MidiOutput::openDevice (int index)\r
+{\r
+    return openDevice (getAvailableDevices()[index].identifier);\r
+}\r
+\r
+MidiOutput::~MidiOutput()\r
+{\r
+    stopBackgroundThread();\r
+}\r
+\r
+void MidiOutput::sendMessageNow (const MidiMessage& message)\r
+{\r
+    internal->send (message);\r
+}\r
+\r
+#undef CHECK_ERROR\r
+\r
+} // namespace juce\r
index f05dd460ab09c97d621f2bc461e0f96546557088..4763da2367642e18fe1b63904af44f65ad087e7c 100644 (file)
@@ -26,10 +26,12 @@ set (oboe_sources
     src/fifo/FifoController.cpp
     src/fifo/FifoControllerBase.cpp
     src/fifo/FifoControllerIndirect.cpp
-        src/flowgraph/FlowGraphNode.cpp
+    src/flowgraph/FlowGraphNode.cpp
+    src/flowgraph/ChannelCountConverter.cpp
     src/flowgraph/ClipToRange.cpp
     src/flowgraph/ManyToMultiConverter.cpp
     src/flowgraph/MonoToMultiConverter.cpp
+    src/flowgraph/MultiToMonoConverter.cpp
     src/flowgraph/RampLinear.cpp
     src/flowgraph/SampleRateConverter.cpp
     src/flowgraph/SinkFloat.cpp
@@ -77,7 +79,7 @@ set_target_properties(oboe PROPERTIES CXX_STANDARD 14 CXX_STANDARD_REQUIRED TRUE
 
 # JUCE CHANGE ENDS HERE
 
-# Enable logging for debug builds
+# Enable logging of D,V for debug builds
 target_compile_definitions(oboe PUBLIC $<$<CONFIG:DEBUG>:OBOE_ENABLE_LOGGING=1>)
 
 target_link_libraries(oboe PRIVATE log OpenSLES)
index a158aafcb64fc133623aaafa1e34d93847152959..c862de6d3e52e7d7af5e0b66b4129ad84cba90e9 100644 (file)
@@ -393,12 +393,25 @@ public:
      * Swap old callback for new callback.
      * This not atomic.
      * This should only be used internally.
-     * @param streamCallback
-     * @return previous streamCallback
+     * @param dataCallback
+     * @return previous dataCallback
      */
-    AudioStreamCallback *swapCallback(AudioStreamCallback *streamCallback) {
-        AudioStreamCallback *previousCallback = mStreamCallback;
-        mStreamCallback = streamCallback;
+    AudioStreamDataCallback *swapDataCallback(AudioStreamDataCallback *dataCallback) {
+        AudioStreamDataCallback *previousCallback = mDataCallback;
+        mDataCallback = dataCallback;
+        return previousCallback;
+    }
+
+    /*
+     * Swap old callback for new callback.
+     * This not atomic.
+     * This should only be used internally.
+     * @param errorCallback
+     * @return previous errorCallback
+     */
+    AudioStreamErrorCallback *swapErrorCallback(AudioStreamErrorCallback *errorCallback) {
+        AudioStreamErrorCallback *previousCallback = mErrorCallback;
+        mErrorCallback = errorCallback;
         return previousCallback;
     }
 
@@ -419,6 +432,13 @@ public:
     ResultWithValue<int32_t> waitForAvailableFrames(int32_t numFrames,
                                                     int64_t timeoutNanoseconds);
 
+    /**
+     * @return last result passed from an error callback
+     */
+    virtual oboe::Result getLastErrorCallbackResult() const {
+        return mErrorCallbackResult;
+    }
+
 protected:
 
     /**
@@ -515,8 +535,10 @@ protected:
 
     std::mutex           mLock; // for synchronizing start/stop/close
 
+    oboe::Result         mErrorCallbackResult = oboe::Result::OK;
 
 private:
+
     // Log the scheduler if it changes.
     void                 checkScheduler();
     int                  mPreviousScheduler = -1;
index 4a6237dfd518b8bc401b78ac71f81351d298aa5f..e0b38aa61dc424d7518cb0aff645238dbb6827d5 100644 (file)
@@ -62,9 +62,14 @@ public:
     int32_t getSampleRate() const { return mSampleRate; }
 
     /**
-     * @return the number of frames in each callback or kUnspecified.
+     * @deprecated use `getFramesPerDataCallback` instead.
      */
-    int32_t getFramesPerCallback() const { return mFramesPerCallback; }
+    int32_t getFramesPerCallback() const { return getFramesPerDataCallback(); }
+
+    /**
+     * @return the number of frames in each data callback or kUnspecified.
+     */
+    int32_t getFramesPerDataCallback() const { return mFramesPerCallback; }
 
     /**
      * @return the audio sample format (e.g. Float or I16)
@@ -100,10 +105,35 @@ public:
     int32_t getDeviceId() const { return mDeviceId; }
 
     /**
-     * @return the callback object for this stream, if set.
+     * For internal use only.
+     * @return the data callback object for this stream, if set.
+     */
+    AudioStreamDataCallback *getDataCallback() const {
+        return mDataCallback;
+    }
+
+    /**
+     * For internal use only.
+     * @return the error callback object for this stream, if set.
+     */
+    AudioStreamErrorCallback *getErrorCallback() const {
+        return mErrorCallback;
+    }
+
+    /**
+     * @return true if a data callback was set for this stream
      */
-    AudioStreamCallback* getCallback() const {
-        return mStreamCallback;
+    bool isDataCallbackSpecified() const {
+        return mDataCallback != nullptr;
+    }
+
+    /**
+     * Note that if the app does not set an error callback then a
+     * default one may be provided.
+     * @return true if an error callback was set for this stream
+     */
+    bool isErrorCallbackSpecified() const {
+        return mErrorCallback != nullptr;
     }
 
     /**
@@ -148,9 +178,12 @@ public:
     }
 
 protected:
+    /** The callback which will be fired when new data is ready to be read/written. **/
+    AudioStreamDataCallback        *mDataCallback = nullptr;
+
+    /** The callback which will be fired when an error or a disconnect occurs. **/
+    AudioStreamErrorCallback       *mErrorCallback = nullptr;
 
-    /** The callback which will be fired when new data is ready to be read/written **/
-    AudioStreamCallback            *mStreamCallback = nullptr;
     /** Number of audio frames which will be requested in each callback */
     int32_t                         mFramesPerCallback = kUnspecified;
     /** Stream channel count */
@@ -195,6 +228,32 @@ protected:
     bool                            mFormatConversionAllowed = false;
     // Control whether and how Oboe can convert sample rates to achieve optimal results.
     SampleRateConversionQuality     mSampleRateConversionQuality = SampleRateConversionQuality::None;
+
+    /** Validate stream parameters that might not be checked in lower layers */
+    virtual Result isValidConfig() {
+        switch (mFormat) {
+            case AudioFormat::Unspecified:
+            case AudioFormat::I16:
+            case AudioFormat::Float:
+                break;
+
+            case AudioFormat::Invalid:
+            default:
+                return Result::ErrorInvalidFormat;
+        }
+
+        switch (mSampleRateConversionQuality) {
+            case SampleRateConversionQuality::None:
+            case SampleRateConversionQuality::Fastest:
+            case SampleRateConversionQuality::Low:
+            case SampleRateConversionQuality::Medium:
+            case SampleRateConversionQuality::High:
+            case SampleRateConversionQuality::Best:
+                return Result::OK;
+            default:
+                return Result::ErrorIllegalArgument;
+        }
+    }
 };
 
 } // namespace oboe
index a1ea0a851ebddb981d3a0b650050e2627aa22a70..de9c60691fafbbf722868b5a93d88b1c101ea40a 100644 (file)
@@ -74,6 +74,13 @@ public:
         return this;
     }
 
+    /**
+     * @deprecated use `setFramesPerDataCallback` instead.
+     */
+    AudioStreamBuilder *setFramesPerCallback(int framesPerCallback) {
+        return setFramesPerDataCallback(framesPerCallback);
+    }
+
     /**
      * Request a specific number of frames for the data callback.
      *
@@ -88,7 +95,7 @@ public:
      * @param framesPerCallback
      * @return pointer to the builder so calls can be chained
      */
-    AudioStreamBuilder *setFramesPerCallback(int framesPerCallback) {
+    AudioStreamBuilder *setFramesPerDataCallback(int framesPerCallback) {
         mFramesPerCallback = framesPerCallback;
         return this;
     }
@@ -198,10 +205,11 @@ public:
 
 
     /**
-     * Set the intended use case for the stream.
+     * Set the intended use case for an output stream.
      *
      * The system will use this information to optimize the behavior of the stream.
      * This could, for example, affect how volume and focus is handled for the stream.
+     * The usage is ignored for input streams.
      *
      * The default, if you do not call this function, is Usage::Media.
      *
@@ -215,10 +223,11 @@ public:
     }
 
     /**
-     * Set the type of audio data that the stream will carry.
+     * Set the type of audio data that an output stream will carry.
      *
      * The system will use this information to optimize the behavior of the stream.
      * This could, for example, affect whether a stream is paused when a notification occurs.
+     * The contentType is ignored for input streams.
      *
      * The default, if you do not call this function, is ContentType::Music.
      *
@@ -303,9 +312,45 @@ public:
         return this;
     }
 
+    /**
+     * Specifies an object to handle data related callbacks from the underlying API.
+     *
+     * <strong>Important: See AudioStreamCallback for restrictions on what may be called
+     * from the callback methods.</strong>
+     *
+     * @param dataCallback
+     * @return pointer to the builder so calls can be chained
+     */
+    AudioStreamBuilder *setDataCallback(oboe::AudioStreamDataCallback *dataCallback) {
+        mDataCallback = dataCallback;
+        return this;
+    }
+
+    /**
+     * Specifies an object to handle error related callbacks from the underlying API.
+     * This can occur when a stream is disconnected because a headset is plugged in or unplugged.
+     * It can also occur if the audio service fails or if an exclusive stream is stolen by
+     * another stream.
+     *
+     * <strong>Important: See AudioStreamCallback for restrictions on what may be called
+     * from the callback methods.</strong>
+     *
+     * <strong>When an error callback occurs, the associated stream must be stopped and closed
+     * in a separate thread.</strong>
+     *
+     * @param errorCallback
+     * @return pointer to the builder so calls can be chained
+     */
+    AudioStreamBuilder *setErrorCallback(oboe::AudioStreamErrorCallback *errorCallback) {
+        mErrorCallback = errorCallback;
+        return this;
+    }
+
     /**
      * Specifies an object to handle data or error related callbacks from the underlying API.
      *
+     * This is the equivalent of calling both setDataCallback() and setErrorCallback().
+     *
      * <strong>Important: See AudioStreamCallback for restrictions on what may be called
      * from the callback methods.</strong>
      *
@@ -325,7 +370,9 @@ public:
      * @return pointer to the builder so calls can be chained
      */
     AudioStreamBuilder *setCallback(AudioStreamCallback *streamCallback) {
-        mStreamCallback = streamCallback;
+        // Use the same callback object for both, dual inheritance.
+        mDataCallback = streamCallback;
+        mErrorCallback = streamCallback;
         return this;
     }
 
index f427693e30f969e44e9f62b7cdecaf9ce1382703..915c3d71b2be870d14c8ac11629c0d0ef53d22a4 100644 (file)
@@ -24,15 +24,16 @@ namespace oboe {
 class AudioStream;
 
 /**
- * AudioStreamCallback defines a callback interface for:
- *
- * 1) moving data to/from an audio stream using `onAudioReady`
+ * AudioStreamDataCallback defines a callback interface for
+ * moving data to/from an audio stream using `onAudioReady`
  * 2) being alerted when a stream has an error using `onError*` methods
  *
+ * It is used with AudioStreamBuilder::setDataCallback().
  */
-class AudioStreamCallback {
+
+class AudioStreamDataCallback {
 public:
-    virtual ~AudioStreamCallback() = default;
+    virtual ~AudioStreamDataCallback() = default;
 
     /**
      * A buffer is ready for processing.
@@ -75,21 +76,64 @@ public:
      * If you need to move data, eg. MIDI commands, in or out of the callback function then
      * we recommend the use of non-blocking techniques such as an atomic FIFO.
      *
-     * @param oboeStream pointer to the associated stream
+     * @param audioStream pointer to the associated stream
      * @param audioData buffer containing input data or a place to put output data
      * @param numFrames number of frames to be processed
      * @return DataCallbackResult::Continue or DataCallbackResult::Stop
      */
     virtual DataCallbackResult onAudioReady(
-            AudioStream *oboeStream,
+            AudioStream *audioStream,
             void *audioData,
             int32_t numFrames) = 0;
+};
+
+/**
+ * AudioStreamErrorCallback defines a callback interface for
+ * being alerted when a stream has an error or is disconnected
+ * using `onError*` methods.
+ *
+ * It is used with AudioStreamBuilder::setErrorCallback().
+ */
+class AudioStreamErrorCallback {
+public:
+    virtual ~AudioStreamErrorCallback() = default;
+
+    /**
+     * This will be called before other `onError` methods when an error occurs on a stream,
+     * such as when the stream is disconnected.
+     *
+     * It can be used to override and customize the normal error processing.
+     * Use of this method is considered an advanced technique.
+     * It might, for example, be used if an app want to use a high level lock when
+     * closing and reopening a stream.
+     * Or it might be used when an app want to signal a management thread that handles
+     * all of the stream state.
+     *
+     * If this method returns false it indicates that the stream has *not been stopped and closed
+     * by the application. In this case it will be stopped by Oboe in the following way:
+     * onErrorBeforeClose() will be called, then the stream will be closed and onErrorAfterClose()
+     * will be closed.
+     *
+     * If this method returns true it indicates that the stream *has* been stopped and closed
+     * by the application and Oboe will not do this.
+     * In that case, the app MUST stop() and close() the stream.
+     *
+     * This method will be called on a thread created by Oboe.
+     *
+     * @param audioStream pointer to the associated stream
+     * @param error
+     * @return true if the stream has been stopped and closed, false if not
+     */
+    virtual bool onError(AudioStream* /* audioStream */, Result /* error */) {
+        return false;
+    }
 
     /**
-     * This will be called when an error occurs on a stream or when the stream is disconnected.
+     * This will be called when an error occurs on a stream,
+     * such as when the stream is disconnected,
+     * and if onError() returns false (indicating that the error has not already been handled).
      *
-     * Note that this will be called on a different thread than the onAudioReady() thread.
-     * This thread will be created by Oboe.
+     * Note that this will be called on a thread created by Oboe.
      *
      * The underlying stream will already be stopped by Oboe but not yet closed.
      * So the stream can be queried.
@@ -97,27 +141,49 @@ public:
      * Do not close or delete the stream in this method because it will be
      * closed after this method returns.
      *
-     * @param oboeStream pointer to the associated stream
+     * @param audioStream pointer to the associated stream
      * @param error
      */
-    virtual void onErrorBeforeClose(AudioStream* /* oboeStream */, Result /* error */) {}
+    virtual void onErrorBeforeClose(AudioStream* /* audioStream */, Result /* error */) {}
 
     /**
-     * This will be called when an error occurs on a stream or when the stream is disconnected.
+     * This will be called when an error occurs on a stream,
+     * such as when the stream is disconnected,
+     * and if onError() returns false (indicating that the error has not already been handled).
+     *
      * The underlying AAudio or OpenSL ES stream will already be stopped AND closed by Oboe.
      * So the underlying stream cannot be referenced.
      * But you can still query most parameters.
      *
      * This callback could be used to reopen a new stream on another device.
-     * You can safely delete the old AudioStream in this method.
      *
-     * @param oboeStream pointer to the associated stream
+     * @param audioStream pointer to the associated stream
      * @param error
      */
-    virtual void onErrorAfterClose(AudioStream* /* oboeStream */, Result /* error */) {}
+    virtual void onErrorAfterClose(AudioStream* /* audioStream */, Result /* error */) {}
 
 };
 
+/**
+ * AudioStreamCallback defines a callback interface for:
+ *
+ * 1) moving data to/from an audio stream using `onAudioReady`
+ * 2) being alerted when a stream has an error using `onError*` methods
+ *
+ * It is used with AudioStreamBuilder::setCallback().
+ *
+ * It combines the interfaces defined by AudioStreamDataCallback and AudioStreamErrorCallback.
+ * This was the original callback object. We now recommend using the individual interfaces
+ * and using setDataCallback() and setErrorCallback().
+ *
+ * @deprecated Use `AudioStreamDataCallback` and `AudioStreamErrorCallback` instead
+ */
+class AudioStreamCallback : public AudioStreamDataCallback,
+                            public AudioStreamErrorCallback {
+public:
+    virtual ~AudioStreamCallback() = default;
+};
+
 } // namespace oboe
 
 #endif //OBOE_STREAM_CALLBACK_H
index df472f56d781d481842511c1bfae737dc7c56162..8b8404d943778edafd996cddfc4455e9dd6d519d 100644 (file)
@@ -54,7 +54,7 @@ public:
      * @param stream the stream who's latency will be tuned
      * @param the maximum buffer size which the tune() operation will set the buffer size to
      */
-     explicit LatencyTuner(AudioStream &stream, int32_t maximumBufferSize);
+    explicit LatencyTuner(AudioStream &stream, int32_t maximumBufferSize);
 
     /**
      * Adjust the bufferSizeInFrames to optimize latency.
@@ -81,8 +81,37 @@ public:
      * was specified when constructing the LatencyTuner then the value of
      * stream->getBufferCapacityInFrames is used
      */
-     bool isAtMaximumBufferSize();
+    bool isAtMaximumBufferSize();
 
+    /**
+     * Set the minimum bufferSize in frames that is used when the tuner is reset.
+     * You may wish to call requestReset() after calling this.
+     * @param bufferSize
+     */
+    void setMinimumBufferSize(int32_t bufferSize) {
+        mMinimumBufferSize = bufferSize;
+    }
+
+    int32_t getMinimumBufferSize() const {
+        return mMinimumBufferSize;
+    }
+
+    /**
+     * Set the amount the bufferSize will be incremented while tuning.
+     * By default, this will be one burst.
+     *
+     * Note that AAudio will quantize the buffer size to a multiple of the burstSize.
+     * So the final buffer sizes may not be a multiple of this increment.
+     *
+     * @param sizeIncrement
+     */
+    void setBufferSizeIncrement(int32_t sizeIncrement) {
+        mBufferSizeIncrement = sizeIncrement;
+    }
+
+    int32_t getBufferSizeIncrement() const {
+        return mBufferSizeIncrement;
+    }
 
 private:
 
@@ -103,12 +132,15 @@ private:
 
     // arbitrary number of calls to wait before bumping up the latency
     static constexpr int32_t kIdleCount = 8;
+    static constexpr int32_t kDefaultNumBursts = 2;
 
     AudioStream           &mStream;
     State                 mState = State::Idle;
     int32_t               mMaxBufferSize = 0;
     int32_t               mPreviousXRuns = 0;
     int32_t               mIdleCountDown = 0;
+    int32_t               mMinimumBufferSize;
+    int32_t               mBufferSizeIncrement;
     std::atomic<int32_t>  mLatencyTriggerRequests{0}; // TODO user atomic requester from AAudio
     std::atomic<int32_t>  mLatencyTriggerResponses{0};
 };
index bdc12e4a76de3eb358de17a986083ebab8bbc5ca..fac42d4c9e657ca97153ad2581e70f1ec4c57c64 100644 (file)
 #define OBOE_VERSION_MAJOR 1
 
 // Type: 8-bit unsigned int. Min value: 0 Max value: 255. See below for description.
-#define OBOE_VERSION_MINOR 4
+#define OBOE_VERSION_MINOR 5
 
 // Type: 16-bit unsigned int. Min value: 0 Max value: 65535. See below for description.
-#define OBOE_VERSION_PATCH 2
+#define OBOE_VERSION_PATCH 0
 
 #define OBOE_STRINGIFY(x) #x
 #define OBOE_TOSTRING(x) OBOE_STRINGIFY(x)
index 52d85b9baa07349f3b76bffdb93ad714124c3d26..cb8176233a31751e0e850b880e3f67302ff1d954 100644 (file)
@@ -62,14 +62,16 @@ static aaudio_data_callback_result_t oboe_aaudio_data_callback_proc(
 static void oboe_aaudio_error_thread_proc(AudioStreamAAudio *oboeStream,
                                           Result error) {
     LOGD("%s() - entering >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", __func__);
-    oboeStream->requestStop();
-    if (oboeStream->getCallback() != nullptr) {
-        oboeStream->getCallback()->onErrorBeforeClose(oboeStream, error);
-    }
-    oboeStream->close();
-    if (oboeStream->getCallback() != nullptr) {
+    AudioStreamErrorCallback *errorCallback = oboeStream->getErrorCallback();
+    if (errorCallback == nullptr) return; // should be impossible
+    bool isErrorHandled = errorCallback->onError(oboeStream, error);
+
+    if (!isErrorHandled) {
+        oboeStream->requestStop();
+        errorCallback->onErrorBeforeClose(oboeStream, error);
+        oboeStream->close();
         // Warning, oboeStream may get deleted by this callback.
-        oboeStream->getCallback()->onErrorAfterClose(oboeStream, error);
+        errorCallback->onErrorAfterClose(oboeStream, error);
     }
     LOGD("%s() - exiting <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<", __func__);
 }
@@ -92,7 +94,7 @@ AudioStreamAAudio::AudioStreamAAudio(const AudioStreamBuilder &builder)
     : AudioStream(builder)
     , mAAudioStream(nullptr) {
     mCallbackThreadEnabled.store(false);
-    isSupported();
+    mLibLoader = AAudioLoader::getInstance();
 }
 
 bool AudioStreamAAudio::isSupported() {
@@ -101,16 +103,29 @@ bool AudioStreamAAudio::isSupported() {
     return openResult == 0;
 }
 
-// Static 'C' wrapper for the error callback method.
+// Static method for the error callback.
+// We use a method so we can access protected methods on the stream.
 // Launch a thread to handle the error.
 // That other thread can safely stop, close and delete the stream.
 void AudioStreamAAudio::internalErrorCallback(
         AAudioStream *stream,
         void *userData,
         aaudio_result_t error) {
+    oboe::Result oboeResult = static_cast<Result>(error);
     AudioStreamAAudio *oboeStream = reinterpret_cast<AudioStreamAAudio*>(userData);
 
-    // Prevents deletion of the stream if the app is using AudioStreamBuilder::openSharedStream()
+    // Coerce the error code if needed to workaround a regression in RQ1A that caused
+    // the wrong code to be passed when headsets plugged in. See b/173928197.
+    if (OboeGlobals::areWorkaroundsEnabled()
+            && getSdkVersion() == __ANDROID_API_R__
+            && oboeResult == oboe::Result::ErrorTimeout) {
+        oboeResult = oboe::Result::ErrorDisconnected;
+        LOGD("%s() ErrorTimeout changed to ErrorDisconnected to fix b/173928197", __func__);
+    }
+
+    oboeStream->mErrorCallbackResult = oboeResult;
+
+    // Prevents deletion of the stream if the app is using AudioStreamBuilder::openStream(shared_ptr)
     std::shared_ptr<AudioStream> sharedStream = oboeStream->lockWeakThis();
 
     // These checks should be enough because we assume that the stream close()
@@ -118,16 +133,14 @@ void AudioStreamAAudio::internalErrorCallback(
     if (oboeStream->wasErrorCallbackCalled()) { // block extra error callbacks
         LOGE("%s() multiple error callbacks called!", __func__);
     } else if (stream != oboeStream->getUnderlyingStream()) {
-        LOGW("%s() stream already closed", __func__); // can happen if there are bugs
+        LOGW("%s() stream already closed or closing", __func__); // might happen if there are bugs
     } else if (sharedStream) {
         // Handle error on a separate thread using shared pointer.
-        std::thread t(oboe_aaudio_error_thread_proc_shared, sharedStream,
-                      static_cast<Result>(error));
+        std::thread t(oboe_aaudio_error_thread_proc_shared, sharedStream, oboeResult);
         t.detach();
     } else {
         // Handle error on a separate thread.
-        std::thread t(oboe_aaudio_error_thread_proc, oboeStream,
-                      static_cast<Result>(error));
+        std::thread t(oboe_aaudio_error_thread_proc, oboeStream, oboeResult);
         t.detach();
     }
 }
@@ -213,8 +226,13 @@ Result AudioStreamAAudio::open() {
     }
 
     if (mLibLoader->builder_setInputPreset != nullptr) {
+        aaudio_input_preset_t inputPreset = mInputPreset;
+        if (getSdkVersion() <= __ANDROID_API_P__ && inputPreset == InputPreset::VoicePerformance) {
+            LOGD("InputPreset::VoicePerformance not supported before Q. Using VoiceRecognition.");
+            inputPreset = InputPreset::VoiceRecognition; // most similar preset
+        }
         mLibLoader->builder_setInputPreset(aaudioBuilder,
-                                           static_cast<aaudio_input_preset_t>(mInputPreset));
+                                           static_cast<aaudio_input_preset_t>(inputPreset));
     }
 
     if (mLibLoader->builder_setSessionId != nullptr) {
@@ -224,13 +242,19 @@ Result AudioStreamAAudio::open() {
 
     // TODO get more parameters from the builder?
 
-    if (mStreamCallback != nullptr) {
+    if (isDataCallbackSpecified()) {
         mLibLoader->builder_setDataCallback(aaudioBuilder, oboe_aaudio_data_callback_proc, this);
-        mLibLoader->builder_setFramesPerDataCallback(aaudioBuilder, getFramesPerCallback());
-        // If the data callback is not being used then the write method will return an error
-        // and the app can stop and close the stream.
+        mLibLoader->builder_setFramesPerDataCallback(aaudioBuilder, getFramesPerDataCallback());
+
+        if (!isErrorCallbackSpecified()) {
+            // The app did not specify a callback so we should specify
+            // our own so the stream gets closed and stopped.
+            mErrorCallback = &mDefaultErrorCallback;
+        }
         mLibLoader->builder_setErrorCallback(aaudioBuilder, internalErrorCallback, this);
     }
+    // Else if the data callback is not being used then the write method will return an error
+    // and the app can stop and close the stream.
 
     // ============= OPEN THE STREAM ================
     {
@@ -239,6 +263,11 @@ Result AudioStreamAAudio::open() {
         mAAudioStream.store(stream);
     }
     if (result != Result::OK) {
+        // Warn developer because ErrorInternal is not very informative.
+        if (result == Result::ErrorInternal && mDirection == Direction::Input) {
+            LOGW("AudioStreamAAudio.open() may have failed due to lack of "
+                 "audio recording permission.");
+        }
         goto error2;
     }
 
@@ -253,7 +282,6 @@ Result AudioStreamAAudio::open() {
     mBufferCapacityInFrames = mLibLoader->stream_getBufferCapacity(mAAudioStream);
     mBufferSizeInFrames = mLibLoader->stream_getBufferSize(mAAudioStream);
 
-
     // These were added in P so we have to check for the function pointer.
     if (mLibLoader->stream_getUsage != nullptr) {
         mUsage = static_cast<Usage>(mLibLoader->stream_getUsage(mAAudioStream));
@@ -282,10 +310,9 @@ error2:
 }
 
 Result AudioStreamAAudio::close() {
-    // The main reason we have this mutex if to prevent a collision between a call
-    // by the application to stop a stream at the same time that an onError callback
-    // is being executed because of a disconnect. The close will delete the stream,
-    // which could otherwise cause the requestStop() to crash.
+    // Prevent two threads from closing the stream at the same time and crashing.
+    // This could occur, for example, if an application called close() at the same
+    // time that an onError callback was being executed because of a disconnect.
     std::lock_guard<std::mutex> lock(mLock);
 
     AudioStream::close();
@@ -293,6 +320,17 @@ Result AudioStreamAAudio::close() {
     // This will delete the AAudio stream object so we need to null out the pointer.
     AAudioStream *stream = mAAudioStream.exchange(nullptr);
     if (stream != nullptr) {
+        if (OboeGlobals::areWorkaroundsEnabled()) {
+            // Make sure we are really stopped. Do it under mLock
+            // so another thread cannot call requestStart() right before the close.
+            requestStop_l(stream);
+            // Sometimes a callback can occur shortly after a stream has been stopped and
+            // even after a close! If the stream has been closed then the callback
+            // can access memory that has been freed. That causes a crash.
+            // This seems to be more likely in Android P or earlier.
+            // But it can also occur in later versions.
+            usleep(kDelayBeforeCloseMillis * 1000);
+        }
         return static_cast<Result>(mLibLoader->stream_close(stream));
     } else {
         return Result::ErrorClosed;
@@ -338,7 +376,7 @@ Result AudioStreamAAudio::requestStart() {
                 return Result::OK;
             }
         }
-        if (mStreamCallback != nullptr) { // Was a callback requested?
+        if (isDataCallbackSpecified()) {
             setDataCallbackEnabled(true);
         }
         return static_cast<Result>(mLibLoader->stream_requestStart(stream));
@@ -385,19 +423,24 @@ Result AudioStreamAAudio::requestStop() {
     std::lock_guard<std::mutex> lock(mLock);
     AAudioStream *stream = mAAudioStream.load();
     if (stream != nullptr) {
-        // Avoid state machine errors in O_MR1.
-        if (getSdkVersion() <= __ANDROID_API_O_MR1__) {
-            StreamState state = static_cast<StreamState>(mLibLoader->stream_getState(stream));
-            if (state == StreamState::Stopping || state == StreamState::Stopped) {
-                return Result::OK;
-            }
-        }
-        return static_cast<Result>(mLibLoader->stream_requestStop(stream));
+        return requestStop_l(stream);
     } else {
         return Result::ErrorClosed;
     }
 }
 
+// Call under mLock
+Result AudioStreamAAudio::requestStop_l(AAudioStream *stream) {
+    // Avoid state machine errors in O_MR1.
+    if (getSdkVersion() <= __ANDROID_API_O_MR1__) {
+        StreamState state = static_cast<StreamState>(mLibLoader->stream_getState(stream));
+        if (state == StreamState::Stopping || state == StreamState::Stopped) {
+            return Result::OK;
+        }
+    }
+    return static_cast<Result>(mLibLoader->stream_requestStop(stream));
+}
+
 ResultWithValue<int32_t>   AudioStreamAAudio::write(const void *buffer,
                                      int32_t numFrames,
                                      int64_t timeoutNanoseconds) {
index 6267328ba2f3e9a8927fcf3c65890e05e1250378..83f4b2fe16030d08af2adc5d2bfb649ff2fd1f48 100644 (file)
@@ -109,13 +109,22 @@ protected:
     void logUnsupportedAttributes();
 
 private:
+    // Must call under mLock. And stream must NOT be nullptr.
+    Result requestStop_l(AAudioStream *stream);
+
+    // Time to sleep in order to prevent a race condition with a callback after a close().
+    // Two milliseconds may be enough but 10 msec is even safer.
+    static constexpr int kDelayBeforeCloseMillis = 10;
 
     std::atomic<bool>    mCallbackThreadEnabled;
 
-    // pointer to the underlying AAudio stream, valid if open, null if closed
+    // pointer to the underlying 'C' AAudio stream, valid if open, null if closed
     std::atomic<AAudioStream *> mAAudioStream{nullptr};
 
     static AAudioLoader *mLibLoader;
+
+    // We may not use this but it is so small that it is not worth allocating dynamically.
+    AudioStreamErrorCallback mDefaultErrorCallback;
 };
 
 } // namespace oboe
index 0180c2264c20c1ea7e8d838b8089b938e0fda179..a19cf8134f836686bd730ea7970ee3db4d939970 100644 (file)
@@ -20,7 +20,7 @@ using namespace oboe;
 using namespace flowgraph;
 
 int32_t AudioSourceCaller::onProcessFixedBlock(uint8_t *buffer, int32_t numBytes) {
-    oboe::AudioStreamCallback *callback = mStream->getCallback();
+    AudioStreamDataCallback *callback = mStream->getDataCallback();
     int32_t result = 0;
     int32_t numFrames = numBytes / mStream->getBytesPerFrame();
     if (callback != nullptr) {
index 7bcd087c2c6f801cf398979af65be8cf63514874..8a9cd452c2c2e795ac949c707293ad1a9afd5e90 100644 (file)
@@ -59,10 +59,10 @@ DataCallbackResult AudioStream::fireDataCallback(void *audioData, int32_t numFra
     }
 
     DataCallbackResult result;
-    if (mStreamCallback == nullptr) {
-        result = onDefaultCallback(audioData, numFrames);
+    if (mDataCallback) {
+        result = mDataCallback->onAudioReady(this, audioData, numFrames);
     } else {
-        result = mStreamCallback->onAudioReady(this, audioData, numFrames);
+        result = onDefaultCallback(audioData, numFrames);
     }
     // On Oreo, we might get called after returning stop.
     // So block that here.
index 9f1e31b512913a88360a2252b4eeee5b10e70f3c..dffcd75e8c652a8636982c1aac3d8744c74aca87 100644 (file)
@@ -80,13 +80,18 @@ AudioStream *AudioStreamBuilder::build() {
 }
 
 bool AudioStreamBuilder::isCompatible(AudioStreamBase &other) {
-    return getSampleRate() == other.getSampleRate()
-           && getFormat() == other.getFormat()
-           && getChannelCount() == other.getChannelCount();
+    return (getSampleRate() == oboe::Unspecified || getSampleRate() == other.getSampleRate())
+           && (getFormat() == (AudioFormat)oboe::Unspecified || getFormat() == other.getFormat())
+           && (getFramesPerDataCallback() == oboe::Unspecified || getFramesPerDataCallback() == other.getFramesPerDataCallback())
+           && (getChannelCount() == oboe::Unspecified || getChannelCount() == other.getChannelCount());
 }
 
 Result AudioStreamBuilder::openStream(AudioStream **streamPP) {
-    Result result = Result::OK;
+    auto result = isValidConfig();
+    if (result != Result::OK) {
+        return result;
+    }
+
     LOGI("%s() %s -------- %s --------",
          __func__, getDirection() == Direction::Input ? "INPUT" : "OUTPUT", getVersionText());
 
@@ -111,7 +116,7 @@ Result AudioStreamBuilder::openStream(AudioStream **streamPP) {
         }
 
         if (isCompatible(*tempStream)) {
-            // Everything matches so we can just use the child stream directly.
+            // The child stream would work as the requested stream so we can just use it directly.
             *streamPP = tempStream;
             return result;
         } else {
@@ -126,6 +131,9 @@ Result AudioStreamBuilder::openStream(AudioStream **streamPP) {
             if (getSampleRate() == oboe::Unspecified) {
                 parentBuilder.setSampleRate(tempStream->getSampleRate());
             }
+            if (getFramesPerDataCallback() == oboe::Unspecified) {
+                parentBuilder.setFramesPerCallback(tempStream->getFramesPerDataCallback());
+            }
 
             // Use childStream in a FilterAudioStream.
             LOGI("%s() create a FilterAudioStream for data conversion.", __func__);
@@ -180,16 +188,24 @@ Result AudioStreamBuilder::openStream(AudioStream **streamPP) {
 
 Result AudioStreamBuilder::openManagedStream(oboe::ManagedStream &stream) {
     stream.reset();
+    auto result = isValidConfig();
+    if (result != Result::OK) {
+        return result;
+    }
     AudioStream *streamptr;
-    auto result = openStream(&streamptr);
+    result = openStream(&streamptr);
     stream.reset(streamptr);
     return result;
 }
 
 Result AudioStreamBuilder::openStream(std::shared_ptr<AudioStream> &sharedStream) {
     sharedStream.reset();
+    auto result = isValidConfig();
+    if (result != Result::OK) {
+        return result;
+    }
     AudioStream *streamptr;
-    auto result = openStream(&streamptr);
+    result = openStream(&streamptr);
     if (result == Result::OK) {
         sharedStream.reset(streamptr);
         // Save a weak_ptr in the stream for use with callbacks.
index c15e92d2531aa63365935156f0fb920e56c3fb93..2829e6f549f864c41968ea3fc7db1c4853bc5487 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <flowgraph/ClipToRange.h>
 #include <flowgraph/MonoToMultiConverter.h>
+#include <flowgraph/MultiToMonoConverter.h>
 #include <flowgraph/RampLinear.h>
 #include <flowgraph/SinkFloat.h>
 #include <flowgraph/SinkI16.h>
@@ -81,34 +82,39 @@ Result DataConversionFlowGraph::configure(AudioStream *sourceStream, AudioStream
     AudioFormat sourceFormat = sourceStream->getFormat();
     int32_t sourceChannelCount = sourceStream->getChannelCount();
     int32_t sourceSampleRate = sourceStream->getSampleRate();
+    int32_t sourceFramesPerCallback = sourceStream->getFramesPerDataCallback();
 
     AudioFormat sinkFormat = sinkStream->getFormat();
     int32_t sinkChannelCount = sinkStream->getChannelCount();
     int32_t sinkSampleRate = sinkStream->getSampleRate();
+    int32_t sinkFramesPerCallback = sinkStream->getFramesPerDataCallback();
 
-    LOGI("%s() flowgraph converts channels: %d to %d, format: %d to %d, rate: %d to %d, qual = %d",
+    LOGI("%s() flowgraph converts channels: %d to %d, format: %d to %d"
+         ", rate: %d to %d, cbsize: %d to %d, qual = %d",
             __func__,
             sourceChannelCount, sinkChannelCount,
             sourceFormat, sinkFormat,
             sourceSampleRate, sinkSampleRate,
+            sourceFramesPerCallback, sinkFramesPerCallback,
             sourceStream->getSampleRateConversionQuality());
 
-    int32_t framesPerCallback = (sourceStream->getFramesPerCallback() == kUnspecified)
-                                ? sourceStream->getFramesPerBurst()
-                                : sourceStream->getFramesPerCallback();
     // Source
-    // If OUTPUT and using a callback then call back to the app using a SourceCaller.
-    // If INPUT and NOT using a callback then read from the child stream using a SourceCaller.
-    if ((sourceStream->getCallback() != nullptr && isOutput)
-        || (sourceStream->getCallback() == nullptr && isInput)) {
+    // IF OUTPUT and using a callback then call back to the app using a SourceCaller.
+    // OR IF INPUT and NOT using a callback then read from the child stream using a SourceCaller.
+    bool isDataCallbackSpecified = sourceStream->isDataCallbackSpecified();
+    if ((isDataCallbackSpecified && isOutput)
+        || (!isDataCallbackSpecified && isInput)) {
+        int32_t actualSourceFramesPerCallback = (sourceFramesPerCallback == kUnspecified)
+                ? sourceStream->getFramesPerBurst()
+                : sourceFramesPerCallback;
         switch (sourceFormat) {
             case AudioFormat::Float:
                 mSourceCaller = std::make_unique<SourceFloatCaller>(sourceChannelCount,
-                                                                    framesPerCallback);
+                                                                    actualSourceFramesPerCallback);
                 break;
             case AudioFormat::I16:
                 mSourceCaller = std::make_unique<SourceI16Caller>(sourceChannelCount,
-                                                                  framesPerCallback);
+                                                                  actualSourceFramesPerCallback);
                 break;
             default:
                 LOGE("%s() Unsupported source caller format = %d", __func__, sourceFormat);
@@ -117,8 +123,8 @@ Result DataConversionFlowGraph::configure(AudioStream *sourceStream, AudioStream
         mSourceCaller->setStream(sourceStream);
         lastOutput = &mSourceCaller->output;
     } else {
-        // If OUTPUT and NOT using a callback then write to the child stream using a BlockWriter.
-        // If INPUT and using a callback then write to the app using a BlockWriter.
+        // IF OUTPUT and NOT using a callback then write to the child stream using a BlockWriter.
+        // OR IF INPUT and using a callback then write to the app using a BlockWriter.
         switch (sourceFormat) {
             case AudioFormat::Float:
                 mSource = std::make_unique<SourceFloat>(sourceChannelCount);
@@ -131,35 +137,61 @@ Result DataConversionFlowGraph::configure(AudioStream *sourceStream, AudioStream
                 return Result::ErrorIllegalArgument;
         }
         if (isInput) {
+            int32_t actualSinkFramesPerCallback = (sinkFramesPerCallback == kUnspecified)
+                    ? sinkStream->getFramesPerBurst()
+                    : sinkFramesPerCallback;
             // The BlockWriter is after the Sink so use the SinkStream size.
-            mBlockWriter.open(framesPerCallback * sinkStream->getBytesPerFrame());
+            mBlockWriter.open(actualSinkFramesPerCallback * sinkStream->getBytesPerFrame());
             mAppBuffer = std::make_unique<uint8_t[]>(
                     kDefaultBufferSize * sinkStream->getBytesPerFrame());
         }
         lastOutput = &mSource->output;
     }
 
+    // If we are going to reduce the number of channels then do it before the
+    // sample rate converter.
+    if (sourceChannelCount > sinkChannelCount) {
+        if (sinkChannelCount == 1) {
+            mMultiToMonoConverter = std::make_unique<MultiToMonoConverter>(sourceChannelCount);
+            lastOutput->connect(&mMultiToMonoConverter->input);
+            lastOutput = &mMultiToMonoConverter->output;
+        } else {
+            mChannelCountConverter = std::make_unique<ChannelCountConverter>(
+                    sourceChannelCount,
+                    sinkChannelCount);
+            lastOutput->connect(&mChannelCountConverter->input);
+            lastOutput = &mChannelCountConverter->output;
+        }
+    }
+
     // Sample Rate conversion
     if (sourceSampleRate != sinkSampleRate) {
-        mResampler.reset(MultiChannelResampler::make(sourceChannelCount,
+        // Create a resampler to do the math.
+        mResampler.reset(MultiChannelResampler::make(lastOutput->getSamplesPerFrame(),
                                                      sourceSampleRate,
                                                      sinkSampleRate,
                                                      convertOboeSRQualityToMCR(
                                                              sourceStream->getSampleRateConversionQuality())));
-        mRateConverter = std::make_unique<SampleRateConverter>(sourceChannelCount,
+        // Make a flowgraph node that uses the resampler.
+        mRateConverter = std::make_unique<SampleRateConverter>(lastOutput->getSamplesPerFrame(),
                                                                *mResampler.get());
         lastOutput->connect(&mRateConverter->input);
         lastOutput = &mRateConverter->output;
     }
 
     // Expand the number of channels if required.
-    if (sourceChannelCount == 1 && sinkChannelCount > 1) {
-        mChannelConverter = std::make_unique<MonoToMultiConverter>(sinkChannelCount);
-        lastOutput->connect(&mChannelConverter->input);
-        lastOutput = &mChannelConverter->output;
-    } else if (sourceChannelCount != sinkChannelCount) {
-        LOGW("%s() Channel reduction not supported.", __func__);
-        return Result::ErrorUnimplemented; // TODO
+    if (sourceChannelCount < sinkChannelCount) {
+        if (sourceChannelCount == 1) {
+            mMonoToMultiConverter = std::make_unique<MonoToMultiConverter>(sinkChannelCount);
+            lastOutput->connect(&mMonoToMultiConverter->input);
+            lastOutput = &mMonoToMultiConverter->output;
+        } else {
+            mChannelCountConverter = std::make_unique<ChannelCountConverter>(
+                    sourceChannelCount,
+                    sinkChannelCount);
+            lastOutput->connect(&mChannelCountConverter->input);
+            lastOutput = &mChannelCountConverter->output;
+        }
     }
 
     // Sink
@@ -176,8 +208,6 @@ Result DataConversionFlowGraph::configure(AudioStream *sourceStream, AudioStream
     }
     lastOutput->connect(&mSink->input);
 
-    mFramePosition = 0;
-
     return Result::OK;
 }
 
@@ -185,8 +215,7 @@ int32_t DataConversionFlowGraph::read(void *buffer, int32_t numFrames, int64_t t
     if (mSourceCaller) {
         mSourceCaller->setTimeoutNanos(timeoutNanos);
     }
-    int32_t numRead = mSink->read(mFramePosition, buffer, numFrames);
-    mFramePosition += numRead;
+    int32_t numRead = mSink->read(buffer, numFrames);
     return numRead;
 }
 
@@ -196,8 +225,7 @@ int32_t DataConversionFlowGraph::write(void *inputBuffer, int32_t numFrames) {
     mSource->setData(inputBuffer, numFrames);
     while (true) {
         // Pull and read some data in app format into a small buffer.
-        int32_t framesRead = mSink->read(mFramePosition, mAppBuffer.get(), flowgraph::kDefaultBufferSize);
-        mFramePosition += framesRead;
+        int32_t framesRead = mSink->read(mAppBuffer.get(), flowgraph::kDefaultBufferSize);
         if (framesRead <= 0) break;
         // Write to a block adapter, which will call the destination whenever it has enough data.
         int32_t bytesRead = mBlockWriter.write(mAppBuffer.get(),
@@ -209,7 +237,7 @@ int32_t DataConversionFlowGraph::write(void *inputBuffer, int32_t numFrames) {
 
 int32_t DataConversionFlowGraph::onProcessFixedBlock(uint8_t *buffer, int32_t numBytes) {
     int32_t numFrames = numBytes / mFilterStream->getBytesPerFrame();
-    mCallbackResult = mFilterStream->getCallback()->onAudioReady(mFilterStream, buffer, numFrames);
+    mCallbackResult = mFilterStream->getDataCallback()->onAudioReady(mFilterStream, buffer, numFrames);
     // TODO handle STOP from callback, process data remaining in the block adapter
     return numBytes;
-}
\ No newline at end of file
+}
index b1d5ebe8bc97c0328120f821ba6db0edcb1b09da..0cde1f353c84aa4dcf320d0073d65e3ecb5397fe 100644 (file)
@@ -21,7 +21,9 @@
 #include <stdint.h>
 #include <sys/types.h>
 
+#include <flowgraph/ChannelCountConverter.h>
 #include <flowgraph/MonoToMultiConverter.h>
+#include <flowgraph/MultiToMonoConverter.h>
 #include <flowgraph/SampleRateConverter.h>
 #include <oboe/Definitions.h>
 #include "AudioSourceCaller.h"
@@ -67,7 +69,9 @@ public:
 private:
     std::unique_ptr<flowgraph::FlowGraphSourceBuffered>    mSource;
     std::unique_ptr<AudioSourceCaller>                 mSourceCaller;
-    std::unique_ptr<flowgraph::MonoToMultiConverter>   mChannelConverter;
+    std::unique_ptr<flowgraph::MonoToMultiConverter>   mMonoToMultiConverter;
+    std::unique_ptr<flowgraph::MultiToMonoConverter>   mMultiToMonoConverter;
+    std::unique_ptr<flowgraph::ChannelCountConverter>  mChannelCountConverter;
     std::unique_ptr<resampler::MultiChannelResampler>  mResampler;
     std::unique_ptr<flowgraph::SampleRateConverter>    mRateConverter;
     std::unique_ptr<flowgraph::FlowGraphSink>              mSink;
@@ -76,8 +80,6 @@ private:
     DataCallbackResult                                 mCallbackResult = DataCallbackResult::Continue;
     AudioStream                                       *mFilterStream = nullptr;
     std::unique_ptr<uint8_t[]>                         mAppBuffer;
-
-    int64_t mFramePosition = 0;
 };
 
 }
index a471583516b01110a111b73f7a71832a1b1beceb..975b03ddd68c07c527684bc49fd42b2146069d10 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <memory>
 
+#include "OboeDebug.h"
 #include "FilterAudioStream.h"
 
 using namespace oboe;
@@ -90,3 +91,16 @@ ResultWithValue<int32_t> FilterAudioStream::read(void *buffer,
     return ResultWithValue<int32_t>::createBasedOnSign(framesRead);
 }
 
+DataCallbackResult FilterAudioStream::onAudioReady(AudioStream *oboeStream,
+                                void *audioData,
+                                int32_t numFrames) {
+    int32_t framesProcessed;
+    if (oboeStream->getDirection() == Direction::Output) {
+        framesProcessed = mFlowGraph->read(audioData, numFrames, 0 /* timeout */);
+    } else {
+        framesProcessed = mFlowGraph->write(audioData, numFrames);
+    }
+    return (framesProcessed < numFrames)
+           ? DataCallbackResult::Stop
+           : mFlowGraph->getDataCallbackResult();
+}
index 3949de77619aadf286cb1f9811ea48169c1828d7..210e9d11da4bf7308ed4dc67db9f4cb29b9ae9b7 100644 (file)
@@ -42,8 +42,11 @@ public:
     : AudioStream(builder)
     , mChildStream(childStream) {
         // Intercept the callback if used.
-        if (builder.getCallback() != nullptr) {
-            mStreamCallback = mChildStream->swapCallback(this);
+        if (builder.isErrorCallbackSpecified()) {
+            mErrorCallback = mChildStream->swapErrorCallback(this);
+        }
+        if (builder.isDataCallbackSpecified()) {
+            mDataCallback = mChildStream->swapDataCallback(this);
         } else {
             const int size = childStream->getFramesPerBurst() * childStream->getBytesPerFrame();
             mBlockingBuffer = std::make_unique<uint8_t[]>(size);
@@ -52,6 +55,7 @@ public:
         // Copy parameters that may not match builder.
         mBufferCapacityInFrames = mChildStream->getBufferCapacityInFrames();
         mPerformanceMode = mChildStream->getPerformanceMode();
+        mInputPreset = mChildStream->getInputPreset();
     }
 
     virtual ~FilterAudioStream() = default;
@@ -175,32 +179,36 @@ public:
 
     DataCallbackResult onAudioReady(AudioStream *oboeStream,
             void *audioData,
-            int32_t numFrames) override {
-        int32_t framesProcessed;
-        if (oboeStream->getDirection() == Direction::Output) {
-            framesProcessed = mFlowGraph->read(audioData, numFrames, 0 /* timeout */);
-        } else {
-            framesProcessed = mFlowGraph->write(audioData, numFrames);
+            int32_t numFrames) override;
+
+    bool onError(AudioStream * audioStream, Result error) override {
+        if (mErrorCallback != nullptr) {
+            return mErrorCallback->onError(this, error);
         }
-        return (framesProcessed < numFrames)
-                ? DataCallbackResult::Stop
-                : mFlowGraph->getDataCallbackResult();
+        return false;
     }
 
     void onErrorBeforeClose(AudioStream *oboeStream, Result error) override {
-        if (mStreamCallback != nullptr) {
-            mStreamCallback->onErrorBeforeClose(this, error);
+        if (mErrorCallback != nullptr) {
+            mErrorCallback->onErrorBeforeClose(this, error);
         }
     }
 
     void onErrorAfterClose(AudioStream *oboeStream, Result error) override {
         // Close this parent stream because the callback will only close the child.
         AudioStream::close();
-        if (mStreamCallback != nullptr) {
-            mStreamCallback->onErrorAfterClose(this, error);
+        if (mErrorCallback != nullptr) {
+            mErrorCallback->onErrorAfterClose(this, error);
         }
     }
 
+    /**
+     * @return last result passed from an error callback
+     */
+    oboe::Result getLastErrorCallbackResult() const override {
+        return mChildStream->getLastErrorCallbackResult();
+    }
+
 private:
 
     std::unique_ptr<AudioStream>             mChildStream; // this stream wraps the child stream
index cce8e18976a35bb4321b05a9f33e7dc42423842d..0ac29750bb4d7eb4a43e2c5105c920ceb67a648a 100644 (file)
 using namespace oboe;
 
 LatencyTuner::LatencyTuner(AudioStream &stream)
-    : LatencyTuner(stream, stream.getBufferCapacityInFrames()){
-    }
+        : LatencyTuner(stream, stream.getBufferCapacityInFrames()) {
+}
 
 LatencyTuner::LatencyTuner(oboe::AudioStream &stream, int32_t maximumBufferSize)
-    : mStream(stream)
-    , mMaxBufferSize(maximumBufferSize) {
-        reset();
+        : mStream(stream)
+        , mMaxBufferSize(maximumBufferSize) {
+    int32_t burstSize = stream.getFramesPerBurst();
+    setMinimumBufferSize(kDefaultNumBursts * burstSize);
+    setBufferSizeIncrement(burstSize);
+    reset();
 }
 
 Result LatencyTuner::tune() {
@@ -55,12 +58,15 @@ Result LatencyTuner::tune() {
             if ((xRunCountResult.value() - mPreviousXRuns) > 0) {
                 mPreviousXRuns = xRunCountResult.value();
                 int32_t oldBufferSize = mStream.getBufferSizeInFrames();
-                int32_t requestedBufferSize = oldBufferSize + mStream.getFramesPerBurst();
+                int32_t requestedBufferSize = oldBufferSize + getBufferSizeIncrement();
 
                 // Do not request more than the maximum buffer size (which was either user-specified
                 // or was from stream->getBufferCapacityInFrames())
                 if (requestedBufferSize > mMaxBufferSize) requestedBufferSize = mMaxBufferSize;
 
+                // Note that this will not allocate more memory. It simply determines
+                // how much of the existing buffer capacity will be used. The size will be
+                // clipped to the bufferCapacity by AAudio.
                 auto setBufferResult = mStream.setBufferSizeInFrames(requestedBufferSize);
                 if (setBufferResult != Result::OK) {
                     result = setBufferResult;
@@ -94,7 +100,7 @@ void LatencyTuner::reset() {
     mState = State::Idle;
     mIdleCountDown = kIdleCount;
     // Set to minimal latency
-    mStream.setBufferSizeInFrames(2 * mStream.getFramesPerBurst());
+    mStream.setBufferSizeInFrames(getMinimumBufferSize());
 }
 
 bool LatencyTuner::isAtMaximumBufferSize() {
index 3df1bc4ac32094f52d97879ee91a5fef7a23559a..aa285de07a749a40911d045db8df52e93f097c58 100644 (file)
 #include <oboe/AudioStreamBuilder.h>
 #include <oboe/Oboe.h>
 
+#include "OboeDebug.h"
 #include "QuirksManager.h"
 
+#ifndef __ANDROID_API_R__
+#define __ANDROID_API_R__ 30
+#endif
+
 using namespace oboe;
 
 int32_t QuirksManager::DeviceQuirks::clipBufferSize(AudioStream &stream,
@@ -51,11 +56,24 @@ int32_t QuirksManager::DeviceQuirks::clipBufferSize(AudioStream &stream,
     return adjustedSize;
 }
 
+bool QuirksManager::DeviceQuirks::isAAudioMMapPossible(const AudioStreamBuilder &builder) const {
+    bool isSampleRateCompatible =
+            builder.getSampleRate() == oboe::Unspecified
+            || builder.getSampleRate() == kCommonNativeRate
+            || builder.getSampleRateConversionQuality() != SampleRateConversionQuality::None;
+    return builder.getPerformanceMode() == PerformanceMode::LowLatency
+            && isSampleRateCompatible
+            && builder.getChannelCount() <= kChannelCountStereo;
+}
+
 class SamsungDeviceQuirks : public  QuirksManager::DeviceQuirks {
 public:
     SamsungDeviceQuirks() {
         std::string arch = getPropertyString("ro.arch");
         isExynos = (arch.rfind("exynos", 0) == 0); // starts with?
+
+        std::string chipname = getPropertyString("ro.hardware.chipname");
+        isExynos9810 = (chipname == "exynos9810");
     }
 
     virtual ~SamsungDeviceQuirks() = default;
@@ -69,12 +87,24 @@ public:
         return kTopMargin;
     }
 
+    // See Oboe issue #824 for more information.
+    bool isMonoMMapActuallyStereo() const override {
+        return isExynos9810; // TODO We can make this version specific if it gets fixed.
+    }
+
+    bool isAAudioMMapPossible(const AudioStreamBuilder &builder) const override {
+        return DeviceQuirks::isAAudioMMapPossible(builder)
+                // Samsung says they use Legacy for Camcorder
+                && builder.getInputPreset() != oboe::InputPreset::Camcorder;
+    }
+
 private:
     // Stay farther away from DSP position on Exynos devices.
     static constexpr int32_t kBottomMarginExynos = 2;
     static constexpr int32_t kBottomMarginOther = 1;
     static constexpr int32_t kTopMargin = 1;
     bool isExynos = false;
+    bool isExynos9810 = false;
 };
 
 QuirksManager::QuirksManager() {
@@ -94,6 +124,28 @@ bool QuirksManager::isConversionNeeded(
     const bool isInput = builder.getDirection() == Direction::Input;
     const bool isFloat = builder.getFormat() == AudioFormat::Float;
 
+    // There are multiple bugs involving using callback with a specified callback size.
+    // Issue #778: O to Q had a problem with Legacy INPUT streams for FLOAT streams
+    // and a specified callback size. It would assert because of a bad buffer size.
+    //
+    // Issue #973: O to R had a problem with Legacy output streams using callback and a specified callback size.
+    // An AudioTrack stream could still be running when the AAudio FixedBlockReader was closed.
+    // Internally b/161914201#comment25
+    //
+    // Issue #983: O to R would glitch if the framesPerCallback was too small.
+    //
+    // Most of these problems were related to Legacy stream. MMAP was OK. But we don't
+    // know if we will get an MMAP stream. So, to be safe, just do the conversion in Oboe.
+    if (OboeGlobals::areWorkaroundsEnabled()
+            && builder.willUseAAudio()
+            && builder.isDataCallbackSpecified()
+            && builder.getFramesPerDataCallback() != 0
+            && getSdkVersion() <= __ANDROID_API_R__) {
+        LOGI("QuirksManager::%s() avoid setFramesPerCallback(n>0)", __func__);
+        childBuilder.setFramesPerCallback(oboe::Unspecified);
+        conversionNeeded = true;
+    }
+
     // If a SAMPLE RATE is specified for low latency then let the native code choose an optimal rate.
     // TODO There may be a problem if the devices supports low latency
     //      at a higher rate than the default.
@@ -115,24 +167,39 @@ bool QuirksManager::isConversionNeeded(
             ) {
         childBuilder.setFormat(AudioFormat::I16); // needed for FAST track
         conversionNeeded = true;
+        LOGI("QuirksManager::%s() forcing internal format to I16 for low latency", __func__);
     }
 
-    // Channel Count
-    if (builder.getChannelCount() != oboe::Unspecified
-            && builder.isChannelConversionAllowed()) {
-        if (OboeGlobals::areWorkaroundsEnabled()
-                && builder.getChannelCount() == 2 // stereo?
-                && isInput
-                && isLowLatency
-                && (!builder.willUseAAudio() && (getSdkVersion() == __ANDROID_API_O__))) {
-            // Workaround for heap size regression in O.
-            // b/66967812 AudioRecord does not allow FAST track for stereo capture in O
-            childBuilder.setChannelCount(1);
-            conversionNeeded = true;
-        }
-        // Note that MMAP does not support mono in 8.1. But that would only matter on Pixel 1
-        // phones and they have almost all been updated to 9.0.
+    // Channel Count conversions
+    if (OboeGlobals::areWorkaroundsEnabled()
+            && builder.isChannelConversionAllowed()
+            && builder.getChannelCount() == kChannelCountStereo
+            && isInput
+            && isLowLatency
+            && (!builder.willUseAAudio() && (getSdkVersion() == __ANDROID_API_O__))
+            ) {
+        // Workaround for heap size regression in O.
+        // b/66967812 AudioRecord does not allow FAST track for stereo capture in O
+        childBuilder.setChannelCount(kChannelCountMono);
+        conversionNeeded = true;
+        LOGI("QuirksManager::%s() using mono internally for low latency on O", __func__);
+    } else if (OboeGlobals::areWorkaroundsEnabled()
+               && builder.getChannelCount() == kChannelCountMono
+               && isInput
+               && mDeviceQuirks->isMonoMMapActuallyStereo()
+               && builder.willUseAAudio()
+               // Note: we might use this workaround on a device that supports
+               // MMAP but will use Legacy for this stream.  But this will only happen
+               // on devices that have the broken mono.
+               && mDeviceQuirks->isAAudioMMapPossible(builder)
+               ) {
+        // Workaround for mono actually running in stereo mode.
+        childBuilder.setChannelCount(kChannelCountStereo); // Use stereo and extract first channel.
+        conversionNeeded = true;
+        LOGI("QuirksManager::%s() using stereo internally to avoid broken mono", __func__);
     }
+    // Note that MMAP does not support mono in 8.1. But that would only matter on Pixel 1
+    // phones and they have almost all been updated to 9.0.
 
     return conversionNeeded;
 }
index a177764cf2740dfb1516c2cb56302e14133e3c68..b4e38ded7e4d07ccb2fb2879206e663a80a6d664 100644 (file)
@@ -91,6 +91,13 @@ public:
             return kDefaultTopMarginInBursts;
         }
 
+        // On some devices, you can open a mono stream but it is actually running in stereo!
+        virtual bool isMonoMMapActuallyStereo() const {
+            return false;
+        }
+
+        virtual bool isAAudioMMapPossible(const AudioStreamBuilder &builder) const;
+
         static constexpr int32_t kDefaultBottomMarginInBursts = 0;
         static constexpr int32_t kDefaultTopMarginInBursts = 0;
 
@@ -98,10 +105,14 @@ public:
         // b/129545119 | AAudio Legacy allows setBufferSizeInFrames too low
         // Fixed in Q
         static constexpr int32_t kLegacyBottomMarginInBursts = 1;
+        static constexpr int32_t kCommonNativeRate = 48000; // very typical native sample rate
     };
 
 private:
 
+    static constexpr int32_t kChannelCountMono = 1;
+    static constexpr int32_t kChannelCountStereo = 2;
+
     std::unique_ptr<DeviceQuirks> mDeviceQuirks{};
 
 };
index dad6c00714d1159f16fd7a6566336fd5b9b6b6b1..c7965f956f1cef5f94eeb6ad768e047180bea29d 100644 (file)
@@ -28,4 +28,4 @@ private:
     static bool mIsTracingSupported;
 };
 
-#endif //OBOE_TRACE_H
+#endif //OBOE_TRACE_H
\ No newline at end of file
index c3acf4763eeedccb79f4e810555e723e887e1634..d38874b53d7126889cf9b3788ad1995b0571e7b1 100644 (file)
@@ -183,7 +183,7 @@ const char *convertToText<AudioStream*>(AudioStream* stream) {
      <<"BufferCapacity: "<<stream->getBufferCapacityInFrames()<<std::endl
      <<"BufferSize: "<<stream->getBufferSizeInFrames()<<std::endl
      <<"FramesPerBurst: "<< stream->getFramesPerBurst()<<std::endl
-     <<"FramesPerCallback: "<<stream->getFramesPerCallback()<<std::endl
+     <<"FramesPerDataCallback: "<<stream->getFramesPerDataCallback()<<std::endl
      <<"SampleRate: "<<stream->getSampleRate()<<std::endl
      <<"ChannelCount: "<<stream->getChannelCount()<<std::endl
      <<"Format: "<<oboe::convertToText(stream->getFormat())<<std::endl
index 8d6b03bbb10c7a36199ff903ae742f0564ff236c..d8314bb8c73c1a042f35c6048938a3326b1b3c48 100644 (file)
  * limitations under the License.
  */
 
-#include <stdint.h>
-#include <time.h>
-#include <memory.h>
-#include <cassert>
 #include <algorithm>
+#include <memory.h>
+#include <stdint.h>
 
-#include "common/OboeDebug.h"
 #include "fifo/FifoControllerBase.h"
 #include "fifo/FifoController.h"
 #include "fifo/FifoControllerIndirect.h"
 #include "fifo/FifoBuffer.h"
-#include "common/AudioClock.h"
 
 namespace oboe {
 
index 80186208e69b7d093fcb174e7a63a0c3801ec82a..6cced2d34ba1ebebbfe68ea54f7a055d6273f01c 100644 (file)
 #ifndef OBOE_FIFOPROCESSOR_H
 #define OBOE_FIFOPROCESSOR_H
 
-#include <unistd.h>
-#include <sys/types.h>
+#include <memory>
+#include <stdint.h>
 
-#include "common/OboeDebug.h"
-#include "FifoControllerBase.h"
 #include "oboe/Definitions.h"
 
+#include "FifoControllerBase.h"
+
 namespace oboe {
 
 class FifoBuffer {
index 5590683ba4bcb087191cd6c197fe683a85e73be0..b2168d138a5b130986e8733edf9eba867ca6ae68 100644 (file)
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-#include <cassert>
-#include <sys/types.h>
+#include <stdint.h>
+
 #include "FifoControllerBase.h"
 #include "FifoController.h"
 
index 6562e6dec2676a70ba1b3da166df649410a5ea88..d3e413e3c9ec6af88bc8bf71c12542595a28e884 100644 (file)
 #ifndef NATIVEOBOE_FIFOCONTROLLER_H
 #define NATIVEOBOE_FIFOCONTROLLER_H
 
-#include <sys/types.h>
-#include "FifoControllerBase.h"
 #include <atomic>
+#include <stdint.h>
+
+#include "FifoControllerBase.h"
 
 namespace oboe {
 
index 6aceea0e81cb5798dc456281d48ff0def919d7e3..d3419475367e7da546eab205ecdf153438ef336f 100644 (file)
  * limitations under the License.
  */
 
-#include "FifoControllerBase.h"
-
-#include <cassert>
-#include <sys/types.h>
 #include <algorithm>
-#include "FifoControllerBase.h"
+#include <cassert>
+#include <stdint.h>
 
-#include "common/OboeDebug.h"
+#include "FifoControllerBase.h"
 
 namespace oboe {
 
index c8041e041bb87dddaefdcd82eb7ed0c20d5de8bc..a4c2b41a5e5ea9adef4e44ae8264a5db9f0cd638 100644 (file)
@@ -18,7 +18,6 @@
 #define NATIVEOBOE_FIFOCONTROLLERBASE_H
 
 #include <stdint.h>
-#include <sys/types.h>
 
 namespace oboe {
 
index f596461fbdb601febd430ec4a663e5feabbe5eb2..78c43399208935e4fcebc4791d03f91cbe07a1ce 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <stdint.h>
 
 #include "FifoControllerIndirect.h"
 
index 216a28b536ef1f468c582428caf1b42b8886a2a5..32f788190446e1d81ce75d22d7646b2ff14d275f 100644 (file)
 #ifndef NATIVEOBOE_FIFOCONTROLLERINDIRECT_H
 #define NATIVEOBOE_FIFOCONTROLLERINDIRECT_H
 
-#include "FifoControllerBase.h"
 #include <atomic>
+#include <stdint.h>
+
+#include "FifoControllerBase.h"
 
 namespace oboe {
 
diff --git a/modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp b/modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.cpp
new file mode 100644 (file)
index 0000000..b56f8b2
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <unistd.h>
+#include "FlowGraphNode.h"
+#include "ChannelCountConverter.h"
+
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
+
+ChannelCountConverter::ChannelCountConverter(
+        int32_t inputChannelCount,
+        int32_t outputChannelCount)
+        : input(*this, inputChannelCount)
+        , output(*this, outputChannelCount) {
+}
+
+ChannelCountConverter::~ChannelCountConverter() { }
+
+int32_t ChannelCountConverter::onProcess(int32_t numFrames) {
+    const float *inputBuffer = input.getBuffer();
+    float *outputBuffer = output.getBuffer();
+    int32_t inputChannelCount = input.getSamplesPerFrame();
+    int32_t outputChannelCount = output.getSamplesPerFrame();
+    for (int i = 0; i < numFrames; i++) {
+        int inputChannel = 0;
+        for (int outputChannel = 0; outputChannel < outputChannelCount; outputChannel++) {
+            // Copy input channels to output channels.
+            // Wrap if we run out of inputs.
+            // Discard if we run out of outputs.
+            outputBuffer[outputChannel] = inputBuffer[inputChannel];
+            inputChannel = (inputChannel == inputChannelCount)
+                    ? 0 : inputChannel + 1;
+        }
+        inputBuffer += inputChannelCount;
+        outputBuffer += outputChannelCount;
+    }
+    return numFrames;
+}
+
diff --git a/modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h b/modules/juce_audio_devices/native/oboe/src/flowgraph/ChannelCountConverter.h
new file mode 100644 (file)
index 0000000..f688d44
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef FLOWGRAPH_CHANNEL_COUNT_CONVERTER_H
+#define FLOWGRAPH_CHANNEL_COUNT_CONVERTER_H
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include "FlowGraphNode.h"
+
+namespace FLOWGRAPH_OUTER_NAMESPACE {
+namespace flowgraph {
+
+/**
+ * Change the number of number of channels without mixing.
+ * When increasing the channel count, duplicate input channels.
+ * When decreasing the channel count, drop input channels.
+ */
+    class ChannelCountConverter : public FlowGraphNode {
+    public:
+        explicit ChannelCountConverter(
+                int32_t inputChannelCount,
+                int32_t outputChannelCount);
+
+        virtual ~ChannelCountConverter();
+
+        int32_t onProcess(int32_t numFrames) override;
+
+        const char *getName() override {
+            return "ChannelCountConverter";
+        }
+
+        FlowGraphPortFloatInput input;
+        FlowGraphPortFloatOutput output;
+    };
+
+} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
+
+#endif //FLOWGRAPH_CHANNEL_COUNT_CONVERTER_H
index d2f8a02acd748dc7a1831fdf42d761b97b87ec2a..c6ad0b0fef4c020a8a9b497e0b4f36ec05cdd7d7 100644 (file)
@@ -19,7 +19,7 @@
 #include "FlowGraphNode.h"
 #include "ClipToRange.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 ClipToRange::ClipToRange(int32_t channelCount)
         : FlowGraphFilter(channelCount) {
index 22b780496e91c271875ad2bf5b406bac357fbcaf..4dc82f6c7617630773192b48882402db66c4a43f 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 // This is 3 dB, (10^(3/20)), to match the maximum headroom in AudioTrack for float data.
@@ -64,5 +65,6 @@ private:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_CLIP_TO_RANGE_H
index bb6ecc9fa4c35f424df8097fb75c6c4c3fb53803..9a62d7d8924401b6d145554238c464cf7428956f 100644 (file)
 #include <sys/types.h>
 #include "FlowGraphNode.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 /***************************************************************************/
-int32_t FlowGraphNode::pullData(int64_t framePosition, int32_t numFrames) {
+int32_t FlowGraphNode::pullData(int32_t numFrames, int64_t callCount) {
     int32_t frameCount = numFrames;
     // Prevent recursion and multiple execution of nodes.
-    if (framePosition <= mLastFramePosition && !mBlockRecursion) {
-        mBlockRecursion = true;  // for cyclic graphs
+    if (callCount > mLastCallCount) {
+        mLastCallCount = callCount;
         if (mDataPulledAutomatically) {
             // Pull from all the upstream nodes.
             for (auto &port : mInputPorts) {
                 // TODO fix bug of leaving unused data in some ports if using multiple AudioSource
-                frameCount = port.get().pullData(framePosition, frameCount);
+                frameCount = port.get().pullData(callCount, frameCount);
             }
         }
         if (frameCount > 0) {
             frameCount = onProcess(frameCount);
         }
-        mLastFramePosition += frameCount;
-        mBlockRecursion = false;
         mLastFrameCount = frameCount;
     } else {
         frameCount = mLastFrameCount;
@@ -60,6 +58,7 @@ void FlowGraphNode::pullReset() {
 
 void FlowGraphNode::reset() {
     mLastFrameCount = 0;
+    mLastCallCount = kInitialCallCount;
 }
 
 /***************************************************************************/
@@ -74,9 +73,9 @@ FlowGraphPortFloat::FlowGraphPortFloat(FlowGraphNode &parent,
 }
 
 /***************************************************************************/
-int32_t FlowGraphPortFloatOutput::pullData(int64_t framePosition, int32_t numFrames) {
+int32_t FlowGraphPortFloatOutput::pullData(int64_t callCount, int32_t numFrames) {
     numFrames = std::min(getFramesPerBuffer(), numFrames);
-    return mContainingNode.pullData(framePosition, numFrames);
+    return mContainingNode.pullData(numFrames, callCount);
 }
 
 void FlowGraphPortFloatOutput::pullReset() {
@@ -93,10 +92,10 @@ void FlowGraphPortFloatOutput::disconnect(FlowGraphPortFloatInput *port) {
 }
 
 /***************************************************************************/
-int32_t FlowGraphPortFloatInput::pullData(int64_t framePosition, int32_t numFrames) {
+int32_t FlowGraphPortFloatInput::pullData(int64_t callCount, int32_t numFrames) {
     return (mConnected == nullptr)
             ? std::min(getFramesPerBuffer(), numFrames)
-            : mConnected->pullData(framePosition, numFrames);
+            : mConnected->pullData(callCount, numFrames);
 }
 void FlowGraphPortFloatInput::pullReset() {
     if (mConnected != nullptr) mConnected->pullReset();
@@ -109,3 +108,7 @@ float *FlowGraphPortFloatInput::getBuffer() {
         return mConnected->getBuffer();
     }
 }
+
+int32_t FlowGraphSink::pullData(int32_t numFrames) {
+    return FlowGraphNode::pullData(numFrames, getLastCallCount() + 1);
+}
index 007131e47c4de6f9ebf40aecbd8d2d265fb5ab1d..acbee565c5b8d8f2f6b0b584d4ed1edf069c54fb 100644 (file)
 
 // Set this to 1 if using it inside the Android framework.
 // This code is kept here so that it can be moved easily between Oboe and AAudio.
+#ifndef FLOWGRAPH_ANDROID_INTERNAL
 #define FLOWGRAPH_ANDROID_INTERNAL 0
-
+#endif
+
+// Set this to a name that will prevent AAudio from calling into Oboe.
+// AAudio and Oboe both use a version of this flowgraph package.
+// There was a problem in the unit tests where AAudio would call a constructor
+// in AAudio and then call a destructor in Oboe! That caused memory corruption.
+// For more details, see Issue #930.
+#ifndef FLOWGRAPH_OUTER_NAMESPACE
+#define FLOWGRAPH_OUTER_NAMESPACE oboe
+#endif
+
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 // Default block size that can be overridden when the FlowGraphPortFloat is created.
@@ -71,15 +83,17 @@ public:
     virtual int32_t onProcess(int32_t numFrames) = 0;
 
     /**
-     * If the framePosition is at or after the last frame position then call onProcess().
+     * If the callCount is at or after the previous callCount then call
+     * pullData on all of the upstreamNodes.
+     * Then call onProcess().
      * This prevents infinite recursion in case of cyclic graphs.
      * It also prevents nodes upstream from a branch from being executed twice.
      *
-     * @param framePosition
+     * @param callCount
      * @param numFrames
      * @return number of frames valid
      */
-    int32_t pullData(int64_t framePosition, int32_t numFrames);
+    int32_t pullData(int32_t numFrames, int64_t callCount);
 
     /**
      * Recursively reset all the nodes in the graph, starting from a Sink.
@@ -118,12 +132,14 @@ public:
         return "FlowGraph";
     }
 
-    int64_t getLastFramePosition() {
-        return mLastFramePosition;
+    int64_t getLastCallCount() {
+        return mLastCallCount;
     }
 
 protected:
-    int64_t  mLastFramePosition = 0;
+
+    static constexpr int64_t  kInitialCallCount = -1;
+    int64_t  mLastCallCount = kInitialCallCount;
 
     std::vector<std::reference_wrapper<FlowGraphPort>> mInputPorts;
 
@@ -148,6 +164,8 @@ public:
             : mContainingNode(parent)
             , mSamplesPerFrame(samplesPerFrame) {
     }
+    
+    virtual ~FlowGraphPort() = default;
 
     // Ports are often declared public. So let's make them non-copyable.
     FlowGraphPort(const FlowGraphPort&) = delete;
@@ -394,8 +412,15 @@ public:
         return numFrames;
     }
 
-    virtual int32_t read(int64_t framePosition, void *data, int32_t numFrames) = 0;
+    virtual int32_t read(void *data, int32_t numFrames) = 0;
 
+protected:
+    /**
+     * Pull data through the graph using this nodes last callCount.
+     * @param numFrames
+     * @return
+     */
+    int32_t pullData(int32_t numFrames);
 };
 
 /***************************************************************************/
@@ -418,5 +443,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif /* FLOWGRAPH_FLOW_GRAPH_NODE_H */
index 879685e87c1439d78d87ae6ae2a849faa08b5d93..4f973bc3ff8e7c219c1214de34d4e190bc01d846 100644 (file)
@@ -18,7 +18,7 @@
 
 #include "ManyToMultiConverter.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 ManyToMultiConverter::ManyToMultiConverter(int32_t channelCount)
         : inputs(channelCount)
index eca4a8ed71de999b1c8186a9fba70c40bbef4244..c60e0704b8fa9cc781896b6521fe78222deb37a3 100644 (file)
@@ -23,6 +23,9 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
+namespace flowgraph {
+
 /**
  * Combine multiple mono inputs into one interleaved multi-channel output.
  */
@@ -46,4 +49,7 @@ public:
 private:
 };
 
+} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
+
 #endif //FLOWGRAPH_MANY_TO_MULTI_CONVERTER_H
index 11cea78883ee2878bd5d7bc4f3d8e5f273e0cedc..bb471a0f199056caac4392bce3fb451bd9420d29 100644 (file)
 #include "FlowGraphNode.h"
 #include "MonoToMultiConverter.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
-MonoToMultiConverter::MonoToMultiConverter(int32_t channelCount)
+MonoToMultiConverter::MonoToMultiConverter(int32_t outputChannelCount)
         : input(*this, 1)
-        , output(*this, channelCount) {
+        , output(*this, outputChannelCount) {
 }
 
 MonoToMultiConverter::~MonoToMultiConverter() { }
index 376f7a37fa80a64b84723517f31ce1b92d34c2f2..9216f1a9ec9bba9bf08bae4cfadf089a413197d0 100644 (file)
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 /**
- * Convert a monophonic stream to a multi-channel stream
+ * Convert a monophonic stream to a multi-channel interleaved stream
  * with the same signal on each channel.
  */
 class MonoToMultiConverter : public FlowGraphNode {
 public:
-    explicit MonoToMultiConverter(int32_t channelCount);
+    explicit MonoToMultiConverter(int32_t outputChannelCount);
 
     virtual ~MonoToMultiConverter();
 
@@ -45,5 +46,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_MONO_TO_MULTI_CONVERTER_H
diff --git a/modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp b/modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.cpp
new file mode 100644 (file)
index 0000000..8e895bf
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <unistd.h>
+#include "FlowGraphNode.h"
+#include "MultiToMonoConverter.h"
+
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
+
+MultiToMonoConverter::MultiToMonoConverter(int32_t inputChannelCount)
+        : input(*this, inputChannelCount)
+        , output(*this, 1) {
+}
+
+MultiToMonoConverter::~MultiToMonoConverter() { }
+
+int32_t MultiToMonoConverter::onProcess(int32_t numFrames) {
+    const float *inputBuffer = input.getBuffer();
+    float *outputBuffer = output.getBuffer();
+    int32_t channelCount = input.getSamplesPerFrame();
+    for (int i = 0; i < numFrames; i++) {
+        // read first channel of multi stream, write many
+        *outputBuffer++ = *inputBuffer;
+        inputBuffer += channelCount;
+    }
+    return numFrames;
+}
+
diff --git a/modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h b/modules/juce_audio_devices/native/oboe/src/flowgraph/MultiToMonoConverter.h
new file mode 100644 (file)
index 0000000..9cb6911
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef FLOWGRAPH_MULTI_TO_MONO_CONVERTER_H
+#define FLOWGRAPH_MULTI_TO_MONO_CONVERTER_H
+
+#include <unistd.h>
+#include <sys/types.h>
+
+#include "FlowGraphNode.h"
+
+namespace FLOWGRAPH_OUTER_NAMESPACE {
+namespace flowgraph {
+
+/**
+ * Convert a multi-channel interleaved stream to a monophonic stream
+ * by extracting channel[0].
+ */
+    class MultiToMonoConverter : public FlowGraphNode {
+    public:
+        explicit MultiToMonoConverter(int32_t inputChannelCount);
+
+        virtual ~MultiToMonoConverter();
+
+        int32_t onProcess(int32_t numFrames) override;
+
+        const char *getName() override {
+            return "MultiToMonoConverter";
+        }
+
+        FlowGraphPortFloatInput input;
+        FlowGraphPortFloatOutput output;
+    };
+
+} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
+
+#endif //FLOWGRAPH_MULTI_TO_MONO_CONVERTER_H
index afef0181cbd71e6d3bac9ee9525bfb6b755026e6..33b2712c806bb26f290b21c03026833318a9481c 100644 (file)
@@ -19,7 +19,7 @@
 #include "FlowGraphNode.h"
 #include "RampLinear.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 RampLinear::RampLinear(int32_t channelCount)
         : FlowGraphFilter(channelCount) {
index f285704c730f0ba19d1bb667e608675db74f5bf1..8d4c546e96266702dfa108ec528bc6febbbfbfb3 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 /**
@@ -92,5 +93,6 @@ private:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_RAMP_LINEAR_H
index 708c684fc3a2d665eaa7d06dbc8949c6de0a4a5c..b1ae4bd82bc68c466c2d416bf61347aaf5ccdd91 100644 (file)
@@ -16,7 +16,7 @@
 
 #include "SampleRateConverter.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 using namespace resampler;
 
 SampleRateConverter::SampleRateConverter(int32_t channelCount, MultiChannelResampler &resampler)
@@ -25,11 +25,17 @@ SampleRateConverter::SampleRateConverter(int32_t channelCount, MultiChannelResam
     setDataPulledAutomatically(false);
 }
 
+void SampleRateConverter::reset() {
+    FlowGraphNode::reset();
+    mInputCursor = kInitialCallCount;
+}
+
 // Return true if there is a sample available.
 bool SampleRateConverter::isInputAvailable() {
+    // If we have consumed all of the input data then go out and get some more.
     if (mInputCursor >= mNumValidInputFrames) {
-        mNumValidInputFrames = input.pullData(mInputFramePosition, input.getFramesPerBuffer());
-        mInputFramePosition += mNumValidInputFrames;
+        mInputCallCount++;
+        mNumValidInputFrames = input.pullData(mInputCallCount, input.getFramesPerBuffer());
         mInputCursor = 0;
     }
     return (mInputCursor < mNumValidInputFrames);
index d940b22b98788ea5f8874e0c8e466871fd5fff2c..534df49aaeb8ac7439ce2ec8fe195953ce2839af 100644 (file)
@@ -23,6 +23,7 @@
 #include "FlowGraphNode.h"
 #include "resampler/MultiChannelResampler.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 class SampleRateConverter : public FlowGraphFilter {
@@ -37,6 +38,8 @@ public:
         return "SampleRateConverter";
     }
 
+    void reset() override;
+
 private:
 
     // Return true if there is a sample available.
@@ -47,10 +50,15 @@ private:
 
     resampler::MultiChannelResampler &mResampler;
 
-    int32_t mInputCursor = 0;
-    int32_t mNumValidInputFrames = 0;
-    int64_t mInputFramePosition = 0; // monotonic counter of input frames used for pullData
+    int32_t mInputCursor = 0;         // offset into the input port buffer
+    int32_t mNumValidInputFrames = 0; // number of valid frames currently in the input port buffer
+    // We need our own callCount for upstream calls because calls occur at a different rate.
+    // This means we cannot have cyclic graphs or merges that contain an SRC.
+    int64_t mInputCallCount = 0;
 
 };
+
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
+
 #endif //OBOE_SAMPLE_RATE_CONVERTER_H
index f830dafd2b373ccf5afda0ff6e940ae61ed27712..e0ac6e9318b963a76fbfdbd6d2fb1fd50609aa81 100644 (file)
 #include "FlowGraphNode.h"
 #include "SinkFloat.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 SinkFloat::SinkFloat(int32_t channelCount)
         : FlowGraphSink(channelCount) {
 }
 
-int32_t SinkFloat::read(int64_t framePosition, void *data, int32_t numFrames) {
+int32_t SinkFloat::read(void *data, int32_t numFrames) {
     // printf("SinkFloat::read(,,%d)\n", numFrames);
     float *floatData = (float *) data;
     int32_t channelCount = input.getSamplesPerFrame();
@@ -33,7 +33,7 @@ int32_t SinkFloat::read(int64_t framePosition, void *data, int32_t numFrames) {
     int32_t framesLeft = numFrames;
     while (framesLeft > 0) {
         // Run the graph and pull data through the input port.
-        int32_t framesPulled = pullData(framePosition, framesLeft);
+        int32_t framesPulled = pullData(framesLeft);
         // printf("SinkFloat::read: framesLeft = %d, framesPulled = %d\n", framesLeft, framesPulled);
         if (framesPulled <= 0) {
             break;
@@ -43,7 +43,6 @@ int32_t SinkFloat::read(int64_t framePosition, void *data, int32_t numFrames) {
         memcpy(floatData, signal, numSamples * sizeof(float));
         floatData += numSamples;
         framesLeft -= framesPulled;
-        framePosition += framesPulled;
     }
     // printf("SinkFloat returning %d\n", numFrames - framesLeft);
     return numFrames - framesLeft;
index b6474d180288f704fb4a44d3802f5df365839945..98d218207cf9a501b042222e1445eec04dd07d85 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 /**
@@ -32,7 +33,7 @@ class SinkFloat : public FlowGraphSink {
 public:
     explicit SinkFloat(int32_t channelCount);
 
-    int32_t read(int64_t framePosition, void *data, int32_t numFrames) override;
+    int32_t read(void *data, int32_t numFrames) override;
 
     const char *getName() override {
         return "SinkFloat";
@@ -40,5 +41,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_SINK_FLOAT_H
index a5904e82faf7f088154b31cf91f1e5e36dfd6387..690431ceb7758f457173bb85dbee921cb761aeb7 100644 (file)
 #include <audio_utils/primitives.h>
 #endif
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 SinkI16::SinkI16(int32_t channelCount)
         : FlowGraphSink(channelCount) {}
 
-int32_t SinkI16::read(int64_t framePosition, void *data, int32_t numFrames) {
+int32_t SinkI16::read(void *data, int32_t numFrames) {
     int16_t *shortData = (int16_t *) data;
     const int32_t channelCount = input.getSamplesPerFrame();
 
     int32_t framesLeft = numFrames;
     while (framesLeft > 0) {
         // Run the graph and pull data through the input port.
-        int32_t framesRead = pullData(framePosition, framesLeft);
+        int32_t framesRead = pullData(framesLeft);
         if (framesRead <= 0) {
             break;
         }
@@ -52,7 +52,6 @@ int32_t SinkI16::read(int64_t framePosition, void *data, int32_t numFrames) {
         }
 #endif
         framesLeft -= framesRead;
-        framePosition += framesRead;
     }
     return numFrames - framesLeft;
 }
index 2cfdfb0cb6f6757761118bb2095c6b484cb8df01..e65ffae59cf6b4b55c46c66561bff100d5a364ec 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 /**
@@ -31,7 +32,7 @@ class SinkI16 : public FlowGraphSink {
 public:
     explicit SinkI16(int32_t channelCount);
 
-    int32_t read(int64_t framePosition, void *data, int32_t numFrames) override;
+    int32_t read(void *data, int32_t numFrames) override;
 
     const char *getName() override {
         return "SinkI16";
@@ -39,5 +40,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_SINK_I16_H
index b944b770b5087d3f3ba79b6f25e7fb8ad5bd5c5a..d4f68b684792ac32aff1862321a85cb2bcbaf2fe 100644 (file)
 #include <audio_utils/primitives.h>
 #endif
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 SinkI24::SinkI24(int32_t channelCount)
         : FlowGraphSink(channelCount) {}
 
-int32_t SinkI24::read(int64_t framePosition, void *data, int32_t numFrames) {
+int32_t SinkI24::read(void *data, int32_t numFrames) {
     uint8_t *byteData = (uint8_t *) data;
     const int32_t channelCount = input.getSamplesPerFrame();
 
     int32_t framesLeft = numFrames;
     while (framesLeft > 0) {
         // Run the graph and pull data through the input port.
-        int32_t framesRead = pullData(framePosition, framesLeft);
+        int32_t framesRead = pullData(framesLeft);
         if (framesRead <= 0) {
             break;
         }
@@ -61,7 +61,6 @@ int32_t SinkI24::read(int64_t framePosition, void *data, int32_t numFrames) {
         }
 #endif
         framesLeft -= framesRead;
-        framePosition += framesRead;
     }
     return numFrames - framesLeft;
 }
index 7477c8d29ae3e1cebb8517be17cf53b2a8c89a0c..116a5790632341e170e0c43387b4c207e1bdea17 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 /**
@@ -32,7 +33,7 @@ class SinkI24 : public FlowGraphSink {
 public:
     explicit SinkI24(int32_t channelCount);
 
-    int32_t read(int64_t framePosition, void *data, int32_t numFrames) override;
+    int32_t read(void *data, int32_t numFrames) override;
 
     const char *getName() override {
         return "SinkI24";
@@ -40,5 +41,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_SINK_I24_H
index f574d842039d4be9084379e3baed0ee8ada5da8a..3161ec18437bfd71370a617d672c62e24f6b3033 100644 (file)
@@ -20,7 +20,7 @@
 #include "FlowGraphNode.h"
 #include "SourceFloat.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 SourceFloat::SourceFloat(int32_t channelCount)
         : FlowGraphSourceBuffered(channelCount) {
index 4de1b41c35a1b3930366186aa018357996d5a318..d191c4c62f9ed7e36cdc47bd22669502aea25a83 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 /**
@@ -39,5 +40,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_SOURCE_FLOAT_H
index 881302390b144b502e16df9952c14e6f2e9fb896..16cd2b3dc835cf0cf4d792ef8a16e91b80e49f36 100644 (file)
@@ -24,7 +24,7 @@
 #include <audio_utils/primitives.h>
 #endif
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 SourceI16::SourceI16(int32_t channelCount)
         : FlowGraphSourceBuffered(channelCount) {
index fe440b2006e0e26c32b088f516d354234f8256fe..3e04c5e5639f6213484edf1dcd7ca54f46466937 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 /**
  * AudioSource that reads a block of pre-defined 16-bit integer data.
@@ -38,5 +39,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_SOURCE_I16_H
index 19758787993b40937c0ea4863cb0b96ce08d6fd5..321f732f19786f3f296417b6d0fce1f29db318df 100644 (file)
@@ -24,7 +24,7 @@
 #include "FlowGraphNode.h"
 #include "SourceI24.h"
 
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
 
 constexpr int kBytesPerI24Packed = 3;
 
index 377953432f02e136ec43c6115668195c328f271b..69044d5264cf40696dbb02bc1e01661d446aca1c 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "FlowGraphNode.h"
 
+namespace FLOWGRAPH_OUTER_NAMESPACE {
 namespace flowgraph {
 
 /**
@@ -39,5 +40,6 @@ public:
 };
 
 } /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
 
 #endif //FLOWGRAPH_SOURCE_I24_H
index 4862ad8a0f432c637422ef43d02960ff4209cadb..163cf7cb194183d5b56c091f9747566b5180b8be 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <cassert>
 #include <math.h>
 #include "IntegerRatio.h"
 #include "PolyphaseResampler.h"
index c7de1185c7e84346d3b08bf0f9488c978ab9996d..52671cd2160351ba9eae730c028f2a669bf28d57 100644 (file)
@@ -25,8 +25,8 @@
 
 namespace resampler {
 /**
- * Resample that is optimized for a reduced ratio of sample rates.
- * All of the coefficients for eacxh possible phase value are precalculated.
+ * Resampler that is optimized for a reduced ratio of sample rates.
+ * All of the coefficients for each possible phase value are pre-calculated.
  */
 class PolyphaseResampler : public MultiChannelResampler {
 public:
index 2dcdc8ec3364ffcbd8074b9a2b1c475f464b9470..c0e29b7cc473fdaf8a589ee5f52d1655ac5fe3dc 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <cassert>
 #include "PolyphaseResamplerMono.h"
 
 using namespace resampler;
index 5c73a8e3ba55b1686e589ff68790db3af29a8da7..e4bef74230598019ea71d406bc88b3696d765553 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <cassert>
 #include "PolyphaseResamplerStereo.h"
 
 using namespace resampler;
index 1084356dec4555f9e266c47c1bdc7c5ccce714a8..37582109cb324d0ae2d6f54d3f3ae20d6a56cce4 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <cassert>
 #include <math.h>
 #include "SincResampler.h"
 
index bde658a4865c5604eb1cb3edae55f26745a5cc3f..ce0030220662c449e2cdfae55db692a9cb60ed42 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <cassert>
 #include <math.h>
 
 #include "SincResamplerStereo.h"
index fcad183bf935603ed40614c73793a6f9afddc047..b07b0ccdda97284efd3c640c41b6ffad9371b5bf 100644 (file)
@@ -36,6 +36,7 @@ static SLuint32 OpenSLES_convertInputPreset(InputPreset oboePreset) {
             openslPreset =  SL_ANDROID_RECORDING_PRESET_CAMCORDER;
             break;
         case InputPreset::VoiceRecognition:
+        case InputPreset::VoicePerformance:
             openslPreset =  SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION;
             break;
         case InputPreset::VoiceCommunication:
@@ -155,14 +156,19 @@ Result AudioInputStreamOpenSLES::open() {
         LOGW("%s() GetInterface(SL_IID_ANDROIDCONFIGURATION) failed with %s",
              __func__, getSLErrStr(result));
     } else {
+        if (getInputPreset() == InputPreset::VoicePerformance) {
+            LOGD("OpenSL ES does not support InputPreset::VoicePerformance. Use VoiceRecognition.");
+            mInputPreset = InputPreset::VoiceRecognition;
+        }
         SLuint32 presetValue = OpenSLES_convertInputPreset(getInputPreset());
         result = (*configItf)->SetConfiguration(configItf,
                                          SL_ANDROID_KEY_RECORDING_PRESET,
                                          &presetValue,
                                          sizeof(SLuint32));
         if (SL_RESULT_SUCCESS != result
-            && presetValue != SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION) {
+                && presetValue != SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION) {
             presetValue = SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION;
+            LOGD("Setting InputPreset %d failed. Using VoiceRecognition instead.", getInputPreset());
             mInputPreset = InputPreset::VoiceRecognition;
             (*configItf)->SetConfiguration(configItf,
                                              SL_ANDROID_KEY_RECORDING_PRESET,
@@ -214,19 +220,16 @@ error:
 
 Result AudioInputStreamOpenSLES::close() {
     LOGD("AudioInputStreamOpenSLES::%s()", __func__);
-    mLock.lock();
+    std::lock_guard<std::mutex> lock(mLock);
     Result result = Result::OK;
     if (getState() == StreamState::Closed){
         result = Result::ErrorClosed;
     } else {
-        mLock.unlock(); // avoid recursive lock
-        requestStop();
-        mLock.lock();
+        requestStop_l();
         // invalidate any interfaces
         mRecordInterface = nullptr;
-        result = AudioStreamOpenSLES::close();
+        result = AudioStreamOpenSLES::close_l();
     }
-    mLock.unlock(); // avoid recursive lock
     return result;
 }
 
@@ -294,8 +297,12 @@ Result AudioInputStreamOpenSLES::requestFlush() {
 
 Result AudioInputStreamOpenSLES::requestStop() {
     LOGD("AudioInputStreamOpenSLES(): %s() called", __func__);
-
     std::lock_guard<std::mutex> lock(mLock);
+    return requestStop_l();
+}
+
+// Call under mLock
+Result AudioInputStreamOpenSLES::requestStop_l() {
     StreamState initialState = getState();
     switch (initialState) {
         case StreamState::Stopping:
index 7be1c96d772e61d128f7311f2802672f872ead47..08e7a056464dcfa644d4f7c9851d9b5b51c8d014 100644 (file)
@@ -46,6 +46,7 @@ public:
     Result requestStop() override;
 
 protected:
+    Result requestStop_l();
 
     Result updateServiceFrameCounter() override;
 
index cdb888327f10aba3747af1492487e387bc1143fb..5791b5ec59dec1b0cbca73688a9da1bcf089f78c 100644 (file)
@@ -243,19 +243,17 @@ Result AudioOutputStreamOpenSLES::onAfterDestroy() {
 }
 
 Result AudioOutputStreamOpenSLES::close() {
-    mLock.lock();
+    LOGD("AudioOutputStreamOpenSLES::%s()", __func__);
+    std::lock_guard<std::mutex> lock(mLock);
     Result result = Result::OK;
     if (getState() == StreamState::Closed){
         result = Result::ErrorClosed;
     } else {
-        mLock.unlock(); // avoid recursive lock
-        requestPause();
-        mLock.lock();
+        requestPause_l();
         // invalidate any interfaces
         mPlayInterface = nullptr;
-        result = AudioStreamOpenSLES::close();
+        result = AudioStreamOpenSLES::close_l();
     }
-    mLock.unlock(); // avoid recursive lock
     return result;
 }
 
@@ -317,8 +315,12 @@ Result AudioOutputStreamOpenSLES::requestStart() {
 
 Result AudioOutputStreamOpenSLES::requestPause() {
     LOGD("AudioOutputStreamOpenSLES(): %s() called", __func__);
-
     std::lock_guard<std::mutex> lock(mLock);
+    return requestPause_l();
+}
+
+// Call under mLock
+Result AudioOutputStreamOpenSLES::requestPause_l() {
     StreamState initialState = getState();
     switch (initialState) {
         case StreamState::Pausing:
@@ -374,8 +376,8 @@ Result AudioOutputStreamOpenSLES::requestFlush_l() {
 
 Result AudioOutputStreamOpenSLES::requestStop() {
     LOGD("AudioOutputStreamOpenSLES(): %s() called", __func__);
-
     std::lock_guard<std::mutex> lock(mLock);
+
     StreamState initialState = getState();
     switch (initialState) {
         case StreamState::Stopping:
index d74faf67cf561c9f0ca41c4d4efaa1e3faf85533..ed11eb9b9d548dbdb1616bcd8225b6c03e3f47d7 100644 (file)
@@ -45,6 +45,7 @@ public:
     Result requestStop() override;
 
 protected:
+    Result requestPause_l();
 
     void setFramesRead(int64_t framesRead);
 
index 85b9f8e4a52c66284861dec25a43e3f398c73096..298c1eb8115c83160cc5f2bd25e0a538ab8f6646 100644 (file)
@@ -110,12 +110,22 @@ int64_t AudioStreamBuffered::predictNextCallbackTime() {
 
 // Common code for read/write.
 // @return Result::OK with frames read/written, or Result::Error*
-ResultWithValue<int32_t> AudioStreamBuffered::transfer(void *buffer,
-                                      int32_t numFrames,
-                                      int64_t timeoutNanoseconds) {
+ResultWithValue<int32_t> AudioStreamBuffered::transfer(
+        void *readBuffer,
+        const void *writeBuffer,
+        int32_t numFrames,
+        int64_t timeoutNanoseconds) {
     // Validate arguments.
-    if (buffer == nullptr) {
-        LOGE("AudioStreamBuffered::%s(): buffer is NULL", __func__);
+    if (readBuffer != nullptr && writeBuffer != nullptr) {
+        LOGE("AudioStreamBuffered::%s(): both buffers are not NULL", __func__);
+        return ResultWithValue<int32_t>(Result::ErrorInternal);
+    }
+    if (getDirection() == Direction::Input && readBuffer == nullptr) {
+        LOGE("AudioStreamBuffered::%s(): readBuffer is NULL", __func__);
+        return ResultWithValue<int32_t>(Result::ErrorNull);
+    }
+    if (getDirection() == Direction::Output && writeBuffer == nullptr) {
+        LOGE("AudioStreamBuffered::%s(): writeBuffer is NULL", __func__);
         return ResultWithValue<int32_t>(Result::ErrorNull);
     }
     if (numFrames < 0) {
@@ -130,7 +140,8 @@ ResultWithValue<int32_t> AudioStreamBuffered::transfer(void *buffer,
     }
 
     int32_t result = 0;
-    uint8_t *data = reinterpret_cast<uint8_t *>(buffer);
+    uint8_t *readData = reinterpret_cast<uint8_t *>(readBuffer);
+    const uint8_t *writeData = reinterpret_cast<const uint8_t *>(writeBuffer);
     int32_t framesLeft = numFrames;
     int64_t timeToQuit = 0;
     bool repeat = true;
@@ -144,18 +155,22 @@ ResultWithValue<int32_t> AudioStreamBuffered::transfer(void *buffer,
     do {
         // read or write
         if (getDirection() == Direction::Input) {
-            result = mFifoBuffer->read(data, framesLeft);
+            result = mFifoBuffer->read(readData, framesLeft);
+            if (result > 0) {
+                readData += mFifoBuffer->convertFramesToBytes(result);
+                framesLeft -= result;
+            }
         } else {
             // between zero and capacity
             uint32_t fullFrames = mFifoBuffer->getFullFramesAvailable();
             // Do not write above threshold size.
             int32_t emptyFrames = getBufferSizeInFrames() - static_cast<int32_t>(fullFrames);
             int32_t framesToWrite = std::max(0, std::min(framesLeft, emptyFrames));
-            result = mFifoBuffer->write(data, framesToWrite);
-        }
-        if (result > 0) {
-            data += mFifoBuffer->convertFramesToBytes(result);
-            framesLeft -= result;
+            result = mFifoBuffer->write(writeData, framesToWrite);
+            if (result > 0) {
+                writeData += mFifoBuffer->convertFramesToBytes(result);
+                framesLeft -= result;
+            }
         }
 
         // If we need more data then sleep and try again.
@@ -211,8 +226,9 @@ ResultWithValue<int32_t> AudioStreamBuffered::write(const void *buffer,
     if (getDirection() == Direction::Input) {
         return ResultWithValue<int32_t>(Result::ErrorUnavailable); // TODO review, better error code?
     }
-    updateServiceFrameCounter();
-    return transfer(const_cast<void *>(buffer), numFrames, timeoutNanoseconds);
+    Result result = updateServiceFrameCounter();
+    if (result != Result::OK) return ResultWithValue<int32_t>(static_cast<Result>(result));
+    return transfer(nullptr, buffer, numFrames, timeoutNanoseconds);
 }
 
 // Read data from the FIFO that was written by the callback.
@@ -226,8 +242,9 @@ ResultWithValue<int32_t> AudioStreamBuffered::read(void *buffer,
     if (getDirection() == Direction::Output) {
         return ResultWithValue<int32_t>(Result::ErrorUnavailable); // TODO review, better error code?
     }
-    updateServiceFrameCounter();
-    return transfer(buffer, numFrames, timeoutNanoseconds);
+    Result result = updateServiceFrameCounter();
+    if (result != Result::OK) return ResultWithValue<int32_t>(static_cast<Result>(result));
+    return transfer(buffer, nullptr, numFrames, timeoutNanoseconds);
 }
 
 // Only supported when we are not using a callback.
@@ -260,7 +277,7 @@ int32_t AudioStreamBuffered::getBufferCapacityInFrames() const {
 
 bool AudioStreamBuffered::isXRunCountSupported() const {
     // XRun count is only supported if we're using blocking I/O (not callbacks)
-    return (getCallback() == nullptr);
+    return (!isDataCallbackSpecified());
 }
 
 } // namespace oboe
\ No newline at end of file
index 5923e8db3a43a96b9221d9c5d14ee8dc84b7b65d..d7e88850d40ffbdf0af5a0647ae943fa67110b30 100644 (file)
@@ -60,7 +60,7 @@ protected:
     DataCallbackResult onDefaultCallback(void *audioData, int numFrames) override;
 
     // If there is no callback then we need a FIFO between the App and OpenSL ES.
-    bool usingFIFO() const { return getCallback() == nullptr; }
+    bool usingFIFO() const { return !isDataCallbackSpecified(); }
 
     virtual Result updateServiceFrameCounter() = 0;
 
@@ -74,7 +74,11 @@ private:
     void markCallbackTime(int32_t numFrames);
 
     // Read or write to the FIFO.
-    ResultWithValue<int32_t> transfer(void *buffer, int32_t numFrames, int64_t timeoutNanoseconds);
+    // Only pass one pointer and set the other to nullptr.
+    ResultWithValue<int32_t> transfer(void *readBuffer,
+            const void *writeBuffer,
+            int32_t numFrames,
+            int64_t timeoutNanoseconds);
 
     void incrementXRunCount() {
         ++mXRunCount;
index 3af1a30e3080dacb480881d95f8dae5d02f18ff8..2b69935252f5c06a86e8853865273b061f165d72 100644 (file)
@@ -134,6 +134,13 @@ Result AudioStreamOpenSLES::configureBufferSizes(int32_t sampleRate) {
 
     if (!usingFIFO()) {
         mBufferCapacityInFrames = mFramesPerBurst * kBufferQueueLength;
+        // Check for overflow.
+        if (mBufferCapacityInFrames <= 0) {
+            mBufferCapacityInFrames = 0;
+            LOGE("AudioStreamOpenSLES::open() numeric overflow because mFramesPerBurst = %d",
+                 mFramesPerBurst);
+            return Result::ErrorOutOfRange;
+        }
         mBufferSizeInFrames = mBufferCapacityInFrames;
     }
 
@@ -208,12 +215,6 @@ void AudioStreamOpenSLES::logUnsupportedAttributes() {
         LOGW("SessionId [AudioStreamBuilder::setSessionId()] "
              "is not supported on OpenSLES streams.");
     }
-
-    // Input Preset
-    if (mInputPreset != InputPreset::VoiceRecognition) {
-        LOGW("InputPreset [AudioStreamBuilder::setInputPreset()] "
-             "is not supported on OpenSLES streams.");
-    }
 }
 
 SLresult AudioStreamOpenSLES::configurePerformanceMode(SLAndroidConfigurationItf configItf) {
@@ -266,7 +267,8 @@ SLresult AudioStreamOpenSLES::updateStreamParameters(SLAndroidConfigurationItf c
     return result;
 }
 
-Result AudioStreamOpenSLES::close() {
+// This is called under mLock.
+Result AudioStreamOpenSLES::close_l() {
     if (mState == StreamState::Closed) {
         return Result::ErrorClosed;
     }
@@ -381,7 +383,7 @@ Result AudioStreamOpenSLES::waitForStateChange(StreamState currentState,
         }
 
         // Did we timeout or did user ask for non-blocking?
-        if (timeoutNanoseconds <= 0) {
+        if (timeLeftNanos <= 0) {
             break;
         }
 
index 81fdc63e295c420355e2f4ac71620070cdc45235..10a730b70422cf134bbcac9c5fc8bcd44173ae76 100644 (file)
@@ -50,7 +50,6 @@ public:
     virtual ~AudioStreamOpenSLES() = default;
 
     virtual Result open() override;
-    virtual Result close() override;
 
     /**
      * Query the current state, eg. OBOE_STREAM_STATE_PAUSING
@@ -80,6 +79,9 @@ public:
 
 protected:
 
+    // This must be called under mLock.
+    Result close_l();
+
     SLuint32 channelCountToChannelMaskDefault(int channelCount) const;
 
     virtual Result onBeforeDestroy() { return Result::OK; }
index 071c0d08f6ad26c21c45d8d4b56fd35bce183f22..4be23b37856e07c13f99f2a1a8e2e9470d47769d 100644 (file)
@@ -24,42 +24,42 @@ namespace oboe {
 
 const char *getSLErrStr(SLresult code) {
     switch (code) {
-        case 0:
+        case SL_RESULT_SUCCESS:
             return "SL_RESULT_SUCCESS";
-        case 1:
-            return "SL_RESULT_PRECONDITIONS_VIOLATE";
-        case 2:
+        case SL_RESULT_PRECONDITIONS_VIOLATED:
+            return "SL_RESULT_PRECONDITIONS_VIOLATED";
+        case SL_RESULT_PARAMETER_INVALID:
             return "SL_RESULT_PARAMETER_INVALID";
-        case 3:
+        case SL_RESULT_MEMORY_FAILURE:
             return "SL_RESULT_MEMORY_FAILURE";
-        case 4:
+        case SL_RESULT_RESOURCE_ERROR:
             return "SL_RESULT_RESOURCE_ERROR";
-        case 5:
+        case SL_RESULT_RESOURCE_LOST:
             return "SL_RESULT_RESOURCE_LOST";
-        case 6:
+        case SL_RESULT_IO_ERROR:
             return "SL_RESULT_IO_ERROR";
-        case 7:
+        case SL_RESULT_BUFFER_INSUFFICIENT:
             return "SL_RESULT_BUFFER_INSUFFICIENT";
-        case 8:
+        case SL_RESULT_CONTENT_CORRUPTED:
             return "SL_RESULT_CONTENT_CORRUPTED";
-        case 9:
+        case SL_RESULT_CONTENT_UNSUPPORTED:
             return "SL_RESULT_CONTENT_UNSUPPORTED";
-        case 10:
+        case SL_RESULT_CONTENT_NOT_FOUND:
             return "SL_RESULT_CONTENT_NOT_FOUND";
-        case 11:
+        case SL_RESULT_PERMISSION_DENIED:
             return "SL_RESULT_PERMISSION_DENIED";
-        case 12:
+        case SL_RESULT_FEATURE_UNSUPPORTED:
             return "SL_RESULT_FEATURE_UNSUPPORTED";
-        case 13:
+        case SL_RESULT_INTERNAL_ERROR:
             return "SL_RESULT_INTERNAL_ERROR";
-        case 14:
+        case SL_RESULT_UNKNOWN_ERROR:
             return "SL_RESULT_UNKNOWN_ERROR";
-        case 15:
+        case SL_RESULT_OPERATION_ABORTED:
             return "SL_RESULT_OPERATION_ABORTED";
-        case 16:
+        case SL_RESULT_CONTROL_LOST:
             return "SL_RESULT_CONTROL_LOST";
         default:
-            return "Unknown error";
+            return "Unknown SL error";
     }
 }
 
index b2167cf4ec5cd7e05ecd04340ebd012e46e6bc3e..a389d009a56e680f7f7eaa1ef250b9cf675c5a17 100644 (file)
@@ -67,25 +67,25 @@ namespace AiffFileHelpers
         Loop sustainLoop;\r
         Loop releaseLoop;\r
 \r
-        void copyTo (StringPairArray& values) const\r
+        void copyTo (std::map<String, String>& values) const\r
         {\r
-            values.set ("MidiUnityNote",        String (baseNote));\r
-            values.set ("Detune",               String (detune));\r
+            values.emplace ("MidiUnityNote",        String (baseNote));\r
+            values.emplace ("Detune",               String (detune));\r
 \r
-            values.set ("LowNote",              String (lowNote));\r
-            values.set ("HighNote",             String (highNote));\r
-            values.set ("LowVelocity",          String (lowVelocity));\r
-            values.set ("HighVelocity",         String (highVelocity));\r
+            values.emplace ("LowNote",              String (lowNote));\r
+            values.emplace ("HighNote",             String (highNote));\r
+            values.emplace ("LowVelocity",          String (lowVelocity));\r
+            values.emplace ("HighVelocity",         String (highVelocity));\r
 \r
-            values.set ("Gain",                 String ((int16) ByteOrder::swapIfLittleEndian ((uint16) gain)));\r
+            values.emplace ("Gain",                 String ((int16) ByteOrder::swapIfLittleEndian ((uint16) gain)));\r
 \r
-            values.set ("NumSampleLoops",       String (2));        // always 2 with AIFF, WAV can have more\r
-            values.set ("Loop0Type",            String (ByteOrder::swapIfLittleEndian (sustainLoop.type)));\r
-            values.set ("Loop0StartIdentifier", String (ByteOrder::swapIfLittleEndian (sustainLoop.startIdentifier)));\r
-            values.set ("Loop0EndIdentifier",   String (ByteOrder::swapIfLittleEndian (sustainLoop.endIdentifier)));\r
-            values.set ("Loop1Type",            String (ByteOrder::swapIfLittleEndian (releaseLoop.type)));\r
-            values.set ("Loop1StartIdentifier", String (ByteOrder::swapIfLittleEndian (releaseLoop.startIdentifier)));\r
-            values.set ("Loop1EndIdentifier",   String (ByteOrder::swapIfLittleEndian (releaseLoop.endIdentifier)));\r
+            values.emplace ("NumSampleLoops",       String (2));        // always 2 with AIFF, WAV can have more\r
+            values.emplace ("Loop0Type",            String (ByteOrder::swapIfLittleEndian (sustainLoop.type)));\r
+            values.emplace ("Loop0StartIdentifier", String (ByteOrder::swapIfLittleEndian (sustainLoop.startIdentifier)));\r
+            values.emplace ("Loop0EndIdentifier",   String (ByteOrder::swapIfLittleEndian (sustainLoop.endIdentifier)));\r
+            values.emplace ("Loop1Type",            String (ByteOrder::swapIfLittleEndian (releaseLoop.type)));\r
+            values.emplace ("Loop1StartIdentifier", String (ByteOrder::swapIfLittleEndian (releaseLoop.startIdentifier)));\r
+            values.emplace ("Loop1EndIdentifier",   String (ByteOrder::swapIfLittleEndian (releaseLoop.endIdentifier)));\r
         }\r
 \r
         static uint16 getValue16 (const StringPairArray& values, const char* name, const char* def)\r
@@ -149,7 +149,7 @@ namespace AiffFileHelpers
             input.read (unknown, sizeof (unknown));\r
         }\r
 \r
-        void addToMetadata (StringPairArray& metadata) const\r
+        void addToMetadata (std::map<String, String>& metadata) const\r
         {\r
             const bool rootNoteSet = rootNote != 0;\r
 \r
@@ -157,11 +157,11 @@ namespace AiffFileHelpers
             setBoolFlag (metadata, AiffAudioFormat::appleRootSet, rootNoteSet);\r
 \r
             if (rootNoteSet)\r
-                metadata.set (AiffAudioFormat::appleRootNote,   String (rootNote));\r
+                metadata.emplace (AiffAudioFormat::appleRootNote,   String (rootNote));\r
 \r
-            metadata.set (AiffAudioFormat::appleBeats,          String (numBeats));\r
-            metadata.set (AiffAudioFormat::appleDenominator,    String (timeSigDen));\r
-            metadata.set (AiffAudioFormat::appleNumerator,      String (timeSigNum));\r
+            metadata.emplace (AiffAudioFormat::appleBeats,          String (numBeats));\r
+            metadata.emplace (AiffAudioFormat::appleDenominator,    String (timeSigDen));\r
+            metadata.emplace (AiffAudioFormat::appleNumerator,      String (timeSigNum));\r
 \r
             const char* keyString = nullptr;\r
 \r
@@ -175,12 +175,14 @@ namespace AiffFileHelpers
             }\r
 \r
             if (keyString != nullptr)\r
-                metadata.set (AiffAudioFormat::appleKey, keyString);\r
+                metadata.emplace (AiffAudioFormat::appleKey, keyString);\r
         }\r
 \r
-        void setBoolFlag (StringPairArray& values, const char* name, bool shouldBeSet) const\r
+        void setBoolFlag (std::map<String, String>& values,\r
+                          const char* name,\r
+                          bool shouldBeSet) const\r
         {\r
-            values.set (name, shouldBeSet ? "1" : "0");\r
+            values.emplace (name, shouldBeSet ? "1" : "0");\r
         }\r
 \r
         uint32 flags;\r
@@ -388,6 +390,17 @@ public:
     {\r
         using namespace AiffFileHelpers;\r
 \r
+        std::map<String, String> metadataValuesMap;\r
+\r
+        for (int i = 0; i != metadataValues.size(); ++i)\r
+        {\r
+            metadataValuesMap.emplace (metadataValues.getAllKeys().getReference (i),\r
+                                       metadataValues.getAllValues().getReference (i));\r
+        }\r
+\r
+        // If this fails, there were duplicate keys in the metadata\r
+        jassert ((size_t) metadataValuesMap.size() == (size_t) metadataValues.size());\r
+\r
         if (input->readInt() == chunkName ("FORM"))\r
         {\r
             auto len = input->readIntBigEndian();\r
@@ -479,8 +492,8 @@ public:
                         auto numCues = (uint16) input->readShortBigEndian();\r
 \r
                         // these two are always the same for AIFF-read files\r
-                        metadataValues.set ("NumCuePoints", String (numCues));\r
-                        metadataValues.set ("NumCueLabels", String (numCues));\r
+                        metadataValuesMap.emplace ("NumCuePoints", String (numCues));\r
+                        metadataValuesMap.emplace ("NumCueLabels", String (numCues));\r
 \r
                         for (uint16 i = 0; i < numCues; ++i)\r
                         {\r
@@ -497,18 +510,18 @@ public:
                                 input->readByte();\r
 \r
                             auto prefixCue = "Cue" + String (i);\r
-                            metadataValues.set (prefixCue + "Identifier", String (identifier));\r
-                            metadataValues.set (prefixCue + "Offset", String (offset));\r
+                            metadataValuesMap.emplace (prefixCue + "Identifier", String (identifier));\r
+                            metadataValuesMap.emplace (prefixCue + "Offset", String (offset));\r
 \r
                             auto prefixLabel = "CueLabel" + String (i);\r
-                            metadataValues.set (prefixLabel + "Identifier", String (identifier));\r
-                            metadataValues.set (prefixLabel + "Text", textBlock.toString());\r
+                            metadataValuesMap.emplace (prefixLabel + "Identifier", String (identifier));\r
+                            metadataValuesMap.emplace (prefixLabel + "Text", textBlock.toString());\r
                         }\r
                     }\r
                     else if (type == chunkName ("COMT"))\r
                     {\r
                         auto numNotes = (uint16) input->readShortBigEndian();\r
-                        metadataValues.set ("NumCueNotes", String (numNotes));\r
+                        metadataValuesMap.emplace ("NumCueNotes", String (numNotes));\r
 \r
                         for (uint16 i = 0; i < numNotes; ++i)\r
                         {\r
@@ -520,9 +533,9 @@ public:
                             input->readIntoMemoryBlock (textBlock, stringLength + (stringLength & 1));\r
 \r
                             auto prefix = "CueNote" + String (i);\r
-                            metadataValues.set (prefix + "TimeStamp", String (timestamp));\r
-                            metadataValues.set (prefix + "Identifier", String (identifier));\r
-                            metadataValues.set (prefix + "Text", textBlock.toString());\r
+                            metadataValuesMap.emplace (prefix + "TimeStamp", String (timestamp));\r
+                            metadataValuesMap.emplace (prefix + "Identifier", String (identifier));\r
+                            metadataValuesMap.emplace (prefix + "Text", textBlock.toString());\r
                         }\r
                     }\r
                     else if (type == chunkName ("INST"))\r
@@ -530,16 +543,16 @@ public:
                         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 (metadataValuesMap);\r
                     }\r
                     else if (type == chunkName ("basc"))\r
                     {\r
-                        AiffFileHelpers::BASCChunk (*input).addToMetadata (metadataValues);\r
+                        AiffFileHelpers::BASCChunk (*input).addToMetadata (metadataValuesMap);\r
                     }\r
                     else if (type == chunkName ("cate"))\r
                     {\r
-                        metadataValues.set (AiffAudioFormat::appleTag,\r
-                                            AiffFileHelpers::CATEChunk::read (*input, length));\r
+                        metadataValuesMap.emplace (AiffAudioFormat::appleTag,\r
+                                                  AiffFileHelpers::CATEChunk::read (*input, length));\r
                     }\r
                     else if ((hasGotVer && hasGotData && hasGotType)\r
                               || chunkEnd < input->getPosition()\r
@@ -553,8 +566,10 @@ public:
             }\r
         }\r
 \r
-        if (metadataValues.size() > 0)\r
-            metadataValues.set ("MetaDataSource", "AIFF");\r
+        if (metadataValuesMap.size() > 0)\r
+            metadataValuesMap.emplace ("MetaDataSource", "AIFF");\r
+\r
+        metadataValues.addMap (metadataValuesMap);\r
     }\r
 \r
     //==============================================================================\r
index 44bec28e3f1c8fd180464079b516570ddae13567..f355b644f54646cce0de8f041aa573660aa19369 100644 (file)
@@ -492,7 +492,9 @@ struct MP3Frame
         return frequencies[sampleRateIndex];\r
     }\r
 \r
-    void decodeHeader (const uint32 header)\r
+    enum class ParseSuccessful { no, yes };\r
+\r
+    ParseSuccessful decodeHeader (const uint32 header)\r
     {\r
         jassert (((header >> 10) & 3) != 3);\r
 \r
@@ -527,17 +529,18 @@ struct MP3Frame
             jassertfalse; // This means the file is using "free format". Apparently very few decoders\r
                           // support this mode, and this one certainly doesn't handle it correctly!\r
             frameSize = 0;\r
+            return ParseSuccessful::no;\r
         }\r
-        else\r
+\r
+        switch (layer)\r
         {\r
-            switch (layer)\r
-            {\r
-                case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break;\r
-                case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000)  / getFrequency() + (padding - 4); break;\r
-                case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break;\r
-                default: break;\r
-            }\r
+            case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break;\r
+            case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000)  / getFrequency() + (padding - 4); break;\r
+            case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break;\r
+            default: break;\r
         }\r
+\r
+        return ParseSuccessful::yes;\r
     }\r
 \r
     int layer, frameSize, numChannels, single;\r
@@ -1430,7 +1433,11 @@ struct MP3Stream
                 lastFrameSize += nextFrameOffset;\r
             }\r
 \r
-            frame.decodeHeader ((uint32) stream.readIntBigEndian());\r
+            const auto successful = frame.decodeHeader ((uint32) stream.readIntBigEndian());\r
+\r
+            if (successful == MP3Frame::ParseSuccessful::no)\r
+                return -1;\r
+\r
             headerParsed = true;\r
             frameSize = frame.frameSize;\r
             isFreeFormat = (frameSize == 0);\r
index f25261c2ec1fbd8a97ab40ec48684f21ac405591..7642040bd9e88ef0150c4c7bf4639e888e114532 100644 (file)
@@ -993,10 +993,12 @@ public:
                     input->skipNextBytes (2);\r
                     bitsPerSample = (unsigned int) (int) input->readShort();\r
 \r
-                    if (bitsPerSample > 64)\r
+                    if (bitsPerSample > 64 && (int) sampleRate != 0)\r
                     {\r
                         bytesPerFrame = bytesPerSec / (int) sampleRate;\r
-                        bitsPerSample = 8 * (unsigned int) bytesPerFrame / numChannels;\r
+\r
+                        if (numChannels != 0)\r
+                            bitsPerSample = 8 * (unsigned int) bytesPerFrame / numChannels;\r
                     }\r
                     else\r
                     {\r
index 257cef73bd3b38cc7a4920799e9085eeb2ddffc0..f5cf70d82d994757b3832dd3e9c3338ea657da25 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_formats\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 3e63d337223d6cfb7b2cb9a8578a49e5a1b19e64..4ee29755d5a757a7b8768113384869e7dffc4d5e 100644 (file)
@@ -231,9 +231,26 @@ public:
         return getParamForVSTParamID (bypassParamID);\r
     }\r
 \r
+    AudioProcessorParameter* getProgramParameter() const noexcept\r
+    {\r
+        return getParamForVSTParamID (JuceAudioProcessor::paramPreset);\r
+    }\r
+\r
     static Vst::UnitID getUnitID (const AudioProcessorParameterGroup* group)\r
     {\r
-        return group == nullptr ? Vst::kRootUnitId : group->getID().hashCode();\r
+        if (group == nullptr || group->getParent() == nullptr)\r
+            return Vst::kRootUnitId;\r
+\r
+        // From the VST3 docs:\r
+        // Up to 2^31 parameters can be exported with id range [0, 2147483648]\r
+        // (the range [2147483649, 429496729] is reserved for host application).\r
+        auto unitID = group->getID().hashCode() & 0x7fffffff;\r
+\r
+        // If you hit this assertion then your group ID is hashing to a value\r
+        // reserved by the VST3 SDK. Use a different group ID.\r
+        jassert (unitID != Vst::kRootUnitId);\r
+\r
+        return unitID;\r
     }\r
 \r
     int getNumParameters() const noexcept             { return vstParamIDs.size(); }\r
@@ -263,6 +280,21 @@ private:
     {\r
         parameterGroups = audioProcessor->getParameterTree().getSubgroups (true);\r
 \r
+       #if JUCE_DEBUG\r
+        auto allGroups = parameterGroups;\r
+        allGroups.add (&audioProcessor->getParameterTree());\r
+        std::unordered_set<Vst::UnitID> unitIDs;\r
+\r
+        for (auto* group : allGroups)\r
+        {\r
+            auto insertResult = unitIDs.insert (getUnitID (group));\r
+\r
+            // If you hit this assertion then either a group ID is not unique or\r
+            // you are very unlucky and a hashed group ID is not unique\r
+            jassert (insertResult.second);\r
+        }\r
+       #endif\r
+\r
        #if JUCE_FORCE_USE_LEGACY_PARAM_IDS\r
         const bool forceLegacyParamIDs = true;\r
        #else\r
@@ -309,6 +341,20 @@ private:
             vstParamIDs.add (vstParamID);\r
             paramMap.set (static_cast<int32> (vstParamID), juceParam);\r
         }\r
+\r
+        auto numPrograms = audioProcessor->getNumPrograms();\r
+\r
+        if (numPrograms > 1)\r
+        {\r
+            ownedProgramParameter = std::make_unique<AudioParameterInt> ("juceProgramParameter", "Program",\r
+                                                                         0, numPrograms - 1,\r
+                                                                         audioProcessor->getCurrentProgram());\r
+\r
+            juceParameters.params.add (ownedProgramParameter.get());\r
+\r
+            vstParamIDs.add (JuceAudioProcessor::paramPreset);\r
+            paramMap.set (static_cast<int32> (JuceAudioProcessor::paramPreset), ownedProgramParameter.get());\r
+        }\r
     }\r
 \r
     Vst::ParamID generateVSTParamIDForParam (AudioProcessorParameter* param)\r
@@ -336,7 +382,7 @@ private:
     //==============================================================================\r
     LegacyAudioParametersWrapper juceParameters;\r
     HashMap<int32, AudioProcessorParameter*> paramMap;\r
-    std::unique_ptr<AudioProcessorParameter> ownedBypassParameter;\r
+    std::unique_ptr<AudioProcessorParameter> ownedBypassParameter, ownedProgramParameter;\r
     Array<const AudioProcessorParameterGroup*> parameterGroups;\r
 \r
     JuceAudioProcessor() = delete;\r
@@ -352,8 +398,7 @@ class JuceVST3EditController : public Vst::EditController,
                                public Vst::IMidiMapping,\r
                                public Vst::IUnitInfo,\r
                                public Vst::ChannelContext::IInfoListener,\r
-                               public AudioProcessorListener,\r
-                               private AudioProcessorParameter::Listener\r
+                               public AudioProcessorListener\r
 {\r
 public:\r
     JuceVST3EditController (Vst::IHostApplication* host)\r
@@ -567,16 +612,20 @@ public:
 \r
         bool setNormalized (Vst::ParamValue v) override\r
         {\r
-            Vst::ParamValue program = v * info.stepCount;\r
+            auto programValue = roundToInt (toPlain (v));\r
 \r
-            if (! isPositiveAndBelow ((int) program, owner.getNumPrograms()))\r
-                return false;\r
-\r
-            if (valueNormalized != v)\r
+            if (isPositiveAndBelow (programValue, owner.getNumPrograms()))\r
             {\r
-                valueNormalized = v;\r
-                changed();\r
-                return true;\r
+                if (programValue != owner.getCurrentProgram())\r
+                    owner.setCurrentProgram (programValue);\r
+\r
+                if (valueNormalized != v)\r
+                {\r
+                    valueNormalized = v;\r
+                    changed();\r
+\r
+                    return true;\r
+                }\r
             }\r
 \r
             return false;\r
@@ -657,17 +706,8 @@ public:
     tresult PLUGIN_API setComponentState (IBStream* stream) override\r
     {\r
         // Cubase and Nuendo need to inform the host of the current parameter values\r
-        if (auto* pluginInstance = getPluginInstance())\r
-        {\r
-            for (auto vstParamId : audioProcessor->vstParamIDs)\r
-                setParamNormalized (vstParamId, audioProcessor->getParamForVSTParamID (vstParamId)->getValue());\r
-\r
-            auto numPrograms = pluginInstance->getNumPrograms();\r
-\r
-            if (numPrograms > 1)\r
-                setParamNormalized (JuceAudioProcessor::paramPreset, static_cast<Vst::ParamValue> (pluginInstance->getCurrentProgram())\r
-                                                                         / static_cast<Vst::ParamValue> (numPrograms - 1));\r
-        }\r
+        for (auto vstParamId : audioProcessor->vstParamIDs)\r
+            setParamNormalized (vstParamId, audioProcessor->getParamForVSTParamID (vstParamId)->getValue());\r
 \r
         if (auto* handler = getComponentHandler())\r
             handler->restartComponent (Vst::kParamValuesChanged);\r
@@ -885,7 +925,7 @@ public:
     }\r
 \r
     //==============================================================================\r
-    void paramChanged (Vst::ParamID vstParamId, float newValue)\r
+    void paramChanged (Vst::ParamID vstParamId, double newValue)\r
     {\r
         if (inParameterChangedCallback.get())\r
         {\r
@@ -894,8 +934,8 @@ public:
         }\r
 \r
         // NB: Cubase has problems if performEdit is called without setParamNormalized\r
-        EditController::setParamNormalized (vstParamId, (double) newValue);\r
-        performEdit (vstParamId, (double) newValue);\r
+        EditController::setParamNormalized (vstParamId, newValue);\r
+        performEdit (vstParamId, newValue);\r
     }\r
 \r
     //==============================================================================\r
@@ -918,28 +958,29 @@ public:
 \r
         if (auto* pluginInstance = getPluginInstance())\r
         {\r
-            auto newNumPrograms = pluginInstance->getNumPrograms();\r
-\r
-            if (newNumPrograms != lastNumPrograms)\r
+            if (audioProcessor->getProgramParameter() != nullptr)\r
             {\r
-                if (newNumPrograms > 1)\r
+                auto currentProgram = pluginInstance->getCurrentProgram();\r
+                auto paramValue = roundToInt (EditController::normalizedParamToPlain (JuceAudioProcessor::paramPreset,\r
+                                                                                      EditController::getParamNormalized (JuceAudioProcessor::paramPreset)));\r
+\r
+                if (currentProgram != paramValue)\r
                 {\r
-                    auto paramValue = static_cast<Vst::ParamValue> (pluginInstance->getCurrentProgram())\r
-                                      / static_cast<Vst::ParamValue> (pluginInstance->getNumPrograms() - 1);\r
+                    beginEdit (JuceAudioProcessor::paramPreset);\r
+                    paramChanged (JuceAudioProcessor::paramPreset,\r
+                                  EditController::plainParamToNormalized (JuceAudioProcessor::paramPreset, currentProgram));\r
+                    endEdit (JuceAudioProcessor::paramPreset);\r
 \r
-                    EditController::setParamNormalized (JuceAudioProcessor::paramPreset, paramValue);\r
                     flags |= Vst::kParamValuesChanged;\r
                 }\r
-\r
-                lastNumPrograms = newNumPrograms;\r
             }\r
 \r
-            auto newLatencySamples = pluginInstance->getLatencySamples();\r
+            auto latencySamples = pluginInstance->getLatencySamples();\r
 \r
-            if (newLatencySamples != lastLatencySamples)\r
+            if (latencySamples != lastLatencySamples)\r
             {\r
                 flags |= Vst::kLatencyChanged;\r
-                lastLatencySamples = newLatencySamples;\r
+                lastLatencySamples = latencySamples;\r
             }\r
         }\r
 \r
@@ -947,19 +988,6 @@ public:
             componentHandler->restartComponent (flags);\r
     }\r
 \r
-    void parameterValueChanged (int, float newValue) override\r
-    {\r
-        // this can only come from the bypass parameter\r
-        paramChanged (audioProcessor->bypassParamID, newValue);\r
-    }\r
-\r
-    void parameterGestureChanged (int, bool gestureIsStarting) override\r
-    {\r
-        // this can only come from the bypass parameter\r
-        if (gestureIsStarting) beginEdit (audioProcessor->bypassParamID);\r
-        else endEdit (audioProcessor->bypassParamID);\r
-    }\r
-\r
     //==============================================================================\r
     AudioProcessor* getPluginInstance() const noexcept\r
     {\r
@@ -986,11 +1014,42 @@ private:
     MidiController parameterToMidiController[(int) numMIDIChannels * (int) Vst::kCountCtrlNumber];\r
     Vst::ParamID midiControllerToParameter[numMIDIChannels][Vst::kCountCtrlNumber];\r
 \r
+    //==============================================================================\r
+    struct OwnedParameterListener  : public AudioProcessorParameter::Listener\r
+    {\r
+        OwnedParameterListener (JuceVST3EditController& editController,\r
+                                AudioProcessorParameter& juceParameter,\r
+                                Vst::ParamID paramID)\r
+            : owner (editController),\r
+              vstParamID (paramID)\r
+        {\r
+            juceParameter.addListener (this);\r
+        }\r
+\r
+        void parameterValueChanged (int, float newValue) override\r
+        {\r
+            owner.paramChanged (vstParamID, newValue);\r
+        }\r
+\r
+        void parameterGestureChanged (int, bool gestureIsStarting) override\r
+        {\r
+            if (gestureIsStarting)\r
+                owner.beginEdit (vstParamID);\r
+            else\r
+                owner.endEdit (vstParamID);\r
+        }\r
+\r
+        JuceVST3EditController& owner;\r
+        Vst::ParamID vstParamID;\r
+    };\r
+\r
+    std::vector<std::unique_ptr<OwnedParameterListener>> ownedParameterListeners;\r
+\r
     //==============================================================================\r
     std::atomic<bool> vst3IsPlaying     { false },\r
                       inSetupProcessing { false };\r
 \r
-    int lastNumPrograms = 0, lastLatencySamples = 0;\r
+    int lastLatencySamples = 0;\r
 \r
    #if ! JUCE_MAC\r
     float lastScaleFactorReceived = 1.0f;\r
@@ -1002,10 +1061,11 @@ private:
         {\r
             pluginInstance->addListener (this);\r
 \r
-            // as the bypass is not part of the regular parameters\r
-            // we need to listen for it explicitly\r
+            // as the bypass is not part of the regular parameters we need to listen for it explicitly\r
             if (! audioProcessor->bypassIsRegularParameter)\r
-                audioProcessor->getBypassParameter()->addListener (this);\r
+                ownedParameterListeners.push_back (std::make_unique<OwnedParameterListener> (*this,\r
+                                                                                             *audioProcessor->getBypassParameter(),\r
+                                                                                             audioProcessor->bypassParamID));\r
 \r
             if (parameters.getParameterCount() <= 0)\r
             {\r
@@ -1014,6 +1074,10 @@ private:
                 for (int i = 0; i < n; ++i)\r
                 {\r
                     auto vstParamID = audioProcessor->getVSTParamIDForIndex (i);\r
+\r
+                    if (vstParamID == JuceAudioProcessor::paramPreset)\r
+                        continue;\r
+\r
                     auto* juceParam = audioProcessor->getParamForVSTParamID (vstParamID);\r
                     auto* parameterGroup = pluginInstance->getParameterTree().getGroupsForParameter (juceParam).getLast();\r
                     auto unitID = JuceAudioProcessor::getUnitID (parameterGroup);\r
@@ -1022,8 +1086,14 @@ private:
                                                         (vstParamID == audioProcessor->bypassParamID)));\r
                 }\r
 \r
-                if (pluginInstance->getNumPrograms() > 1)\r
+                if (auto* programParam = audioProcessor->getProgramParameter())\r
+                {\r
+                    ownedParameterListeners.push_back (std::make_unique<OwnedParameterListener> (*this,\r
+                                                                                                 *programParam,\r
+                                                                                                 JuceAudioProcessor::paramPreset));\r
+\r
                     parameters.addParameter (new ProgramChangeParameter (*pluginInstance));\r
+                }\r
             }\r
 \r
            #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS\r
@@ -2558,20 +2628,11 @@ public:
                 {\r
                     auto vstParamID = paramQueue->getParameterId();\r
 \r
-                    if (vstParamID == JuceAudioProcessor::paramPreset)\r
-                    {\r
-                        auto numPrograms  = pluginInstance->getNumPrograms();\r
-                        auto programValue = roundToInt (value * (jmax (0, numPrograms - 1)));\r
-\r
-                        if (numPrograms > 1 && isPositiveAndBelow (programValue, numPrograms)\r
-                             && programValue != pluginInstance->getCurrentProgram())\r
-                            pluginInstance->setCurrentProgram (programValue);\r
-                    }\r
                    #if JUCE_VST3_EMULATE_MIDI_CC_WITH_PARAMETERS\r
-                    else if (juceVST3EditController != nullptr && juceVST3EditController->isMidiControllerParamID (vstParamID))\r
+                    if (juceVST3EditController != nullptr && juceVST3EditController->isMidiControllerParamID (vstParamID))\r
                         addParameterChangeToMidiBuffer (offsetSamples, vstParamID, value);\r
-                   #endif\r
                     else\r
+                   #endif\r
                     {\r
                         auto floatValue = static_cast<float> (value);\r
 \r
index 015844ee0e839770a055d0d4dda93e5e38e9f98b..7e43e6a9acd6f12e601bd3d16a6096d68107878a 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_plugin_client\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 5d8eef93619fbaeb9423be9172f067e2890d5190..1982684293960151d6428760952bd7b0aedb13f5 100644 (file)
@@ -25,6 +25,8 @@
 \r
 #if JUCE_PLUGINHOST_AU && (JUCE_MAC || JUCE_IOS)\r
 \r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
+\r
 #if JUCE_MAC\r
 #include <AudioUnit/AUCocoaUIView.h>\r
 #include <CoreAudioKit/AUGenericView.h>\r
@@ -243,7 +245,8 @@ namespace AudioUnitFormatHelpers
                         if (Handle h = Get1IndResource (thngType, i))\r
                         {\r
                             HLock (h);\r
-                            const uint32* const types = (const uint32*) *h;\r
+                            uint32 types[3];\r
+                            std::memcpy (types, *h, sizeof (types));\r
 \r
                             if (types[0] == kAudioUnitType_MusicDevice\r
                                  || types[0] == kAudioUnitType_MusicEffect\r
@@ -2908,4 +2911,6 @@ FileSearchPath AudioUnitPluginFormat::getDefaultLocationsToSearch()
 \r
 } // namespace juce\r
 \r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
 #endif\r
index 19f1d7ac7a0b07d3fc7d164d9a453cfaf4106244..176150e61214cd908d1c1ef295f267da964f5fae 100644 (file)
@@ -374,7 +374,7 @@ public:
         destData.setSize ((size_t) numParameters * sizeof (float));\r
         destData.fillWith (0);\r
 \r
-        auto* p = (float*) ((char*) destData.getData());\r
+        auto* p = unalignedPointerCast<float*> (destData.getData());\r
 \r
         for (int i = 0; i < numParameters; ++i)\r
             if (auto* param = getParameters()[i])\r
index 23d7ae17e2957d387e723260039a4f3bdb011655..d3b19a211ba65eb17c5c3e43f3e535d89202c505 100644 (file)
@@ -55,6 +55,7 @@ namespace Vst2
 JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 JUCE_END_IGNORE_WARNINGS_MSVC\r
 \r
+JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")\r
 JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4355)\r
 \r
 #include "juce_VSTMidiEventList.h"\r
@@ -1768,9 +1769,9 @@ struct VSTPluginInstance     : public AudioPluginInstance,
                 {\r
                     if (i != oldProg)\r
                     {\r
-                        auto prog = (const fxProgram*) (((const char*) (set->programs)) + i * progLen);\r
+                        auto prog = addBytesToPointer (set->programs, i * progLen);\r
 \r
-                        if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize)\r
+                        if (getAddressDifference (prog, set) >= (int) dataSize)\r
                             return false;\r
 \r
                         if (fxbSwap (set->numPrograms) > 0)\r
@@ -1784,9 +1785,9 @@ struct VSTPluginInstance     : public AudioPluginInstance,
                 if (fxbSwap (set->numPrograms) > 0)\r
                     setCurrentProgram (oldProg);\r
 \r
-                auto prog = (const fxProgram*) (((const char*) (set->programs)) + oldProg * progLen);\r
+                auto prog = addBytesToPointer (set->programs, oldProg * progLen);\r
 \r
-                if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize)\r
+                if (getAddressDifference (prog, set) >= (int) dataSize)\r
                     return false;\r
 \r
                 if (! restoreProgramSettings (prog))\r
@@ -1906,14 +1907,14 @@ struct VSTPluginInstance     : public AudioPluginInstance,
                 auto oldProgram = getCurrentProgram();\r
 \r
                 if (oldProgram >= 0)\r
-                    setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + oldProgram * progLen));\r
+                    setParamsInProgramBlock (addBytesToPointer (set->programs, oldProgram * progLen));\r
 \r
                 for (int i = 0; i < numPrograms; ++i)\r
                 {\r
                     if (i != oldProgram)\r
                     {\r
                         setCurrentProgram (i);\r
-                        setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + i * progLen));\r
+                        setParamsInProgramBlock (addBytesToPointer (set->programs, i * progLen));\r
                     }\r
                 }\r
 \r
@@ -2591,7 +2592,7 @@ private:
 \r
         getCurrentProgramName().copyToUTF8 ((char*) dest.getData(), 63);\r
 \r
-        auto p = (float*) (((char*) dest.getData()) + 64);\r
+        auto p = unalignedPointerCast<float*> (((char*) dest.getData()) + 64);\r
 \r
         for (int i = 0; i < numParameters; ++i)\r
             if (auto* param = getParameters()[i])\r
@@ -2602,7 +2603,7 @@ private:
     {\r
         changeProgramName (getCurrentProgram(), (const char*) m.getData());\r
 \r
-        auto p = (float*) (((char*) m.getData()) + 64);\r
+        auto p = unalignedPointerCast<float*> (((char*) m.getData()) + 64);\r
         auto numParameters = getParameters().size();\r
 \r
         for (int i = 0; i < numParameters; ++i)\r
@@ -3743,6 +3744,7 @@ void VSTPluginFormat::aboutToScanVSTShellPlugin (const PluginDescription&) {}
 \r
 } // namespace juce\r
 \r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 JUCE_END_IGNORE_WARNINGS_MSVC\r
 \r
 #endif\r
index ac194a19d8c5d3b9cde187aa94ee3a49c51d3ff1..fb0d8e149df976f5fd8b767470c398eb93f88e8c 100644 (file)
@@ -134,8 +134,6 @@ struct AutoResizingNSViewComponentWithParent  : public AutoResizingNSViewCompone
 \r
 } // namespace juce\r
 \r
-JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations", "-Wcast-align")\r
-\r
 #include "format/juce_AudioPluginFormat.cpp"\r
 #include "format/juce_AudioPluginFormatManager.cpp"\r
 #include "format_types/juce_LegacyAudioParameter.cpp"\r
index 67d5074c75676242489bec0afe0e0626ee626ae8..deda7366168516c350581c7b1c1ed76107144588 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_processors\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 c805991315e4a8ca956c2685df7c2233571dab7b..1c23e9d3ecd324f6fd942707f4a4853972908316 100644 (file)
@@ -443,6 +443,24 @@ void AudioProcessor::checkForDuplicateParamID (AudioProcessorParameter* param)
    #endif\r
 }\r
 \r
+void AudioProcessor::checkForDuplicateGroupIDs (const AudioProcessorParameterGroup& newGroup)\r
+{\r
+    ignoreUnused (newGroup);\r
+\r
+   #if JUCE_DEBUG\r
+    auto groups = newGroup.getSubgroups (true);\r
+    groups.add (&newGroup);\r
+\r
+    for (auto* group : groups)\r
+    {\r
+        auto insertResult = groupIDs.insert (group->getID());\r
+\r
+        // If you hit this assertion then a group ID is not unique\r
+        jassert (insertResult.second);\r
+    }\r
+   #endif\r
+}\r
+\r
 const Array<AudioProcessorParameter*>& AudioProcessor::getParameters() const   { return flatParameterList; }\r
 const AudioProcessorParameterGroup& AudioProcessor::getParameterTree() const   { return parameterTree; }\r
 \r
@@ -461,6 +479,7 @@ void AudioProcessor::addParameter (AudioProcessorParameter* param)
 void AudioProcessor::addParameterGroup (std::unique_ptr<AudioProcessorParameterGroup> group)\r
 {\r
     jassert (group != nullptr);\r
+    checkForDuplicateGroupIDs (*group);\r
 \r
     auto oldSize = flatParameterList.size();\r
     flatParameterList.addArray (group->getParameters (true));\r
@@ -481,9 +500,12 @@ void AudioProcessor::setParameterTree (AudioProcessorParameterGroup&& newTree)
 {\r
    #if JUCE_DEBUG\r
     paramIDs.clear();\r
+    groupIDs.clear();\r
    #endif\r
 \r
     parameterTree = std::move (newTree);\r
+    checkForDuplicateGroupIDs (parameterTree);\r
+\r
     flatParameterList = parameterTree.getParameters (true);\r
 \r
     for (int i = 0; i < flatParameterList.size(); ++i)\r
index 02c3de12eb2bd091a02df8781f7128ae81c7102c..27e433864018ebf9e15d7f1cc9b521580897e653 100644 (file)
@@ -1487,10 +1487,11 @@ private:
     #endif\r
 \r
     bool textRecursionCheck = false;\r
-    std::unordered_set<String> paramIDs;\r
+    std::unordered_set<String> paramIDs, groupIDs;\r
    #endif\r
 \r
     void checkForDuplicateParamID (AudioProcessorParameter*);\r
+    void checkForDuplicateGroupIDs (const AudioProcessorParameterGroup&);\r
 \r
     AudioProcessorListener* getListenerLocked (int) const noexcept;\r
     void updateSpeakerFormatStrings();\r
index 4f32a51a1fcaca3a8d8f818bbbfc401d1d8c49e2..dde97cb8bc3688999f6ec8628bda1b7ca494cabd 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_audio_utils\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE extra audio utility classes\r
   description:        Classes for audio-related GUI and miscellaneous tasks.\r
   website:            http://www.juce.com/juce\r
index 1058aa45be75dcf73d0c10b1010e51eec4dbec48..f6a956745571092953801381431a213cfea03e20 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_blocks_basics\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               Provides low-level control over ROLI BLOCKS devices\r
   description:        JUCE wrapper for low-level control over ROLI BLOCKS devices.\r
   website:            http://developer.roli.com\r
index 5db1fb9d9445f6bcd988a02e94762d2563edbffb..0f04a8ca0cd109a21e1bf62f3ebff9ec22bfea7d 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_box2d\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 914cae6806c383d5677c39f16160bceeb80eae68..0c9b604f249e58673f496ffd773d20b09ecee8ab 100644 (file)
 \r
 #include "juce_core.h"\r
 \r
-#include <locale>\r
 #include <cctype>\r
 #include <cstdarg>\r
+#include <locale>\r
+#include <thread>\r
 \r
 #if ! JUCE_ANDROID\r
  #include <sys/timeb.h>\r
index 1f6ea8045c7138bfbdaccebc3c64b7c4a4d3be11..3612d62232b0c48d6d842d957fdbeb10af9354f6 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_core\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 03c0de3ceb0658eba72db2e8a98bf8836c80441b..0f21a5a8da62bacc29287ec5743894fd58ba0ee2 100644 (file)
@@ -183,4 +183,18 @@ inline const Type* addBytesToPointer (const Type* basePointer, IntegerType bytes
  #define juce_UseDebuggingNewOperator\r
 #endif\r
 \r
+ /** Converts an owning raw pointer into a unique_ptr, deriving the\r
+     type of the unique_ptr automatically.\r
+\r
+     This should only be used with pointers to single objects.\r
+     Do NOT pass a pointer to an array to this function, as the\r
+     destructor of the unique_ptr will incorrectly call `delete`\r
+     instead of `delete[]` on the pointer.\r
+ */\r
+ template <typename T>\r
+ std::unique_ptr<T> rawToUniquePtr (T* ptr)\r
+ {\r
+     return std::unique_ptr<T> (ptr);\r
+ }\r
+\r
 } // namespace juce\r
index 202896a51f7b41cf11fa9128f8926865f09e1d67..4bbf8bee250621cc044f7f0c5014397cf88633f3 100644 (file)
@@ -132,7 +132,7 @@ static String getOSXVersion()
        #endif\r
 \r
         if (dict != nullptr)\r
-            return nsStringToJuce (dict[nsStringLiteral ("ProductVersion")]);\r
+            return nsStringToJuce ([dict objectForKey: nsStringLiteral ("ProductVersion")]);\r
 \r
         jassertfalse;\r
         return {};\r
@@ -157,8 +157,8 @@ SystemStats::OperatingSystemType SystemStats::getOperatingSystemType()
         return (OperatingSystemType) (minor + MacOSX_10_7 - 7);\r
     }\r
 \r
-    jassert (major == 11 && minor == 0);\r
-    return MacOSX_11_0;\r
+    jassert (major == 11);\r
+    return MacOS_11;\r
    #endif\r
 }\r
 \r
index 982db865bb07e9426f482e9b3dbc538aae4359c3..073b73d7dd379ee06afdb3269292ac8b193c3ef1 100644 (file)
@@ -1224,217 +1224,125 @@ bool ChildProcess::start (const StringArray& args, int streamFlags)
 //==============================================================================\r
 struct HighResolutionTimer::Pimpl\r
 {\r
-    Pimpl (HighResolutionTimer& t)  : owner (t)\r
-    {\r
-        pthread_condattr_t attr;\r
-        pthread_condattr_init (&attr);\r
-\r
-       #if JUCE_LINUX || (JUCE_ANDROID && defined(__ANDROID_API__) && __ANDROID_API__ >= 21)\r
-        pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);\r
-       #endif\r
-\r
-        pthread_cond_init (&stopCond, &attr);\r
-        pthread_condattr_destroy (&attr);\r
-        pthread_mutex_init (&timerMutex, nullptr);\r
-    }\r
+    explicit Pimpl (HighResolutionTimer& t)\r
+        : owner (t)\r
+    {}\r
 \r
     ~Pimpl()\r
     {\r
-        jassert (! isRunning);\r
+        jassert (periodMs == 0);\r
         stop();\r
     }\r
 \r
     void start (int newPeriod)\r
     {\r
-        if (periodMs != newPeriod)\r
-        {\r
-            if (thread != pthread_self())\r
-            {\r
-                stop();\r
-\r
-                periodMs = newPeriod;\r
-                destroyThread = false;\r
-                isRunning = true;\r
-\r
-                if (pthread_create (&thread, nullptr, timerThread, this) == 0)\r
-                    setThreadToRealtime (thread, (uint64) newPeriod);\r
-                else\r
-                    jassertfalse;\r
-            }\r
-            else\r
-            {\r
-                periodMs = newPeriod;\r
-                isRunning = true;\r
-                destroyThread = false;\r
-            }\r
-        }\r
-    }\r
-\r
-    void stop()\r
-    {\r
-        isRunning = false;\r
-\r
-        if (thread == pthread_t())\r
+        if (periodMs == newPeriod)\r
             return;\r
 \r
-        if (thread == pthread_self())\r
+        if (thread.get_id() == std::this_thread::get_id())\r
         {\r
-            periodMs = 3600000;\r
+            periodMs = newPeriod;\r
             return;\r
         }\r
 \r
-        isRunning = false;\r
-        destroyThread = true;\r
-\r
-        pthread_mutex_lock (&timerMutex);\r
-        pthread_cond_signal (&stopCond);\r
-        pthread_mutex_unlock (&timerMutex);\r
-\r
-        pthread_join (thread, nullptr);\r
-        thread = {};\r
-    }\r
-\r
-    HighResolutionTimer& owner;\r
-    std::atomic<int> periodMs { 0 };\r
+        stop();\r
 \r
-private:\r
-    pthread_t thread = {};\r
-    pthread_cond_t stopCond;\r
-    pthread_mutex_t timerMutex;\r
-    std::atomic<bool> destroyThread { false }, isRunning { false };\r
+        periodMs = newPeriod;\r
 \r
-    static void* timerThread (void* param)\r
-    {\r
-       #if ! JUCE_ANDROID\r
-        int dummy;\r
-        pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, &dummy);\r
-       #endif\r
+        thread = std::thread ([this, newPeriod]\r
+        {\r
+            setThisThreadToRealtime ((uint64) newPeriod);\r
 \r
-        reinterpret_cast<Pimpl*> (param)->timerThread();\r
-        return nullptr;\r
-    }\r
+            auto lastPeriod = periodMs.load();\r
+            Clock clock (lastPeriod);\r
 \r
-    void timerThread()\r
-    {\r
-        auto lastPeriod = periodMs.load();\r
-        Clock clock (lastPeriod);\r
+            std::unique_lock<std::mutex> unique_lock (timerMutex);\r
 \r
-        pthread_mutex_lock (&timerMutex);\r
-\r
-        while (! destroyThread)\r
-        {\r
-            clock.next();\r
-            while (! destroyThread && clock.wait (stopCond, timerMutex));\r
+            while (periodMs != 0)\r
+            {\r
+                clock.next();\r
+                while (periodMs != 0 && clock.wait (stopCond, unique_lock));\r
 \r
-            if (destroyThread)\r
-                break;\r
+                if (periodMs == 0)\r
+                    break;\r
 \r
-            if (isRunning)\r
                 owner.hiResTimerCallback();\r
 \r
-            auto newPeriod = periodMs.load();\r
+                auto nextPeriod = periodMs.load();\r
 \r
-            if (lastPeriod != newPeriod)\r
-            {\r
-                lastPeriod = newPeriod;\r
-                clock = Clock (lastPeriod);\r
+                if (lastPeriod != nextPeriod)\r
+                {\r
+                    lastPeriod = nextPeriod;\r
+                    clock = Clock (lastPeriod);\r
+                }\r
             }\r
-        }\r
 \r
-        periodMs = 0;\r
-        pthread_mutex_unlock (&timerMutex);\r
-        pthread_exit (nullptr);\r
+            periodMs = 0;\r
+        });\r
     }\r
 \r
-    struct Clock\r
+    void stop()\r
     {\r
-       #if JUCE_MAC || JUCE_IOS\r
-        Clock (double millis) noexcept\r
-        {\r
-            (void) mach_timebase_info (&timebase);\r
-            delta = (((uint64_t) (millis * 1000000.0)) * timebase.denom) / timebase.numer;\r
-            time = mach_absolute_time();\r
-        }\r
-\r
-        bool wait (pthread_cond_t& cond, pthread_mutex_t& mutex) noexcept\r
-        {\r
-            struct timespec left;\r
-\r
-            if (! hasExpired (left))\r
-                return (pthread_cond_timedwait_relative_np (&cond, &mutex, &left) != ETIMEDOUT);\r
-\r
-            return false;\r
-        }\r
-\r
-        uint64_t time, delta;\r
-        mach_timebase_info_data_t timebase;\r
-\r
-        bool hasExpired (struct timespec& time_left) noexcept\r
-        {\r
-            uint64_t now = mach_absolute_time();\r
+        periodMs = 0;\r
 \r
-            if (now < time)\r
-            {\r
-                uint64_t left = time - now;\r
-                uint64_t nanos = (left * static_cast<uint64_t> (timebase.numer)) / static_cast<uint64_t> (timebase.denom);\r
-                time_left.tv_sec = static_cast<__darwin_time_t> (nanos / 1000000000ULL);\r
-                time_left.tv_nsec = static_cast<long> (nanos - (static_cast<uint64_t> (time_left.tv_sec) * 1000000000ULL));\r
+        const auto thread_id = thread.get_id();\r
 \r
-                return false;\r
-            }\r
+        if (thread_id == std::thread::id() || thread_id == std::this_thread::get_id())\r
+            return;\r
 \r
-            return true;\r
-        }\r
-      #else\r
-        Clock (double millis) noexcept  : delta ((uint64) (millis * 1000000))\r
         {\r
-            struct timespec t;\r
-            clock_gettime (CLOCK_MONOTONIC, &t);\r
-            time = (uint64) (1000000000 * (int64) t.tv_sec + (int64) t.tv_nsec);\r
+            std::unique_lock<std::mutex> unique_lock (timerMutex);\r
+            stopCond.notify_one();\r
         }\r
 \r
-        bool wait (pthread_cond_t& cond, pthread_mutex_t& mutex) noexcept\r
-        {\r
-            struct timespec absExpire;\r
+        thread.join();\r
+    }\r
 \r
-            if (! hasExpired (absExpire))\r
-                return (pthread_cond_timedwait (&cond, &mutex, &absExpire) != ETIMEDOUT);\r
+    HighResolutionTimer& owner;\r
+    std::atomic<int> periodMs { 0 };\r
 \r
-            return false;\r
-        }\r
+private:\r
+    std::thread thread;\r
+    std::condition_variable stopCond;\r
+    std::mutex timerMutex;\r
 \r
-        uint64 time, delta;\r
+    class Clock\r
+    {\r
+    public:\r
+        explicit Clock (std::chrono::steady_clock::rep millis) noexcept\r
+            : time (std::chrono::steady_clock::now()),\r
+              delta (std::chrono::milliseconds (millis))\r
+        {}\r
 \r
-        bool hasExpired (struct timespec& expiryTime) noexcept\r
+        bool wait (std::condition_variable& cond, std::unique_lock<std::mutex>& lock) noexcept\r
         {\r
-            struct timespec t;\r
-            clock_gettime (CLOCK_MONOTONIC, &t);\r
-            auto now = (uint64) (1000000000 * (int64) t.tv_sec + (int64) t.tv_nsec);\r
-\r
-            if (now < time)\r
-            {\r
-                expiryTime.tv_sec  = (time_t) (time / 1000000000);\r
-                expiryTime.tv_nsec = (long)   (time % 1000000000);\r
-\r
-                return false;\r
-            }\r
-\r
-            return true;\r
+            return cond.wait_until (lock, time) != std::cv_status::timeout;\r
         }\r
-       #endif\r
 \r
         void next() noexcept\r
         {\r
             time += delta;\r
         }\r
+\r
+    private:\r
+        std::chrono::time_point<std::chrono::steady_clock> time;\r
+        std::chrono::steady_clock::duration delta;\r
     };\r
 \r
-    static bool setThreadToRealtime (pthread_t thread, uint64 periodMs)\r
+    static bool setThisThreadToRealtime (uint64 periodMs)\r
     {\r
+        const auto thread = pthread_self();\r
+\r
        #if JUCE_MAC || JUCE_IOS\r
+        mach_timebase_info_data_t timebase;\r
+        mach_timebase_info (&timebase);\r
+\r
+        const auto ticksPerMs = ((double) timebase.denom * 1000000.0) / (double) timebase.numer;\r
+        const auto periodTicks = (uint32_t) (ticksPerMs * periodMs);\r
+\r
         thread_time_constraint_policy_data_t policy;\r
-        policy.period      = (uint32_t) (periodMs * 1000000);\r
-        policy.computation = 50000;\r
+        policy.period      = periodTicks;\r
+        policy.computation = jmin ((uint32_t) 50000, policy.period);\r
         policy.constraint  = policy.period;\r
         policy.preemptible = true;\r
 \r
@@ -1448,7 +1356,6 @@ private:
         struct sched_param param;\r
         param.sched_priority = sched_get_priority_max (SCHED_RR);\r
         return pthread_setschedparam (thread, SCHED_RR, &param) == 0;\r
-\r
        #endif\r
     }\r
 \r
index ff949799bcb0c6f6dc8b47f0ae7479a92d59d0b8..29142b39904341d1ce6d83f8d91919b877f5bd6d 100644 (file)
@@ -29,7 +29,7 @@
 */\r
 #define JUCE_MAJOR_VERSION      6\r
 #define JUCE_MINOR_VERSION      0\r
-#define JUCE_BUILDNUMBER        5\r
+#define JUCE_BUILDNUMBER        7\r
 \r
 /** Current JUCE version number.\r
 \r
index 3260af8e2c706fc7723b6f67ea005ff6b86bb9e9..5e4d2b10743749ec6b099e1bee20949edc20f667 100644 (file)
@@ -61,7 +61,7 @@ public:
         MacOSX_10_13    = MacOSX | 13,\r
         MacOSX_10_14    = MacOSX | 14,\r
         MacOSX_10_15    = MacOSX | 15,\r
-        MacOSX_11_0     = MacOSX | 16,\r
+        MacOS_11        = MacOSX | 16,\r
 \r
         Win2000         = Windows | 1,\r
         WinXP           = Windows | 2,\r
index 8523dc9669be1e0b3d0fa4b365f886ca645c39c6..5dc50eb9c3ea344531f2c2ead17cb18b5e3f400e 100644 (file)
@@ -132,6 +132,11 @@ String& StringArray::getReference (int index) noexcept
     return strings.getReference (index);\r
 }\r
 \r
+const String& StringArray::getReference (int index) const noexcept\r
+{\r
+    return strings.getReference (index);\r
+}\r
+\r
 void StringArray::add (String newString)\r
 {\r
     // NB: the local temp copy is to avoid a dangling pointer if the\r
index 6f3670bd7d6f180b98679f80b83731178f115ec6..ac597b748e28b63b203c7cc9b14a4ee7f2291b03 100644 (file)
@@ -152,6 +152,12 @@ public:
     */\r
     String& getReference (int index) noexcept;\r
 \r
+    /** Returns a reference to one of the strings in the array.\r
+        This lets you modify a string in-place in the array, but you must be sure that\r
+        the index is in-range.\r
+    */\r
+    const String& getReference (int index) const noexcept;\r
+\r
     /** Returns a pointer to the first String in the array.\r
         This method is provided for compatibility with standard C++ iteration mechanisms.\r
     */\r
index a906bf98b7da100aecc37b66ea0d579f4261de56..b1b12f92b5fa42afd395f0897ce4db02f9139a0b 100644 (file)
@@ -145,6 +145,11 @@ void StringPairArray::setIgnoresCase (bool shouldIgnoreCase)
     ignoreCase = shouldIgnoreCase;\r
 }\r
 \r
+bool StringPairArray::getIgnoresCase() const noexcept\r
+{\r
+    return ignoreCase;\r
+}\r
+\r
 String StringPairArray::getDescription() const\r
 {\r
     String s;\r
@@ -166,4 +171,141 @@ void StringPairArray::minimiseStorageOverheads()
     values.minimiseStorageOverheads();\r
 }\r
 \r
+void StringPairArray::addMap (const std::map<String, String>& 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
+    // has to loop through the whole container looking for matching keys.\r
+    // Instead, we use a temporary map to give us better lookup performance.\r
+    std::map<String, int> contents;\r
+\r
+    const auto normaliseKey = [this] (const String& key)\r
+    {\r
+        return ignoreCase ? key.toLowerCase() : key;\r
+    };\r
+\r
+    for (auto i = 0; i != size(); ++i)\r
+        contents.emplace (normaliseKey (getAllKeys().getReference (i)), i);\r
+\r
+    for (const auto& pair : toAdd)\r
+    {\r
+        const auto key = normaliseKey (pair.first);\r
+        const auto it = contents.find (key);\r
+\r
+        if (it != contents.cend())\r
+        {\r
+            values.getReference (it->second) = pair.second;\r
+        }\r
+        else\r
+        {\r
+            contents.emplace (key, static_cast<int> (contents.size()));\r
+            keys.add (pair.first);\r
+            values.add (pair.second);\r
+        }\r
+    }\r
+}\r
+\r
+//==============================================================================\r
+//==============================================================================\r
+#if JUCE_UNIT_TESTS\r
+\r
+static String operator""_S (const char* chars, size_t)\r
+{\r
+    return String { chars };\r
+}\r
+\r
+class StringPairArrayTests : public UnitTest\r
+{\r
+public:\r
+    StringPairArrayTests()\r
+        : UnitTest ("StringPairArray", UnitTestCategories::text)\r
+    {}\r
+\r
+    void runTest() override\r
+    {\r
+        beginTest ("addMap respects case sensitivity of StringPairArray");\r
+        {\r
+            StringPairArray insensitive { true };\r
+            insensitive.addMap ({ { "duplicate", "a" },\r
+                                  { "Duplicate", "b" } });\r
+\r
+            expect (insensitive.size() == 1);\r
+            expectEquals (insensitive["DUPLICATE"], "a"_S);\r
+\r
+            StringPairArray sensitive { false };\r
+            sensitive.addMap ({ { "duplicate", "a"_S },\r
+                                { "Duplicate", "b"_S } });\r
+\r
+            expect (sensitive.size() == 2);\r
+            expectEquals (sensitive["duplicate"], "a"_S);\r
+            expectEquals (sensitive["Duplicate"], "b"_S);\r
+            expectEquals (sensitive["DUPLICATE"], ""_S);\r
+        }\r
+\r
+        beginTest ("addMap overwrites existing pairs");\r
+        {\r
+            StringPairArray insensitive { true };\r
+            insensitive.set ("key", "value");\r
+            insensitive.addMap ({ { "KEY", "VALUE" } });\r
+\r
+            expect (insensitive.size() == 1);\r
+            expectEquals (insensitive.getAllKeys()[0], "key"_S);\r
+            expectEquals (insensitive.getAllValues()[0], "VALUE"_S);\r
+\r
+            StringPairArray sensitive { false };\r
+            sensitive.set ("key", "value");\r
+            sensitive.addMap ({ { "KEY", "VALUE" },\r
+                                { "key", "another value" } });\r
+\r
+            expect (sensitive.size() == 2);\r
+            expect (sensitive.getAllKeys() == StringArray { "key", "KEY" });\r
+            expect (sensitive.getAllValues() == StringArray { "another value", "VALUE" });\r
+        }\r
+\r
+        beginTest ("addMap doesn't change the order of existing keys");\r
+        {\r
+            StringPairArray array;\r
+            array.set ("a", "a");\r
+            array.set ("z", "z");\r
+            array.set ("b", "b");\r
+            array.set ("y", "y");\r
+            array.set ("c", "c");\r
+\r
+            array.addMap ({ { "B", "B" },\r
+                            { "0", "0" },\r
+                            { "Z", "Z" } });\r
+\r
+            expect (array.getAllKeys() == StringArray { "a", "z", "b", "y", "c", "0" });\r
+            expect (array.getAllValues() == StringArray { "a", "Z", "B", "y", "c", "0" });\r
+        }\r
+\r
+        beginTest ("addMap has equivalent behaviour to addArray");\r
+        {\r
+            StringPairArray initial;\r
+            initial.set ("aaa", "aaa");\r
+            initial.set ("zzz", "zzz");\r
+            initial.set ("bbb", "bbb");\r
+\r
+            auto withAddMap = initial;\r
+            withAddMap.addMap ({ { "ZZZ", "ZZZ" },\r
+                                 { "ddd", "ddd" } });\r
+\r
+            auto withAddArray = initial;\r
+            withAddArray.addArray ([]\r
+            {\r
+                StringPairArray toAdd;\r
+                toAdd.set ("ZZZ", "ZZZ");\r
+                toAdd.set ("ddd", "ddd");\r
+                return toAdd;\r
+            }());\r
+\r
+            expect (withAddMap == withAddArray);\r
+        }\r
+    }\r
+};\r
+\r
+static StringPairArrayTests stringPairArrayTests;\r
+\r
+#endif\r
+\r
 } // namespace juce\r
index 77d486c92bbc33db37de59124fc98fb095f37544..16b9a99c1e66a0923033cee440746096c3fb7977 100644 (file)
@@ -124,6 +124,10 @@ public:
     */\r
     void setIgnoresCase (bool shouldIgnoreCase);\r
 \r
+    /** Indicates whether a case-insensitive search is used when looking up a key string.\r
+    */\r
+    bool getIgnoresCase() const noexcept;\r
+\r
     //==============================================================================\r
     /** Returns a descriptive string containing the items.\r
         This is handy for dumping the contents of an array.\r
@@ -139,6 +143,9 @@ public:
     */\r
     void minimiseStorageOverheads();\r
 \r
+    //==============================================================================\r
+    /** Adds the contents of a map to this StringPairArray. */\r
+    void addMap (const std::map<String, String>& mapToAdd);\r
 \r
 private:\r
     //==============================================================================\r
index e03f6e81266c1065d31af3d647fe3c078b7081b3..db4e3e8e9258aad9c67c46d5fc9cf9fa411815f1 100644 (file)
@@ -23,7 +23,7 @@
 namespace juce\r
 {\r
 \r
-HighResolutionTimer::HighResolutionTimer()                    { pimpl.reset (new Pimpl (*this)); }\r
+HighResolutionTimer::HighResolutionTimer() : pimpl (new Pimpl (*this)) {}\r
 HighResolutionTimer::~HighResolutionTimer()                   { stopTimer(); }\r
 \r
 void HighResolutionTimer::startTimer (int periodMs)           { pimpl->start (jmax (1, periodMs)); }\r
index 1c2eebc7158fc285e3cbe497388e129478e86c5e..768b3cc3d3eb7cb6b2ef8e528087a38c2031c9f2 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_cryptography\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 4669261d029c644cbacf6ff82799e822c0d8d2c8..996f5e7a36c7b51b0b4b6b95f4fb88c3b11c5dda 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_data_structures\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 f1acc87af451f04a59bb00d66e5fb1a61fa7c1af..c6a50ab0916e1b4422d31966f50601db2b1c5d4a 100644 (file)
@@ -270,19 +270,19 @@ typename FIR::Coefficients<FloatType>::Ptr
     for (int i = 0; i < hh.size(); ++i)\r
         c[i] = (float) hh[i];\r
 \r
-    double NN;\r
-\r
-    if (n % 2 == 0)\r
-    {\r
-        NN = 2.0 * result->getMagnitudeForFrequency (0.5, 1.0);\r
-    }\r
-    else\r
+    auto NN = [&]\r
     {\r
+        if (n % 2 == 0)\r
+            return 2.0 * result->getMagnitudeForFrequency (0.5, 1.0);\r
+\r
         auto w01 = std::sqrt (kp * kp + (1 - kp * kp) * std::pow (std::cos (MathConstants<double>::pi / (2.0 * n + 1.0)), 2.0));\r
-        auto om01 = std::acos (-w01);\r
 \r
-        NN = -2.0 * result->getMagnitudeForFrequency (om01 / MathConstants<double>::twoPi, 1.0);\r
-    }\r
+        if (std::abs (w01) > 1.0)\r
+            return 2.0 * result->getMagnitudeForFrequency (0.5, 1.0);\r
+\r
+        auto om01 = std::acos (-w01);\r
+        return -2.0 * result->getMagnitudeForFrequency (om01 / MathConstants<double>::twoPi, 1.0);\r
+    }();\r
 \r
     for (int i = 0; i < hh.size(); ++i)\r
         c[i] = static_cast<FloatType> ((A * hn[i] + B * hnm[i]) / NN);\r
index 42b6b6a44ac664a01697468f1dacda2f950d6a05..6fb58f1196c6dc13408d12d9a9d52eaf8d5ef92d 100644 (file)
@@ -86,6 +86,12 @@ public:
     // This function is only safe to call from a single thread at a time.\r
     bool push (IncomingCommand& command) { return queue.push (command); }\r
 \r
+    void popAll()\r
+    {\r
+        const ScopedLock lock (popMutex);\r
+        queue.popAll ([] (IncomingCommand& command) { command(); command = nullptr; });\r
+    }\r
+\r
     using Thread::startThread;\r
     using Thread::stopThread;\r
 \r
@@ -94,13 +100,23 @@ private:
     {\r
         while (! threadShouldExit())\r
         {\r
-            if (queue.hasPendingMessages())\r
+            const auto tryPop = [&]\r
+            {\r
+                const ScopedLock lock (popMutex);\r
+\r
+                if (! queue.hasPendingMessages())\r
+                    return false;\r
+\r
                 queue.pop ([] (IncomingCommand& command) { command(); command = nullptr;});\r
-            else\r
+                return true;\r
+            };\r
+\r
+            if (! tryPop())\r
                 sleep (10);\r
         }\r
     }\r
 \r
+    CriticalSection popMutex;\r
     Queue<IncomingCommand> queue;\r
 \r
     JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BackgroundMessageQueue)\r
@@ -892,7 +908,6 @@ public:
     std::unique_ptr<MultichannelEngine> getEngine() { return factory.getEngine(); }\r
 \r
 private:\r
-\r
     template <typename Fn>\r
     void callLater (Fn&& fn)\r
     {\r
@@ -1017,9 +1032,13 @@ public:
 \r
     void prepare (const ProcessSpec& spec)\r
     {\r
+        messageQueue->pimpl->popAll();\r
         mixer.prepare (spec);\r
         engineQueue->prepare (spec);\r
-        currentEngine = engineQueue->getEngine();\r
+\r
+        if (auto newEngine = engineQueue->getEngine())\r
+            currentEngine = std::move (newEngine);\r
+\r
         previousEngine = nullptr;\r
         jassert (currentEngine != nullptr);\r
     }\r
index d7ec4b81986cce842e58a4b4180f8370330ef369..af93b7370221f3377b7b3441070192077e23e01c 100644 (file)
@@ -89,6 +89,19 @@ class ConvolutionTest  : public UnitTest
                 expect (! std::isnan (block.getSample ((int) channel, (int) sample)));\r
     }\r
 \r
+    void checkAllChannelsNonZero (const AudioBlock<float>& block)\r
+    {\r
+        for (size_t i = 0; i != block.getNumChannels(); ++i)\r
+        {\r
+            const auto* channel = block.getChannelPointer (i);\r
+\r
+            expect (std::any_of (channel, channel + block.getNumSamples(), [] (float sample)\r
+            {\r
+                return sample != 0.0f;\r
+            }));\r
+        }\r
+    }\r
+\r
     template <typename T>\r
     void nonAllocatingExpectWithinAbsoluteError (const T& a, const T& b, const T& error)\r
     {\r
@@ -168,16 +181,21 @@ class ConvolutionTest  : public UnitTest
             }\r
         };\r
 \r
-        const auto time = Time::getMillisecondCounter();\r
-\r
-        // Wait 10 seconds to load the impulse response\r
-        while (Time::getMillisecondCounter() - time < 10'000)\r
+        // If we load an IR while the convolution is already running, we'll need to wait\r
+        // for it to be loaded on a background thread\r
+        if (initSequence == InitSequence::prepareThenLoad)\r
         {\r
-            processBlocksWithDiracImpulse();\r
+            const auto time = Time::getMillisecondCounter();\r
+\r
+            // Wait 10 seconds to load the impulse response\r
+            while (Time::getMillisecondCounter() - time < 10'000)\r
+            {\r
+                processBlocksWithDiracImpulse();\r
 \r
-            // Check if the impulse response was loaded\r
-            if (block.getSample (0, 1) != 0.0f)\r
-                break;\r
+                // Check if the impulse response was loaded\r
+                if (block.getSample (0, 1) != 0.0f)\r
+                    break;\r
+            }\r
         }\r
 \r
         // At this point, our convolution should be loaded and the current IR size should\r
@@ -326,6 +344,45 @@ public:
             checkForNans (block);\r
         }\r
 \r
+        beginTest ("Convolutions can cope with a change in samplerate and blocksize");\r
+        {\r
+            Convolution convolution;\r
+\r
+            auto copy = impulseData;\r
+            convolution.loadImpulseResponse (std::move (copy),\r
+                                             2000,\r
+                                             Convolution::Stereo::yes,\r
+                                             Convolution::Trim::no,\r
+                                             Convolution::Normalise::yes);\r
+\r
+            const dsp::ProcessSpec specs[] = { { 96'000.0, 1024, 2 },\r
+                                               { 48'000.0, 512, 2 },\r
+                                               { 44'100.0, 256, 2 } };\r
+\r
+            for (const auto& thisSpec : specs)\r
+            {\r
+                convolution.prepare (thisSpec);\r
+\r
+                expectWithinAbsoluteError ((double) convolution.getCurrentIRSize(),\r
+                                           thisSpec.sampleRate * 0.5,\r
+                                           1.0);\r
+\r
+                juce::AudioBuffer<float> thisBuffer ((int) thisSpec.numChannels,\r
+                                                     (int) thisSpec.maximumBlockSize);\r
+                AudioBlock<float> thisBlock { thisBuffer };\r
+                ProcessContextReplacing<float> thisContext { thisBlock };\r
+\r
+                nTimes (100, [&]\r
+                {\r
+                    addDiracImpulse (thisBlock);\r
+                    convolution.process (thisContext);\r
+\r
+                    checkForNans (thisBlock);\r
+                    checkAllChannelsNonZero (thisBlock);\r
+                });\r
+            }\r
+        }\r
+\r
         beginTest ("Short uniform convolutions work");\r
         {\r
             const auto ramp = makeRamp (static_cast<int> (spec.maximumBlockSize) / 2);\r
index 9e297f03585c67f89c14884302b3cf0ba8702e1f..fdf1df319e05b883ab73b1c0170e058134a92010 100644 (file)
@@ -54,8 +54,6 @@
  #define JUCE_IPP_AVAILABLE 1\r
 #endif\r
 \r
-#include "containers/juce_FixedSizeFunction.h"\r
-\r
 #include "processors/juce_FIRFilter.cpp"\r
 #include "processors/juce_IIRFilter.cpp"\r
 #include "processors/juce_FirstOrderTPTFilter.cpp"\r
index 060494d30f942fa388468be13c2fe4eec5257dd2..15463ccca8d4555cbc89ed2a578278f123aefdf9 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_dsp\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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
@@ -243,6 +243,7 @@ namespace juce
 #include "maths/juce_LookupTable.h"\r
 #include "maths/juce_LogRampedValue.h"\r
 #include "containers/juce_AudioBlock.h"\r
+#include "containers/juce_FixedSizeFunction.h"\r
 #include "processors/juce_ProcessContext.h"\r
 #include "processors/juce_ProcessorWrapper.h"\r
 #include "processors/juce_ProcessorChain.h"\r
index 884db8d743d0d176396a475cd87ca6e1af87db87..922eb539c4a5915e6ae45884c1d5719f277cd10b 100644 (file)
 \r
  #include "native/juce_osx_MessageQueue.h"\r
 \r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-\r
  #if JUCE_MAC\r
   #include "native/juce_mac_MessageManager.mm"\r
  #else\r
   #include "native/juce_ios_MessageManager.mm"\r
  #endif\r
 \r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
 #elif JUCE_WINDOWS\r
  #include "native/juce_win32_Messaging.cpp"\r
  #if JUCE_EVENTS_INCLUDE_WINRT_WRAPPER\r
index 147533242ccfb163750c0dfca7a56d4587c20f69..a62f530c4b07afc80307260809e38ba38d0c3acd 100644 (file)
@@ -32,7 +32,7 @@
 \r
   ID:                 juce_events\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 36352ab5bad3a01c65d7dd1fc99a37ca5a38b1c3..972e894ac70fdf1d1ee75db93d451bf1c5e99470 100644 (file)
@@ -43,20 +43,24 @@ public:
 \r
         NSNotificationCenter* center = [NSNotificationCenter defaultCenter];\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         [center addObserver: delegate selector: @selector (mainMenuTrackingBegan:)\r
                        name: NSMenuDidBeginTrackingNotification object: nil];\r
         [center addObserver: delegate selector: @selector (mainMenuTrackingEnded:)\r
                        name: NSMenuDidEndTrackingNotification object: nil];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
         if (JUCEApplicationBase::isStandaloneApp())\r
         {\r
             [NSApp setDelegate: delegate];\r
 \r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             [[NSDistributedNotificationCenter defaultCenter] addObserver: delegate\r
                                                                 selector: @selector (broadcastMessageCallback:)\r
                                                                     name: getBroadcastEventName()\r
                                                                   object: nil\r
                                                       suspensionBehavior: NSNotificationSuspensionBehaviorDeliverImmediately];\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
         }\r
         else\r
         {\r
@@ -103,7 +107,6 @@ private:
         AppDelegateClass()  : ObjCClass<NSObject> ("JUCEAppDelegate_")\r
         {\r
             addMethod (@selector (applicationWillFinishLaunching:), applicationWillFinishLaunching, "v@:@");\r
-            addMethod (@selector (getUrl:withReplyEvent:),          getUrl_withReplyEvent,          "v@:@@");\r
             addMethod (@selector (applicationShouldTerminate:),     applicationShouldTerminate,     "I@:@");\r
             addMethod (@selector (applicationWillTerminate:),       applicationWillTerminate,       "v@:@");\r
             addMethod (@selector (application:openFile:),           application_openFile,           "c@:@@");\r
@@ -111,17 +114,25 @@ private:
             addMethod (@selector (applicationDidBecomeActive:),     applicationDidBecomeActive,     "v@:@");\r
             addMethod (@selector (applicationDidResignActive:),     applicationDidResignActive,     "v@:@");\r
             addMethod (@selector (applicationWillUnhide:),          applicationWillUnhide,          "v@:@");\r
+\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+            addMethod (@selector (getUrl:withReplyEvent:),          getUrl_withReplyEvent,          "v@:@@");\r
             addMethod (@selector (broadcastMessageCallback:),       broadcastMessageCallback,       "v@:@");\r
             addMethod (@selector (mainMenuTrackingBegan:),          mainMenuTrackingBegan,          "v@:@");\r
             addMethod (@selector (mainMenuTrackingEnded:),          mainMenuTrackingEnded,          "v@:@");\r
             addMethod (@selector (dummyMethod),                     dummyMethod,                    "v@:");\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
            #if JUCE_PUSH_NOTIFICATIONS\r
             //==============================================================================\r
             addIvar<NSObject<NSApplicationDelegate, NSUserNotificationCenterDelegate>*> ("pushNotificationsDelegate");\r
 \r
             addMethod (@selector (applicationDidFinishLaunching:),                                applicationDidFinishLaunching,          "v@:@");\r
+\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             addMethod (@selector (setPushNotificationsDelegate:),                                 setPushNotificationsDelegate,           "v@:@");\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
             addMethod (@selector (application:didRegisterForRemoteNotificationsWithDeviceToken:), registeredForRemoteNotifications,       "v@:@@");\r
             addMethod (@selector (application:didFailToRegisterForRemoteNotificationsWithError:), failedToRegisterForRemoteNotifications, "v@:@@");\r
             addMethod (@selector (application:didReceiveRemoteNotification:),                     didReceiveRemoteNotification,           "v@:@@");\r
@@ -133,10 +144,12 @@ private:
     private:\r
         static void applicationWillFinishLaunching (id self, SEL, NSNotification*)\r
         {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             [[NSAppleEventManager sharedAppleEventManager] setEventHandler: self\r
                                                                andSelector: @selector (getUrl:withReplyEvent:)\r
                                                              forEventClass: kInternetEventClass\r
                                                                 andEventID: kAEGetURL];\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
         }\r
 \r
        #if JUCE_PUSH_NOTIFICATIONS\r
@@ -263,7 +276,7 @@ private:
         {\r
             auto* delegate = getPushNotificationsDelegate (self);\r
 \r
-            SEL selector = NSSelectorFromString (@"application:didRegisterForRemoteNotificationsWithDeviceToken:");\r
+            SEL selector = @selector (application:didRegisterForRemoteNotificationsWithDeviceToken:);\r
 \r
             if (delegate != nil && [delegate respondsToSelector: selector])\r
             {\r
@@ -281,7 +294,7 @@ private:
         {\r
             auto* delegate = getPushNotificationsDelegate (self);\r
 \r
-            SEL selector = NSSelectorFromString (@"application:didFailToRegisterForRemoteNotificationsWithError:");\r
+            SEL selector =  @selector (application:didFailToRegisterForRemoteNotificationsWithError:);\r
 \r
             if (delegate != nil && [delegate respondsToSelector: selector])\r
             {\r
@@ -299,7 +312,7 @@ private:
         {\r
             auto* delegate = getPushNotificationsDelegate (self);\r
 \r
-            SEL selector = NSSelectorFromString (@"application:didReceiveRemoteNotification:");\r
+            SEL selector =  @selector (application:didReceiveRemoteNotification:);\r
 \r
             if (delegate != nil && [delegate respondsToSelector: selector])\r
             {\r
@@ -487,8 +500,10 @@ struct MountedVolumeListChangeDetector::Pimpl
 \r
         NSNotificationCenter* nc = [[NSWorkspace sharedWorkspace] notificationCenter];\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         [nc addObserver: delegate selector: @selector (changed:) name: NSWorkspaceDidMountNotification   object: nil];\r
         [nc addObserver: delegate selector: @selector (changed:) name: NSWorkspaceDidUnmountNotification object: nil];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     ~Pimpl()\r
@@ -506,7 +521,11 @@ private:
         ObserverClass()  : ObjCClass<NSObject> ("JUCEDriveObserver_")\r
         {\r
             addIvar<Pimpl*> ("owner");\r
+\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             addMethod (@selector (changed:), changed, "v@:@");\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
             addProtocol (@protocol (NSTextInput));\r
             registerClass();\r
         }\r
index 8331b1de8584d5f7f983f227a8f947be985ecb89..b2196bbf0a68f205b8fc9653ee0434e6a5d9627f 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_graphics\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 ce106bbae23f10f2ac974d9a249bbae338bbbdf9..d4d7266fa48bfe07eac7140d61027a5999d23b21 100644 (file)
@@ -35,6 +35,12 @@ struct ModalComponentManager::ModalItem  : public ComponentMovementWatcher
         jassert (comp != nullptr);\r
     }\r
 \r
+    ~ModalItem() override\r
+    {\r
+        if (autoDelete)\r
+            std::unique_ptr<Component> componentDeleter (component);\r
+    }\r
+\r
     void componentMovedOrResized (bool, bool) override {}\r
 \r
     using ComponentMovementWatcher::componentMovedOrResized;\r
index 056ff591b27790f343f4d896ae316a57059813de..c70541c991bed826ac7df673dcec952a4af8ffe1 100644 (file)
@@ -229,8 +229,6 @@ namespace juce
 #endif\r
 \r
 #if JUCE_MAC || JUCE_IOS\r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-\r
  #if JUCE_IOS\r
   #include "native/juce_ios_UIViewComponentPeer.mm"\r
   #include "native/juce_ios_Windowing.mm"\r
@@ -247,8 +245,6 @@ namespace juce
   #include "native/juce_mac_FileChooser.mm"\r
  #endif\r
 \r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
  #include "native/juce_mac_MouseCursor.mm"\r
 \r
 #elif JUCE_WINDOWS\r
index 52dd174a76026bf95fbb669dd881638fa06ba56d..615d8f630f5f99ee6377346682e3149fec1ad179 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_gui_basics\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE GUI core classes\r
   description:        Basic user-interface components and related classes.\r
   website:            http://www.juce.com/juce\r
index 4cb678ad3b885f8d806af860e9e8e9eb731a0691..42dde156588eceda8c009f2917f4aec9465cad9e 100644 (file)
@@ -1667,4 +1667,25 @@ const int KeyPress::stopKey         = extendedKeyModifier + 46;
 const int KeyPress::fastForwardKey  = extendedKeyModifier + 47;\r
 const int KeyPress::rewindKey       = extendedKeyModifier + 48;\r
 \r
+//==============================================================================\r
+struct JuceActivityNewIntentListener\r
+{\r
+    #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
+     CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V")\r
+\r
+     DECLARE_JNI_CLASS (JavaActivity, JUCE_PUSH_NOTIFICATIONS_ACTIVITY)\r
+    #undef JNI_CLASS_MEMBERS\r
+\r
+    static void JNICALL appNewIntent (JNIEnv*, jobject /*activity*/, jobject intentData)\r
+    {\r
+       #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
+        juce_handleNotificationIntent (static_cast<void*> (intentData));\r
+       #else\r
+        juce::ignoreUnused (intentData);\r
+       #endif\r
+    }\r
+};\r
+\r
+JuceActivityNewIntentListener::JavaActivity_Class JuceActivityNewIntentListener::JavaActivity;\r
+\r
 } // namespace juce\r
index 82c9452fb3016b3bd27a02a9520636bd346ff626..f2329055258f2ec4c39551bfd8297502202fe378 100644 (file)
@@ -198,7 +198,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:didRegisterUserNotificationSettings:");\r
+    SEL selector = @selector (application:didRegisterUserNotificationSettings:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -216,7 +216,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:didRegisterForRemoteNotificationsWithDeviceToken:");\r
+    SEL selector = @selector (application:didRegisterForRemoteNotificationsWithDeviceToken:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -234,7 +234,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:didFailToRegisterForRemoteNotificationsWithError:");\r
+    SEL selector = @selector (application:didFailToRegisterForRemoteNotificationsWithError:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -252,7 +252,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:didReceiveRemoteNotification:");\r
+    SEL selector = @selector (application:didReceiveRemoteNotification:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -271,7 +271,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:didReceiveRemoteNotification:fetchCompletionHandler:");\r
+    SEL selector = @selector (application:didReceiveRemoteNotification:fetchCompletionHandler:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -292,7 +292,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:");\r
+    SEL selector = @selector (application:handleActionWithIdentifier:forRemoteNotification:withResponseInfo:completionHandler:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -313,7 +313,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:didReceiveLocalNotification:");\r
+    SEL selector = @selector (application:didReceiveLocalNotification:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -332,7 +332,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:handleActionWithIdentifier:forLocalNotification:completionHandler:");\r
+    SEL selector = @selector (application:handleActionWithIdentifier:forLocalNotification:completionHandler:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -354,7 +354,7 @@ namespace juce
 {\r
     ignoreUnused (application);\r
 \r
-    SEL selector = NSSelectorFromString (@"application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:");\r
+    SEL selector = @selector (application:handleActionWithIdentifier:forLocalNotification:withResponseInfo:completionHandler:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -377,7 +377,7 @@ namespace juce
 {\r
     ignoreUnused (center);\r
 \r
-    SEL selector = NSSelectorFromString (@"userNotificationCenter:willPresentNotification:withCompletionHandler:");\r
+    SEL selector = @selector (userNotificationCenter:willPresentNotification:withCompletionHandler:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
@@ -397,7 +397,7 @@ namespace juce
 {\r
     ignoreUnused (center);\r
 \r
-    SEL selector = NSSelectorFromString (@"userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:");\r
+    SEL selector = @selector (userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:);\r
 \r
     if (_pushNotificationsDelegate != nil && [_pushNotificationsDelegate respondsToSelector: selector])\r
     {\r
index 11446731233197e220d8815384bef390444a752e..e8aa9191d7a2c89edc0962500298ef8435d691cf 100644 (file)
@@ -431,15 +431,20 @@ private:
             return;\r
 \r
         Point<int> translation = (parentWindow != 0 ? getScreenPosition (isPhysical) : Point<int>());\r
+        const auto& desktop = Desktop::getInstance();\r
 \r
-        auto newScaleFactor = Desktop::getInstance().getDisplays().getDisplayForRect (newBounds.translated (translation.x, translation.y), isPhysical)->scale\r
-                                 / Desktop::getInstance().getGlobalScaleFactor();\r
-\r
-        if (! approximatelyEqual (newScaleFactor, currentScaleFactor))\r
+        if (auto* display = desktop.getDisplays().getDisplayForRect (newBounds.translated (translation.x, translation.y),\r
+                                                                     isPhysical))\r
         {\r
-            currentScaleFactor = newScaleFactor;\r
-            scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (currentScaleFactor); });\r
+            auto newScaleFactor = display->scale / desktop.getGlobalScaleFactor();\r
+\r
+            if (! approximatelyEqual (newScaleFactor, currentScaleFactor))\r
+            {\r
+                currentScaleFactor = newScaleFactor;\r
+                scaleFactorListeners.call ([&] (ScaleFactorListener& l) { l.nativeScaleFactorChanged (currentScaleFactor); });\r
+            }\r
         }\r
+\r
     }\r
 \r
     //==============================================================================\r
index 9c147cafded6ed08534b2a9b7582086f26dfc1c0..2389f7faa6f463e715d92e8038e6df0c3a1c5e8f 100644 (file)
@@ -38,7 +38,10 @@ struct JuceMainMenuBarHolder : private DeletedAtShutdown
 \r
         auto appMenu = [[NSMenu alloc] initWithTitle: nsStringLiteral ("Apple")];\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         [NSApp performSelector: @selector (setAppleMenu:) withObject: appMenu];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
         [mainMenuBar setSubmenu: appMenu forItem: item];\r
         [appMenu release];\r
 \r
@@ -282,9 +285,11 @@ public:
         }\r
         else\r
         {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             auto item = [[NSMenuItem alloc] initWithTitle: text\r
                                                    action: @selector (menuItemInvoked:)\r
                                             keyEquivalent: nsEmptyString()];\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
             [item setTag: topLevelIndex];\r
             [item setEnabled: i.isEnabled];\r
@@ -515,7 +520,10 @@ private:
         {\r
             addIvar<JuceMainMenuHandler*> ("owner");\r
 \r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             addMethod (@selector (menuItemInvoked:),  menuItemInvoked, "v@:@");\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
             addMethod (@selector (menuNeedsUpdate:),  menuNeedsUpdate, "v@:@");\r
 \r
             addProtocol (@protocol (NSMenuDelegate));\r
index ed74cff79d8ad5a86e76dfa68c7377b95a20dc32..807cdb02b77294132883fbfdf02fdc1de2fa6f84 100644 (file)
@@ -99,8 +99,12 @@ public:
 \r
         notificationCenter = [NSNotificationCenter defaultCenter];\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+        SEL frameChangedSelector = @selector (frameChanged:);\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
         [notificationCenter  addObserver: view\r
-                                selector: @selector (frameChanged:)\r
+                                selector: frameChangedSelector\r
                                     name: NSViewFrameDidChangeNotification\r
                                   object: view];\r
 \r
@@ -171,12 +175,12 @@ public:
            #endif\r
 \r
             [notificationCenter  addObserver: view\r
-                                    selector: @selector (frameChanged:)\r
+                                    selector: frameChangedSelector\r
                                         name: NSWindowDidMoveNotification\r
                                       object: window];\r
 \r
             [notificationCenter  addObserver: view\r
-                                    selector: @selector (frameChanged:)\r
+                                    selector: frameChangedSelector\r
                                         name: NSWindowDidMiniaturizeNotification\r
                                       object: window];\r
 \r
@@ -852,6 +856,14 @@ public:
         if ([screen respondsToSelector: @selector (backingScaleFactor)])\r
             displayScale = (float) screen.backingScaleFactor;\r
 \r
+        auto invalidateTransparentWindowShadow = [this]\r
+        {\r
+            // transparent NSWindows with a drop-shadow need to redraw their shadow when the content\r
+            // changes to avoid stale shadows being drawn behind the window\r
+            if (! isSharedWindow && ! [window isOpaque] && [window hasShadow])\r
+                [window invalidateShadow];\r
+        };\r
+\r
        #if USE_COREGRAPHICS_RENDERING && JUCE_COREGRAPHICS_RENDER_WITH_MULTIPLE_PAINT_CALLS\r
         // This option invokes a separate paint call for each rectangle of the clip region.\r
         // It's a long story, but this is a basically a workaround for a CGContext not having\r
@@ -873,12 +885,14 @@ public:
                     CGContextRestoreGState (cg);\r
                 }\r
 \r
+                invalidateTransparentWindowShadow();\r
                 return;\r
             }\r
         }\r
        #endif\r
 \r
         drawRect (cg, r, displayScale);\r
+        invalidateTransparentWindowShadow();\r
     }\r
 \r
     void drawRect (CGContextRef cg, NSRect r, float displayScale)\r
@@ -1613,9 +1627,7 @@ struct JuceNSViewClass   : public ObjCClass<NSView>
         addMethod (@selector (isOpaque),                      isOpaque,                   "c@:");\r
         addMethod (@selector (drawRect:),                     drawRect,                   "v@:", @encode (NSRect));\r
         addMethod (@selector (mouseDown:),                    mouseDown,                  "v@:@");\r
-        addMethod (@selector (asyncMouseDown:),               asyncMouseDown,             "v@:@");\r
         addMethod (@selector (mouseUp:),                      mouseUp,                    "v@:@");\r
-        addMethod (@selector (asyncMouseUp:),                 asyncMouseUp,               "v@:@");\r
         addMethod (@selector (mouseDragged:),                 mouseDragged,               "v@:@");\r
         addMethod (@selector (mouseMoved:),                   mouseMoved,                 "v@:@");\r
         addMethod (@selector (mouseEntered:),                 mouseEntered,               "v@:@");\r
@@ -1629,10 +1641,9 @@ struct JuceNSViewClass   : public ObjCClass<NSView>
         addMethod (@selector (scrollWheel:),                  scrollWheel,                "v@:@");\r
         addMethod (@selector (magnifyWithEvent:),             magnify,                    "v@:@");\r
         addMethod (@selector (acceptsFirstMouse:),            acceptsFirstMouse,          "c@:@");\r
-        addMethod (@selector (frameChanged:),                 frameChanged,               "v@:@");\r
         addMethod (@selector (windowWillMiniaturize:),        windowWillMiniaturize,      "v@:@");\r
         addMethod (@selector (windowDidDeminiaturize:),       windowDidDeminiaturize,     "v@:@");\r
-        addMethod (@selector (wantsDefaultClipping:),         wantsDefaultClipping,       "c@:");\r
+        addMethod (@selector (wantsDefaultClipping),          wantsDefaultClipping,       "c@:");\r
         addMethod (@selector (worksWhenModal),                worksWhenModal,             "c@:");\r
         addMethod (@selector (viewDidMoveToWindow),           viewDidMoveToWindow,        "v@:");\r
         addMethod (@selector (keyDown:),                      keyDown,                    "v@:@");\r
@@ -1670,6 +1681,12 @@ struct JuceNSViewClass   : public ObjCClass<NSView>
 \r
         addMethod (@selector (viewWillMoveToWindow:),         willMoveToWindow,           "v@:@");\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+        addMethod (@selector (asyncMouseDown:),               asyncMouseDown,             "v@:@");\r
+        addMethod (@selector (asyncMouseUp:),                 asyncMouseUp,               "v@:@");\r
+        addMethod (@selector (frameChanged:),                 frameChanged,               "v@:@");\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
         addProtocol (@protocol (NSTextInput));\r
 \r
         registerClass();\r
@@ -1684,27 +1701,39 @@ private:
     static void mouseDown (id self, SEL s, NSEvent* ev)\r
     {\r
         if (JUCEApplicationBase::isStandaloneApp())\r
+        {\r
             asyncMouseDown (self, s, ev);\r
+        }\r
         else\r
+        {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             // In some host situations, the host will stop modal loops from working\r
             // correctly if they're called from a mouse event, so we'll trigger\r
             // the event asynchronously..\r
             [self performSelectorOnMainThread: @selector (asyncMouseDown:)\r
                                    withObject: ev\r
                                 waitUntilDone: NO];\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+        }\r
     }\r
 \r
     static void mouseUp (id self, SEL s, NSEvent* ev)\r
     {\r
         if (JUCEApplicationBase::isStandaloneApp())\r
+        {\r
             asyncMouseUp (self, s, ev);\r
+        }\r
         else\r
+        {\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             // In some host situations, the host will stop modal loops from working\r
             // correctly if they're called from a mouse event, so we'll trigger\r
             // the event asynchronously..\r
             [self performSelectorOnMainThread: @selector (asyncMouseUp:)\r
                                    withObject: ev\r
                                 waitUntilDone: NO];\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+        }\r
     }\r
 \r
     static void asyncMouseDown   (id self, SEL, NSEvent* ev)   { if (auto* p = getOwner (self)) p->redirectMouseDown  (ev); }\r
index a1a554ef9ceb0165d34d6fb10906e32be966bc61..491449358924e9e3f1f057cedff0df8418917775 100644 (file)
@@ -46,7 +46,7 @@ public:
                             const File& startingFile, const String& titleToUse,\r
                             const String& filtersToUse)\r
         : Thread ("Native Win32 FileChooser"),\r
-          owner (parent), title (titleToUse), filtersString (filtersToUse),\r
+          owner (parent), title (titleToUse), filtersString (filtersToUse.replaceCharacter (',', ';')),\r
           selectsDirectories ((flags & FileBrowserComponent::canSelectDirectories)   != 0),\r
           isSave             ((flags & FileBrowserComponent::saveMode)               != 0),\r
           warnAboutOverwrite ((flags & FileBrowserComponent::warnAboutOverwriting)   != 0),\r
@@ -167,6 +167,11 @@ private:
     Atomic<HWND> nativeDialogRef;\r
     Atomic<int>  shouldCancel;\r
 \r
+    struct FreeLPWSTR\r
+    {\r
+        void operator() (LPWSTR ptr) const noexcept { CoTaskMemFree (ptr); }\r
+    };\r
+\r
     bool showDialog (IFileDialog& dialog, bool async) const\r
     {\r
         FILEOPENDIALOGOPTIONS flags = {};\r
@@ -193,7 +198,17 @@ private:
         PIDLIST_ABSOLUTE pidl = {};\r
 \r
         if (FAILED (SHParseDisplayName (initialPath.toWideCharPointer(), nullptr, &pidl, SFGAO_FOLDER, nullptr)))\r
-            return false;\r
+        {\r
+            LPWSTR ptr = nullptr;\r
+            auto result = SHGetKnownFolderPath (FOLDERID_Desktop, 0, nullptr, &ptr);\r
+            std::unique_ptr<WCHAR, FreeLPWSTR> desktopPath (ptr);\r
+\r
+            if (FAILED (result))\r
+                return false;\r
+\r
+            if (FAILED (SHParseDisplayName (desktopPath.get(), nullptr, &pidl, SFGAO_FOLDER, nullptr)))\r
+                return false;\r
+        }\r
 \r
         const auto item = [&]\r
         {\r
@@ -228,17 +243,12 @@ private:
     {\r
         const auto getUrl = [] (IShellItem& item)\r
         {\r
-            struct Free\r
-            {\r
-                void operator() (LPWSTR ptr) const noexcept { CoTaskMemFree (ptr); }\r
-            };\r
-\r
             LPWSTR ptr = nullptr;\r
 \r
             if (item.GetDisplayName (SIGDN_FILESYSPATH, &ptr) != S_OK)\r
                 return URL();\r
 \r
-            const auto path = std::unique_ptr<WCHAR, Free> { ptr };\r
+            const auto path = std::unique_ptr<WCHAR, FreeLPWSTR> { ptr };\r
             return URL (File (String (path.get())));\r
         };\r
 \r
index 6ae0d3dc3761618f00751874473c9ae1d19c3b87..cda94b0ca4dc325b2e6e9bff63e445b22c6a048b 100644 (file)
@@ -362,7 +362,9 @@ static void setDPIAwareness()
     if (! JUCEApplicationBase::isStandaloneApp())\r
         return;\r
 \r
-    HMODULE shcoreModule = GetModuleHandleA ("SHCore.dll");\r
+    const auto shcore = "SHCore.dll";\r
+    LoadLibraryA (shcore);\r
+    const auto shcoreModule = GetModuleHandleA (shcore);\r
 \r
     if (shcoreModule != nullptr)\r
     {\r
@@ -1415,8 +1417,7 @@ public:
         if (auto parentH = GetParent (hwnd))\r
         {\r
             auto r = getWindowRect (parentH);\r
-            auto localBounds = Rectangle<int>::leftTopRightBottom (bounds.left, bounds.top,\r
-                                                                   bounds.right, bounds.bottom).translated (-r.left, -r.top);\r
+            auto localBounds = rectangleFromRECT (bounds).translated (-r.left, -r.top);\r
 \r
            #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
             if (isPerMonitorDPIAwareWindow (hwnd))\r
@@ -1795,31 +1796,11 @@ public:
             return peer.getComponent().getLocalPoint (nullptr, screenPos);\r
         }\r
 \r
-        template <typename CharType>\r
-        void parseFileList (const CharType* names, const SIZE_T totalLen)\r
-        {\r
-            for (unsigned int i = 0;;)\r
-            {\r
-                unsigned int len = 0;\r
-\r
-                while (i + len < totalLen && names[i + len] != 0)\r
-                    ++len;\r
-\r
-                if (len == 0)\r
-                    break;\r
-\r
-                dragInfo.files.add (String (names + i, len));\r
-                i += len + 1;\r
-            }\r
-        }\r
-\r
         struct DroppedData\r
         {\r
             DroppedData (IDataObject* dataObject, CLIPFORMAT type)\r
             {\r
                 FORMATETC format = { type, nullptr, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };\r
-                STGMEDIUM resetMedium = { TYMED_HGLOBAL, { nullptr }, nullptr };\r
-                medium = resetMedium;\r
 \r
                 if (SUCCEEDED (error = dataObject->GetData (&format, &medium)))\r
                 {\r
@@ -1835,11 +1816,33 @@ public:
             }\r
 \r
             HRESULT error;\r
-            STGMEDIUM medium;\r
+            STGMEDIUM medium { TYMED_HGLOBAL, { nullptr }, nullptr };\r
             void* data = {};\r
             SIZE_T dataSize;\r
         };\r
 \r
+        void parseFileList (HDROP dropFiles)\r
+        {\r
+            dragInfo.files.clearQuick();\r
+\r
+            std::vector<TCHAR> nameBuffer;\r
+\r
+            const auto numFiles = DragQueryFile (dropFiles, ~(UINT) 0, nullptr, 0);\r
+\r
+            for (UINT i = 0; i < numFiles; ++i)\r
+            {\r
+                const auto bufferSize = DragQueryFile (dropFiles, i, nullptr, 0);\r
+                nameBuffer.clear();\r
+                nameBuffer.resize (bufferSize + 1, 0); // + 1 for the null terminator\r
+\r
+                const auto readCharacters = DragQueryFile (dropFiles, i, nameBuffer.data(), (UINT) nameBuffer.size());\r
+                ignoreUnused (readCharacters);\r
+                jassert (readCharacters == bufferSize);\r
+\r
+                dragInfo.files.add (String (nameBuffer.data()));\r
+            }\r
+        }\r
+\r
         HRESULT updateFileList (IDataObject* const dataObject)\r
         {\r
             if (peerIsDeleted)\r
@@ -1852,14 +1855,7 @@ public:
 \r
                 if (SUCCEEDED (fileData.error))\r
                 {\r
-                    auto dropFiles = static_cast<const LPDROPFILES> (fileData.data);\r
-                    const void* const names = addBytesToPointer (dropFiles, sizeof (DROPFILES));\r
-\r
-                    if (dropFiles->fWide)\r
-                        parseFileList (static_cast<const WCHAR*> (names), fileData.dataSize);\r
-                    else\r
-                        parseFileList (static_cast<const char*>  (names), fileData.dataSize);\r
-\r
+                    parseFileList (static_cast<HDROP> (fileData.data));\r
                     return S_OK;\r
                 }\r
             }\r
@@ -4514,15 +4510,20 @@ static const Displays::Display* getCurrentDisplayFromScaleFactor (HWND hwnd)
 //==============================================================================\r
 struct MonitorInfo\r
 {\r
-    MonitorInfo (bool main, RECT rect, double d) noexcept\r
-        : isMain (main), bounds (rect), dpi (d) {}\r
+    MonitorInfo (bool main, RECT totalArea, RECT workArea, double d) noexcept\r
+        : isMain (main),\r
+          totalAreaRect (totalArea),\r
+          workAreaRect (workArea),\r
+          dpi (d)\r
+    {\r
+    }\r
 \r
     bool isMain;\r
-    RECT bounds;\r
+    RECT totalAreaRect, workAreaRect;\r
     double dpi;\r
 };\r
 \r
-static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT r, LPARAM userInfo)\r
+static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT, LPARAM userInfo)\r
 {\r
     MONITORINFO info = {};\r
     info.cbSize = sizeof (info);\r
@@ -4539,7 +4540,7 @@ static BOOL CALLBACK enumMonitorsProc (HMONITOR hm, HDC, LPRECT r, LPARAM userIn
             dpi = (dpiX + dpiY) / 2.0;\r
     }\r
 \r
-    ((Array<MonitorInfo>*) userInfo)->add ({ isMain, *r, dpi });\r
+    ((Array<MonitorInfo>*) userInfo)->add ({ isMain, info.rcMonitor, info.rcWork, dpi });\r
     return TRUE;\r
 }\r
 \r
@@ -4553,7 +4554,10 @@ void Displays::findDisplays (float masterScale)
     auto globalDPI = getGlobalDPI();\r
 \r
     if (monitors.size() == 0)\r
-        monitors.add ({ true, getWindowRect (GetDesktopWindow()), globalDPI });\r
+    {\r
+        auto windowRect = getWindowRect (GetDesktopWindow());\r
+        monitors.add ({ true, windowRect, windowRect, globalDPI });\r
+    }\r
 \r
     // make sure the first in the list is the main monitor\r
     for (int i = 1; i < monitors.size(); ++i)\r
@@ -4577,30 +4581,24 @@ void Displays::findDisplays (float masterScale)
             d.scale = (d.dpi / USER_DEFAULT_SCREEN_DPI) * (masterScale / Desktop::getDefaultMasterScale());\r
         }\r
 \r
-        d.userArea = d.totalArea = Rectangle<int>::leftTopRightBottom (monitor.bounds.left, monitor.bounds.top,\r
-                                                                       monitor.bounds.right, monitor.bounds.bottom);\r
-\r
-        if (d.isMain)\r
-        {\r
-            RECT workArea;\r
-            SystemParametersInfo (SPI_GETWORKAREA, 0, &workArea, 0);\r
-\r
-            d.userArea = d.userArea.getIntersection (Rectangle<int>::leftTopRightBottom (workArea.left, workArea.top,\r
-                                                                                         workArea.right, workArea.bottom));\r
-        }\r
+        d.totalArea = rectangleFromRECT (monitor.totalAreaRect);\r
+        d.userArea  = rectangleFromRECT (monitor.workAreaRect);\r
 \r
         displays.add (d);\r
     }\r
 \r
    #if JUCE_WIN_PER_MONITOR_DPI_AWARE\r
-    updateToLogical();\r
-   #else\r
-    for (auto& d : displays)\r
+    if (isPerMonitorDPIAwareThread())\r
+        updateToLogical();\r
+    else\r
+   #endif\r
     {\r
-        d.totalArea /= masterScale;\r
-        d.userArea  /= masterScale;\r
+        for (auto& d : displays)\r
+        {\r
+            d.totalArea /= masterScale;\r
+            d.userArea  /= masterScale;\r
+        }\r
     }\r
-   #endif\r
 }\r
 \r
 //==============================================================================\r
index ff523ac45afa2b10408da22273e8723414ea6c06..d6508e09f61fe923d948fe8630481862c87fd789 100644 (file)
@@ -287,8 +287,11 @@ public:
 \r
             if (XWindowSystemUtilities::Atoms::isMimeTypeFile (getDisplay(), dragAndDropCurrentMimeType))\r
             {\r
-                for (int i = 0; i < lines.size(); ++i)\r
-                    dragInfo.files.add (URL::removeEscapeChars (lines[i].replace ("file://", String(), true)));\r
+                for (const auto& line : lines)\r
+                {\r
+                    const auto escaped = line.replace ("+", "%2B").replace ("file://", String(), true);\r
+                    dragInfo.files.add (URL::removeEscapeChars (escaped));\r
+                }\r
 \r
                 dragInfo.files.trim();\r
                 dragInfo.files.removeEmptyStrings();\r
index aee1c82e634427b32d65be09920c31fc004ecc2d..ab207c4da4e442bb36f0cc43a5b0075962624927 100644 (file)
@@ -30,9 +30,11 @@ struct PropertyPanel::SectionComponent  : public Component
 {\r
     SectionComponent (const String& sectionTitle,\r
                       const Array<PropertyComponent*>& newProperties,\r
-                      bool sectionIsOpen)\r
+                      bool sectionIsOpen,\r
+                      int extraPadding)\r
         : Component (sectionTitle),\r
-          isOpen (sectionIsOpen)\r
+          isOpen (sectionIsOpen),\r
+          padding (extraPadding)\r
     {\r
         lookAndFeelChanged();\r
 \r
@@ -63,7 +65,7 @@ struct PropertyPanel::SectionComponent  : public Component
         for (auto* propertyComponent : propertyComps)\r
         {\r
             propertyComponent->setBounds (1, y, getWidth() - 2, propertyComponent->getPreferredHeight());\r
-            y = propertyComponent->getBottom();\r
+            y = propertyComponent->getBottom() + padding;\r
         }\r
     }\r
 \r
@@ -78,10 +80,16 @@ struct PropertyPanel::SectionComponent  : public Component
     {\r
         auto y = titleHeight;\r
 \r
-        if (isOpen)\r
+        auto numComponents = propertyComps.size();\r
+\r
+        if (numComponents > 0 && isOpen)\r
+        {\r
             for (auto* propertyComponent : propertyComps)\r
                 y += propertyComponent->getPreferredHeight();\r
 \r
+            y += (numComponents - 1) * padding;\r
+        }\r
+\r
         return y;\r
     }\r
 \r
@@ -122,6 +130,7 @@ struct PropertyPanel::SectionComponent  : public Component
     OwnedArray<PropertyComponent> propertyComps;\r
     int titleHeight;\r
     bool isOpen;\r
+    int padding;\r
 \r
     JUCE_DECLARE_NON_COPYABLE (SectionComponent)\r
 };\r
@@ -241,26 +250,32 @@ int PropertyPanel::getTotalContentHeight() const
     return propertyHolderComponent->getHeight();\r
 }\r
 \r
-void PropertyPanel::addProperties (const Array<PropertyComponent*>& newProperties)\r
+void PropertyPanel::addProperties (const Array<PropertyComponent*>& newProperties,\r
+                                   int extraPaddingBetweenComponents)\r
 {\r
     if (isEmpty())\r
         repaint();\r
 \r
-    propertyHolderComponent->insertSection (-1, new SectionComponent (String(), newProperties, true));\r
+    propertyHolderComponent->insertSection (-1, new SectionComponent ({}, newProperties, true, extraPaddingBetweenComponents));\r
     updatePropHolderLayout();\r
 }\r
 \r
 void PropertyPanel::addSection (const String& sectionTitle,\r
                                 const Array<PropertyComponent*>& newProperties,\r
                                 bool shouldBeOpen,\r
-                                int indexToInsertAt)\r
+                                int indexToInsertAt,\r
+                                int extraPaddingBetweenComponents)\r
 {\r
     jassert (sectionTitle.isNotEmpty());\r
 \r
     if (isEmpty())\r
         repaint();\r
 \r
-    propertyHolderComponent->insertSection (indexToInsertAt, new SectionComponent (sectionTitle, newProperties, shouldBeOpen));\r
+    propertyHolderComponent->insertSection (indexToInsertAt, new SectionComponent (sectionTitle,\r
+                                                                                   newProperties,\r
+                                                                                   shouldBeOpen,\r
+                                                                                   extraPaddingBetweenComponents));\r
+\r
     updatePropHolderLayout();\r
 }\r
 \r
index 94bafef89a661033fead506da49a569c40f5f424..b1272839ad7b9d00a7fb4b47258fc9e01fc47d8e 100644 (file)
@@ -65,7 +65,8 @@ public:
         These properties are added without them being inside a named section. If you\r
         want them to be kept together in a collapsible section, use addSection() instead.\r
     */\r
-    void addProperties (const Array<PropertyComponent*>& newPropertyComponents);\r
+    void addProperties (const Array<PropertyComponent*>& newPropertyComponents,\r
+                        int extraPaddingBetweenComponents = 0);\r
 \r
     /** Adds a set of properties to the panel.\r
 \r
@@ -81,7 +82,8 @@ public:
     void addSection (const String& sectionTitle,\r
                      const Array<PropertyComponent*>& newPropertyComponents,\r
                      bool shouldSectionInitiallyBeOpen = true,\r
-                     int indexToInsertAt = -1);\r
+                     int indexToInsertAt = -1,\r
+                     int extraPaddingBetweenComponents = 0);\r
 \r
     /** Calls the refresh() method of all PropertyComponents in the panel */\r
     void refreshAll() const;\r
index d4ebed7fd2b443dc8f31d4f31a37f54c7d3d6d7a..bda3c872f6b894ae1a117d2cb3b8aadbbcb4276e 100644 (file)
 //==============================================================================\r
 #if JUCE_MAC || JUCE_IOS\r
 \r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-\r
  #if JUCE_MAC\r
   #include "native/juce_mac_NSViewComponent.mm"\r
   #include "native/juce_mac_AppleRemote.mm"\r
   #include "native/juce_mac_WebBrowserComponent.mm"\r
  #endif\r
 \r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
 //==============================================================================\r
 #elif JUCE_WINDOWS\r
  #include "native/juce_win32_ActiveXComponent.cpp"\r
index 8808aa98f87870a3e623437dcff7fda273d3830a..bcec491c9a320b04652a5ed50aba5cb930354b2e 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_gui_extra\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE extended GUI classes\r
   description:        Miscellaneous GUI classes for specialised tasks.\r
   website:            http://www.juce.com/juce\r
index e108081ee0f5ad385d0348962bdddd155be42d0c..ae2f503f790d7f6c78ecde546d40de7076e23f70 100644 (file)
@@ -1645,25 +1645,4 @@ bool juce_handleNotificationIntent (void* intent)
     return false;\r
 }\r
 \r
-//==============================================================================\r
-struct JuceActivityNewIntentListener\r
-{\r
-    #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD, CALLBACK) \\r
-     CALLBACK (appNewIntent, "appNewIntent", "(Landroid/content/Intent;)V")\r
-\r
-     DECLARE_JNI_CLASS (JavaActivity, JUCE_PUSH_NOTIFICATIONS_ACTIVITY)\r
-    #undef JNI_CLASS_MEMBERS\r
-\r
-    static void JNICALL appNewIntent (JNIEnv*, jobject /*activity*/, jobject intentData)\r
-    {\r
-       #if JUCE_PUSH_NOTIFICATIONS && JUCE_MODULE_AVAILABLE_juce_gui_extra\r
-        juce_handleNotificationIntent(static_cast<void*>(intentData));\r
-       #else\r
-        juce::ignoreUnused(intentData);\r
-       #endif\r
-    }\r
-};\r
-\r
-JuceActivityNewIntentListener::JavaActivity_Class JuceActivityNewIntentListener::JavaActivity;\r
-\r
 } // namespace juce\r
index 5255d835af45b0d0e3afd3bd6f8341a121996b83..fbccee94d1228a89cf33732efd14b84bce5cb95e 100644 (file)
@@ -422,10 +422,10 @@ struct PushNotificationsDelegate
 \r
         id<UIApplicationDelegate> appDelegate = [[UIApplication sharedApplication] delegate];\r
 \r
-        SEL selector = NSSelectorFromString (@"setPushNotificationsDelegateToUse:");\r
-\r
-        if ([appDelegate respondsToSelector: selector])\r
-            [appDelegate performSelector: selector withObject: delegate.get()];\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+        if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegateToUse:)])\r
+            [appDelegate performSelector: @selector (setPushNotificationsDelegateToUse:) withObject: delegate.get()];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     virtual ~PushNotificationsDelegate() {}\r
index a4d997a8370772e40e7928908871f5ad98ad50dd..6326283b9933ab65c64826f10f5bf9c6d9104a0f 100644 (file)
@@ -42,10 +42,12 @@ struct NSViewResizeWatcher
         callback = [cls.createInstance() init];\r
         ViewFrameChangeCallbackClass::setTarget (callback, this);\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         [[NSNotificationCenter defaultCenter]  addObserver: callback\r
                                                   selector: @selector (frameChanged:)\r
                                                       name: NSViewFrameDidChangeNotification\r
                                                     object: view];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     void detachViewWatcher()\r
@@ -69,7 +71,11 @@ private:
         ViewFrameChangeCallbackClass()  : ObjCClass<NSObject> ("JUCE_NSViewCallback_")\r
         {\r
             addIvar<NSViewResizeWatcher*> ("target");\r
+\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             addMethod (@selector (frameChanged:),  frameChanged, "v@:@");\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
             registerClass();\r
         }\r
 \r
index 17880e7713fa3df93052507dbeb45d82c0487e27..f72d93782a97afa1ccf95ebdca90c64676313667 100644 (file)
@@ -272,10 +272,10 @@ struct PushNotificationsDelegate
 \r
         id<NSApplicationDelegate> appDelegate = [[NSApplication sharedApplication] delegate];\r
 \r
-        SEL selector = NSSelectorFromString (@"setPushNotificationsDelegate:");\r
-\r
-        if ([appDelegate respondsToSelector: selector])\r
-            [appDelegate performSelector: selector withObject: delegate.get()];\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+        if ([appDelegate respondsToSelector: @selector (setPushNotificationsDelegate:)])\r
+            [appDelegate performSelector: @selector (setPushNotificationsDelegate:) withObject: delegate.get()];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
         [NSUserNotificationCenter defaultUserNotificationCenter].delegate = delegate.get();\r
     }\r
index b92b3b37afc08ef412bfcfb9589900ab5a9c2e1e..f40d166834a8f7981db3b1276ef19f8812b3c6e9 100644 (file)
@@ -223,10 +223,12 @@ struct ViewBasedStatusItem   : public StatusItemContainer
 \r
         SystemTrayViewClass::frameChanged (view.get(), SEL(), nullptr);\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         [[NSNotificationCenter defaultCenter]  addObserver: view.get()\r
                                                   selector: @selector (frameChanged:)\r
                                                       name: NSWindowDidMoveNotification\r
                                                     object: nil];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     ~ViewBasedStatusItem() override\r
@@ -312,7 +314,10 @@ struct ViewBasedStatusItem   : public StatusItemContainer
             addMethod (@selector (mouseDown:),      handleEventDown, "v@:@");\r
             addMethod (@selector (rightMouseDown:), handleEventDown, "v@:@");\r
             addMethod (@selector (drawRect:),       drawRect,        "v@:@");\r
+\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
             addMethod (@selector (frameChanged:),   frameChanged,    "v@:@");\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
             registerClass();\r
         }\r
index bb76b4fdee409b0f9f8270ae03da63bbb509dfaa..626aaa7ea3a2590180c60782f8b23363ed6448b2 100644 (file)
@@ -30,6 +30,10 @@ namespace juce
 \r
  #define JUCE_USE_WKWEBVIEW 1\r
 \r
+ #if (defined (MAC_OS_X_VERSION_10_11) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_11)\r
+  #define WKWEBVIEW_WEBVIEWDIDCLOSE_SUPPORTED 1\r
+ #endif\r
+\r
  #if (defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)\r
   #define WKWEBVIEW_OPENPANEL_SUPPORTED 1\r
  #endif\r
@@ -106,7 +110,15 @@ private:
     {\r
         NSResponder* first = [[self window] firstResponder];\r
 \r
-        if (([event modifierFlags] & NSDeviceIndependentModifierFlagsMask) == NSCommandKeyMask)\r
+       #if (defined (MAC_OS_X_VERSION_10_12) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_12)\r
+        constexpr auto mask = NSEventModifierFlagDeviceIndependentFlagsMask;\r
+        constexpr auto key  = NSEventModifierFlagCommand;\r
+       #else\r
+        constexpr auto mask = NSDeviceIndependentModifierFlagsMask;\r
+        constexpr auto key  = NSCommandKeyMask;\r
+       #endif\r
+\r
+        if (([event modifierFlags] & mask) == key)\r
         {\r
             auto sendAction = [&] (SEL actionSelector) -> BOOL\r
             {\r
@@ -140,7 +152,10 @@ struct WebViewDelegateClass  : public ObjCClass<NSObject>
         addMethod (@selector (webView:didFailNavigation:withError:),                      didFailNavigation,               "v@:@@@");\r
         addMethod (@selector (webView:didFailProvisionalNavigation:withError:),           didFailProvisionalNavigation,    "v@:@@@");\r
 \r
-        addMethod (@selector (webView:webViewDidClose:),                                  webViewDidClose,                 "v@:@");\r
+       #if WKWEBVIEW_WEBVIEWDIDCLOSE_SUPPORTED\r
+        addMethod (@selector (webViewDidClose:),                                          webViewDidClose,                 "v@:@");\r
+       #endif\r
+\r
         addMethod (@selector (webView:createWebViewWithConfiguration:forNavigationAction:\r
                               windowFeatures:),                                           createWebView,                   "@@:@@@@");\r
 \r
@@ -192,10 +207,12 @@ private:
         displayError (getOwner (self), error);\r
     }\r
 \r
+   #if WKWEBVIEW_WEBVIEWDIDCLOSE_SUPPORTED\r
     static void webViewDidClose (id self, SEL, WKWebView*)\r
     {\r
         getOwner (self)->windowCloseRequest();\r
     }\r
+   #endif\r
 \r
     static WKWebView* createWebView (id self, SEL, WKWebView*, WKWebViewConfiguration*,\r
                                      WKNavigationAction* navigationAction, WKWindowFeatures*)\r
@@ -548,10 +565,12 @@ public:
 \r
     void mouseMove (const MouseEvent&)\r
     {\r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         // WebKit doesn't capture mouse-moves itself, so it seems the only way to make\r
         // them work is to push them via this non-public method..\r
         if ([webView respondsToSelector: @selector (_updateMouseoverWithFakeEvent)])\r
             [webView performSelector:    @selector (_updateMouseoverWithFakeEvent)];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
 private:\r
index 78beeee9f81cab27a55770da904537d49cc0ae7e..76754ae0f529018cb308c7a9b35d6a5a66ccfe28 100644 (file)
@@ -263,16 +263,12 @@ private:
 //==============================================================================\r
 #if JUCE_MAC || JUCE_IOS\r
 \r
- JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
-\r
  #if JUCE_MAC\r
   #include "native/juce_OpenGL_osx.h"\r
  #else\r
   #include "native/juce_OpenGL_ios.h"\r
  #endif\r
 \r
- JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
-\r
 #elif JUCE_WINDOWS\r
  #include "native/juce_OpenGL_win32.h"\r
 \r
index eebdf67f98bd2752c384be84e1230500aae97078..f7bc806f8616d5cfe32184233091ed2c37f50149 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_opengl\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE OpenGL classes\r
   description:        Classes for rendering OpenGL in a JUCE window.\r
   website:            http://www.juce.com/juce\r
index 3a7686bf58379b7fbba23c2bbc75181894ca2c93..e6378a99c7381aa65b7bded0b2b0afb5e0ca1058 100644 (file)
@@ -49,10 +49,12 @@ public:
         if ([view respondsToSelector: @selector (setWantsBestResolutionOpenGLSurface:)])\r
             [view setWantsBestResolutionOpenGLSurface: YES];\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         [[NSNotificationCenter defaultCenter] addObserver: view\r
                                                  selector: @selector (_surfaceNeedsUpdate:)\r
                                                      name: NSViewGlobalFrameDidChangeNotification\r
                                                    object: view];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
         renderContext = [[[NSOpenGLContext alloc] initWithFormat: format\r
                                                     shareContext: (NSOpenGLContext*) contextToShare] autorelease];\r
index faeecada0ef922a2ee6d818d0f2cda94014b9c0b..93986d5d462f451aadde937768d933cae90ba654 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_osc\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE OSC classes\r
   description:        Open Sound Control implementation.\r
   website:            http://www.juce.com/juce\r
index e9ba7effa1d2f8a51c9ca2c847835d8560e34415..fd2a311193630fe11244a7773759e26245220f72 100644 (file)
@@ -36,11 +36,11 @@ namespace juce
     Only a subset of ASCII characters are allowed in OSC addresses; see\r
     OpenSoundControl 1.0 specification for details.\r
 \r
-    OSC addresses can be used to register OSCMessageListener objects to an\r
+    OSC addresses can be used to register ListenerWithOSCAddress objects to an\r
     OSCReceiver if you wish them to only listen to certain messages with\r
     matching OSC address patterns.\r
 \r
-    @see OSCMessageListener, OSCAddressPattern, OSCMessage\r
+    @see OSCReceiver, OSCAddressPattern, OSCMessage\r
 \r
     @tags{OSC}\r
 */\r
index 20b9248bb97b16674e4a645c63483f30f468502c..b8456400ed3d7287e7ba9a1078b994f7166fd38a 100644 (file)
@@ -77,7 +77,7 @@ public:
     /** Returns whether the type of the OSCArgument is blob. */\r
     bool isBlob() const noexcept            { return type == OSCTypes::blob; }\r
 \r
-    /** Returns whether the type of the OSCArgument is blob. */\r
+    /** Returns whether the type of the OSCArgument is colour. */\r
     bool isColour() const noexcept          { return type == OSCTypes::colour; }\r
 \r
     /** Returns the value of the OSCArgument as an int32.\r
index decb5e3412522fa914df8433e52f649144e09e7f..4f3e4907e73adaa9416ddaa43269a70221ea7e64 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_product_unlocking\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\r
   name:               JUCE Online marketplace support\r
   description:        Classes for online product authentication\r
   website:            http://www.juce.com/juce\r
index 90b4cbf7c59f1be6a11254fe23695538c87e3c14..748fe605bce9c36d310e0dea868ae331502df1f9 100644 (file)
@@ -35,7 +35,7 @@
 \r
   ID:                 juce_video\r
   vendor:             juce\r
-  version:            6.0.5\r
+  version:            6.0.7\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 30e69328c5729ef61a6ca6af3336b5d69f43e737..da3ca40ebe356370140df9853d506127b1b6f7fc 100644 (file)
@@ -215,10 +215,12 @@ struct CameraDevice::Pimpl
         callbackDelegate = (id<AVCaptureFileOutputRecordingDelegate>) [cls.createInstance() init];\r
         DelegateClass::setOwner (callbackDelegate, this);\r
 \r
+        JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
         [[NSNotificationCenter defaultCenter] addObserver: callbackDelegate\r
-                                                 selector: DelegateClass::runtimeErrorSel()\r
+                                                 selector: @selector (captureSessionRuntimeError:)\r
                                                      name: AVCaptureSessionRuntimeErrorNotification\r
                                                    object: session];\r
+        JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
     }\r
 \r
     ~Pimpl()\r
@@ -345,7 +347,9 @@ private:
             addMethod (@selector (captureOutput:didResumeRecordingToOutputFileAtURL: fromConnections:),       didResumeRecordingToOutputFileAtURL,  "v@:@@@");\r
             addMethod (@selector (captureOutput:willFinishRecordingToOutputFileAtURL:fromConnections:error:), willFinishRecordingToOutputFileAtURL, "v@:@@@@");\r
 \r
-            addMethod (runtimeErrorSel(), sessionRuntimeError, "v@:@");\r
+            JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wundeclared-selector")\r
+            addMethod (@selector (captureSessionRuntimeError:), sessionRuntimeError, "v@:@");\r
+            JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
 \r
             registerClass();\r
         }\r
@@ -353,8 +357,6 @@ private:
         static void setOwner (id self, Pimpl* owner)   { object_setInstanceVariable (self, "owner", owner); }\r
         static Pimpl& getOwner (id self)               { return *getIvar<Pimpl*> (self, "owner"); }\r
 \r
-        static SEL runtimeErrorSel()    { return NSSelectorFromString (nsStringLiteral ("captureSessionRuntimeError:")); }\r
-\r
     private:\r
         static void didStartRecordingToOutputFileAtURL (id, SEL, AVCaptureFileOutput*, NSURL*, NSArray*) {}\r
         static void didPauseRecordingToOutputFileAtURL (id, SEL, AVCaptureFileOutput*, NSURL*, NSArray*) {}\r