diff --git a/build/staging/version/BundleInfo.wxi b/build/staging/version/BundleInfo.wxi
index cbcd3697..489cd93d 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 5d74cd15..3b6df6df 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 9";
- public const string BuildFullVersion = "1.0.2-preview-9.250112-1659";
+ public const string BuildFullVersion = "1.0.2-preview-9.250112-2036";
public const string VersionMajor = "1";
public const string VersionMinor = "0";
public const string VersionRevision = "2";
public const string VersionDateNumber = "250112";
- public const string VersionTimeNumber = "1659";
+ public const string VersionTimeNumber = "2036";
}
}
diff --git a/build/staging/version/WindowsMidiServicesVersion.h b/build/staging/version/WindowsMidiServicesVersion.h
index 66f3ed85..9d8da7dc 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 9"
-#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_FULL L"1.0.2-preview-9.250112-1659"
+#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_FULL L"1.0.2-preview-9.250112-2036"
#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"250112"
-#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"1659"
+#define WINDOWS_MIDI_SERVICES_BUILD_VERSION_TIME_NUMBER L"2036"
#endif
diff --git a/samples/cpp-winrt/basics/client-basics-cpp.vcxproj b/samples/cpp-winrt/basics/client-basics-cpp.vcxproj
index 183d64bb..52bd86f1 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
false
diff --git a/samples/cpp-winrt/basics/packages.config b/samples/cpp-winrt/basics/packages.config
index 1c7a38d4..fde69a99 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 c264f300..1eb8c39e 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
true
diff --git a/samples/cpp-winrt/loopback-endpoints/packages.config b/samples/cpp-winrt/loopback-endpoints/packages.config
index 1c7a38d4..fde69a99 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 1c7a38d4..fde69a99 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 2e71022d..fdad6a9a 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
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 1c7a38d4..fde69a99 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 22df94d7..cf5ae205 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
true
diff --git a/samples/cpp-winrt/static-enum-endpoints/packages.config b/samples/cpp-winrt/static-enum-endpoints/packages.config
index 1c7a38d4..fde69a99 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 8a48d94a..c5122bca 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
true
diff --git a/samples/cpp-winrt/watch-endpoints/packages.config b/samples/cpp-winrt/watch-endpoints/packages.config
index 1c7a38d4..fde69a99 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 8b0664f0..6c508990 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
true
diff --git a/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.cpp b/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.cpp
index 02e52907..8b617010 100644
--- a/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.cpp
+++ b/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.cpp
@@ -168,4 +168,34 @@ void MidiSequenceNumberTests::TestWrappedDecrement()
VERIFY_ARE_EQUAL(a.Value(), 65535);
}
+void MidiSequenceNumberTests::TestInitializedComparison()
+{
+ MidiSequenceNumber a{ 0 };
+ MidiSequenceNumber b{ 0 };
+
+ a--; // gets us to max, which will be considered less than the 0 of b
+
+ VERIFY_IS_TRUE(b > a);
+ VERIFY_ARE_EQUAL(a.Value(), MidiSequenceNumber::Max());
+ VERIFY_ARE_EQUAL(b.Value(), (a + 1).Value());
+ VERIFY_ARE_EQUAL(a.Value(), (b - 1).Value());
+}
+
+void MidiSequenceNumberTests::TestBasicMath()
+{
+ uint16_t val{ 100 };
+ MidiSequenceNumber a{ val };
+
+ a = val;
+ a = a - 50;
+ VERIFY_ARE_EQUAL(a.Value(), 50);
+
+ a = val;
+ a = a + 50;
+ VERIFY_ARE_EQUAL(a.Value(), 150);
+
+ a = val;
+ a = a - 101;
+ VERIFY_ARE_EQUAL(a.Value(), MidiSequenceNumber::Max());
+}
diff --git a/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.h b/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.h
index 0ca5ac1c..0f54c5e2 100644
--- a/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.h
+++ b/src/api/Test/Midi2.Transport.NetworkMidi2.unittests/SequenceNumberTests.h
@@ -30,6 +30,8 @@ class MidiSequenceNumberTests
TEST_METHOD(TestSimpleDecrement);
TEST_METHOD(TestWrappedIncrement);
TEST_METHOD(TestWrappedDecrement);
+ TEST_METHOD(TestInitializedComparison);
+ TEST_METHOD(TestBasicMath);
private:
diff --git a/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.cpp b/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.cpp
index 996dd164..4e5f37c0 100644
--- a/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.cpp
+++ b/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.cpp
@@ -237,8 +237,9 @@ MidiNetworkConnection::ResetSequenceNumbers()
return S_OK;
}
+_Use_decl_annotations_
HRESULT
-MidiNetworkConnection::EndActiveSession()
+MidiNetworkConnection::EndActiveSession(bool respondWithByeReply)
{
TraceLoggingWrite(
MidiNetworkMidiTransportTelemetryProvider::Provider(),
@@ -259,12 +260,15 @@ MidiNetworkConnection::EndActiveSession()
RETURN_IF_FAILED(TransportState::Current().GetEndpointManager()->DeleteEndpoint(m_sessionDeviceInstanceId));
m_sessionDeviceInstanceId.clear();
- // send bye reply
+ if (respondWithByeReply)
+ {
+ // send bye reply
+ auto lock = m_socketWriterLock.lock();
+ RETURN_IF_FAILED(m_writer->WriteUdpPacketHeader());
+ RETURN_IF_FAILED(m_writer->WriteCommandByeReply());
+ RETURN_IF_FAILED(m_writer->Send());
+ }
- auto lock = m_socketWriterLock.lock();
- RETURN_IF_FAILED(m_writer->WriteUdpPacketHeader());
- RETURN_IF_FAILED(m_writer->WriteCommandByeReply());
- RETURN_IF_FAILED(m_writer->Send());
// clear the association with the SWD
RETURN_IF_FAILED(TransportState::Current().DisassociateMidiEndpointFromConnection(m_sessionEndpointDeviceInterfaceId));
@@ -292,17 +296,12 @@ MidiNetworkConnection::HandleIncomingBye()
if (m_sessionActive)
{
- RETURN_IF_FAILED(EndActiveSession());
+ RETURN_IF_FAILED(EndActiveSession(true));
}
else
{
// not an active session. Nothing to clean up
- // but we should NAK the Bye saying there's no active session
-
- auto lock = m_socketWriterLock.lock();
- RETURN_IF_FAILED(m_writer->WriteUdpPacketHeader());
- RETURN_IF_FAILED(m_writer->WriteCommandNAK(0, MidiNetworkCommandNAKReason::CommandNAKReason_CommandNotExpected, L"BYE received when there's no active session."));
- RETURN_IF_FAILED(m_writer->Send());
+ // we ignore this (protocol says not to NAK)
}
return S_OK;
@@ -373,6 +372,8 @@ MidiNetworkConnection::HandleIncomingInvitationReplyAccepted(
m_sessionEndpointDeviceInterfaceId = internal::NormalizeEndpointInterfaceIdWStringCopy(newEndpointDeviceInterfaceId);
m_sessionDeviceInstanceId = internal::NormalizeDeviceInstanceIdWStringCopy(newDeviceInstanceId);
+ m_sessionActive = true;
+
// this is what the BiDi uses when it is created
RETURN_IF_FAILED(TransportState::Current().AssociateMidiEndpointWithConnection(m_sessionEndpointDeviceInterfaceId.c_str(), m_remoteHostName, m_remotePort.c_str()));
@@ -380,8 +381,6 @@ MidiNetworkConnection::HandleIncomingInvitationReplyAccepted(
// because we need to wire up the connection first. Bit of a race.
LOG_IF_FAILED(TransportState::Current().GetEndpointManager()->InitiateDiscoveryAndNegotiation(m_sessionEndpointDeviceInterfaceId));
-
- m_sessionActive = true;
}
else
{
diff --git a/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.h b/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.h
index 18de3370..38a3dbb1 100644
--- a/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.h
+++ b/src/api/Transport/UdpNetworkMidi2Transport/MidiNetworkConnection.h
@@ -64,7 +64,7 @@ class MidiNetworkConnection
HRESULT StartOutboundProcessingThreads();
HRESULT ResetSequenceNumbers();
- HRESULT EndActiveSession();
+ HRESULT EndActiveSession(_In_ bool respondWithByeReply);
HRESULT RequestMissingPackets();
diff --git a/src/api/Transport/UdpNetworkMidi2Transport/MidiSequenceNumber.h b/src/api/Transport/UdpNetworkMidi2Transport/MidiSequenceNumber.h
index 226ef6d8..c72a6a74 100644
--- a/src/api/Transport/UdpNetworkMidi2Transport/MidiSequenceNumber.h
+++ b/src/api/Transport/UdpNetworkMidi2Transport/MidiSequenceNumber.h
@@ -33,44 +33,43 @@ class MidiSequenceNumber
MidiSequenceNumber operator+ (_In_ const MidiSequenceNumber value) const
{
- uint32_t val = m_value + value.m_value;
+ uint32_t val = (m_value + value.m_value);
- return MidiSequenceNumber(static_cast(val % Max()));
+ return MidiSequenceNumber(static_cast(val % (Max() + 1)));
}
MidiSequenceNumber operator+ (_In_ uint16_t const value) const
{
- uint32_t val = m_value + value;
+ uint32_t val = (m_value + value);
- return MidiSequenceNumber(static_cast(val % Max()));
+ return MidiSequenceNumber(static_cast(val % (Max() + 1)));
}
-
MidiSequenceNumber operator- (_In_ MidiSequenceNumber const value) const
{
- int32_t val = m_value - value.m_value;
+ int32_t val = ((int32_t)m_value - (int32_t)value.m_value);
if (val >= 0)
{
- return MidiSequenceNumber(static_cast(val % Max()));
+ return MidiSequenceNumber(static_cast(val % (Max() + 1)));
}
else
{
- return MidiSequenceNumber(static_cast(Max() - (val % Max())));
+ return MidiSequenceNumber(static_cast(Max() - (val * -1)));
}
}
MidiSequenceNumber operator- (_In_ uint16_t const value) const
{
- int32_t val = m_value - value;
+ int32_t val = ((int32_t)m_value - (int32_t)value);
if (val >= 0)
{
- return MidiSequenceNumber(static_cast(val % Max()));
+ return MidiSequenceNumber(static_cast(val % (Max() + 1)));
}
else
{
- return MidiSequenceNumber(static_cast(Max() - (val % Max())));
+ return MidiSequenceNumber(static_cast(Max() - (val * -1) + 1));
}
}
diff --git a/src/app-sdk/mididiag/mididiag.vcxproj b/src/app-sdk/mididiag/mididiag.vcxproj
index ee67036a..3e5bd565 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
true
diff --git a/src/app-sdk/mididiag/packages.config b/src/app-sdk/mididiag/packages.config
index 2e683561..8a532ca4 100644
--- a/src/app-sdk/mididiag/packages.config
+++ b/src/app-sdk/mididiag/packages.config
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj b/src/app-sdk/midimdnsinfo/midimdnsinfo.vcxproj
index 6914369b..1665db0d 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
true
diff --git a/src/app-sdk/midimdnsinfo/packages.config b/src/app-sdk/midimdnsinfo/packages.config
index 2e683561..8a532ca4 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 52133a8d..e8b14390 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-9.250112-1659
+ Microsoft.Windows.Devices.Midi2.1.0.2-preview-9.250112-2036
true
true
true
diff --git a/src/app-sdk/midiusbinfo/packages.config b/src/app-sdk/midiusbinfo/packages.config
index 2e683561..8a532ca4 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