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