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