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
=============
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)
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
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).
- __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
- `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.
--- /dev/null
+# 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
{\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
# 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
#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
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"
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()
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
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)
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)
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)
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)
}
defaultConfig {
- applicationId "com.rmsl.juce.demorunner"
+ applicationId "com.rmsl.jucedemorunner"
minSdkVersion 23
targetSdkVersion 29
externalNativeBuild {
<?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"/>
<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>
{\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
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
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
"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;
+++ /dev/null
-<?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>
<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
<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
<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
<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
#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
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
<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
<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
#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
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
<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
<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
#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
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
"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;
+++ /dev/null
-<?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>
<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
<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
<?xml version="1.0" encoding="UTF-8"?>\r
\r
<JUCERPROJECT name="DemoRunner" projectType="guiapp" defines="JUCE_DEMO_RUNNER=1 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
{\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
\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
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()
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
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)
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)
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)
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)
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
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
"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;
+++ /dev/null
-<?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>
<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
<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
"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;
+++ /dev/null
-<?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>
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")
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
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)
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)
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)
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)
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
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
"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;
+++ /dev/null
-<?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>
<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
<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
<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
<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
<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
<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
"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;
+++ /dev/null
-<?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>
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
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
"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;
+++ /dev/null
-<?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>
<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
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()
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
\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
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()
"../../../../../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"
"../../../../../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"
"../../../../../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"
"../../../../../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"
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)
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)
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)
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)
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
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
"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;
+++ /dev/null
-<?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>
<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
<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
"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;
+++ /dev/null
-<?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>
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
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
<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
"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;
+++ /dev/null
-<?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>
<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
#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
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
<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
#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
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
<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
#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
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
" #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
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
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
{\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
<?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
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
\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
#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
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
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
for (auto& def : getDefines (config, target))\r
{\r
if (! def.containsChar ('='))\r
- def << '=';\r
+ def << '=';\r
\r
flags.add ("-D" + def);\r
}\r
v10_15,\r
v10_16,\r
v11_0,\r
+ v11_1,\r
};\r
\r
static const char* const getName (MacOSVersion m)\r
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
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
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
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
"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
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
[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
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
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
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
\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
\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
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
.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
searchPath = srcRoot + searchPath;\r
}\r
\r
- return sanitisePath (searchPath);\r
+ return expandPath (searchPath);\r
}\r
\r
String getCodeSigningIdentity (const XcodeBuildConfiguration& config) const\r
{\r
String attributes;\r
\r
- attributes << "{ LastUpgradeCheck = 1200; "\r
+ attributes << "{ LastUpgradeCheck = 1230; "\r
<< "ORGANIZATIONNAME = " << getProject().getCompanyNameString().quoted()\r
<<"; ";\r
\r
{\r
auto defs = mergePreprocessorDefs (config.getAllPreprocessorDefs(),\r
parsePreprocessorDefs (getExporterPreprocessorDefsString()));\r
+\r
addDefaultPreprocessorDefs (defs);\r
addTargetSpecificPreprocessorDefs (defs, targetType);\r
\r
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
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
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
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
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
"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;
+++ /dev/null
-<?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>
<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
<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
<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
<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
<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
<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
\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
\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
{\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
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
const ScopedLock sl (lock);\r
legacyMode.isEnabled = false;\r
zoneLayout = newLayout;\r
+\r
+ resetLastReceivedValues();\r
}\r
\r
//==============================================================================\r
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
{\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
\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
\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
\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
#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
#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
\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
--- /dev/null
+/*\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
+++ /dev/null
-/*\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
--- /dev/null
+/*\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
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
# 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)
* 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;
}
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:
/**
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;
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)
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;
}
/**
}
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 */
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
return this;
}
+ /**
+ * @deprecated use `setFramesPerDataCallback` instead.
+ */
+ AudioStreamBuilder *setFramesPerCallback(int framesPerCallback) {
+ return setFramesPerDataCallback(framesPerCallback);
+ }
+
/**
* Request a specific number of frames for the data callback.
*
* @param framesPerCallback
* @return pointer to the builder so calls can be chained
*/
- AudioStreamBuilder *setFramesPerCallback(int framesPerCallback) {
+ AudioStreamBuilder *setFramesPerDataCallback(int framesPerCallback) {
mFramesPerCallback = framesPerCallback;
return this;
}
/**
- * 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.
*
}
/**
- * 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.
*
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>
*
* @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;
}
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.
* 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.
* 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
* @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.
* 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:
// 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};
};
#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)
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__);
}
: AudioStream(builder)
, mAAudioStream(nullptr) {
mCallbackThreadEnabled.store(false);
- isSupported();
+ mLibLoader = AAudioLoader::getInstance();
}
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()
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();
}
}
}
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) {
// 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 ================
{
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;
}
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));
}
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();
// 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;
return Result::OK;
}
}
- if (mStreamCallback != nullptr) { // Was a callback requested?
+ if (isDataCallbackSpecified()) {
setDataCallbackEnabled(true);
}
return static_cast<Result>(mLibLoader->stream_requestStart(stream));
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) {
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
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) {
}
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.
}
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());
}
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 {
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__);
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.
#include <flowgraph/ClipToRange.h>
#include <flowgraph/MonoToMultiConverter.h>
+#include <flowgraph/MultiToMonoConverter.h>
#include <flowgraph/RampLinear.h>
#include <flowgraph/SinkFloat.h>
#include <flowgraph/SinkI16.h>
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);
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);
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
}
lastOutput->connect(&mSink->input);
- mFramePosition = 0;
-
return Result::OK;
}
if (mSourceCaller) {
mSourceCaller->setTimeoutNanos(timeoutNanos);
}
- int32_t numRead = mSink->read(mFramePosition, buffer, numFrames);
- mFramePosition += numRead;
+ int32_t numRead = mSink->read(buffer, numFrames);
return numRead;
}
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(),
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
+}
#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"
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;
DataCallbackResult mCallbackResult = DataCallbackResult::Continue;
AudioStream *mFilterStream = nullptr;
std::unique_ptr<uint8_t[]> mAppBuffer;
-
- int64_t mFramePosition = 0;
};
}
#include <memory>
+#include "OboeDebug.h"
#include "FilterAudioStream.h"
using namespace oboe;
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();
+}
: 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);
// Copy parameters that may not match builder.
mBufferCapacityInFrames = mChildStream->getBufferCapacityInFrames();
mPerformanceMode = mChildStream->getPerformanceMode();
+ mInputPreset = mChildStream->getInputPreset();
}
virtual ~FilterAudioStream() = default;
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
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() {
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;
mState = State::Idle;
mIdleCountDown = kIdleCount;
// Set to minimal latency
- mStream.setBufferSizeInFrames(2 * mStream.getFramesPerBurst());
+ mStream.setBufferSizeInFrames(getMinimumBufferSize());
}
bool LatencyTuner::isAtMaximumBufferSize() {
#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,
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;
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() {
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.
) {
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;
}
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;
// 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{};
};
static bool mIsTracingSupported;
};
-#endif //OBOE_TRACE_H
+#endif //OBOE_TRACE_H
\ No newline at end of file
<<"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
* 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 {
#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 {
* limitations under the License.
*/
-#include <cassert>
-#include <sys/types.h>
+#include <stdint.h>
+
#include "FifoControllerBase.h"
#include "FifoController.h"
#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 {
* 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 {
#define NATIVEOBOE_FIFOCONTROLLERBASE_H
#include <stdint.h>
-#include <sys/types.h>
namespace oboe {
* limitations under the License.
*/
+#include <stdint.h>
#include "FifoControllerIndirect.h"
#ifndef NATIVEOBOE_FIFOCONTROLLERINDIRECT_H
#define NATIVEOBOE_FIFOCONTROLLERINDIRECT_H
-#include "FifoControllerBase.h"
#include <atomic>
+#include <stdint.h>
+
+#include "FifoControllerBase.h"
namespace oboe {
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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
#include "FlowGraphNode.h"
#include "ClipToRange.h"
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
ClipToRange::ClipToRange(int32_t channelCount)
: FlowGraphFilter(channelCount) {
#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.
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_CLIP_TO_RANGE_H
#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;
void FlowGraphNode::reset() {
mLastFrameCount = 0;
+ mLastCallCount = kInitialCallCount;
}
/***************************************************************************/
}
/***************************************************************************/
-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() {
}
/***************************************************************************/
-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();
return mConnected->getBuffer();
}
}
+
+int32_t FlowGraphSink::pullData(int32_t numFrames) {
+ return FlowGraphNode::pullData(numFrames, getLastCallCount() + 1);
+}
// 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.
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.
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;
: mContainingNode(parent)
, mSamplesPerFrame(samplesPerFrame) {
}
+
+ virtual ~FlowGraphPort() = default;
// Ports are often declared public. So let's make them non-copyable.
FlowGraphPort(const FlowGraphPort&) = delete;
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);
};
/***************************************************************************/
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif /* FLOWGRAPH_FLOW_GRAPH_NODE_H */
#include "ManyToMultiConverter.h"
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
ManyToMultiConverter::ManyToMultiConverter(int32_t channelCount)
: inputs(channelCount)
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
+namespace flowgraph {
+
/**
* Combine multiple mono inputs into one interleaved multi-channel output.
*/
private:
};
+} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
+
#endif //FLOWGRAPH_MANY_TO_MULTI_CONVERTER_H
#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() { }
#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();
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_MONO_TO_MULTI_CONVERTER_H
--- /dev/null
+/*
+ * 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;
+}
+
--- /dev/null
+/*
+ * 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
#include "FlowGraphNode.h"
#include "RampLinear.h"
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
RampLinear::RampLinear(int32_t channelCount)
: FlowGraphFilter(channelCount) {
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
/**
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_RAMP_LINEAR_H
#include "SampleRateConverter.h"
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
using namespace resampler;
SampleRateConverter::SampleRateConverter(int32_t channelCount, MultiChannelResampler &resampler)
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);
#include "FlowGraphNode.h"
#include "resampler/MultiChannelResampler.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
class SampleRateConverter : public FlowGraphFilter {
return "SampleRateConverter";
}
+ void reset() override;
+
private:
// Return true if there is a sample available.
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
#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();
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;
memcpy(floatData, signal, numSamples * sizeof(float));
floatData += numSamples;
framesLeft -= framesPulled;
- framePosition += framesPulled;
}
// printf("SinkFloat returning %d\n", numFrames - framesLeft);
return numFrames - framesLeft;
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
/**
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";
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_SINK_FLOAT_H
#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;
}
}
#endif
framesLeft -= framesRead;
- framePosition += framesRead;
}
return numFrames - framesLeft;
}
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
/**
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";
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_SINK_I16_H
#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;
}
}
#endif
framesLeft -= framesRead;
- framePosition += framesRead;
}
return numFrames - framesLeft;
}
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
/**
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";
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_SINK_I24_H
#include "FlowGraphNode.h"
#include "SourceFloat.h"
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
SourceFloat::SourceFloat(int32_t channelCount)
: FlowGraphSourceBuffered(channelCount) {
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
/**
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_SOURCE_FLOAT_H
#include <audio_utils/primitives.h>
#endif
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
SourceI16::SourceI16(int32_t channelCount)
: FlowGraphSourceBuffered(channelCount) {
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
/**
* AudioSource that reads a block of pre-defined 16-bit integer data.
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_SOURCE_I16_H
#include "FlowGraphNode.h"
#include "SourceI24.h"
-using namespace flowgraph;
+using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
constexpr int kBytesPerI24Packed = 3;
#include "FlowGraphNode.h"
+namespace FLOWGRAPH_OUTER_NAMESPACE {
namespace flowgraph {
/**
};
} /* namespace flowgraph */
+} /* namespace FLOWGRAPH_OUTER_NAMESPACE */
#endif //FLOWGRAPH_SOURCE_I24_H
* limitations under the License.
*/
+#include <cassert>
#include <math.h>
#include "IntegerRatio.h"
#include "PolyphaseResampler.h"
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:
* limitations under the License.
*/
+#include <cassert>
#include "PolyphaseResamplerMono.h"
using namespace resampler;
* limitations under the License.
*/
+#include <cassert>
#include "PolyphaseResamplerStereo.h"
using namespace resampler;
* limitations under the License.
*/
+#include <cassert>
#include <math.h>
#include "SincResampler.h"
* limitations under the License.
*/
+#include <cassert>
#include <math.h>
#include "SincResamplerStereo.h"
openslPreset = SL_ANDROID_RECORDING_PRESET_CAMCORDER;
break;
case InputPreset::VoiceRecognition:
+ case InputPreset::VoicePerformance:
openslPreset = SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION;
break;
case InputPreset::VoiceCommunication:
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,
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;
}
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:
Result requestStop() override;
protected:
+ Result requestStop_l();
Result updateServiceFrameCounter() override;
}
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;
}
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:
Result AudioOutputStreamOpenSLES::requestStop() {
LOGD("AudioOutputStreamOpenSLES(): %s() called", __func__);
-
std::lock_guard<std::mutex> lock(mLock);
+
StreamState initialState = getState();
switch (initialState) {
case StreamState::Stopping:
Result requestStop() override;
protected:
+ Result requestPause_l();
void setFramesRead(int64_t framesRead);
// 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) {
}
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;
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.
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.
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.
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
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;
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;
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;
}
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) {
return result;
}
-Result AudioStreamOpenSLES::close() {
+// This is called under mLock.
+Result AudioStreamOpenSLES::close_l() {
if (mState == StreamState::Closed) {
return Result::ErrorClosed;
}
}
// Did we timeout or did user ask for non-blocking?
- if (timeoutNanoseconds <= 0) {
+ if (timeLeftNanos <= 0) {
break;
}
virtual ~AudioStreamOpenSLES() = default;
virtual Result open() override;
- virtual Result close() override;
/**
* Query the current state, eg. OBOE_STREAM_STATE_PAUSING
protected:
+ // This must be called under mLock.
+ Result close_l();
+
SLuint32 channelCountToChannelMaskDefault(int channelCount) const;
virtual Result onBeforeDestroy() { return Result::OK; }
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";
}
}
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
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
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
}\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
{\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
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
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
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
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
}\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
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
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
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
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
\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
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
{\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
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
//==============================================================================\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
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
\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
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
}\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
}\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
\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
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
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
{\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
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
(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
{\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
\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
\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
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
\r
} // namespace juce\r
\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
+\r
#endif\r
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
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
{\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
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
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
\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
{\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
\r
} // namespace juce\r
\r
+JUCE_END_IGNORE_WARNINGS_GCC_LIKE\r
JUCE_END_IGNORE_WARNINGS_MSVC\r
\r
#endif\r
\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
\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
#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
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
{\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
#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
\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
\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
\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
\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
\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
#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
#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
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
//==============================================================================\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
struct sched_param param;\r
param.sched_priority = sched_get_priority_max (SCHED_RR);\r
return pthread_setschedparam (thread, SCHED_RR, ¶m) == 0;\r
-\r
#endif\r
}\r
\r
*/\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
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
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
*/\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
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
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
*/\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
*/\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
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
\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
\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
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
// 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
{\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
std::unique_ptr<MultichannelEngine> getEngine() { return factory.getEngine(); }\r
\r
private:\r
-\r
template <typename Fn>\r
void callLater (Fn&& fn)\r
{\r
\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
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
}\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
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
#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
\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
#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
\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
\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
\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
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
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
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
{\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
{\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
{\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
\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
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
\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
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
#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
#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
\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
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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
{\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
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
\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
}\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
{\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
\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
#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
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
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
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
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
\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
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
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
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
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
{\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
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
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
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
}\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
\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
//==============================================================================\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
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
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
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
\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
{\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
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
{\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
OwnedArray<PropertyComponent> propertyComps;\r
int titleHeight;\r
bool isOpen;\r
+ int padding;\r
\r
JUCE_DECLARE_NON_COPYABLE (SectionComponent)\r
};\r
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
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
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
//==============================================================================\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
\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
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
\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
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
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
\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
\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
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
\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
{\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
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
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
\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
//==============================================================================\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
\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
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
\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
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
/** 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
\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
\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
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
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
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