From cd2afc6dbb2cbaae15fe96938d04a3e46cb8b8a7 Mon Sep 17 00:00:00 2001 From: Pete Brown Date: Sun, 16 Feb 2025 21:14:41 -0500 Subject: [PATCH 1/2] Settings, console, and diagnostics app updates --- build/staging/version/BundleInfo.wxi | 2 +- .../version/WindowsMidiServicesVersion.cs | 6 +- .../version/WindowsMidiServicesVersion.h | 6 +- .../how-to-install-development-builds.md | 6 + .../basics/client-basics-cpp.vcxproj | 2 +- samples/cpp-winrt/basics/packages.config | 2 +- .../loopback-endpoints-cpp.vcxproj | 2 +- .../loopback-endpoints/packages.config | 2 +- samples/cpp-winrt/send-speed/packages.config | 2 +- .../send-speed/send-speed-cpp.vcxproj | 2 +- .../simple-app-to-app-midi/packages.config | 2 +- .../simple-app-to-app-cpp.vcxproj | 2 +- .../static-enum-endpoints/packages.config | 2 +- .../static-enum-endpoints-cpp.vcxproj | 2 +- .../cpp-winrt/watch-endpoints/packages.config | 2 +- .../watch-endpoints-cpp.vcxproj | 2 +- src/api/Inc/MidiDefs.h | 2 +- src/app-sdk/mididiag/main.cpp | 18 +++ src/app-sdk/mididiag/mididiag.vcxproj | 2 +- src/app-sdk/mididiag/mididiag_field_defs.h | 7 + src/app-sdk/mididiag/packages.config | 2 +- src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj | 2 +- src/app-sdk/midimdnsinfo/packages.config | 2 +- src/app-sdk/midiusbinfo/main.cpp | 1 + src/app-sdk/midiusbinfo/midiusbinfo.vcxproj | 2 +- src/app-sdk/midiusbinfo/packages.config | 2 +- .../winrt/MidiLoopbackEndpointManager.cpp | 28 ++-- .../midi-pre-install-reg-steps.ps1 | 2 + .../Endpoint/EndpointPropertiesCommand.cs | 3 +- .../midi-console/Midi/MidiFriendlyNames.cs | 26 ++++ .../Midi/Resources/Strings.Designer.cs | 36 +++++ .../midi-console/Midi/Resources/Strings.resx | 12 ++ .../Assets/LoopbackDiagram.svg | 100 ++++++++++++-- .../Assets/SVG Assets.afdesign | Bin 18069 -> 23052 bytes .../Endpoints/LOOP/EndpointsLoopPage.xaml | 43 ++++-- .../Endpoints/LOOP/EndpointsLoopViewModel.cs | 126 +++++++++++++++--- .../Styles/TextBlock.xaml | 10 ++ .../ViewModels/HomeViewModel.cs | 18 ++- 38 files changed, 399 insertions(+), 89 deletions(-) create mode 100644 src/user-tools/midi-console/Midi/MidiFriendlyNames.cs diff --git a/build/staging/version/BundleInfo.wxi b/build/staging/version/BundleInfo.wxi index 3de205f3..7d465b97 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 f1104722..2be2f001 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.250215-2126"; + public const string BuildFullVersion = "1.0.3-preview-11.250216-1702"; public const string VersionMajor = "1"; public const string VersionMinor = "0"; public const string VersionRevision = "3"; - public const string VersionDateNumber = "250215"; - public const string VersionTimeNumber = "2126"; + public const string VersionDateNumber = "250216"; + public const string VersionTimeNumber = "1702"; } } diff --git a/build/staging/version/WindowsMidiServicesVersion.h b/build/staging/version/WindowsMidiServicesVersion.h index 6abbb14e..22f3a5b7 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.250215-2126" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_FULL L"1.0.3-preview-11.250216-1702" #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"250215" -#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"2126" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_DATE_NUMBER L"250216" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"1702" #endif diff --git a/docs/developer-how-to/how-to-install-development-builds.md b/docs/developer-how-to/how-to-install-development-builds.md index 31561368..6a56baea 100644 --- a/docs/developer-how-to/how-to-install-development-builds.md +++ b/docs/developer-how-to/how-to-install-development-builds.md @@ -70,3 +70,9 @@ If everything worked, you'll see the files reported as being from `Program Files In some cases, you may want to leave the existing service, but install only a preview plugin. In that case, the service and other components will still show `System32`, but the new component will show `Program Files` as the location. > Note: These scripts only know about the plugins we've developed. Additional third-party components will not be shown in the output unless we know about and add them. + +## wdmaud2.drv the WinMM bridge to Windows MIDI Services + +The WinMM compatibility component, `wdmaud2.drv`, is a system-protected file under Windows 11 Resource Protection (WRP). It is possible to take ownership of it using the `takeown` command, but if you replace it, WRP will kick in and put the official version back in place. The mechanisms used to bypass Windows File Protection (WFP) with older versions of Windows do not necessarily apply here. + +[Learn more about Windows Resource Protection](https://learn.microsoft.com/windows/win32/wfp/about-windows-file-protection) diff --git a/samples/cpp-winrt/basics/client-basics-cpp.vcxproj b/samples/cpp-winrt/basics/client-basics-cpp.vcxproj index cae1852c..6ee2288c 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true false diff --git a/samples/cpp-winrt/basics/packages.config b/samples/cpp-winrt/basics/packages.config index 10c74314..bb347eaa 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 91112dac..329e2c94 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true true diff --git a/samples/cpp-winrt/loopback-endpoints/packages.config b/samples/cpp-winrt/loopback-endpoints/packages.config index 10c74314..bb347eaa 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 10c74314..bb347eaa 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 6900ff4c..e5a084c1 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 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 10c74314..bb347eaa 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 8bad8d12..56ef7236 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true true diff --git a/samples/cpp-winrt/static-enum-endpoints/packages.config b/samples/cpp-winrt/static-enum-endpoints/packages.config index 10c74314..bb347eaa 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 62169f33..2f8a2598 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true true diff --git a/samples/cpp-winrt/watch-endpoints/packages.config b/samples/cpp-winrt/watch-endpoints/packages.config index 10c74314..bb347eaa 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 1dab4006..fe2a43e3 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true true diff --git a/src/api/Inc/MidiDefs.h b/src/api/Inc/MidiDefs.h index 17b2dee2..a5887fc6 100644 --- a/src/api/Inc/MidiDefs.h +++ b/src/api/Inc/MidiDefs.h @@ -640,7 +640,7 @@ DEFINE_MIDIDEVPROPKEY(PKEY_MIDI_MidiOutLatencyTicksUserOverride, 802); // DE // Starts at 900 #define STRING_PKEY_MIDI_VirtualMidiEndpointAssociator MIDI_STRING_PKEY_GUID MIDI_STRING_PKEY_PID_SEPARATOR L"900" -DEFINE_MIDIDEVPROPKEY(PKEY_MIDI_VirtualMidiEndpointAssociator, 900); // DEVPROP_TYPE_GUID +DEFINE_MIDIDEVPROPKEY(PKEY_MIDI_VirtualMidiEndpointAssociator, 900); // DEVPROP_TYPE_STRING diff --git a/src/app-sdk/mididiag/main.cpp b/src/app-sdk/mididiag/main.cpp index 847d008c..cd6e98d1 100644 --- a/src/app-sdk/mididiag/main.cpp +++ b/src/app-sdk/mididiag/main.cpp @@ -611,6 +611,24 @@ bool DoSectionMidi2ApiEndpoints(_In_ bool const verbose) OutputStringField(MIDIDIAG_FIELD_LABEL_MIDI2_ENDPOINT_USER_SUPPLIED_DESC, userInfo.Description); } + + // show any GTBs. This is needed to help debug some winmm enumeration issues + + for (auto const& gtb : device.GetGroupTerminalBlocks()) + { + OutputBlankLine(); + + OutputNumericField(MIDIDIAG_FIELD_LABEL_GTB_NUMBER, gtb.Number()); + OutputStringField(MIDIDIAG_FIELD_LABEL_GTB_NAME, gtb.Name()); + OutputNumericField(MIDIDIAG_FIELD_LABEL_GTB_FIRST_GROUP, gtb.FirstGroup().DisplayValue()); + OutputNumericField(MIDIDIAG_FIELD_LABEL_GTB_GROUP_COUNT, gtb.GroupCount()); + } + + if (device.GetGroupTerminalBlocks().Size() > 0) + { + OutputBlankLine(); + } + auto parent = device.GetParentDeviceInformation(); if (parent != nullptr) diff --git a/src/app-sdk/mididiag/mididiag.vcxproj b/src/app-sdk/mididiag/mididiag.vcxproj index d92dc095..fbb74a58 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true true diff --git a/src/app-sdk/mididiag/mididiag_field_defs.h b/src/app-sdk/mididiag/mididiag_field_defs.h index 95c608b9..be810090 100644 --- a/src/app-sdk/mididiag/mididiag_field_defs.h +++ b/src/app-sdk/mididiag/mididiag_field_defs.h @@ -78,6 +78,13 @@ #define MIDIDIAG_FIELD_LABEL_MIDI2_ENDPOINT_PARENT_ID "parent_id" #define MIDIDIAG_FIELD_LABEL_MIDI2_ENDPOINT_PARENT_NAME "parent_name" +#define MIDIDIAG_FIELD_LABEL_GTB_NUMBER "gtb_number" +#define MIDIDIAG_FIELD_LABEL_GTB_NAME "gtb_name" +#define MIDIDIAG_FIELD_LABEL_GTB_FIRST_GROUP "gtb_first_group_number" +#define MIDIDIAG_FIELD_LABEL_GTB_GROUP_COUNT "gtb_group_count" + + + #define MIDIDIAG_SECTION_LABEL_MIDI1_API_INPUT_ENDPOINTS "enum_winrt_midi1_api_input_ports" #define MIDIDIAG_SECTION_LABEL_MIDI1_API_OUTPUT_ENDPOINTS "enum_winrt_midi1_api_output_ports" #define MIDIDIAG_FIELD_LABEL_MIDI1_ENDPOINT_ID "endpoint_device_id" diff --git a/src/app-sdk/mididiag/packages.config b/src/app-sdk/mididiag/packages.config index b0a52d03..d02ea5db 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 f4cf395b..2250c251 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true true diff --git a/src/app-sdk/midimdnsinfo/packages.config b/src/app-sdk/midimdnsinfo/packages.config index b0a52d03..d02ea5db 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/main.cpp b/src/app-sdk/midiusbinfo/main.cpp index 3f030a89..1bf0fceb 100644 --- a/src/app-sdk/midiusbinfo/main.cpp +++ b/src/app-sdk/midiusbinfo/main.cpp @@ -569,6 +569,7 @@ int __cdecl main() //} std::cout << std::endl; + std::cout << "-- End of Information --" << std::endl << std::endl; return 0; } diff --git a/src/app-sdk/midiusbinfo/midiusbinfo.vcxproj b/src/app-sdk/midiusbinfo/midiusbinfo.vcxproj index 4997aed1..c00d3680 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.250215-2126 + Microsoft.Windows.Devices.Midi2.1.0.3-preview-11.250216-1702 true true true diff --git a/src/app-sdk/midiusbinfo/packages.config b/src/app-sdk/midiusbinfo/packages.config index b0a52d03..d02ea5db 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/winrt/MidiLoopbackEndpointManager.cpp b/src/app-sdk/winrt/MidiLoopbackEndpointManager.cpp index 2c8c8d3a..49c0ea84 100644 --- a/src/app-sdk/winrt/MidiLoopbackEndpointManager.cpp +++ b/src/app-sdk/winrt/MidiLoopbackEndpointManager.cpp @@ -170,29 +170,21 @@ namespace winrt::Microsoft::Windows::Devices::Midi2::Endpoints::Loopback::implem // 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()); + if (ep.GetTransportSuppliedInfo().TransportId != TransportId()) continue; + if (ep.EndpointDeviceId() == loopbackEndpoint.EndpointDeviceId()) continue; + - // 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) { - if (ep.Properties().HasKey(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator) && - ep.Properties().Lookup(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator) != nullptr) + auto thisAssociator = winrt::unbox_value(ep.Properties().Lookup(STRING_PKEY_MIDI_VirtualMidiEndpointAssociator)); + + // return the endpoint if it has the matching association id + if (thisAssociator == associator) { - 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 ep; } } } diff --git a/src/dev-tools/reg-helpers/midi-pre-install-reg-steps.ps1 b/src/dev-tools/reg-helpers/midi-pre-install-reg-steps.ps1 index c1fa58db..bfcdd259 100644 --- a/src/dev-tools/reg-helpers/midi-pre-install-reg-steps.ps1 +++ b/src/dev-tools/reg-helpers/midi-pre-install-reg-steps.ps1 @@ -167,6 +167,8 @@ if ($confirmation -eq 'y' -or $confirmation -eq 'Y') Write-Host "Taking ownership of wdmaud2.drv..." -ForegroundColor DarkCyan cmd.exe /c "takeown /F %windir%\System32\wdmaud2.drv" + #cmd.exe /c "icacls %windir%\System32\wdmaud2.drv /grant administrators:F" + Write-Host "wdmaud2.drv is protected by Windows Resource Protection (WRP) and cannot be replaced in public builds without first disabling WRP." -ForegroundColor DarkCyan Write-Host Write-Host "You may now install the development version of the service and plugins." -ForegroundColor Green diff --git a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPropertiesCommand.cs b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPropertiesCommand.cs index 9cfdc28a..9195034e 100644 --- a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPropertiesCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPropertiesCommand.cs @@ -371,7 +371,8 @@ public override int Execute(CommandContext context, Settings settings) } groupInformation += $", [grey]{Strings.CommonStringProtocolSingular}[/] " + groupTerminalBlock.Protocol.ToString(); - groupInformation += $", [grey]{Strings.CommonStringDirectionSingular}[/] " + groupTerminalBlock.Direction.ToString(); + + groupInformation += $", [grey]{Strings.CommonStringDirectionSingular}[/] " + MidiFriendlyNames.GroupTerminalBlockDirection(groupTerminalBlock.Direction); table.AddRow( AnsiMarkupFormatter.FormatBlockNumber(groupTerminalBlock.Number) + " " + diff --git a/src/user-tools/midi-console/Midi/MidiFriendlyNames.cs b/src/user-tools/midi-console/Midi/MidiFriendlyNames.cs new file mode 100644 index 00000000..3fa3a242 --- /dev/null +++ b/src/user-tools/midi-console/Midi/MidiFriendlyNames.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.Midi.ConsoleApp +{ + public class MidiFriendlyNames + { + public static string GroupTerminalBlockDirection(MidiGroupTerminalBlockDirection direction) + { + switch (direction) + { + case MidiGroupTerminalBlockDirection.Bidirectional: + return Strings.DirectionMessageBiDi; + case MidiGroupTerminalBlockDirection.BlockInput: + return Strings.DirectionMessageDestination; + case MidiGroupTerminalBlockDirection.BlockOutput: + return Strings.DirectionMessageSource; + default: + return Strings.Unknown; + } + } + } +} 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 5e4d9b90..8833362d 100644 --- a/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs +++ b/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs @@ -420,6 +420,33 @@ internal static string CommonTableHeaderIndex { } } + /// + /// Looks up a localized string similar to Source/Destination. + /// + internal static string DirectionMessageBiDi { + get { + return ResourceManager.GetString("DirectionMessageBiDi", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Message Destination. + /// + internal static string DirectionMessageDestination { + get { + return ResourceManager.GetString("DirectionMessageDestination", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Message Source. + /// + internal static string DirectionMessageSource { + get { + return ResourceManager.GetString("DirectionMessageSource", resourceCulture); + } + } + /// /// Looks up a localized string similar to Endpoint disconnected. /// @@ -2369,6 +2396,15 @@ internal static string TableColumnHeaderCommonTimestamp { } } + /// + /// Looks up a localized string similar to Unknown. + /// + internal static string Unknown { + get { + return ResourceManager.GetString("Unknown", resourceCulture); + } + } + /// /// Looks up a localized string similar to The specified group index is invalid. Specify a group index between 0 and 15.. /// diff --git a/src/user-tools/midi-console/Midi/Resources/Strings.resx b/src/user-tools/midi-console/Midi/Resources/Strings.resx index 56287ed5..f7df8b9f 100644 --- a/src/user-tools/midi-console/Midi/Resources/Strings.resx +++ b/src/user-tools/midi-console/Midi/Resources/Strings.resx @@ -917,4 +917,16 @@ Timestamp Restart the service when complete + + Message Source + + + Message Destination + + + Source/Destination + + + Unknown + \ No newline at end of file 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 index da14b13e..88b550bc 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/LoopbackDiagram.svg +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Assets/LoopbackDiagram.svg @@ -1,27 +1,111 @@ - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 index fd943400c6ec9c8a1a1ec5018cab7b049422f64c..1e860e9c5e9fdc09ce9863face1a9652fc422fc6 100644 GIT binary patch literal 23052 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 literal 18069 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 diff --git a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/LOOP/EndpointsLoopPage.xaml b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/LOOP/EndpointsLoopPage.xaml index 34f73e13..ce5f57a0 100644 --- a/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/LOOP/EndpointsLoopPage.xaml +++ b/src/user-tools/midi-settings/Microsoft.Midi.Settings/Sections/Endpoints/LOOP/EndpointsLoopPage.xaml @@ -34,30 +34,43 @@