diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json index a39174ae..c19c277b 100644 --- a/.nuke/build.schema.json +++ b/.nuke/build.schema.json @@ -80,7 +80,8 @@ "BuildUserToolsSharedComponents", "CreateVersionIncludes", "Prerequisites", - "ZipPowershellDevUtilities" + "ZipPowershellDevUtilities", + "ZipWdmaud2" ] } }, @@ -106,7 +107,8 @@ "BuildUserToolsSharedComponents", "CreateVersionIncludes", "Prerequisites", - "ZipPowershellDevUtilities" + "ZipPowershellDevUtilities", + "ZipWdmaud2" ] } }, diff --git a/build/nuke_build/Build.cs b/build/nuke_build/Build.cs index 3305fcdb..7c2bf806 100644 --- a/build/nuke_build/Build.cs +++ b/build/nuke_build/Build.cs @@ -128,9 +128,9 @@ class Build : NukeBuild string[] SdkPlatforms => new string[] { "x64", "Arm64EC" }; string[] ServiceAndApiPlatforms => new string[] { "x64", "Arm64" }; - string[] ServiceAndApiPlatformsAll => new string[] { "x64", "Arm64", "Arm64EC" }; + string[] ServiceAndApiPlatformsAll => new string[] { "x64", "Arm64", "Arm64EC" }; // the order here matters because the dependencies in the solution aren't perfect string[] ToolsPlatforms => new string[] { "x64", "Arm64" }; - string[] NativeSamplesPlatforms => new string[] { "x64", "Arm64EC", "Arm64" }; + string[] NativeSamplesPlatforms => new string[] { "x64", "Arm64", "Arm64EC" }; string[] ManagedSamplesPlatforms => new string[] { "x64", "Arm64" }; string[] InstallerPlatforms => new string[] { "x64", "Arm64" }; @@ -263,7 +263,7 @@ class Build : NukeBuild // This transport gets compiled to Arm64X and x64. The Arm64X output is in the Arm64EC folder stagingFiles.Add(ApiSolutionFolder / "vsfiles" / platform / Configuration.Release / $"Midi2.MidiSrvTransport.dll"); - + stagingFiles.Add(ApiSolutionFolder / "vsfiles" / platform / Configuration.Release / $"wdmaud2.drv"); // only in-proc files, like the MidiSrvTransport, are Arm64EC. For all the others // any reference to Arm64EC is just Arm64. We don't use any of the Arm64X output @@ -283,8 +283,6 @@ class Build : NukeBuild stagingFiles.Add(ApiSolutionFolder / "vsfiles" / servicePlatform / Configuration.Release / $"Midi2.SchedulerTransform.dll"); - stagingFiles.Add(ApiSolutionFolder / "vsfiles" / servicePlatform / Configuration.Release / $"wdmaud2.drv"); - foreach (var file in stagingFiles) { FileSystemTasks.CopyFileToDirectory(file, ApiStagingFolder / servicePlatform, FileExistsPolicy.Overwrite, true); @@ -1538,12 +1536,33 @@ void UpdatePackagesConfigForCPPProject(string configFilePath) regHelpersFolder.ZipTo(ThisReleaseFolder / $"dev-pre-setup-scripts.zip"); }); + Target ZipWdmaud2 => _ => _ + .DependsOn(Prerequisites) + .DependsOn(BuildServiceAndPlugins) + .Executes(() => + { + var zipRoot = (StagingRootFolder / "wdmaud2").CreateOrCleanDirectory(); + + var arm64 = (zipRoot / "arm64").CreateOrCleanDirectory(); + var x64 = (zipRoot / "x64").CreateOrCleanDirectory(); + + string driverFile = "wdmaud2.drv"; + + CopyFile(ApiStagingFolder / "arm64" / driverFile, arm64 / driverFile, FileExistsPolicy.Fail, false); + CopyFile(ApiStagingFolder / "x64" / driverFile, x64 / driverFile, FileExistsPolicy.Fail, false); + + // todo: add takeown / copy scripts + + zipRoot.ZipTo(ThisReleaseFolder / $"wdmaud2-winmm-shim-driver.zip"); + + }); Target BuildAndPublishAll => _ => _ .DependsOn(Prerequisites) .DependsOn(CreateVersionIncludes) .DependsOn(BuildServiceAndPlugins) + .DependsOn(ZipWdmaud2) .DependsOn(BuildServiceAndPluginsInstaller) .DependsOn(BuildInDevelopmentServicePlugins) .DependsOn(BuildInDevelopmentServicePluginsInstaller) diff --git a/build/replace_wdmaud2_x64.bat b/build/replace_wdmaud2_x64.bat new file mode 100644 index 00000000..692cf4ad --- /dev/null +++ b/build/replace_wdmaud2_x64.bat @@ -0,0 +1,23 @@ +@echo off +echo This is for copying build artifacts into the system for testing. +echo This will only replace the github-built Windows service and components +echo If you are using the in-box service or dism-deployed service, this will not work. +echo This must be run as administrator. + +set servicepath="%ProgramFiles%\Windows MIDI Services\Service" +set apipath="%ProgramFiles%\Windows MIDI Services\API" +set dmppath="%ProgramFiles%\Windows MIDI Services\" +set buildoutput="%midi_repo_root%src\api\VSFiles\x64\Release" + +echo Stopping midisrv +net stop midisrv + +echo stopping AEB +net stop /Y AudioEndpointBuilder + +timeout 3 +%midi_repo_root%build\sfpcopy %buildoutput%\wdmaud2.drv %windir%\system32\wdmaud2.drv + +net start audiosrv + +pause \ No newline at end of file diff --git a/build/staging/version/BundleInfo.wxi b/build/staging/version/BundleInfo.wxi index d49d1bb6..be34c082 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 59b35c0f..c670b978 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 = "Developer Preview 8"; - public const string BuildFullVersion = "1.0.2-preview-8.241217-1713"; + public const string BuildFullVersion = "1.0.2-preview-8.241219-1336"; public const string VersionMajor = "1"; public const string VersionMinor = "0"; public const string VersionRevision = "2"; - public const string VersionDateNumber = "241217"; - public const string VersionTimeNumber = "1713"; + public const string VersionDateNumber = "241219"; + public const string VersionTimeNumber = "1336"; } } diff --git a/build/staging/version/WindowsMidiServicesVersion.h b/build/staging/version/WindowsMidiServicesVersion.h index 18f76cb9..49750b1d 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"Developer Preview 8" -#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_FULL L"1.0.2-preview-8.241217-1713" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_FULL L"1.0.2-preview-8.241219-1336" #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"2" -#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_DATE_NUMBER L"241217" -#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"1713" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_DATE_NUMBER L"241219" +#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"1336" #endif diff --git a/samples/cpp-winrt/basics/client-basics-cpp.vcxproj b/samples/cpp-winrt/basics/client-basics-cpp.vcxproj index 01371d7e..79b675cc 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true false diff --git a/samples/cpp-winrt/basics/packages.config b/samples/cpp-winrt/basics/packages.config index 384c7669..2346b67e 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 a33f9b32..7dfd7c2f 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true true diff --git a/samples/cpp-winrt/loopback-endpoints/packages.config b/samples/cpp-winrt/loopback-endpoints/packages.config index 384c7669..2346b67e 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 384c7669..2346b67e 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 edea08b9..504d9e4f 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 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 384c7669..2346b67e 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 57cc3d3a..b8ec1bfd 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true true diff --git a/samples/cpp-winrt/static-enum-endpoints/packages.config b/samples/cpp-winrt/static-enum-endpoints/packages.config index 384c7669..2346b67e 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 124cdfca..1aa71ae3 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true true diff --git a/samples/cpp-winrt/watch-endpoints/packages.config b/samples/cpp-winrt/watch-endpoints/packages.config index 384c7669..2346b67e 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 8246406b..c772072e 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true true diff --git a/src/api/Client/WinMM/wdmaud2.vcxproj b/src/api/Client/WinMM/wdmaud2.vcxproj index 722ec18c..5483de67 100644 --- a/src/api/Client/WinMM/wdmaud2.vcxproj +++ b/src/api/Client/WinMM/wdmaud2.vcxproj @@ -5,6 +5,10 @@ Debug ARM64 + + Debug + ARM64EC + Debug Win32 @@ -17,6 +21,10 @@ Debug x64 + + Release + ARM64EC + Release Win32 @@ -39,6 +47,12 @@ v143 Unicode + + DynamicLibrary + true + v143 + Unicode + DynamicLibrary true @@ -57,6 +71,12 @@ v143 Unicode + + DynamicLibrary + false + v143 + Unicode + DynamicLibrary false @@ -77,6 +97,9 @@ + + + @@ -86,6 +109,9 @@ + + + @@ -99,6 +125,13 @@ $(SolutionDir)VSFiles\intermediate\wdmaud2\$(Platform)\$(Configuration)\ .drv + + true + $(SolutionDir)VSFiles\$(Platform)\$(Configuration)\ + $(SolutionDir)VSFiles\intermediate\wdmaud2\$(Platform)\$(Configuration)\ + .drv + true + true $(SolutionDir)VSFiles\$(Platform)\$(Configuration)\ @@ -117,6 +150,13 @@ $(SolutionDir)VSFiles\intermediate\wdmaud2\$(Platform)\$(Configuration)\ .drv + + true + $(SolutionDir)VSFiles\$(Platform)\$(Configuration)\ + $(SolutionDir)VSFiles\intermediate\wdmaud2\$(Platform)\$(Configuration)\ + .drv + true + true $(SolutionDir)VSFiles\$(Platform)\$(Configuration)\ @@ -146,6 +186,23 @@ false + + + _DEBUG;_WINDOWS;_USRDLL;WDMAUD2_EXPORTS;%(PreprocessorDefinitions) + Level3 + Create + pch.h + stdcpp20 + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + + + true + Windows + winmmdrv.def + $(CoreLibraryDependencies);%(AdditionalDependencies);winmm.lib;onecoreuap.lib;avrt.lib;$(SolutionDir)VSFiles\$(Platform)\$(Configuration)\midixproc.lib;$(SolutionDir)VSFiles\$(Platform)\$(Configuration)\midisrvtransportlib.lib + false + + _DEBUG;_WINDOWS;_USRDLL;WDMAUD2_EXPORTS;%(PreprocessorDefinitions) @@ -199,6 +256,25 @@ false + + + NDEBUG;_WINDOWS;_USRDLL;WDMAUD2_EXPORTS;%(PreprocessorDefinitions) + Level3 + Create + pch.h + stdcpp20 + %(AdditionalIncludeDirectories);$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(ProjectDir)\..\Inc;$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\MidiSrv\$(Platform)\$(Configuration);$(SolutionDir)VSFiles\intermediate\midi2.midisrvtransport\$(Platform)\$(Configuration) + + + true + Windows + true + true + winmmdrv.def + $(CoreLibraryDependencies);%(AdditionalDependencies);winmm.lib;onecoreuap.lib;avrt.lib;$(SolutionDir)VSFiles\$(Platform)\$(Configuration)\midixproc.lib;$(SolutionDir)VSFiles\$(Platform)\$(Configuration)\midisrvtransportlib.lib + false + + NDEBUG;_WINDOWS;_USRDLL;WDMAUD2_EXPORTS;%(PreprocessorDefinitions) diff --git a/src/api/Inc/MidiSrvTransport.h b/src/api/Inc/MidiSrvTransport.h index 24e7a93c..8eebd05a 100644 --- a/src/api/Inc/MidiSrvTransport.h +++ b/src/api/Inc/MidiSrvTransport.h @@ -17,7 +17,7 @@ class MidiSrvTransportTelemetryProvider : public wil::TraceLoggingProvider (0xc22d26fd,0x947b,0x5df1,0xa0,0xf8,0xbc,0x62,0xd2,0x6d,0x18,0x8d)) }; -HRESULT GetMidiSrvBindingHandle(_In_ handle_t* BindingHandle); +HRESULT GetMidiSrvBindingHandle(_In_ handle_t* BindingHandle); class CMidi2MidiSrv { @@ -28,21 +28,21 @@ class CMidi2MidiSrv HRESULT Shutdown(); // session tracker - HRESULT AddClientSession(_In_ GUID sessionId, _In_ LPCWSTR sessionName); - HRESULT UpdateClientSessionName(_In_ GUID sessionId, _In_ LPCWSTR sessionName); - HRESULT RemoveClientSession(_In_ GUID sessionId); - HRESULT GetSessionList(_Out_ LPWSTR* sessionList); - HRESULT GetSessionList(_Out_ LPSAFEARRAY* SessionDetailsList); - BOOL VerifyConnectivity(); + HRESULT AddClientSession(_In_ GUID sessionId, _In_ LPCWSTR sessionName); + HRESULT UpdateClientSessionName(_In_ GUID sessionId, _In_ LPCWSTR sessionName); + HRESULT RemoveClientSession(_In_ GUID sessionId); + HRESULT GetSessionList(_Out_ LPWSTR* sessionList); + // HRESULT GetSessionList(_Out_ LPSAFEARRAY* SessionDetailsList); + BOOL VerifyConnectivity(); // configuration manager - HRESULT UpdateConfiguration(_In_ LPCWSTR configurationJson, _Out_ LPWSTR* responseJson); - HRESULT GetTransportList(_Out_ LPWSTR* transportListJson); - HRESULT GetTransformList(_Out_ LPWSTR* transformListJson); + HRESULT UpdateConfiguration(_In_ LPCWSTR configurationJson, _Out_ LPWSTR* responseJson); + HRESULT GetTransportList(_Out_ LPWSTR* transportListJson); + HRESULT GetTransformList(_Out_ LPWSTR* transformListJson); private: - PVOID m_ContextHandle{ nullptr }; + PVOID m_ContextHandle{ nullptr }; MidiClientHandle m_ClientHandle{ 0 }; std::unique_ptr m_MidiPump; diff --git a/src/api/Libs/MidiSrvTransportLib/MidiSrvTransport.cpp b/src/api/Libs/MidiSrvTransportLib/MidiSrvTransport.cpp index 5184ada3..deb3819c 100644 --- a/src/api/Libs/MidiSrvTransportLib/MidiSrvTransport.cpp +++ b/src/api/Libs/MidiSrvTransportLib/MidiSrvTransport.cpp @@ -23,39 +23,39 @@ void __RPC_USER midl_user_free(void __RPC_FAR* pointer delete[](BYTE*)pointer; } -// using the protocol and endpoint, retrieve the midisrv -// rpc binding handle -_Use_decl_annotations_ -HRESULT -GetMidiSrvBindingHandle(handle_t* bindingHandle -) -{ - RETURN_HR_IF(E_INVALIDARG, nullptr == bindingHandle); - *bindingHandle = NULL; - - RPC_WSTR stringBinding = nullptr; - auto cleanupOnExit = wil::scope_exit([&]() - { - if (stringBinding) - { - RpcStringFree(&stringBinding); - } - }); - - RETURN_IF_WIN32_ERROR(RpcStringBindingCompose( - nullptr, - (RPC_WSTR) MIDISRV_LRPC_PROTOCOL, - nullptr, - nullptr, - nullptr, - &stringBinding)); - - RETURN_IF_WIN32_ERROR(RpcBindingFromStringBinding( - stringBinding, - bindingHandle)); - - return S_OK; -} +// using the protocol and endpoint, retrieve the midisrv +// rpc binding handle +_Use_decl_annotations_ +HRESULT +GetMidiSrvBindingHandle(handle_t* bindingHandle +) +{ + RETURN_HR_IF(E_INVALIDARG, nullptr == bindingHandle); + *bindingHandle = NULL; + + RPC_WSTR stringBinding = nullptr; + auto cleanupOnExit = wil::scope_exit([&]() + { + if (stringBinding) + { + RpcStringFree(&stringBinding); + } + }); + + RETURN_IF_WIN32_ERROR(RpcStringBindingCompose( + nullptr, + (RPC_WSTR) MIDISRV_LRPC_PROTOCOL, + nullptr, + nullptr, + nullptr, + &stringBinding)); + + RETURN_IF_WIN32_ERROR(RpcBindingFromStringBinding( + stringBinding, + bindingHandle)); + + return S_OK; +} HRESULT CMidi2MidiSrv::Initialize( @@ -261,299 +261,299 @@ CMidi2MidiSrv::SendMidiMessage( return E_ABORT; } -_Use_decl_annotations_ -HRESULT +_Use_decl_annotations_ +HRESULT CMidi2MidiSrv::AddClientSession( - GUID sessionId, - LPCWSTR sessionName -) -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this") - ); - - wil::unique_rpc_binding bindingHandle; - - RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - RETURN_HR_IF_NULL(E_INVALIDARG, sessionName); - - RETURN_IF_FAILED([&]() - { - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept RETURN_IF_FAILED(MidiSrvRegisterSession(bindingHandle.get(), sessionId, sessionName, &m_ContextHandle)); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - - return S_OK; - }()); - - return S_OK; -} - -_Use_decl_annotations_ -HRESULT + GUID sessionId, + LPCWSTR sessionName +) +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this") + ); + + wil::unique_rpc_binding bindingHandle; + + RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + RETURN_HR_IF_NULL(E_INVALIDARG, sessionName); + + RETURN_IF_FAILED([&]() + { + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept RETURN_IF_FAILED(MidiSrvRegisterSession(bindingHandle.get(), sessionId, sessionName, &m_ContextHandle)); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + + return S_OK; + }()); + + return S_OK; +} + +_Use_decl_annotations_ +HRESULT CMidi2MidiSrv::UpdateClientSessionName( - GUID sessionId, - LPCWSTR sessionName -) -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this") - ); - - wil::unique_rpc_binding bindingHandle; - - RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - RETURN_HR_IF_NULL(E_INVALIDARG, sessionName); - - RETURN_IF_FAILED([&]() - { - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept RETURN_IF_FAILED(MidiSrvUpdateSessionName(bindingHandle.get(), m_ContextHandle, sessionId, sessionName)); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - - return S_OK; - }()); - - return S_OK; -} - - -_Use_decl_annotations_ -HRESULT + GUID sessionId, + LPCWSTR sessionName +) +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this") + ); + + wil::unique_rpc_binding bindingHandle; + + RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + RETURN_HR_IF_NULL(E_INVALIDARG, sessionName); + + RETURN_IF_FAILED([&]() + { + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept RETURN_IF_FAILED(MidiSrvUpdateSessionName(bindingHandle.get(), m_ContextHandle, sessionId, sessionName)); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + + return S_OK; + }()); + + return S_OK; +} + + +_Use_decl_annotations_ +HRESULT CMidi2MidiSrv::RemoveClientSession( - GUID sessionId -) -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this") - ); - - wil::unique_rpc_binding bindingHandle; - - RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - - RETURN_IF_FAILED([&]() - { - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept RETURN_IF_FAILED(MidiSrvDeregisterSession(bindingHandle.get(), m_ContextHandle, sessionId)); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - - return S_OK; - }()); - - return S_OK; -} - - - -_Use_decl_annotations_ -HRESULT + GUID sessionId +) +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this") + ); + + wil::unique_rpc_binding bindingHandle; + + RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + + RETURN_IF_FAILED([&]() + { + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept RETURN_IF_FAILED(MidiSrvDeregisterSession(bindingHandle.get(), m_ContextHandle, sessionId)); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + + return S_OK; + }()); + + return S_OK; +} + + + +_Use_decl_annotations_ +HRESULT CMidi2MidiSrv::GetSessionList( - LPWSTR* sessionList -) -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this") - ); - - wil::unique_rpc_binding bindingHandle; - - RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - RETURN_HR_IF_NULL(E_INVALIDARG, sessionList); - - RETURN_IF_FAILED([&]() - { - // RPC requirement - *sessionList = nullptr; - - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept RETURN_IF_FAILED(MidiSrvGetSessionList(bindingHandle.get(), sessionList)); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - return S_OK; - }()); - - return S_OK; -} - -BOOL + LPWSTR* sessionList +) +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this") + ); + + wil::unique_rpc_binding bindingHandle; + + RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + RETURN_HR_IF_NULL(E_INVALIDARG, sessionList); + + RETURN_IF_FAILED([&]() + { + // RPC requirement + *sessionList = nullptr; + + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept RETURN_IF_FAILED(MidiSrvGetSessionList(bindingHandle.get(), sessionList)); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + return S_OK; + }()); + + return S_OK; +} + +BOOL CMidi2MidiSrv::VerifyConnectivity() -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this") - ); - - wil::unique_rpc_binding bindingHandle; - - LOG_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - - auto verifyConnectivity = ([&]() - { - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept MidiSrvVerifyConnectivity(bindingHandle.get()); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - - return S_OK; - }); - - auto hr = verifyConnectivity(); - - if (FAILED(hr)) - { - return FALSE; - } - else - { - return TRUE; - } - -} - -_Use_decl_annotations_ -HRESULT +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this") + ); + + wil::unique_rpc_binding bindingHandle; + + LOG_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + + auto verifyConnectivity = ([&]() + { + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept MidiSrvVerifyConnectivity(bindingHandle.get()); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + + return S_OK; + }); + + auto hr = verifyConnectivity(); + + if (FAILED(hr)) + { + return FALSE; + } + else + { + return TRUE; + } + +} + +_Use_decl_annotations_ +HRESULT CMidi2MidiSrv::UpdateConfiguration(LPCWSTR configurationJson, LPWSTR* responseJson) -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this"), - TraceLoggingWideString(L"Entering UpdateConfiguration", MIDI_TRACE_EVENT_MESSAGE_FIELD), - TraceLoggingWideString(configurationJson, "config json"), - TraceLoggingPointer(responseJson, "Response pointer") - ); - - RETURN_HR_IF_NULL(E_INVALIDARG, responseJson); - - // requirement for RPC and also in case of failure - *responseJson = NULL; - - RETURN_HR_IF_NULL(E_INVALIDARG, configurationJson); - - wil::unique_rpc_binding bindingHandle; - RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - - RETURN_IF_FAILED([&]() - { - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept RETURN_IF_FAILED(MidiSrvUpdateConfiguration(bindingHandle.get(), configurationJson, responseJson)); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this"), - TraceLoggingWideString(L"Completed RPC call", MIDI_TRACE_EVENT_MESSAGE_FIELD), - TraceLoggingWideString(configurationJson, "config json"), - TraceLoggingPointer(responseJson, "Response pointer") - ); - - return S_OK; - }()); - - return S_OK; -} - -_Use_decl_annotations_ -HRESULT +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this"), + TraceLoggingWideString(L"Entering UpdateConfiguration", MIDI_TRACE_EVENT_MESSAGE_FIELD), + TraceLoggingWideString(configurationJson, "config json"), + TraceLoggingPointer(responseJson, "Response pointer") + ); + + RETURN_HR_IF_NULL(E_INVALIDARG, responseJson); + + // requirement for RPC and also in case of failure + *responseJson = NULL; + + RETURN_HR_IF_NULL(E_INVALIDARG, configurationJson); + + wil::unique_rpc_binding bindingHandle; + RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + + RETURN_IF_FAILED([&]() + { + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept RETURN_IF_FAILED(MidiSrvUpdateConfiguration(bindingHandle.get(), configurationJson, responseJson)); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this"), + TraceLoggingWideString(L"Completed RPC call", MIDI_TRACE_EVENT_MESSAGE_FIELD), + TraceLoggingWideString(configurationJson, "config json"), + TraceLoggingPointer(responseJson, "Response pointer") + ); + + return S_OK; + }()); + + return S_OK; +} + +_Use_decl_annotations_ +HRESULT CMidi2MidiSrv::GetTransportList(LPWSTR* transportListJson) -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this") - ); - - RETURN_HR_IF_NULL(E_INVALIDARG, transportListJson); - - // requirement for RPC and also in case of failure - *transportListJson = NULL; - - wil::unique_rpc_binding bindingHandle; - RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - - - RETURN_IF_FAILED([&]() - { - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept RETURN_IF_FAILED(MidiSrvGetTransportList(bindingHandle.get(), transportListJson)); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - return S_OK; - }()); - - return S_OK; -} - -_Use_decl_annotations_ -HRESULT +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this") + ); + + RETURN_HR_IF_NULL(E_INVALIDARG, transportListJson); + + // requirement for RPC and also in case of failure + *transportListJson = NULL; + + wil::unique_rpc_binding bindingHandle; + RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + + + RETURN_IF_FAILED([&]() + { + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept RETURN_IF_FAILED(MidiSrvGetTransportList(bindingHandle.get(), transportListJson)); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + return S_OK; + }()); + + return S_OK; +} + +_Use_decl_annotations_ +HRESULT CMidi2MidiSrv::GetTransformList(LPWSTR* transformListJson) -{ - TraceLoggingWrite( - MidiSrvTransportTelemetryProvider::Provider(), - MIDI_TRACE_EVENT_INFO, - TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), - TraceLoggingLevel(WINEVENT_LEVEL_INFO), - TraceLoggingPointer(this, "this") - ); - - RETURN_HR_IF_NULL(E_INVALIDARG, transformListJson); - - // requirement for RPC and also in case of failure - *transformListJson = NULL; - - wil::unique_rpc_binding bindingHandle; - RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); - - - RETURN_IF_FAILED([&]() - { - - // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks - // with structured exception handling. - RpcTryExcept RETURN_IF_FAILED(MidiSrvGetTransformList(bindingHandle.get(), transformListJson)); - RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); - RpcEndExcept - return S_OK; - }()); - - return S_OK; -} +{ + TraceLoggingWrite( + MidiSrvTransportTelemetryProvider::Provider(), + MIDI_TRACE_EVENT_INFO, + TraceLoggingString(__FUNCTION__, MIDI_TRACE_EVENT_LOCATION_FIELD), + TraceLoggingLevel(WINEVENT_LEVEL_INFO), + TraceLoggingPointer(this, "this") + ); + + RETURN_HR_IF_NULL(E_INVALIDARG, transformListJson); + + // requirement for RPC and also in case of failure + *transformListJson = NULL; + + wil::unique_rpc_binding bindingHandle; + RETURN_IF_FAILED(GetMidiSrvBindingHandle(&bindingHandle)); + + + RETURN_IF_FAILED([&]() + { + + // RPC calls are placed in a lambda to work around compiler error C2712, limiting use of try/except blocks + // with structured exception handling. + RpcTryExcept RETURN_IF_FAILED(MidiSrvGetTransformList(bindingHandle.get(), transformListJson)); + RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) RETURN_IF_FAILED(HRESULT_FROM_WIN32(RpcExceptionCode())); + RpcEndExcept + return S_OK; + }()); + + return S_OK; +} diff --git a/src/api/Libs/MidiSrvTransportLib/MidiSrvTransportLib.vcxproj b/src/api/Libs/MidiSrvTransportLib/MidiSrvTransportLib.vcxproj index 5ad80a6b..7b9a2c12 100644 --- a/src/api/Libs/MidiSrvTransportLib/MidiSrvTransportLib.vcxproj +++ b/src/api/Libs/MidiSrvTransportLib/MidiSrvTransportLib.vcxproj @@ -184,7 +184,7 @@ Level4 ProgramDatabase Disabled - %(AdditionalIncludeDirectories);$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(IntDir);$(SolutionDir)VSFiles\intermediate\midisrv\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(IntDir);$(SolutionDir)VSFiles\intermediate\midisrv\x64\$(Configuration) true stdcpp20 @@ -216,7 +216,7 @@ MultiThreadedDLL Level4 ProgramDatabase - %(AdditionalIncludeDirectories);$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(IntDir);$(SolutionDir)VSFiles\intermediate\midisrv\$(Platform)\$(Configuration) + %(AdditionalIncludeDirectories);$(SolutionDir)inc;$(SolutionDir)VSFiles\intermediate\idl\$(Platform)\$(Configuration);$(IntDir);$(SolutionDir)VSFiles\intermediate\midisrv\x64\$(Configuration) true stdcpp20 diff --git a/src/api/Midi2.sln b/src/api/Midi2.sln index 7a90c252..b152d394 100644 --- a/src/api/Midi2.sln +++ b/src/api/Midi2.sln @@ -226,7 +226,6 @@ Global {22ABB513-5E77-474D-AA11-E56B8071EB4C}.Release|ARM64.ActiveCfg = Release|ARM64 {22ABB513-5E77-474D-AA11-E56B8071EB4C}.Release|ARM64.Build.0 = Release|ARM64 {22ABB513-5E77-474D-AA11-E56B8071EB4C}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {22ABB513-5E77-474D-AA11-E56B8071EB4C}.Release|ARM64EC.Build.0 = Release|ARM64 {22ABB513-5E77-474D-AA11-E56B8071EB4C}.Release|Win32.ActiveCfg = Release|Win32 {22ABB513-5E77-474D-AA11-E56B8071EB4C}.Release|Win32.Build.0 = Release|Win32 {22ABB513-5E77-474D-AA11-E56B8071EB4C}.Release|x64.ActiveCfg = Release|x64 @@ -246,9 +245,8 @@ Global {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Debug|x86.Deploy.0 = Debug|Win32 {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|ARM64.ActiveCfg = Release|ARM64 {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|ARM64.Build.0 = Release|ARM64 - {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|ARM64EC.Build.0 = Release|ARM64 - {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|ARM64EC.Deploy.0 = Release|ARM64 + {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|ARM64EC.ActiveCfg = Release|x64 + {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|ARM64EC.Deploy.0 = Release|x64 {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|Win32.ActiveCfg = Release|Win32 {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|x64.ActiveCfg = Release|x64 {0ACC44A8-A2AE-449C-AABA-64A75277C5BD}.Release|x64.Build.0 = Release|x64 @@ -267,7 +265,6 @@ Global {8EABA9B2-A718-4AA3-88F7-E264CF3CCC29}.Release|ARM64.ActiveCfg = Release|ARM64 {8EABA9B2-A718-4AA3-88F7-E264CF3CCC29}.Release|ARM64.Build.0 = Release|ARM64 {8EABA9B2-A718-4AA3-88F7-E264CF3CCC29}.Release|ARM64EC.ActiveCfg = Release|x64 - {8EABA9B2-A718-4AA3-88F7-E264CF3CCC29}.Release|ARM64EC.Build.0 = Release|x64 {8EABA9B2-A718-4AA3-88F7-E264CF3CCC29}.Release|Win32.ActiveCfg = Release|Win32 {8EABA9B2-A718-4AA3-88F7-E264CF3CCC29}.Release|x64.ActiveCfg = Release|x64 {8EABA9B2-A718-4AA3-88F7-E264CF3CCC29}.Release|x64.Build.0 = Release|x64 @@ -305,8 +302,8 @@ Global {00B066CB-3F9F-4B31-B30A-48631B07D157}.Debug|x86.Build.0 = Debug|Win32 {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|ARM64.ActiveCfg = Release|ARM64 {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|ARM64.Build.0 = Release|ARM64 - {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|ARM64EC.Build.0 = Release|ARM64 + {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|ARM64EC.Build.0 = Release|ARM64EC {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|Win32.ActiveCfg = Release|Win32 {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|Win32.Build.0 = Release|Win32 {00B066CB-3F9F-4B31-B30A-48631B07D157}.Release|x64.ActiveCfg = Release|x64 @@ -325,8 +322,8 @@ Global {0FB85768-237C-4A60-A824-E09884C3EB34}.Debug|x86.Build.0 = Debug|Win32 {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|ARM64.ActiveCfg = Release|ARM64 {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|ARM64.Build.0 = Release|ARM64 - {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|ARM64EC.Build.0 = Release|ARM64 + {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|ARM64EC.Build.0 = Release|ARM64EC {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|Win32.ActiveCfg = Release|Win32 {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|Win32.Build.0 = Release|Win32 {0FB85768-237C-4A60-A824-E09884C3EB34}.Release|x64.ActiveCfg = Release|x64 @@ -345,7 +342,6 @@ Global {A08D50A1-F83A-4B36-BC65-5E3E36C93050}.Release|ARM64.ActiveCfg = Release|ARM64 {A08D50A1-F83A-4B36-BC65-5E3E36C93050}.Release|ARM64.Build.0 = Release|ARM64 {A08D50A1-F83A-4B36-BC65-5E3E36C93050}.Release|ARM64EC.ActiveCfg = Release|x64 - {A08D50A1-F83A-4B36-BC65-5E3E36C93050}.Release|ARM64EC.Build.0 = Release|x64 {A08D50A1-F83A-4B36-BC65-5E3E36C93050}.Release|Win32.ActiveCfg = Release|Win32 {A08D50A1-F83A-4B36-BC65-5E3E36C93050}.Release|x64.ActiveCfg = Release|x64 {A08D50A1-F83A-4B36-BC65-5E3E36C93050}.Release|x64.Build.0 = Release|x64 @@ -363,7 +359,6 @@ Global {4C09E660-79C6-4BA1-B823-21A867A3A4A9}.Release|ARM64.ActiveCfg = Release|ARM64 {4C09E660-79C6-4BA1-B823-21A867A3A4A9}.Release|ARM64.Build.0 = Release|ARM64 {4C09E660-79C6-4BA1-B823-21A867A3A4A9}.Release|ARM64EC.ActiveCfg = Release|x64 - {4C09E660-79C6-4BA1-B823-21A867A3A4A9}.Release|ARM64EC.Build.0 = Release|x64 {4C09E660-79C6-4BA1-B823-21A867A3A4A9}.Release|Win32.ActiveCfg = Release|Win32 {4C09E660-79C6-4BA1-B823-21A867A3A4A9}.Release|x64.ActiveCfg = Release|x64 {4C09E660-79C6-4BA1-B823-21A867A3A4A9}.Release|x64.Build.0 = Release|x64 @@ -421,7 +416,6 @@ Global {574447FB-B44C-403E-9617-092F08B0FB27}.Release|ARM64.ActiveCfg = Release|ARM64 {574447FB-B44C-403E-9617-092F08B0FB27}.Release|ARM64.Build.0 = Release|ARM64 {574447FB-B44C-403E-9617-092F08B0FB27}.Release|ARM64EC.ActiveCfg = Release|x64 - {574447FB-B44C-403E-9617-092F08B0FB27}.Release|ARM64EC.Build.0 = Release|x64 {574447FB-B44C-403E-9617-092F08B0FB27}.Release|Win32.ActiveCfg = Release|Win32 {574447FB-B44C-403E-9617-092F08B0FB27}.Release|x64.ActiveCfg = Release|x64 {574447FB-B44C-403E-9617-092F08B0FB27}.Release|x64.Build.0 = Release|x64 @@ -459,8 +453,8 @@ Global {3BD492AD-A08C-4923-9486-138189CA4A0A}.Debug|x86.Build.0 = Debug|Win32 {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|ARM64.ActiveCfg = Release|ARM64 {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|ARM64.Build.0 = Release|ARM64 - {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|ARM64EC.Build.0 = Release|ARM64 + {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|ARM64EC.Build.0 = Release|ARM64EC {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|Win32.ActiveCfg = Release|Win32 {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|Win32.Build.0 = Release|Win32 {3BD492AD-A08C-4923-9486-138189CA4A0A}.Release|x64.ActiveCfg = Release|x64 @@ -479,8 +473,7 @@ Global {F6ACF293-2612-4D01-AFA4-103282B84A36}.Debug|x86.Build.0 = Debug|Win32 {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|ARM64.ActiveCfg = Release|ARM64 {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|ARM64.Build.0 = Release|ARM64 - {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|ARM64EC.Build.0 = Release|ARM64 + {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|ARM64EC.ActiveCfg = Release|ARM64EC {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|Win32.ActiveCfg = Release|Win32 {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|Win32.Build.0 = Release|Win32 {F6ACF293-2612-4D01-AFA4-103282B84A36}.Release|x64.ActiveCfg = Release|x64 @@ -499,7 +492,6 @@ Global {03009B2B-E3E8-49DC-A0D6-0FA90AE3B15B}.Release|ARM64.ActiveCfg = Release|ARM64 {03009B2B-E3E8-49DC-A0D6-0FA90AE3B15B}.Release|ARM64.Build.0 = Release|ARM64 {03009B2B-E3E8-49DC-A0D6-0FA90AE3B15B}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {03009B2B-E3E8-49DC-A0D6-0FA90AE3B15B}.Release|ARM64EC.Build.0 = Release|ARM64 {03009B2B-E3E8-49DC-A0D6-0FA90AE3B15B}.Release|Win32.ActiveCfg = Release|Win32 {03009B2B-E3E8-49DC-A0D6-0FA90AE3B15B}.Release|x64.ActiveCfg = Release|x64 {03009B2B-E3E8-49DC-A0D6-0FA90AE3B15B}.Release|x64.Build.0 = Release|x64 @@ -518,7 +510,6 @@ Global {093852BE-32B8-4EB8-814E-91410FFDB4F6}.Release|ARM64.ActiveCfg = Release|ARM64 {093852BE-32B8-4EB8-814E-91410FFDB4F6}.Release|ARM64.Build.0 = Release|ARM64 {093852BE-32B8-4EB8-814E-91410FFDB4F6}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {093852BE-32B8-4EB8-814E-91410FFDB4F6}.Release|ARM64EC.Build.0 = Release|ARM64 {093852BE-32B8-4EB8-814E-91410FFDB4F6}.Release|Win32.ActiveCfg = Release|Win32 {093852BE-32B8-4EB8-814E-91410FFDB4F6}.Release|Win32.Build.0 = Release|Win32 {093852BE-32B8-4EB8-814E-91410FFDB4F6}.Release|x64.ActiveCfg = Release|x64 @@ -538,9 +529,8 @@ Global {2AD0622B-D47A-4CC1-9493-459730F442BE}.Debug|x86.Deploy.0 = Debug|Win32 {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|ARM64.ActiveCfg = Release|ARM64 {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|ARM64.Build.0 = Release|ARM64 - {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|ARM64EC.Build.0 = Release|ARM64 - {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|ARM64EC.Deploy.0 = Release|ARM64 + {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|ARM64EC.ActiveCfg = Release|x64 + {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|ARM64EC.Deploy.0 = Release|x64 {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|Win32.ActiveCfg = Release|Win32 {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|x64.ActiveCfg = Release|x64 {2AD0622B-D47A-4CC1-9493-459730F442BE}.Release|x64.Build.0 = Release|x64 @@ -561,7 +551,6 @@ Global {38A9F27A-13E3-49DF-920B-630B09C68105}.Release|ARM64.ActiveCfg = Release {38A9F27A-13E3-49DF-920B-630B09C68105}.Release|ARM64.Build.0 = Release {38A9F27A-13E3-49DF-920B-630B09C68105}.Release|ARM64EC.ActiveCfg = Release - {38A9F27A-13E3-49DF-920B-630B09C68105}.Release|ARM64EC.Build.0 = Release {38A9F27A-13E3-49DF-920B-630B09C68105}.Release|Win32.ActiveCfg = Release {38A9F27A-13E3-49DF-920B-630B09C68105}.Release|x64.ActiveCfg = Release {38A9F27A-13E3-49DF-920B-630B09C68105}.Release|x64.Build.0 = Release @@ -580,9 +569,8 @@ Global {1B5A1991-AD62-494F-AE3A-1A681914898D}.Debug|x86.Deploy.0 = Debug|Win32 {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|ARM64.ActiveCfg = Release|ARM64 {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|ARM64.Build.0 = Release|ARM64 - {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|ARM64EC.Build.0 = Release|ARM64 - {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|ARM64EC.Deploy.0 = Release|ARM64 + {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|ARM64EC.ActiveCfg = Release|x64 + {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|ARM64EC.Deploy.0 = Release|x64 {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|Win32.ActiveCfg = Release|Win32 {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|x64.ActiveCfg = Release|x64 {1B5A1991-AD62-494F-AE3A-1A681914898D}.Release|x64.Build.0 = Release|x64 @@ -602,7 +590,6 @@ Global {206CEDBF-6343-4171-87A8-1DDDE6E2ED60}.Release|ARM64.ActiveCfg = Release|ARM64 {206CEDBF-6343-4171-87A8-1DDDE6E2ED60}.Release|ARM64.Build.0 = Release|ARM64 {206CEDBF-6343-4171-87A8-1DDDE6E2ED60}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {206CEDBF-6343-4171-87A8-1DDDE6E2ED60}.Release|ARM64EC.Build.0 = Release|ARM64 {206CEDBF-6343-4171-87A8-1DDDE6E2ED60}.Release|Win32.ActiveCfg = Release|Win32 {206CEDBF-6343-4171-87A8-1DDDE6E2ED60}.Release|Win32.Build.0 = Release|Win32 {206CEDBF-6343-4171-87A8-1DDDE6E2ED60}.Release|x64.ActiveCfg = Release|x64 @@ -622,7 +609,6 @@ Global {0E739771-0C0B-42EE-AADB-95E7E1E5A5ED}.Release|ARM64.ActiveCfg = Release|ARM64 {0E739771-0C0B-42EE-AADB-95E7E1E5A5ED}.Release|ARM64.Build.0 = Release|ARM64 {0E739771-0C0B-42EE-AADB-95E7E1E5A5ED}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {0E739771-0C0B-42EE-AADB-95E7E1E5A5ED}.Release|ARM64EC.Build.0 = Release|ARM64 {0E739771-0C0B-42EE-AADB-95E7E1E5A5ED}.Release|Win32.ActiveCfg = Release|Win32 {0E739771-0C0B-42EE-AADB-95E7E1E5A5ED}.Release|Win32.Build.0 = Release|Win32 {0E739771-0C0B-42EE-AADB-95E7E1E5A5ED}.Release|x64.ActiveCfg = Release|x64 @@ -642,7 +628,6 @@ Global {366FA284-D8C0-4CC5-B9A3-917EAB967173}.Release|ARM64.ActiveCfg = Release|ARM64 {366FA284-D8C0-4CC5-B9A3-917EAB967173}.Release|ARM64.Build.0 = Release|ARM64 {366FA284-D8C0-4CC5-B9A3-917EAB967173}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {366FA284-D8C0-4CC5-B9A3-917EAB967173}.Release|ARM64EC.Build.0 = Release|ARM64 {366FA284-D8C0-4CC5-B9A3-917EAB967173}.Release|Win32.ActiveCfg = Release|Win32 {366FA284-D8C0-4CC5-B9A3-917EAB967173}.Release|Win32.Build.0 = Release|Win32 {366FA284-D8C0-4CC5-B9A3-917EAB967173}.Release|x64.ActiveCfg = Release|x64 @@ -661,7 +646,6 @@ Global {1425218C-E6E6-40BB-B99B-052156749E2C}.Release|ARM64.ActiveCfg = Release|ARM64 {1425218C-E6E6-40BB-B99B-052156749E2C}.Release|ARM64.Build.0 = Release|ARM64 {1425218C-E6E6-40BB-B99B-052156749E2C}.Release|ARM64EC.ActiveCfg = Release|x64 - {1425218C-E6E6-40BB-B99B-052156749E2C}.Release|ARM64EC.Build.0 = Release|x64 {1425218C-E6E6-40BB-B99B-052156749E2C}.Release|Win32.ActiveCfg = Release|Win32 {1425218C-E6E6-40BB-B99B-052156749E2C}.Release|x64.ActiveCfg = Release|x64 {1425218C-E6E6-40BB-B99B-052156749E2C}.Release|x64.Build.0 = Release|x64 @@ -679,7 +663,6 @@ Global {0F94A751-9159-4A88-8A71-347151124548}.Release|ARM64.ActiveCfg = Release|ARM64 {0F94A751-9159-4A88-8A71-347151124548}.Release|ARM64.Build.0 = Release|ARM64 {0F94A751-9159-4A88-8A71-347151124548}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {0F94A751-9159-4A88-8A71-347151124548}.Release|ARM64EC.Build.0 = Release|ARM64 {0F94A751-9159-4A88-8A71-347151124548}.Release|Win32.ActiveCfg = Release|Win32 {0F94A751-9159-4A88-8A71-347151124548}.Release|Win32.Build.0 = Release|Win32 {0F94A751-9159-4A88-8A71-347151124548}.Release|x64.ActiveCfg = Release|x64 @@ -699,7 +682,6 @@ Global {C31CEE7B-8BEC-46A6-A8FD-74BABB01A4FB}.Release|ARM64.ActiveCfg = Release|ARM64 {C31CEE7B-8BEC-46A6-A8FD-74BABB01A4FB}.Release|ARM64.Build.0 = Release|ARM64 {C31CEE7B-8BEC-46A6-A8FD-74BABB01A4FB}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {C31CEE7B-8BEC-46A6-A8FD-74BABB01A4FB}.Release|ARM64EC.Build.0 = Release|ARM64 {C31CEE7B-8BEC-46A6-A8FD-74BABB01A4FB}.Release|Win32.ActiveCfg = Release|Win32 {C31CEE7B-8BEC-46A6-A8FD-74BABB01A4FB}.Release|Win32.Build.0 = Release|Win32 {C31CEE7B-8BEC-46A6-A8FD-74BABB01A4FB}.Release|x64.ActiveCfg = Release|x64 @@ -719,7 +701,6 @@ Global {EE585F4F-91A6-426C-AC25-25565D1AD70D}.Release|ARM64.ActiveCfg = Release|ARM64 {EE585F4F-91A6-426C-AC25-25565D1AD70D}.Release|ARM64.Build.0 = Release|ARM64 {EE585F4F-91A6-426C-AC25-25565D1AD70D}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {EE585F4F-91A6-426C-AC25-25565D1AD70D}.Release|ARM64EC.Build.0 = Release|ARM64 {EE585F4F-91A6-426C-AC25-25565D1AD70D}.Release|Win32.ActiveCfg = Release|Win32 {EE585F4F-91A6-426C-AC25-25565D1AD70D}.Release|Win32.Build.0 = Release|Win32 {EE585F4F-91A6-426C-AC25-25565D1AD70D}.Release|x64.ActiveCfg = Release|x64 @@ -738,8 +719,8 @@ Global {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Debug|x86.Build.0 = Debug|Win32 {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|ARM64.ActiveCfg = Release|ARM64 {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|ARM64.Build.0 = Release|ARM64 - {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|ARM64EC.ActiveCfg = Release|ARM64 - {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|ARM64EC.Build.0 = Release|ARM64 + {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|ARM64EC.ActiveCfg = Release|ARM64EC + {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|ARM64EC.Build.0 = Release|ARM64EC {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|Win32.ActiveCfg = Release|Win32 {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|Win32.Build.0 = Release|Win32 {8D7E847B-AD56-4900-93A1-4F0E2EF7A4F9}.Release|x64.ActiveCfg = Release|x64 diff --git a/src/app-sdk/client-initialization-redist/Microsoft.Windows.Devices.Midi2.Initialization.hpp b/src/app-sdk/client-initialization-redist/Microsoft.Windows.Devices.Midi2.Initialization.hpp index 04ae56cc..fa433c9e 100644 --- a/src/app-sdk/client-initialization-redist/Microsoft.Windows.Devices.Midi2.Initialization.hpp +++ b/src/app-sdk/client-initialization-redist/Microsoft.Windows.Devices.Midi2.Initialization.hpp @@ -90,6 +90,7 @@ namespace Microsoft::Windows::Devices::Midi2::Initialization // guid for the initializer + // this must be called only *after* initializing the SDK Runtime bool EnsureServiceAvailable() { // initialize the SDK runtime before calling this function diff --git a/src/app-sdk/mididiag/main.cpp b/src/app-sdk/mididiag/main.cpp index 4e4b031b..6e05ac94 100644 --- a/src/app-sdk/mididiag/main.cpp +++ b/src/app-sdk/mididiag/main.cpp @@ -1000,7 +1000,7 @@ void OutputProcessAndNativeMachine() // if not running emulated, IsWow64Process2 returns machine unknown for the process. if ((processMachine == IMAGE_FILE_MACHINE_UNKNOWN || processMachine == IMAGE_FILE_MACHINE_ARM64) && nativeMachine == IMAGE_FILE_MACHINE_ARM64) { - OutputStringField(MIDIDIAG_FIELD_LABEL_SYSTEM_INFO_PROCESSOR_EMULATION, std::wstring{ L"Native Arm64 process on Arm64 PC (Note Emulated)" }); + OutputStringField(MIDIDIAG_FIELD_LABEL_SYSTEM_INFO_PROCESSOR_EMULATION, std::wstring{ L"Native Arm64 process on Arm64 PC (Not Emulated)" }); } else if ((processMachine == IMAGE_FILE_MACHINE_UNKNOWN || processMachine == IMAGE_FILE_MACHINE_AMD64) && nativeMachine == IMAGE_FILE_MACHINE_AMD64) { diff --git a/src/app-sdk/mididiag/mididiag.vcxproj b/src/app-sdk/mididiag/mididiag.vcxproj index 7028ff88..e5208306 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true true diff --git a/src/app-sdk/mididiag/packages.config b/src/app-sdk/mididiag/packages.config index 8b4456ae..f8387df3 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/main.cpp b/src/app-sdk/midimdnsinfo/main.cpp index c6d47a1b..bff81c88 100644 --- a/src/app-sdk/midimdnsinfo/main.cpp +++ b/src/app-sdk/midimdnsinfo/main.cpp @@ -36,6 +36,7 @@ int __cdecl main() std::cout << std::endl; std::cout << dye::grey(std::string(LINE_LENGTH, '=')) << std::endl; std::cout << dye::aqua(" Enumerating MIDI mdns advertisements currently visible to this PC") << std::endl; + std::cout << dye::aqua(" This may take a moment...") << std::endl; std::cout << dye::grey(std::string(LINE_LENGTH, '=')) << std::endl; std::cout << std::endl; diff --git a/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj b/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj index 412d7c32..1df14707 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true true diff --git a/src/app-sdk/midimdnsinfo/packages.config b/src/app-sdk/midimdnsinfo/packages.config index 8b4456ae..f8387df3 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 39da9216..4c34d837 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.2-preview-8.241217-1713 + Microsoft.Windows.Devices.Midi2.1.0.2-preview-8.241219-1336 true true true diff --git a/src/app-sdk/midiusbinfo/packages.config b/src/app-sdk/midiusbinfo/packages.config index 8b4456ae..f8387df3 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/projections/dotnet-and-cpp/MidiDesktopAppSdkInitializer.cs b/src/app-sdk/projections/dotnet-and-cpp/MidiDesktopAppSdkInitializer.cs index 93697db6..5bf63b6d 100644 --- a/src/app-sdk/projections/dotnet-and-cpp/MidiDesktopAppSdkInitializer.cs +++ b/src/app-sdk/projections/dotnet-and-cpp/MidiDesktopAppSdkInitializer.cs @@ -68,6 +68,7 @@ public class MidiDesktopAppSdkInitializer : IDisposable private MidiDesktopAppSdkInitializer(IMidiClientInitializer initializer) { _initializer = initializer; + } public static MidiDesktopAppSdkInitializer? Create() @@ -82,11 +83,24 @@ private MidiDesktopAppSdkInitializer(IMidiClientInitializer initializer) if (hr == 0 && obj != null) { - return new MidiDesktopAppSdkInitializer((IMidiClientInitializer)obj); + var cominit = (IMidiClientInitializer)obj; + + try + { + cominit.Initialize(); + + var initializer = new MidiDesktopAppSdkInitializer(cominit); + + return initializer; + } + catch (Exception) + { + return null; + } } else { - // TODO: failed to create the initializer + // failed to create the initializer return null; } } @@ -99,7 +113,7 @@ public bool EnsureServiceAvailable() return true; } - catch (Exception ex) + catch (Exception) { // todo: Log return false; @@ -114,7 +128,7 @@ public bool InitializeSdkRuntime() return true; } - catch (Exception ex) + catch (Exception) { // todo: Log return false; diff --git a/src/app-sdk/winrt/Initialization/MidiClientInitializer.cpp b/src/app-sdk/winrt/Initialization/MidiClientInitializer.cpp index 4d5357a7..46721d23 100644 --- a/src/app-sdk/winrt/Initialization/MidiClientInitializer.cpp +++ b/src/app-sdk/winrt/Initialization/MidiClientInitializer.cpp @@ -34,6 +34,18 @@ MidiClientInitializer::Initialize( return S_OK; } + // midisrv client initialization. Doesn't actually connect to service here + + RETURN_IF_FAILED(CoCreateInstance(__uuidof(Midi2MidiSrvTransport), nullptr, CLSCTX_ALL, IID_PPV_ARGS(&m_serviceTransport))); + RETURN_IF_FAILED(m_serviceTransport->Activate(__uuidof(IMidiSessionTracker), (void**)&m_sessionTracker)); + + RETURN_HR_IF_NULL(E_POINTER, m_sessionTracker); + + RETURN_IF_FAILED(m_sessionTracker->Initialize()); + + + // SDK initialization + g_runtimeComponentCatalog = std::make_shared(); if (g_runtimeComponentCatalog == nullptr) @@ -100,6 +112,7 @@ MidiClientInitializer::Initialize( RETURN_IF_FAILED(E_FAIL); } + m_initialized = true; return S_OK; @@ -268,17 +281,10 @@ MidiClientInitializer::EnsureServiceAvailable() noexcept TraceLoggingWideString(L"Enter", MIDI_TRACE_EVENT_MESSAGE_FIELD) ); - wil::com_ptr_nothrow serviceTransport; - wil::com_ptr_nothrow sessionTracker; - RETURN_IF_FAILED(CoCreateInstance(__uuidof(Midi2MidiSrvTransport), nullptr, CLSCTX_ALL, IID_PPV_ARGS(&serviceTransport))); - RETURN_IF_FAILED(serviceTransport->Activate(__uuidof(IMidiSessionTracker), (void**)&sessionTracker)); + RETURN_HR_IF_NULL(E_POINTER, m_sessionTracker); - RETURN_HR_IF_NULL(E_POINTER, sessionTracker); - - RETURN_IF_FAILED(sessionTracker->Initialize()); - - if (sessionTracker->VerifyConnectivity()) + if (m_sessionTracker->VerifyConnectivity()) { return S_OK; } @@ -303,6 +309,16 @@ MidiClientInitializer::Shutdown() noexcept // Remove activation hooks RemoveWinRTActivationHooks(); + if (m_serviceTransport) + { + m_serviceTransport = nullptr; + } + + if (m_sessionTracker) + { + m_sessionTracker->Shutdown(); + m_serviceTransport = nullptr; + } if (g_runtimeComponentCatalog != nullptr) { diff --git a/src/app-sdk/winrt/Initialization/MidiClientInitializer.h b/src/app-sdk/winrt/Initialization/MidiClientInitializer.h index 5fd67d52..0be14eca 100644 --- a/src/app-sdk/winrt/Initialization/MidiClientInitializer.h +++ b/src/app-sdk/winrt/Initialization/MidiClientInitializer.h @@ -77,6 +77,9 @@ struct __declspec(uuid("c3263827-c3b0-bdbd-2500-ce63a3f3f2c3")) MidiClientInitia private: bool m_initialized{ false }; + + wil::com_ptr_nothrow m_serviceTransport{ nullptr }; + wil::com_ptr_nothrow m_sessionTracker{ nullptr }; }; extern winrt::com_ptr g_clientInitializer; 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 1b250501..c1fa58db 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 @@ -165,6 +165,9 @@ if ($confirmation -eq 'y' -or $confirmation -eq 'Y') Write-Host "Midisrv service was not present. No service action taken." -ForegroundColor DarkGray } + Write-Host "Taking ownership of wdmaud2.drv..." -ForegroundColor DarkCyan + cmd.exe /c "takeown /F %windir%\System32\wdmaud2.drv" + Write-Host Write-Host "You may now install the development version of the service and plugins." -ForegroundColor Green diff --git a/src/oob-setup/api-package/WindowsMidiServices.wxs b/src/oob-setup/api-package/WindowsMidiServices.wxs index f3d9c81a..dfff9bfc 100644 --- a/src/oob-setup/api-package/WindowsMidiServices.wxs +++ b/src/oob-setup/api-package/WindowsMidiServices.wxs @@ -62,10 +62,9 @@ - - + - + @@ -166,7 +164,7 @@ - + diff --git a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPlayNotesCommand.cs b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPlayNotesCommand.cs index d1dd27a3..876ea414 100644 --- a/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPlayNotesCommand.cs +++ b/src/user-tools/midi-console/Midi/Commands/Endpoint/EndpointPlayNotesCommand.cs @@ -28,20 +28,20 @@ public sealed class Settings : EndpointCommandSettings [DefaultValue(250)] public int Rest { get; set; } - [LocalizedDescription("ParameterPlayNotesGroupIndex")] - [CommandOption("-g|--group|--group-index")] - [DefaultValue(0)] - public int GroupIndex { get; set; } + [LocalizedDescription("ParameterPlayNotesGroupNumber")] + [CommandOption("-g|--group|--group-number")] + [DefaultValue(1)] + public int GroupNumber { get; set; } - [LocalizedDescription("ParameterPlayNotesChannelIndex")] - [CommandOption("-c|--channel|--channel-index")] - [DefaultValue(0)] - public int ChannelIndex { get; set; } + [LocalizedDescription("ParameterPlayNotesChannelNumber")] + [CommandOption("-c|--channel|--channel-number")] + [DefaultValue(1)] + public int ChannelNumber { get; set; } [LocalizedDescription("ParameterPlayNotesVelocity")] - [CommandOption("-v|--velocity")] - [DefaultValue(127)] - public UInt32 Velocity { get; set; } + [CommandOption("-v|--velocity|--velocity-percent")] + [DefaultValue(75.0)] + public double Velocity { get; set; } [LocalizedDescription("ParameterPlayNotesForever")] [CommandOption("-f|--forever|--repeat-forever")] @@ -57,22 +57,19 @@ public sealed class Settings : EndpointCommandSettings public override Spectre.Console.ValidationResult Validate(CommandContext context, Settings settings) { - if (!MidiGroup.IsValidIndex((byte)settings.GroupIndex)) + if (!MidiGroup.IsValidIndex((byte)(settings.GroupNumber-1))) { - return ValidationResult.Error("Group index must be between 0 and 15 inclusive."); + return ValidationResult.Error("Group number must be between 1 and 16 inclusive."); } - if (!MidiChannel.IsValidIndex((byte)settings.ChannelIndex)) + if (!MidiChannel.IsValidIndex((byte)(settings.ChannelNumber-1))) { - return ValidationResult.Error("Channel index must be between 0 and 15 inclusive."); + return ValidationResult.Error("Channel index must be between 1 and 16 inclusive."); } - if (!settings.Midi2) + if (settings.Velocity > 100.0 || settings.Velocity < 1.0) { - if (settings.Velocity > 127 || settings.Velocity < 0) - { - return ValidationResult.Error("Velocity must be between 0 and 127 inclusive for MIDI 1.0 messages."); - } + return ValidationResult.Error("Velocity percentage must be between 1.0 and 100.0 inclusive."); } // todo: validate notes @@ -86,18 +83,18 @@ public override Spectre.Console.ValidationResult Validate(CommandContext context { if (index > 127 || index < 0) { - return ValidationResult.Error("All note indexes must be between 0 and 127"); + return ValidationResult.Error("All note indexes must be between 0 and 127."); } } if (settings.Length < 30 ) { - return ValidationResult.Error("Please provide a note duration of at least 30 milliseconds"); + return ValidationResult.Error("Please provide a note duration of at least 30 milliseconds."); } if (settings.Rest < 0) { - return ValidationResult.Error("Please provide a rest duration of zero or more milliseconds"); + return ValidationResult.Error("Please provide a rest duration of zero or more milliseconds."); } return base.Validate(context, settings); @@ -168,9 +165,8 @@ public override int Execute(CommandContext context, Settings settings) bool stillSending = true; - MidiGroup group = new MidiGroup((byte)settings.GroupIndex); - MidiChannel channel = new MidiChannel((byte)settings.ChannelIndex); - byte velocity = (byte)settings.Velocity; + MidiGroup group = new MidiGroup((byte)(settings.GroupNumber-1)); + MidiChannel channel = new MidiChannel((byte)(settings.ChannelNumber-1)); var messageSenderThread = new Thread(() => { @@ -191,6 +187,8 @@ public override int Execute(CommandContext context, Settings settings) if (settings.Midi2) { + UInt32 velocity = (UInt32)(settings.Velocity / 100.0) * UInt32.MaxValue; + var noteOnMessage = MidiMessageBuilder.BuildMidi2ChannelVoiceMessage( MidiClock.TimestampConstantSendImmediately, group, @@ -203,6 +201,8 @@ public override int Execute(CommandContext context, Settings settings) } else { + byte velocity = (byte)settings.Velocity; + var noteOnMessage = MidiMessageBuilder.BuildMidi1ChannelVoiceMessage( MidiClock.TimestampConstantSendImmediately, group, @@ -231,6 +231,8 @@ public override int Execute(CommandContext context, Settings settings) if (settings.Midi2) { + UInt32 velocity = (UInt32)(settings.Velocity / 100.0) * UInt32.MaxValue; + var noteOffMessage = MidiMessageBuilder.BuildMidi2ChannelVoiceMessage( MidiClock.TimestampConstantSendImmediately, group, @@ -243,6 +245,8 @@ public override int Execute(CommandContext context, Settings settings) } else { + byte velocity = (byte)settings.Velocity; + var noteOffMessage = MidiMessageBuilder.BuildMidi1ChannelVoiceMessage( MidiClock.TimestampConstantSendImmediately, group, diff --git a/src/user-tools/midi-console/Midi/Program.cs b/src/user-tools/midi-console/Midi/Program.cs index bfbbad6e..04d1c5c2 100644 --- a/src/user-tools/midi-console/Midi/Program.cs +++ b/src/user-tools/midi-console/Midi/Program.cs @@ -136,7 +136,7 @@ endpoint.AddCommand("play-notes") .WithAlias("play") .WithExample("endpoint", "\\\\?\\SWD#MIDISRV...}", "play-notes", "127 32 56 98", "--length", "500", "--velocity", "50", "--forever", "--midi2") - .WithDescription(Strings.CommandPlayMidi1NotesDescription) + .WithDescription(Strings.CommandPlayNotesDescription) ; 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 bba26ba1..4a743c87 100644 --- a/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs +++ b/src/user-tools/midi-console/Midi/Resources/Strings.Designer.cs @@ -214,11 +214,11 @@ internal static string CommandMonitorEndpointDescription { } /// - /// Looks up a localized string similar to Send MIDI 1.0 note on and off messages to the endpoint. + /// Looks up a localized string similar to Send MIDI 1.0 or 2.0 note on and off messages to the endpoint. /// - internal static string CommandPlayMidi1NotesDescription { + internal static string CommandPlayNotesDescription { get { - return ResourceManager.GetString("CommandPlayMidi1NotesDescription", resourceCulture); + return ResourceManager.GetString("CommandPlayNotesDescription", resourceCulture); } } @@ -1051,16 +1051,16 @@ internal static string ParameterMonitorEndpointVerbose { } /// - /// Looks up a localized string similar to Index (0-15 decimal) of the channel to send the messages to. + /// Looks up a localized string similar to Number (1-16 decimal) of the channel to send the messages to. /// - internal static string ParameterPlayNotesChannelIndex { + internal static string ParameterPlayNotesChannelNumber { get { - return ResourceManager.GetString("ParameterPlayNotesChannelIndex", resourceCulture); + return ResourceManager.GetString("ParameterPlayNotesChannelNumber", resourceCulture); } } /// - /// Looks up a localized string similar to Set to true to play the notes until you press the escape key. + /// Looks up a localized string similar to Set to true to continue to loop through the notes until you press the escape key. /// internal static string ParameterPlayNotesForever { get { @@ -1069,11 +1069,11 @@ internal static string ParameterPlayNotesForever { } /// - /// Looks up a localized string similar to Index (0-15 decimal) for the group to send the messages to. + /// Looks up a localized string similar to Number (1-16 decimal) for the group to send the messages to. /// - internal static string ParameterPlayNotesGroupIndex { + internal static string ParameterPlayNotesGroupNumber { get { - return ResourceManager.GetString("ParameterPlayNotesGroupIndex", resourceCulture); + return ResourceManager.GetString("ParameterPlayNotesGroupNumber", resourceCulture); } } @@ -1096,7 +1096,25 @@ internal static string ParameterPlayNotesLengthMilliseconds { } /// - /// Looks up a localized string similar to Note velocity (0-127 decimal). A velocity of 0 becomes a note-off message.. + /// Looks up a localized string similar to Set to true to use MIDI 2.0 protocol messages (type 4) instead of MIDI 1.0 protocol (type 2). + /// + internal static string ParameterPlayNotesMidi2 { + get { + return ResourceManager.GetString("ParameterPlayNotesMidi2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duration of wait time between notes, in whole decimal milliseconds. + /// + internal static string ParameterPlayNotesRestMilliseconds { + get { + return ResourceManager.GetString("ParameterPlayNotesRestMilliseconds", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Note velocity (1.0 - 100.0) as a fractional decimal percentage of the maximum value for the protocol.. /// internal static string ParameterPlayNotesVelocity { get { diff --git a/src/user-tools/midi-console/Midi/Resources/Strings.resx b/src/user-tools/midi-console/Midi/Resources/Strings.resx index 317d0d9b..d682049d 100644 --- a/src/user-tools/midi-console/Midi/Resources/Strings.resx +++ b/src/user-tools/midi-console/Midi/Resources/Strings.resx @@ -884,20 +884,20 @@ Timestamp Length / duration of the note in whole decimal milliseconds. - - Index (0-15 decimal) for the group to send the messages to + + Number (1-16 decimal) for the group to send the messages to - - Index (0-15 decimal) of the channel to send the messages to + + Number (1-16 decimal) of the channel to send the messages to - Note velocity (0-127 decimal). A velocity of 0 becomes a note-off message. + Note velocity (1.0 - 100.0) as a fractional decimal percentage of the maximum value for the protocol. - Set to true to play the notes until you press the escape key + Set to true to continue to loop through the notes until you press the escape key - - Send MIDI 1.0 note on and off messages to the endpoint + + Send MIDI 1.0 or 2.0 note on and off messages to the endpoint Unique identifiers updated @@ -905,4 +905,10 @@ Timestamp List the Windows MIDI Services-specific property keys + + Duration of wait time between notes, in whole decimal milliseconds + + + Set to true to use MIDI 2.0 protocol messages (type 4) instead of MIDI 1.0 protocol (type 2) + \ No newline at end of file