diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index a42c2c84f7..426834885a 100644 --- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt +++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt @@ -217,6 +217,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" @@ -2903,6 +2904,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj index c172a3161c..7046683508 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -3433,6 +3433,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index b3f42ca2b0..b65cb16ffc 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -4515,6 +4515,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj index de00024908..9e11687974 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj @@ -3433,6 +3433,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters index 4d2d867579..d4c3e7fc6a 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters @@ -4515,6 +4515,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt index 2d5498015b..5e7cfb0d4c 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt @@ -172,6 +172,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" @@ -2472,6 +2473,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj index e1ab9159db..97bdb547b1 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj @@ -2947,6 +2947,7 @@ + diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters index 7fb775d454..aeefc06c58 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters @@ -3777,6 +3777,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt index a6b97ff927..087ea426fa 100644 --- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt @@ -205,6 +205,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" @@ -2658,6 +2659,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj index 4d0999517d..580c389939 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -3127,6 +3127,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index 4bf0c062ba..ceef990767 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -4053,6 +4053,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj index 60671a916b..8df213e37a 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj @@ -3127,6 +3127,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters index f1db0a3b53..0fe0fb861b 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters @@ -4053,6 +4053,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt index 97d412db4a..e3129962ce 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt @@ -176,6 +176,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" @@ -2556,6 +2557,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPOutput.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPSession.h" + "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.cpp" "../../../../../modules/juce_audio_devices/midi_io/ump/juce_UMPVirtualEndpoint.h" "../../../../../modules/juce_audio_devices/midi_io/juce_MidiDeviceListConnectionBroadcaster.cpp" diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj index 42c7fb20af..bef22b91b1 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj @@ -3038,6 +3038,7 @@ + diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters index d8464040c8..818c1800eb 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters @@ -3918,6 +3918,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj index b7ebc81939..52eced3df1 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj @@ -3239,6 +3239,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters index 7e41e44560..fd2d7021b8 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -4212,6 +4212,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj index a64b82cf8d..6148ba57d5 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj @@ -3239,6 +3239,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters index 26816c46b2..53a52ae934 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -4212,6 +4212,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj index 81f5ec3193..266a515250 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj @@ -3014,6 +3014,7 @@ + diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters index 89f0ccaa87..01510cde16 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters @@ -3885,6 +3885,9 @@ JUCE Modules\juce_audio_devices\midi_io\ump + + JUCE Modules\juce_audio_devices\midi_io\ump + JUCE Modules\juce_audio_devices\midi_io\ump diff --git a/modules/juce_audio_devices/juce_audio_devices.h b/modules/juce_audio_devices/juce_audio_devices.h index 7da8286390..3bfd211c32 100644 --- a/modules/juce_audio_devices/juce_audio_devices.h +++ b/modules/juce_audio_devices/juce_audio_devices.h @@ -200,6 +200,7 @@ //============================================================================== #include "midi_io/juce_ScheduledEventThread.h" #include "midi_io/ump/juce_UMPEndpointId.h" +#include "midi_io/ump/juce_UMPStaticDeviceInfo.h" #include "midi_io/ump/juce_UMPBlock.h" #include "midi_io/ump/juce_UMPEndpoint.h" #include "midi_io/ump/juce_UMPDisconnectionListener.h" diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h index b321014137..05237f4dd0 100644 --- a/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h +++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPEndpoints.h @@ -68,77 +68,6 @@ struct EndpointsListener virtual void virtualMidiServiceActiveChanged() {} }; -/** - Static information about a particular MIDI device that can be queried without opening a - connection to the device. - - This information differs from the detailed information in the Endpoint struct, in that - the StaticDeviceInformation is communicated out-of-band, whereas Endpoint information is - communicated 'in-band', i.e. it is sent as MIDI messages after establishing a connection to the - device. - - @tags{Audio} -*/ -class StaticDeviceInfo -{ -public: - [[nodiscard]] StaticDeviceInfo withName (const String& x) const { return withMember (*this, &StaticDeviceInfo::name, x); } - [[nodiscard]] StaticDeviceInfo withManufacturer (const String& x) const { return withMember (*this, &StaticDeviceInfo::manufacturer, x); } - [[nodiscard]] StaticDeviceInfo withProduct (const String& x) const { return withMember (*this, &StaticDeviceInfo::product, x); } - [[nodiscard]] StaticDeviceInfo withHasSource (bool x) const { return withMember (*this, &StaticDeviceInfo::source, x); } - [[nodiscard]] StaticDeviceInfo withHasDestination (bool x) const { return withMember (*this, &StaticDeviceInfo::destination, x); } - [[nodiscard]] StaticDeviceInfo withTransport (Transport x) const { return withMember (*this, &StaticDeviceInfo::transport, x); } - - [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersSrc (Span x) const - { - auto copy = *this; - std::copy (x.begin(), x.end(), copy.identifierSrc.begin()); - return copy; - } - - [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersDst (Span x) const - { - auto copy = *this; - std::copy (x.begin(), x.end(), copy.identifierDst.begin()); - return copy; - } - - [[nodiscard]] StaticDeviceInfo withLegacyIdentifiers (IOKind k, Span x) const - { - return k == IOKind::src ? withLegacyIdentifiersSrc (x) : withLegacyIdentifiersDst (x); - } - - String getName() const { return name; } - String getManufacturer() const { return manufacturer; } - String getProduct() const { return product; } - bool hasSource() const { return source; } - bool hasDestination() const { return destination; } - Transport getTransport() const { return transport; } - - /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */ - Span getLegacyIdentifiersSrc() const& { return identifierSrc; } - /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */ - Span getLegacyIdentifiersDst() const& { return identifierDst; } - - Span getLegacyIdentifiers (IOKind k) const& - { - return k == IOKind::src ? getLegacyIdentifiersSrc() : getLegacyIdentifiersDst(); - } - - Span getLegacyIdentifiersSrc() const&& = delete; - Span getLegacyIdentifiersDst() const&& = delete; - Span getLegacyIdentifiers (IOKind) const&& = delete; - -private: - std::array identifierSrc, identifierDst; - String name; ///< The full human-readable name of this device - String manufacturer; ///< The name of the organisation that produced this device - String product; ///< The human-readable product name - Transport transport{}; ///< The format used for MIDI messages in transit - uint8_t source = false; ///< True if the device can send messages - uint8_t destination = false; ///< True if the device can receive messages -}; - /** MIDI implementation technologies @tags{Audio} diff --git a/modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h b/modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h new file mode 100644 index 0000000000..958a392fc4 --- /dev/null +++ b/modules/juce_audio_devices/midi_io/ump/juce_UMPStaticDeviceInfo.h @@ -0,0 +1,109 @@ +/* + ============================================================================== + + This file is part of the JUCE framework. + Copyright (c) Raw Material Software Limited + + JUCE is an open source framework subject to commercial or open source + licensing. + + By downloading, installing, or using the JUCE framework, or combining the + JUCE framework with any other source code, object code, content or any other + copyrightable work, you agree to the terms of the JUCE End User Licence + Agreement, and all incorporated terms including the JUCE Privacy Policy and + the JUCE Website Terms of Service, as applicable, which will bind you. If you + do not agree to the terms of these agreements, we will not license the JUCE + framework to you, and you must discontinue the installation or download + process and cease use of the JUCE framework. + + JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/ + JUCE Privacy Policy: https://juce.com/juce-privacy-policy + JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/ + + Or: + + You may also use this code under the terms of the AGPLv3: + https://www.gnu.org/licenses/agpl-3.0.en.html + + THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL + WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF + MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. + + ============================================================================== +*/ + +namespace juce::universal_midi_packets +{ + +/** + Static information about a particular MIDI device that can be queried without opening a + connection to the device. + + This information differs from the detailed information in the Endpoint struct, in that + the StaticDeviceInformation is communicated out-of-band, whereas Endpoint information is + communicated 'in-band', i.e. it is sent as MIDI messages after establishing a connection to the + device. + + @tags{Audio} +*/ +class StaticDeviceInfo +{ +public: + [[nodiscard]] StaticDeviceInfo withName (const String& x) const { return withMember (*this, &StaticDeviceInfo::name, x); } + [[nodiscard]] StaticDeviceInfo withManufacturer (const String& x) const { return withMember (*this, &StaticDeviceInfo::manufacturer, x); } + [[nodiscard]] StaticDeviceInfo withProduct (const String& x) const { return withMember (*this, &StaticDeviceInfo::product, x); } + [[nodiscard]] StaticDeviceInfo withHasSource (bool x) const { return withMember (*this, &StaticDeviceInfo::source, x); } + [[nodiscard]] StaticDeviceInfo withHasDestination (bool x) const { return withMember (*this, &StaticDeviceInfo::destination, x); } + [[nodiscard]] StaticDeviceInfo withTransport (Transport x) const { return withMember (*this, &StaticDeviceInfo::transport, x); } + + [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersSrc (Span x) const + { + auto copy = *this; + std::copy (x.begin(), x.end(), copy.identifierSrc.begin()); + return copy; + } + + [[nodiscard]] StaticDeviceInfo withLegacyIdentifiersDst (Span x) const + { + auto copy = *this; + std::copy (x.begin(), x.end(), copy.identifierDst.begin()); + return copy; + } + + [[nodiscard]] StaticDeviceInfo withLegacyIdentifiers (IOKind k, Span x) const + { + return k == IOKind::src ? withLegacyIdentifiersSrc (x) : withLegacyIdentifiersDst (x); + } + + String getName() const { return name; } + String getManufacturer() const { return manufacturer; } + String getProduct() const { return product; } + bool hasSource() const { return source; } + bool hasDestination() const { return destination; } + Transport getTransport() const { return transport; } + + /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */ + Span getLegacyIdentifiersSrc() const& { return identifierSrc; } + /** Returns an identifier to uniquely identify each group, for use with the legacy MIDI API. */ + Span getLegacyIdentifiersDst() const& { return identifierDst; } + + Span getLegacyIdentifiers (IOKind k) const& + { + return k == IOKind::src ? getLegacyIdentifiersSrc() : getLegacyIdentifiersDst(); + } + + Span getLegacyIdentifiersSrc() const&& = delete; + Span getLegacyIdentifiersDst() const&& = delete; + Span getLegacyIdentifiers (IOKind) const&& = delete; + +private: + std::array identifierSrc, identifierDst; + String name; ///< The full human-readable name of this device + String manufacturer; ///< The name of the organisation that produced this device + String product; ///< The human-readable product name + Transport transport{}; ///< The format used for MIDI messages in transit + uint8_t source = false; ///< True if the device can send messages + uint8_t destination = false; ///< True if the device can receive messages +}; + +}