diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index 41aaedfb3f..cad2e36543 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" @@ -2900,6 +2901,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 a35c4c73ec..5301d64dbe 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -3424,6 +3424,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index 7ba92fe15a..3443195c73 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -4506,6 +4506,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 eec603f4e9..347119b4fe 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj @@ -3424,6 +3424,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters index 99a67af9b6..42c70e400f 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters @@ -4506,6 +4506,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 b414a53468..03cd95e25b 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" @@ -2469,6 +2470,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 b6de45cc5f..acdc6d0047 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj @@ -2938,6 +2938,7 @@ + diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters index 87f690df00..4b4340cd8b 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters @@ -3768,6 +3768,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 f4b792d169..8e5af291fd 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" @@ -2655,6 +2656,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 c065068bc7..b4ddec8884 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -3118,6 +3118,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index fde929b00e..2ebca4c84e 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -4044,6 +4044,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 dfdfdfaa85..1110f35e1a 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj @@ -3118,6 +3118,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters index 4c232094a5..2db578d129 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters @@ -4044,6 +4044,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 635156e4ec..32be901834 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" @@ -2553,6 +2554,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 e1e54beced..ea7d72e077 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj @@ -3029,6 +3029,7 @@ + diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters index f46478fb12..7b491b9084 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters @@ -3909,6 +3909,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 0724ed3cc3..89e24bfe48 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj @@ -3230,6 +3230,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters index 6f29ece00e..d8f1ca5ba6 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -4203,6 +4203,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 9a04131577..e2e9a20efa 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj @@ -3230,6 +3230,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters index 76257d6851..71723e8ef6 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -4203,6 +4203,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 9d55e2153e..0609dcef72 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj @@ -3005,6 +3005,7 @@ + diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters index 57530ca870..c9b151cc71 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters @@ -3876,6 +3876,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 8f5ff1370d..2625b9a6c3 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 +}; + +}