diff --git a/build/nuke_build/Build.cs b/build/nuke_build/Build.cs index c7be7ffb7..78426a5ca 100644 --- a/build/nuke_build/Build.cs +++ b/build/nuke_build/Build.cs @@ -882,6 +882,7 @@ void UpdateSetupBundleInfoIncludeFile(string platform) paths.Add(settingsOutputFolder / "Assets" / "AppIcon.ico"); paths.Add(settingsOutputFolder / "Assets" / "AppIcon.png"); + paths.Add(settingsOutputFolder / "Assets" / "LoopbackDiagram.svg"); // TODO: This doesn't deal with any localization content diff --git a/build/staging/version/BundleInfo.wxi b/build/staging/version/BundleInfo.wxi index d20880a59..3de205f3d 100644 --- a/build/staging/version/BundleInfo.wxi +++ b/build/staging/version/BundleInfo.wxi @@ -1,4 +1,4 @@ - + diff --git a/build/staging/version/WindowsMidiServicesVersion.cs b/build/staging/version/WindowsMidiServicesVersion.cs index fc657e903..f11047228 100644 --- a/build/staging/version/WindowsMidiServicesVersion.cs +++ b/build/staging/version/WindowsMidiServicesVersion.cs @@ -6,12 +6,12 @@ public static class MidiBuildInformation { public const string Source = "GitHub Preview"; public const string Name = "Customer Preview 2"; - public const string BuildFullVersion = "1.0.3-preview-11.250213-52"; + public const string BuildFullVersion = "1.0.3-preview-11.250215-2126"; public const string VersionMajor = "1"; public const string VersionMinor = "0"; public const string VersionRevision = "3"; - public const string VersionDateNumber = "250213"; - public const string VersionTimeNumber = "52"; + public const string VersionDateNumber = "250215"; + public const string VersionTimeNumber = "2126"; } } diff --git a/build/staging/version/WindowsMidiServicesVersion.h b/build/staging/version/WindowsMidiServicesVersion.h index a79945daf..6abbb14e1 100644 --- a/build/staging/version/WindowsMidiServicesVersion.h +++ b/build/staging/version/WindowsMidiServicesVersion.h @@ -5,12 +5,12 @@ #define WINDOWS_MIDI_SERVICES_BUILD_SOURCE L"GitHub Preview" #define WINDOWS_MIDI_SERVICES_BUILD_VERSION_NAME L"Customer Preview 2" -#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_FULL L"1.0.3-preview-11.250213-52" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_FULL L"1.0.3-preview-11.250215-2126" #define WINDOWS_MIDI_SERVICES_BUILD_VERSION_MAJOR L"1" #define WINDOWS_MIDI_SERVICES_BUILD_VERSION_MINOR L"0" #define WINDOWS_MIDI_SERVICES_BUILD_VERSION_REVISION L"3" -#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_DATE_NUMBER L"250213" -#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"52" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_DATE_NUMBER L"250215" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"2126" #endif diff --git a/samples/cpp-winrt/basics/client-basics-cpp.vcxproj b/samples/cpp-winrt/basics/client-basics-cpp.vcxproj index 1276e2a45..cae1852ca 100644 --- a/samples/cpp-winrt/basics/client-basics-cpp.vcxproj +++ b/samples/cpp-winrt/basics/client-basics-cpp.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true false diff --git a/samples/cpp-winrt/basics/packages.config b/samples/cpp-winrt/basics/packages.config index 29bfea9f4..10c74314f 100644 --- a/samples/cpp-winrt/basics/packages.config +++ b/samples/cpp-winrt/basics/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/samples/cpp-winrt/loopback-endpoints/loopback-endpoints-cpp.vcxproj b/samples/cpp-winrt/loopback-endpoints/loopback-endpoints-cpp.vcxproj index feca9dfa5..91112dac4 100644 --- a/samples/cpp-winrt/loopback-endpoints/loopback-endpoints-cpp.vcxproj +++ b/samples/cpp-winrt/loopback-endpoints/loopback-endpoints-cpp.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/samples/cpp-winrt/loopback-endpoints/packages.config b/samples/cpp-winrt/loopback-endpoints/packages.config index 29bfea9f4..10c74314f 100644 --- a/samples/cpp-winrt/loopback-endpoints/packages.config +++ b/samples/cpp-winrt/loopback-endpoints/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/samples/cpp-winrt/send-speed/packages.config b/samples/cpp-winrt/send-speed/packages.config index 29bfea9f4..10c74314f 100644 --- a/samples/cpp-winrt/send-speed/packages.config +++ b/samples/cpp-winrt/send-speed/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/samples/cpp-winrt/send-speed/send-speed-cpp.vcxproj b/samples/cpp-winrt/send-speed/send-speed-cpp.vcxproj index 69024004a..6900ff4c3 100644 --- a/samples/cpp-winrt/send-speed/send-speed-cpp.vcxproj +++ b/samples/cpp-winrt/send-speed/send-speed-cpp.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/samples/cpp-winrt/simple-app-to-app-midi/packages.config b/samples/cpp-winrt/simple-app-to-app-midi/packages.config index 29bfea9f4..10c74314f 100644 --- a/samples/cpp-winrt/simple-app-to-app-midi/packages.config +++ b/samples/cpp-winrt/simple-app-to-app-midi/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/samples/cpp-winrt/simple-app-to-app-midi/simple-app-to-app-cpp.vcxproj b/samples/cpp-winrt/simple-app-to-app-midi/simple-app-to-app-cpp.vcxproj index 722d32cab..8bad8d128 100644 --- a/samples/cpp-winrt/simple-app-to-app-midi/simple-app-to-app-cpp.vcxproj +++ b/samples/cpp-winrt/simple-app-to-app-midi/simple-app-to-app-cpp.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/samples/cpp-winrt/static-enum-endpoints/packages.config b/samples/cpp-winrt/static-enum-endpoints/packages.config index 29bfea9f4..10c74314f 100644 --- a/samples/cpp-winrt/static-enum-endpoints/packages.config +++ b/samples/cpp-winrt/static-enum-endpoints/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/samples/cpp-winrt/static-enum-endpoints/static-enum-endpoints-cpp.vcxproj b/samples/cpp-winrt/static-enum-endpoints/static-enum-endpoints-cpp.vcxproj index d33d45eb7..62169f33c 100644 --- a/samples/cpp-winrt/static-enum-endpoints/static-enum-endpoints-cpp.vcxproj +++ b/samples/cpp-winrt/static-enum-endpoints/static-enum-endpoints-cpp.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/samples/cpp-winrt/watch-endpoints/packages.config b/samples/cpp-winrt/watch-endpoints/packages.config index 29bfea9f4..10c74314f 100644 --- a/samples/cpp-winrt/watch-endpoints/packages.config +++ b/samples/cpp-winrt/watch-endpoints/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/samples/cpp-winrt/watch-endpoints/watch-endpoints-cpp.vcxproj b/samples/cpp-winrt/watch-endpoints/watch-endpoints-cpp.vcxproj index 01344d9e6..1dab40062 100644 --- a/samples/cpp-winrt/watch-endpoints/watch-endpoints-cpp.vcxproj +++ b/samples/cpp-winrt/watch-endpoints/watch-endpoints-cpp.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/src/api/Inc/MidiDefs.h b/src/api/Inc/MidiDefs.h index c359b57b8..17b2dee2c 100644 --- a/src/api/Inc/MidiDefs.h +++ b/src/api/Inc/MidiDefs.h @@ -652,8 +652,11 @@ DEFINE_MIDIDEVPROPKEY(PKEY_MIDI_VirtualMidiEndpointAssociator, 900); // DEVP #define STRING_PKEY_MIDI_UseOldMidi1PortNamingScheme MIDI_STRING_PKEY_GUID MIDI_STRING_PKEY_PID_SEPARATOR L"1000" DEFINE_MIDIDEVPROPKEY(PKEY_MIDI_UseOldMidi1PortNamingScheme, 1000); // DEVPROP_TYPE_BOOL +#define STRING_PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames MIDI_STRING_PKEY_GUID MIDI_STRING_PKEY_PID_SEPARATOR L"1010" +DEFINE_MIDIDEVPROPKEY(PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames, 1010); // DEVPROP_TYPE_BOOLEAN - +#define STRING_PKEY_MIDI_CreateMidi1PortsForEndpoint MIDI_STRING_PKEY_GUID MIDI_STRING_PKEY_PID_SEPARATOR L"1020" +DEFINE_MIDIDEVPROPKEY(PKEY_MIDI_CreateMidi1PortsForEndpoint, 1020); // DEVPROP_TYPE_BOOLEAN // Structures for properties ================================================================= diff --git a/src/api/Inc/midi_naming.h b/src/api/Inc/midi_naming.h index e87a9c0b7..7852c62bf 100644 --- a/src/api/Inc/midi_naming.h +++ b/src/api/Inc/midi_naming.h @@ -28,7 +28,8 @@ namespace WindowsMidiServicesInternal::Midi1PortNaming // for whole word. We do other removal in the next step if (pinName == L"MIDI" || pinName == L"Out" || pinName == L"OUT" || pinName == L"out" || - pinName == L"In" || pinName == L"IN" || pinName == L"in" + pinName == L"In" || pinName == L"IN" || pinName == L"in" || + pinName == L"IO" ) { cleanedPinName = L""; diff --git a/src/api/Service/Exe/MidiDeviceManager.cpp b/src/api/Service/Exe/MidiDeviceManager.cpp index d4f235f99..41e301493 100644 --- a/src/api/Service/Exe/MidiDeviceManager.cpp +++ b/src/api/Service/Exe/MidiDeviceManager.cpp @@ -10,6 +10,7 @@ #include "ks.h" #include "Midi2KSAggregateTransport.h" #include "Midi2KSTransport.h" +#include "Midi2LoopbackMidiTransport.h" using namespace winrt::Windows::Devices::Enumeration; @@ -2329,6 +2330,8 @@ CMidiDeviceManager::SyncMidi1Ports( additionalProperties.Append(STRING_PKEY_MIDI_GroupTerminalBlocks); additionalProperties.Append(STRING_PKEY_MIDI_EndpointDiscoveryProcessComplete); additionalProperties.Append(STRING_PKEY_MIDI_CustomPortAssignments); + additionalProperties.Append(STRING_PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames); + additionalProperties.Append(STRING_PKEY_MIDI_CreateMidi1PortsForEndpoint); // We have function blocks to retrieve // build up the property keys to query for the function blocks @@ -2344,6 +2347,21 @@ CMidiDeviceManager::SyncMidi1Ports( auto deviceInfo = DeviceInformation::CreateFromIdAsync(umpMidiPort->DeviceInterfaceId.get(), additionalProperties, winrt::Windows::Devices::Enumeration::DeviceInformationKind::DeviceInterface).get(); + // First, let's check to see if we should be creating MIDI 1 ports for this endpoint + // default action, if unspecified, is to create the ports + auto createMidi1PortsProp = deviceInfo.Properties().Lookup(STRING_PKEY_MIDI_CreateMidi1PortsForEndpoint); + if (createMidi1PortsProp) + { + auto createPorts = winrt::unbox_value(createMidi1PortsProp); + + if (!createPorts) + { + // it's not an error condition to skip creating MIDI 1 ports for an endpoint + return S_OK; + } + } + + // get the current function block information from the UMP SWD, if present, else fall back to // GTB if that is present. If neither, then there's nothing more to do. hrTemp = GetFunctionBlockPortInfo(umpMidiPort->DeviceInterfaceId.get(), deviceInfo, portInfo); @@ -2475,12 +2493,13 @@ CMidiDeviceManager::SyncMidi1Ports( DEVPROP_TYPE_BYTE, (ULONG)(sizeof(BYTE)), (PVOID)(&(nativeDataFormat)) }); } - // KSA uses port names for the GTB names. But the new MIDI 2.0 UMP driver - // does the same for MIDI 1.0 devices. So we check both KSA and KS here. - if (transportId == winrt::guid(__uuidof(Midi2KSAggregateTransport)) || - (transportId == winrt::guid(__uuidof(Midi2KSTransport)) && WI_IsFlagSet(nativeDataFormat, MidiDataFormats::MidiDataFormats_ByteStream))) + //if (transportId == winrt::guid(__uuidof(Midi2KSAggregateTransport)) || + // transportId == winrt::guid(__uuidof(Midi2LoopbackMidiTransport)) || + // (transportId == winrt::guid(__uuidof(Midi2KSTransport)) && WI_IsFlagSet(nativeDataFormat, MidiDataFormats::MidiDataFormats_ByteStream))) + prop = deviceInfo.Properties().Lookup(STRING_PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames); + if (prop) { - usePortInfoName = true; + usePortInfoName = winrt::unbox_value(prop); } prop = deviceInfo.Properties().Lookup(STRING_PKEY_MIDI_CustomEndpointName); diff --git a/src/api/Service/Exe/MidiSrv.vcxproj b/src/api/Service/Exe/MidiSrv.vcxproj index 48b86c019..3c8b201b0 100644 --- a/src/api/Service/Exe/MidiSrv.vcxproj +++ b/src/api/Service/Exe/MidiSrv.vcxproj @@ -161,12 +161,12 @@ - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) @@ -205,12 +205,12 @@ - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) @@ -249,12 +249,12 @@ - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) @@ -297,12 +297,12 @@ - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) - %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\midi2.ksaggregatetransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.kstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.diagnosticstransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.loopbackmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.virtualmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.networkmiditransport\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.JitterReductionTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.EndpointMetadataListenerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\Midi2.UmpProtocolDownscalerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.BS2UMPTransform\$(Platform)\$(Configuration);$(SolutionDir)Libs\TransportUtilities\inc;$(SolutionDir)VSFiles\intermediate\midi2.SchedulerTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.UMP2BSTransform\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) diff --git a/src/api/Transport/KSAggregateTransport/Midi2.KSAggregateMidiEndpointManager.cpp b/src/api/Transport/KSAggregateTransport/Midi2.KSAggregateMidiEndpointManager.cpp index 1ca930743..1a4ce00eb 100644 --- a/src/api/Transport/KSAggregateTransport/Midi2.KSAggregateMidiEndpointManager.cpp +++ b/src/api/Transport/KSAggregateTransport/Midi2.KSAggregateMidiEndpointManager.cpp @@ -164,6 +164,7 @@ CMidi2KSAggregateMidiEndpointManager::CreateMidiUmpEndpoint( TraceLoggingWideString(masterEndpointDefinition.EndpointName.c_str(), "name") ); + DEVPROP_BOOLEAN devPropTrue = DEVPROP_TRUE; // we require at least one valid pin RETURN_HR_IF(E_INVALIDARG, masterEndpointDefinition.MidiPins.size() < 1); @@ -403,6 +404,9 @@ CMidi2KSAggregateMidiEndpointManager::CreateMidiUmpEndpoint( { interfaceDevProperties.push_back({ { PKEY_MIDI_GroupTerminalBlocks, DEVPROP_STORE_SYSTEM, nullptr }, DEVPROP_TYPE_BINARY, (ULONG)groupTerminalBlockData.size(), (PVOID)groupTerminalBlockData.data()}); + + interfaceDevProperties.push_back({ { PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames, DEVPROP_STORE_SYSTEM, nullptr }, + DEVPROP_TYPE_BOOLEAN, (ULONG)sizeof(devPropTrue), (PVOID)&devPropTrue }); } else { diff --git a/src/api/Transport/KSTransport/Midi2.KSMidiEndpointManager.cpp b/src/api/Transport/KSTransport/Midi2.KSMidiEndpointManager.cpp index 81b8e04c9..636ca05db 100644 --- a/src/api/Transport/KSTransport/Midi2.KSMidiEndpointManager.cpp +++ b/src/api/Transport/KSTransport/Midi2.KSMidiEndpointManager.cpp @@ -87,6 +87,9 @@ CMidi2KSMidiEndpointManager::OnDeviceAdded( TraceLoggingWideString(device.Id().c_str(), "device id") ); + DEVPROP_BOOLEAN devPropTrue = DEVPROP_TRUE; + DEVPROP_BOOLEAN devPropFalse = DEVPROP_FALSE; + wil::unique_handle hFilter; std::wstring deviceName; std::wstring deviceId; @@ -542,6 +545,7 @@ CMidi2KSMidiEndpointManager::OnDeviceAdded( capabilities |= MidiEndpointCapabilities_SupportsMultiClient; capabilities |= MidiEndpointCapabilities_GenerateIncomingTimestamps; + interfaceDevProperties.push_back({ {DEVPKEY_KsMidiPort_KsFilterInterfaceId, DEVPROP_STORE_SYSTEM, nullptr}, DEVPROP_TYPE_STRING, static_cast((MidiPin->Id.length() + 1) * sizeof(WCHAR)), (PVOID)MidiPin->Id.c_str() }); interfaceDevProperties.push_back({ {DEVPKEY_KsTransport, DEVPROP_STORE_SYSTEM, nullptr }, @@ -606,6 +610,26 @@ CMidi2KSMidiEndpointManager::OnDeviceAdded( { interfaceDevProperties.push_back({ { PKEY_MIDI_GroupTerminalBlocks, DEVPROP_STORE_SYSTEM, nullptr }, DEVPROP_TYPE_BINARY, MidiPin->GroupTerminalBlockDataSize, (PVOID)MidiPin->GroupTerminalBlockData.get() }); + + + if (MidiPin->NativeDataFormat == KSDATAFORMAT_SUBTYPE_UNIVERSALMIDIPACKET) + { + // if a UMP device, we don't necessarily use the GTBs to name MIDI 1 ports + interfaceDevProperties.push_back({ { PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames, DEVPROP_STORE_SYSTEM, nullptr }, + DEVPROP_TYPE_BOOLEAN, static_cast(sizeof(devPropFalse)), (PVOID) & (devPropFalse) }); + } + else if (MidiPin->NativeDataFormat == KSDATAFORMAT_SUBTYPE_MIDI) + { + // for a native MIDI 1 device, the driver provides a MIDI 1 port name in the GTB + interfaceDevProperties.push_back({ { PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames, DEVPROP_STORE_SYSTEM, nullptr }, + DEVPROP_TYPE_BOOLEAN, static_cast(sizeof(devPropTrue)), (PVOID) & (devPropTrue) }); + } + } + else + { + interfaceDevProperties.push_back({ { PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames, DEVPROP_STORE_SYSTEM, nullptr }, + DEVPROP_TYPE_BOOLEAN, static_cast(sizeof(devPropFalse)), (PVOID) & (devPropFalse) }); + } // Bidirectional uses a different property for the in and out pins, since we currently require two separate ones. diff --git a/src/api/Transport/LoopbackMidiTransport/Midi2.LoopbackMidiEndpointManager.cpp b/src/api/Transport/LoopbackMidiTransport/Midi2.LoopbackMidiEndpointManager.cpp index d7c4ab84d..3d9dd2cbc 100644 --- a/src/api/Transport/LoopbackMidiTransport/Midi2.LoopbackMidiEndpointManager.cpp +++ b/src/api/Transport/LoopbackMidiTransport/Midi2.LoopbackMidiEndpointManager.cpp @@ -236,7 +236,7 @@ CMidi2LoopbackMidiEndpointManager::CreateSingleEndpoint( std::wstring transportCode(TRANSPORT_CODE); - //DEVPROP_BOOLEAN devPropTrue = DEVPROP_TRUE; + DEVPROP_BOOLEAN devPropTrue = DEVPROP_TRUE; // DEVPROP_BOOLEAN devPropFalse = DEVPROP_FALSE; std::wstring endpointName = definition->EndpointName; @@ -320,24 +320,37 @@ CMidi2LoopbackMidiEndpointManager::CreateSingleEndpoint( std::vector blocks{ }; - internal::GroupTerminalBlockInternal gtb; - gtb.Number = 1; // gtb indexes start at 1 - gtb.GroupCount = 1; // todo: we could get this from properties - gtb.FirstGroupIndex = 0; // group indexes start at 0 - gtb.Protocol = 0x11; // 0x11 = MIDI 2.0 - gtb.Direction = MIDI_GROUP_TERMINAL_BLOCK_BIDIRECTIONAL; - gtb.Name = L"IO"; // todo: we could get this from properties so folks can control the port name + internal::GroupTerminalBlockInternal gtb1; + gtb1.Number = 1; // gtb indexes start at 1 + gtb1.GroupCount = 1; // todo: we could get this from properties + gtb1.FirstGroupIndex = 0; // group indexes start at 0 + gtb1.Protocol = 0x11; // 0x11 = MIDI 2.0 + gtb1.Direction = MIDI_GROUP_TERMINAL_BLOCK_INPUT; // MIDI Out from user's perspective + gtb1.Name = friendlyName + L" Out"; // todo: get this from properties so folks can control the port name + blocks.push_back(gtb1); + + internal::GroupTerminalBlockInternal gtb2; + gtb2.Number = 1; // gtb indexes start at 1 + gtb2.GroupCount = 1; // todo: we could get this from properties + gtb2.FirstGroupIndex = 0; // group indexes start at 0 + gtb2.Protocol = 0x11; // 0x11 = MIDI 2.0 + gtb2.Direction = MIDI_GROUP_TERMINAL_BLOCK_OUTPUT; // MIDI In from user's perspective + gtb2.Name = friendlyName + L" In"; // todo: get this from properties so folks can control the port name + blocks.push_back(gtb2); + - blocks.push_back(gtb); - std::vector groupTerminalBlockData; if (internal::WriteGroupTerminalBlocksToPropertyDataPointer(blocks, groupTerminalBlockData)) { interfaceDeviceProperties.push_back({ { PKEY_MIDI_GroupTerminalBlocks, DEVPROP_STORE_SYSTEM, nullptr }, DEVPROP_TYPE_BINARY, (ULONG)groupTerminalBlockData.size(), (PVOID)groupTerminalBlockData.data() }); - } + interfaceDeviceProperties.push_back({ { PKEY_MIDI_UseGroupTerminalBlocksForExactMidi1PortNames, DEVPROP_STORE_SYSTEM, nullptr }, + DEVPROP_TYPE_BOOLEAN, (ULONG)sizeof(devPropTrue), (PVOID)&devPropTrue}); + } + + RETURN_IF_FAILED(m_MidiDeviceManager->ActivateEndpoint( (PCWSTR)m_parentDeviceId.c_str(), // parent instance Id definition->UMPOnly, // UMP-only. When set to false, WinMM MIDI 1.0 ports are created diff --git a/src/app-sdk/mididiag/mididiag.vcxproj b/src/app-sdk/mididiag/mididiag.vcxproj index 96c5aeb7b..d92dc095a 100644 --- a/src/app-sdk/mididiag/mididiag.vcxproj +++ b/src/app-sdk/mididiag/mididiag.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/src/app-sdk/mididiag/packages.config b/src/app-sdk/mididiag/packages.config index d50f79bbc..b0a52d034 100644 --- a/src/app-sdk/mididiag/packages.config +++ b/src/app-sdk/mididiag/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj b/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj index 02ced8544..f4cf395b1 100644 --- a/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj +++ b/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/src/app-sdk/midimdnsinfo/packages.config b/src/app-sdk/midimdnsinfo/packages.config index d50f79bbc..b0a52d034 100644 --- a/src/app-sdk/midimdnsinfo/packages.config +++ b/src/app-sdk/midimdnsinfo/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/src/app-sdk/midiusbinfo/midiusbinfo.vcxproj b/src/app-sdk/midiusbinfo/midiusbinfo.vcxproj index ed6d716f2..4997aed1a 100644 --- a/src/app-sdk/midiusbinfo/midiusbinfo.vcxproj +++ b/src/app-sdk/midiusbinfo/midiusbinfo.vcxproj @@ -2,7 +2,7 @@ - Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250213-52 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250215-2126 true true true diff --git a/src/app-sdk/midiusbinfo/packages.config b/src/app-sdk/midiusbinfo/packages.config index d50f79bbc..b0a52d034 100644 --- a/src/app-sdk/midiusbinfo/packages.config +++ b/src/app-sdk/midiusbinfo/packages.config @@ -1,6 +1,6 @@  - + \ No newline at end of file diff --git a/src/app-sdk/sdk-runtime-installer/settings-package/WindowsMidiServicesSettings.wxs b/src/app-sdk/sdk-runtime-installer/settings-package/WindowsMidiServicesSettings.wxs index 6668e4ed6..ef248575f 100644 --- a/src/app-sdk/sdk-runtime-installer/settings-package/WindowsMidiServicesSettings.wxs +++ b/src/app-sdk/sdk-runtime-installer/settings-package/WindowsMidiServicesSettings.wxs @@ -59,6 +59,7 @@ Guid="f4f2b375-347b-413c-b81d-e900f392f786"> + diff --git a/src/app-sdk/winrt/MidiLoopbackEndpointCreationConfig.idl b/src/app-sdk/winrt/MidiLoopbackEndpointCreationConfig.idl index 7f647dc85..3056d3bbf 100644 --- a/src/app-sdk/winrt/MidiLoopbackEndpointCreationConfig.idl +++ b/src/app-sdk/winrt/MidiLoopbackEndpointCreationConfig.idl @@ -13,6 +13,7 @@ import "MidiLoopbackEndpointDefinition.idl"; namespace Microsoft.Windows.Devices.Midi2.Endpoints.Loopback { + [experimental] [default_interface] runtimeclass MidiLoopbackEndpointCreationConfig : Microsoft.Windows.Devices.Midi2.ServiceConfig.IMidiServiceTransportPluginConfig { diff --git a/src/app-sdk/winrt/MidiLoopbackEndpointManager.cpp b/src/app-sdk/winrt/MidiLoopbackEndpointManager.cpp index d2d541a88..2c8c8d3a5 100644 --- a/src/app-sdk/winrt/MidiLoopbackEndpointManager.cpp +++ b/src/app-sdk/winrt/MidiLoopbackEndpointManager.cpp @@ -111,4 +111,95 @@ namespace winrt::Microsoft::Windows::Devices::Midi2::Endpoints::Loopback::implem return result; } + + _Use_decl_annotations_ + midi2::MidiEndpointDeviceInformation MidiLoopbackEndpointManager::GetAssociatedLoopbackEndpoint( + midi2::MidiEndpointDeviceInformation const& loopbackEndpoint + ) + { + auto domain = midi2::MidiEndpointDeviceInformation::FindAll(); + + return GetAssociatedLoopbackEndpoint(loopbackEndpoint, domain); + } + + + _Use_decl_annotations_ + midi2::MidiEndpointDeviceInformation MidiLoopbackEndpointManager::GetAssociatedLoopbackEndpointForId( + winrt::hstring loopbackEndpointId + ) + { + auto cleanId = internal::NormalizeEndpointInterfaceIdHStringCopy(loopbackEndpointId); + + auto info = midi2::MidiEndpointDeviceInformation::CreateFromEndpointDeviceId(cleanId); + + return GetAssociatedLoopbackEndpoint(info); + } + + + _Use_decl_annotations_ + midi2::MidiEndpointDeviceInformation MidiLoopbackEndpointManager::GetAssociatedLoopbackEndpoint( + midi2::MidiEndpointDeviceInformation const& loopbackEndpoint, + collections::IIterable endpointsToSearch) + { + if (loopbackEndpoint == nullptr) + { + return nullptr; + } + + if (endpointsToSearch == nullptr) + { + return nullptr; + } + + auto transportId = loopbackEndpoint.GetTransportSuppliedInfo().TransportId; + + if (transportId != TransportId()) + { + // not a loopback endpoint + return nullptr; + } + + // get the endpoint's association id + + if (loopbackEndpoint.Properties().HasKey(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator) && + loopbackEndpoint.Properties().Lookup(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator) != nullptr) + { + auto associator = winrt::unbox_value(loopbackEndpoint.Properties().Lookup(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator)); + + // find the other endpoint that has this associator + // this is wasteful to get everything and then iterate, but there's + // no AQS way to search using our custom DEVPKEY properties + + winrt::hstring query{ MIDI_ENDPOINT_DEVICE_AQS_FILTER }; + + for (auto const& ep : endpointsToSearch) + { + auto id = internal::NormalizeEndpointInterfaceIdHStringCopy(ep.EndpointDeviceId()); + + // don't process the endpoint that was passed in, of course + if (id != loopbackEndpoint.EndpointDeviceId()) + { + if (ep.Properties().HasKey(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator) && + ep.Properties().Lookup(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator) != nullptr) + { + auto thisAssociator = winrt::unbox_value(loopbackEndpoint.Properties().Lookup(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator)); + + if (!thisAssociator.empty()) + { + // return the endpoint if it has the matching association id + if (thisAssociator == associator) + { + // create the endpoint + return MidiEndpointDeviceInformation::CreateFromEndpointDeviceId(id); + } + } + } + } + } + } + + return nullptr; + + } + } diff --git a/src/app-sdk/winrt/MidiLoopbackEndpointManager.h b/src/app-sdk/winrt/MidiLoopbackEndpointManager.h index 5f658a3a5..52ee7299e 100644 --- a/src/app-sdk/winrt/MidiLoopbackEndpointManager.h +++ b/src/app-sdk/winrt/MidiLoopbackEndpointManager.h @@ -25,6 +25,17 @@ namespace winrt::Microsoft::Windows::Devices::Midi2::Endpoints::Loopback::implem static bool RemoveTransientLoopbackEndpoints( _In_ loop::MidiLoopbackEndpointRemovalConfig deletionConfig); + + static midi2::MidiEndpointDeviceInformation GetAssociatedLoopbackEndpointForId( + _In_ winrt::hstring loopbackEndpointId); + + static midi2::MidiEndpointDeviceInformation GetAssociatedLoopbackEndpoint( + _In_ midi2::MidiEndpointDeviceInformation const& loopbackEndpoint, + _In_ collections::IIterable endpointsToSearch); + + static midi2::MidiEndpointDeviceInformation GetAssociatedLoopbackEndpoint( + _In_ midi2::MidiEndpointDeviceInformation const& loopbackEndpoint); + }; } namespace winrt::Microsoft::Windows::Devices::Midi2::Endpoints::Loopback::factory_implementation diff --git a/src/app-sdk/winrt/MidiLoopbackEndpointManager.idl b/src/app-sdk/winrt/MidiLoopbackEndpointManager.idl index 8c0d62adc..eadd7a739 100644 --- a/src/app-sdk/winrt/MidiLoopbackEndpointManager.idl +++ b/src/app-sdk/winrt/MidiLoopbackEndpointManager.idl @@ -11,8 +11,11 @@ import "MidiLoopbackEndpointCreationResult.idl"; import "MidiLoopbackEndpointCreationConfig.idl"; import "MidiLoopbackEndpointRemovalConfig.idl"; +import "MidiEndpointDeviceInformation.idl"; + namespace Microsoft.Windows.Devices.Midi2.Endpoints.Loopback { + [experimental] static runtimeclass MidiLoopbackEndpointManager { static Boolean IsTransportAvailable{ get; }; @@ -24,6 +27,16 @@ namespace Microsoft.Windows.Devices.Midi2.Endpoints.Loopback static Boolean RemoveTransientLoopbackEndpoints( MidiLoopbackEndpointRemovalConfig removalConfig); + + static Microsoft.Windows.Devices.Midi2.MidiEndpointDeviceInformation GetAssociatedLoopbackEndpointForId( + String loopbackEndpointId); + + static Microsoft.Windows.Devices.Midi2.MidiEndpointDeviceInformation GetAssociatedLoopbackEndpoint( + Microsoft.Windows.Devices.Midi2.MidiEndpointDeviceInformation loopbackEndpoint, + IIterable endpointsToSearch); + + static Microsoft.Windows.Devices.Midi2.MidiEndpointDeviceInformation GetAssociatedLoopbackEndpoint( + Microsoft.Windows.Devices.Midi2.MidiEndpointDeviceInformation loopbackEndpoint); } } diff --git a/src/app-sdk/winrt/MidiLoopbackEndpointRemovalConfig.idl b/src/app-sdk/winrt/MidiLoopbackEndpointRemovalConfig.idl index 87d054611..720bd2c36 100644 --- a/src/app-sdk/winrt/MidiLoopbackEndpointRemovalConfig.idl +++ b/src/app-sdk/winrt/MidiLoopbackEndpointRemovalConfig.idl @@ -14,6 +14,7 @@ import "IMidiServiceTransportPluginConfig.idl"; namespace Microsoft.Windows.Devices.Midi2.Endpoints.Loopback { + [experimental] [default_interface] runtimeclass MidiLoopbackEndpointRemovalConfig : Microsoft.Windows.Devices.Midi2.ServiceConfig.IMidiServiceTransportPluginConfig { diff --git a/src/oob-setup/api-package/WindowsMidiServices.wxs b/src/oob-setup/api-package/WindowsMidiServices.wxs index dfff9bfc1..4d4a326cb 100644 --- a/src/oob-setup/api-package/WindowsMidiServices.wxs +++ b/src/oob-setup/api-package/WindowsMidiServices.wxs @@ -84,6 +84,7 @@ + - + @@ -137,7 +138,8 @@ - + + - + - + diff --git a/src/user-tools/midi-console/Midi/Commands/Service/ServiceRestartCommand.cs b/src/user-tools/midi-console/Midi/Commands/Service/ServiceRestartCommand.cs index f5c009e7a..0d7d8e90c 100644 --- a/src/user-tools/midi-console/Midi/Commands/Service/ServiceRestartCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Service/ServiceRestartCommand.cs @@ -30,7 +30,7 @@ public override int Execute(CommandContext context, Settings settings) if (!UserHelper.CurrentUserHasAdminRights()) { AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError("This command must be run as Administrator.")); - return (int)MidiConsoleReturnCode.ErrorGeneralFailure; + return (int)MidiConsoleReturnCode.ErrorInsufficientPermissions; } diff --git a/src/user-tools/midi-console/Midi/Commands/Service/ServiceSetAutoStart.cs b/src/user-tools/midi-console/Midi/Commands/Service/ServiceSetAutoStart.cs new file mode 100644 index 000000000..90dedc724 --- /dev/null +++ b/src/user-tools/midi-console/Midi/Commands/Service/ServiceSetAutoStart.cs @@ -0,0 +1,132 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License +// ============================================================================ +// This is part of Windows MIDI Services and should be used +// in your Windows application via an official binary distribution. +// Further information: https://aka.ms/midi +// ============================================================================ + +using System.Runtime.InteropServices; +using System.ServiceProcess; + +namespace Microsoft.Midi.ConsoleApp +{ + internal class ServiceSetAutoStart : Command + { + [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern Boolean ChangeServiceConfig( + IntPtr hService, + UInt32 nServiceType, + UInt32 nStartType, + UInt32 nErrorControl, + String lpBinaryPathName, + String lpLoadOrderGroup, + IntPtr lpdwTagId, + [In] char[] lpDependencies, + String lpServiceStartName, + String lpPassword, + String lpDisplayName); + + [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern IntPtr OpenService( + IntPtr hSCManager, string lpServiceName, uint dwDesiredAccess); + + [DllImport("advapi32.dll", EntryPoint = "OpenSCManagerW", ExactSpelling = true, CharSet = CharSet.Unicode, SetLastError = true)] + public static extern IntPtr OpenSCManager( + string machineName, string databaseName, uint dwAccess); + + [DllImport("advapi32.dll", EntryPoint = "CloseServiceHandle")] + public static extern int CloseServiceHandle(IntPtr hSCObject); + + private const uint SERVICE_NO_CHANGE = 0xFFFFFFFF; + private const uint SERVICE_QUERY_CONFIG = 0x00000001; + private const uint SERVICE_CHANGE_CONFIG = 0x00000002; + private const uint SC_MANAGER_ALL_ACCESS = 0x000F003F; + + + public sealed class Settings : CommandSettings + { + // TODO: Consider changing this to a command argument instead of an option + [LocalizedDescription("ParameterServiceRestart")] + [CommandOption("-r|--restart-service|--restart")] + [DefaultValue(false)] + public bool Restart { get; set; } + + } + + public override int Execute(CommandContext context, Settings settings) + { + // this command requires admin + + if (!UserHelper.CurrentUserHasAdminRights()) + { + AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError("This command must be run as Administrator.")); + return (int)MidiConsoleReturnCode.ErrorInsufficientPermissions; + } + + AnsiConsole.MarkupLine("Setting service to auto-start..."); + + var scManagerHandle = OpenSCManager(null, null, SC_MANAGER_ALL_ACCESS); + if (scManagerHandle == IntPtr.Zero) + { + //throw new ExternalException("Open Service Manager Error"); + AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError("Error opening service manager.")); + return (int)MidiConsoleReturnCode.ErrorGeneralFailure; + } + + var serviceHandle = OpenService( + scManagerHandle, + MidiServiceHelper.GetServiceName(), + SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG); + + if (serviceHandle == IntPtr.Zero) + { + AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError("Error opening service.")); + return (int)MidiConsoleReturnCode.ErrorGeneralFailure; + } + + var result = ChangeServiceConfig( + serviceHandle, + SERVICE_NO_CHANGE, + (uint)ServiceStartMode.Automatic, + SERVICE_NO_CHANGE, + null, + null, + IntPtr.Zero, + null, + null, + null, + null); + + if (!result) + { + int nError = Marshal.GetLastWin32Error(); + var win32Exception = new Win32Exception(nError); + + AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError("Could not change service start type: " + win32Exception.Message)); + + return (int)MidiConsoleReturnCode.ErrorGeneralFailure; + } + + CloseServiceHandle(serviceHandle); + CloseServiceHandle(scManagerHandle); + + var controller = MidiServiceHelper.GetServiceController(); + + if (settings.Restart) + { + AnsiConsole.MarkupLine("Stopping service."); + MidiServiceHelper.StopServiceWithConsoleStatusUpdate(controller); + + AnsiConsole.MarkupLine("Restarting service."); + MidiServiceHelper.StartServiceWithConsoleStatusUpdate(controller); + } + + AnsiConsole.MarkupLine("Succeeded"); + + + return (int)MidiConsoleReturnCode.Success; + } + + } +} diff --git a/src/user-tools/midi-console/Midi/Commands/Service/ServiceStartCommand.cs b/src/user-tools/midi-console/Midi/Commands/Service/ServiceStartCommand.cs index 5cff42c78..d88537894 100644 --- a/src/user-tools/midi-console/Midi/Commands/Service/ServiceStartCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Service/ServiceStartCommand.cs @@ -28,7 +28,7 @@ public override int Execute(CommandContext context, Settings settings) if (!UserHelper.CurrentUserHasAdminRights()) { AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError("This command must be run as Administrator.")); - return (int)MidiConsoleReturnCode.ErrorGeneralFailure; + return (int)MidiConsoleReturnCode.ErrorInsufficientPermissions; } diff --git a/src/user-tools/midi-console/Midi/Commands/Service/ServiceStopCommand.cs b/src/user-tools/midi-console/Midi/Commands/Service/ServiceStopCommand.cs index df18ce191..fef770b88 100644 --- a/src/user-tools/midi-console/Midi/Commands/Service/ServiceStopCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Service/ServiceStopCommand.cs @@ -29,7 +29,7 @@ public override int Execute(CommandContext context, Settings settings) if (!UserHelper.CurrentUserHasAdminRights()) { AnsiConsole.MarkupLine(AnsiMarkupFormatter.FormatError("This command must be run as Administrator.")); - return (int)MidiConsoleReturnCode.ErrorGeneralFailure; + return (int)MidiConsoleReturnCode.ErrorInsufficientPermissions; } diff --git a/src/user-tools/midi-console/Midi/MidiConsoleReturnCode.cs b/src/user-tools/midi-console/Midi/MidiConsoleReturnCode.cs index e798343b9..fbcc93108 100644 --- a/src/user-tools/midi-console/Midi/MidiConsoleReturnCode.cs +++ b/src/user-tools/midi-console/Midi/MidiConsoleReturnCode.cs @@ -27,6 +27,8 @@ public enum MidiConsoleReturnCode : int ErrorServiceNotAvailable = 800, + ErrorInsufficientPermissions = 850, + ErrorNotImplemented = 998, ErrorGeneralFailure = 999 } diff --git a/src/user-tools/midi-console/Midi/Program.cs b/src/user-tools/midi-console/Midi/Program.cs index 04d1c5c23..fd86a0c32 100644 --- a/src/user-tools/midi-console/Midi/Program.cs +++ b/src/user-tools/midi-console/Midi/Program.cs @@ -206,6 +206,14 @@ .WithExample("service", "stop") ; + service.AddCommand("set-auto-start") + .WithDescription(Strings.ServiceSetAutoDelayedStartDescription) + .WithExample("service", "set-auto-start", "--restart") + ; + + + + }).WithAlias("svc"); diff --git a/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs b/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs index 4a743c871..5e4d9b908 100644 --- a/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs +++ b/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs @@ -1365,6 +1365,15 @@ internal static string ParameterServicePingVerbose { } } + /// + /// Looks up a localized string similar to Restart the service when complete. + /// + internal static string ParameterServiceRestart { + get { + return ResourceManager.GetString("ParameterServiceRestart", resourceCulture); + } + } + /// /// Looks up a localized string similar to Report additional details about the service. /// @@ -2315,6 +2324,15 @@ internal static string SendMessageSessionNameSuffix { } } + /// + /// Looks up a localized string similar to Set the MIDI Service to start shortly after Windows starts, to avoid connection delays with the first connection made by an app.. + /// + internal static string ServiceSetAutoDelayedStartDescription { + get { + return ResourceManager.GetString("ServiceSetAutoDelayedStartDescription", resourceCulture); + } + } + /// /// Looks up a localized string similar to Creating session and opening endpoint.... /// diff --git a/src/user-tools/midi-console/Midi/Resources/Strings.resx b/src/user-tools/midi-console/Midi/Resources/Strings.resx index d682049df..56287ed5d 100644 --- a/src/user-tools/midi-console/Midi/Resources/Strings.resx +++ b/src/user-tools/midi-console/Midi/Resources/Strings.resx @@ -911,4 +911,10 @@ Timestamp Set to true to use MIDI 2.0 protocol messages (type 4) instead of MIDI 1.0 protocol (type 2) + + Set the MIDI Service to start shortly after Windows starts, to avoid connection delays with the first connection made by an app. + + + Restart the service when complete + \ No newline at end of file diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml index 22ae3ca62..36600dfe4 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml @@ -1,5 +1,7 @@  @@ -13,6 +15,29 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml.cs b/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml.cs index 5abdbc997..b98859c52 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml.cs +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/App.xaml.cs @@ -10,6 +10,7 @@ using Microsoft.Midi.Settings.ViewModels; using Microsoft.Midi.Settings.Views; using Microsoft.UI.Xaml; +using System.Runtime.InteropServices; using Windows.UI.Popups; namespace Microsoft.Midi.Settings; @@ -71,6 +72,12 @@ public App() services.AddSingleton(); services.AddSingleton(); + // MIDI Services + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + // Views and ViewModels services.AddTransient(); services.AddTransient(); @@ -147,6 +154,9 @@ public App() services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + // Configuration services.Configure(context.Configuration.GetSection(nameof(LocalSettingsOptions))); }). @@ -169,6 +179,14 @@ private void App_UnhandledException(object sender, Microsoft.UI.Xaml.UnhandledEx public MidiDesktopAppSdkInitializer? MidiInitializer => _midiInitializer; + + [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)] + static extern int MessageBox( + IntPtr hWnd, + string lpText, + string lpCaption, + int uType); + protected async override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); @@ -179,5 +197,15 @@ protected async override void OnLaunched(LaunchActivatedEventArgs args) await App.GetService().ActivateAsync(args); } + else + { + // This dialog does not work here. Need either a low-level non-WinUI dialog to show, or use another approach + //var dlg = new MessageDialog("Unable to initialize Windows MIDI Services SDK Runtime. Is it installed?"); + //await dlg.ShowAsync(); + + MessageBox((IntPtr)0, "Unable to initialize Windows MIDI Services SDK Runtime. Is it installed?", "Error Starting Settings App", 0); + + Exit(); + } } } diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/LoopbackDiagram.svg b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/LoopbackDiagram.svg new file mode 100644 index 000000000..da14b13ee --- /dev/null +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/LoopbackDiagram.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/SVG Assets.afdesign b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/SVG Assets.afdesign new file mode 100644 index 000000000..fd943400c Binary files /dev/null and b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/SVG Assets.afdesign differ diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiConfigFileService.cs b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiConfigFileService.cs new file mode 100644 index 000000000..e2d542b2a --- /dev/null +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiConfigFileService.cs @@ -0,0 +1,48 @@ +namespace Microsoft.Midi.Settings.Contracts.Services; + + + +public class MidiConfigFileHeader +{ + public string Comment { get; set; } + public string Name { get; set; } + public string Product { get; set; } + public double FileVersion { get; set; } +} + +public interface IMidiConfigFile +{ + MidiConfigFileHeader? Header { get; } + + string FileName { get; } + bool Load(); + + + bool StoreLoopbackEndpointPair(Microsoft.Windows.Devices.Midi2.Endpoints.Loopback.MidiLoopbackEndpointCreationConfig creationConfig); + + +} + + +public interface IMidiConfigFileService +{ + bool IsConfigFileActive { get; } + + IMidiConfigFile? CurrentConfig { get; } + + string GetConfigFilesLocation(); + + string GetDefaultConfigName(); + + string CleanupConfigName(string configName); + + bool ConfigFileExists(string configFileName); + + bool CreateNewConfigFile(string configName, string configFileName); + + string BuildConfigLocalFileNameFromConfigName(string configName); + + bool UpdateRegistryCurrentConfigFile(string configFileName); + + +} diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiDefaultsService.cs b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiDefaultsService.cs new file mode 100644 index 000000000..b2cd93b08 --- /dev/null +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiDefaultsService.cs @@ -0,0 +1,18 @@ +using Microsoft.Windows.Devices.Midi2.Endpoints.Loopback; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Midi.Settings.Contracts.Services +{ + public interface IMidiDefaultsService + { + string GetDefaultMidiConfigName(); + string GetDefaultMidiConfigFileName(); + + MidiLoopbackEndpointCreationConfig GetDefaultLoopbackCreationConfig(); + bool DoesDefaultLoopbackAlreadyExist(); + } +} diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiTransportInfoService.cs b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiTransportInfoService.cs new file mode 100644 index 000000000..dd4d9f8df --- /dev/null +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Contracts/Services/IMidiTransportInfoService.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Midi.Settings.Contracts.Services +{ + interface IMidiTransportInfoService + { + MidiServiceTransportPluginInfo GetTransportForCode(string transportCode); + + + + + } +} diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Microsoft.Midi.Settings.csproj b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Microsoft.Midi.Settings.csproj index c4bcae7d2..e3591afeb 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Microsoft.Midi.Settings.csproj +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Microsoft.Midi.Settings.csproj @@ -69,6 +69,7 @@ + @@ -98,7 +99,7 @@ - + @@ -109,7 +110,7 @@ - + @@ -118,10 +119,10 @@ - + - + @@ -167,7 +168,7 @@ Never - + MSBuild:Compile diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/APP/EndpointsAppPage.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/APP/EndpointsAppPage.xaml index 01e827163..aadc47b6e 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/APP/EndpointsAppPage.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/APP/EndpointsAppPage.xaml @@ -13,15 +13,6 @@ mc:Ignorable="d" > - - - - - - - - - diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/BLE10/EndpointsBle10Page.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/BLE10/EndpointsBle10Page.xaml index e9a7eebe0..8f8ef2600 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/BLE10/EndpointsBle10Page.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/BLE10/EndpointsBle10Page.xaml @@ -13,16 +13,6 @@ mc:Ignorable="d" > - - - - - - - - - - diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DIAG/EndpointsDiagPage.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DIAG/EndpointsDiagPage.xaml index 78e9ffa6f..deb58d53b 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DIAG/EndpointsDiagPage.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DIAG/EndpointsDiagPage.xaml @@ -13,16 +13,6 @@ mc:Ignorable="d" > - - - - - - - - - - diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DeviceDetailPage.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DeviceDetailPage.xaml index ba8daad60..6cd409a9c 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DeviceDetailPage.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/DeviceDetailPage.xaml @@ -11,21 +11,7 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> - - - - - - - - - - - - - - - + diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KS/EndpointsKSPage.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KS/EndpointsKSPage.xaml index b4d0368cd..3caf819c3 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KS/EndpointsKSPage.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KS/EndpointsKSPage.xaml @@ -16,15 +16,6 @@ mc:Ignorable="d" > - - - - - - - - - diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KSA/EndpointsKsaPage.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KSA/EndpointsKsaPage.xaml index fb252784a..4af5bdcae 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KSA/EndpointsKsaPage.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/KSA/EndpointsKsaPage.xaml @@ -13,16 +13,6 @@ mc:Ignorable="d" > - - - - - - - - - - diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/LOOP/CreateLoopbackEndpointsWindow.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/LOOP/CreateLoopbackEndpointsWindow.xaml deleted file mode 100644 index a5fa2a822..000000000 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/LOOP/CreateLoopbackEndpointsWindow.xaml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - -