From 27d070a63e3972fe813a14408bc983ab7eea49d1 Mon Sep 17 00:00:00 2001 From: Gary Daniels Date: Wed, 19 Feb 2025 12:03:20 -0500 Subject: [PATCH] fix driver test hang when switching state fast, fix build issues due to missing headers --- src/api/Drivers/MinMidi/Driver/MidiPin.cpp | 5 +++-- src/api/Drivers/MinMidi2/Driver/StreamEngine.cpp | 2 +- src/api/Drivers/USBMIDI2/Driver/StreamEngine.cpp | 3 ++- src/api/Service/Exe/stdafx.h | 1 + src/api/Transport/KSAggregateTransport/pch.h | 2 ++ 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/api/Drivers/MinMidi/Driver/MidiPin.cpp b/src/api/Drivers/MinMidi/Driver/MidiPin.cpp index 8d9f017e..3d9e0f07 100644 --- a/src/api/Drivers/MinMidi/Driver/MidiPin.cpp +++ b/src/api/Drivers/MinMidi/Driver/MidiPin.cpp @@ -621,7 +621,6 @@ MidiPin::HandleIo() // start with the even reset to indicate that the thread is running m_ThreadExitedEvent.clear(); - m_ThreadExitEvent.clear(); if (m_Pin->DataFlow == KSPIN_DATAFLOW_IN) { @@ -753,7 +752,7 @@ MidiPin::HandleIo() PVOID midiInWaitObjects[] = { m_ThreadExitEvent.get(), g_MidiInPin->m_ReadEvent }; // Wait for either room in the output buffer, or thread exit. - status = KeWaitForMultipleObjects(2, waitObjects, WaitAny, Executive, KernelMode, FALSE, nullptr, nullptr); + status = KeWaitForMultipleObjects(2, midiInWaitObjects, WaitAny, Executive, KernelMode, FALSE, nullptr, nullptr); if (STATUS_WAIT_1 == status) { // we have room, retry writing this pass @@ -884,6 +883,8 @@ MidiPin::SetDeviceState( // midi out if (This->m_IsLooped) { + This->m_ThreadExitEvent.clear(); + // Create and start the midi out worker thread for the cyclic buffer. HANDLE handle = NULL; NT_RETURN_IF_NTSTATUS_FAILED(PsCreateSystemThread(&handle, THREAD_ALL_ACCESS, 0, 0, 0, MidiPin::WorkerThread, This)); diff --git a/src/api/Drivers/MinMidi2/Driver/StreamEngine.cpp b/src/api/Drivers/MinMidi2/Driver/StreamEngine.cpp index 75c7291e..59b5db1c 100644 --- a/src/api/Drivers/MinMidi2/Driver/StreamEngine.cpp +++ b/src/api/Drivers/MinMidi2/Driver/StreamEngine.cpp @@ -269,7 +269,7 @@ StreamEngine::HandleIo() PVOID midiInWaitObjects[] = { m_ThreadExitEvent.get(), g_MidiInStreamEngine->m_ReadEvent }; // Wait for either room in the output buffer, or thread exit. - status = KeWaitForMultipleObjects(2, waitObjects, WaitAny, Executive, KernelMode, FALSE, nullptr, nullptr); + status = KeWaitForMultipleObjects(2, midiInWaitObjects, WaitAny, Executive, KernelMode, FALSE, nullptr, nullptr); if (STATUS_WAIT_1 == status) { // we have room in the input pin buffer, set the write event and break diff --git a/src/api/Drivers/USBMIDI2/Driver/StreamEngine.cpp b/src/api/Drivers/USBMIDI2/Driver/StreamEngine.cpp index 4f6a381a..398f35f6 100644 --- a/src/api/Drivers/USBMIDI2/Driver/StreamEngine.cpp +++ b/src/api/Drivers/USBMIDI2/Driver/StreamEngine.cpp @@ -150,7 +150,6 @@ StreamEngine::HandleIo() // start with the even reset to indicate that the thread is running m_ThreadExitedEvent.clear(); - m_ThreadExitEvent.clear(); if (AcxPinGetId(m_Pin) == MidiPinTypeMidiOut) { @@ -574,6 +573,8 @@ StreamEngine::Run() // transition from paused to run if (AcxPinGetId(m_Pin) == MidiPinTypeMidiOut) { + m_ThreadExitEvent.clear(); + // Create and start the midi out worker thread for the cyclic buffer. HANDLE handle = nullptr; NT_RETURN_IF_NTSTATUS_FAILED(PsCreateSystemThread(&handle, THREAD_ALL_ACCESS, 0, 0, 0, StreamEngine::WorkerThread, this)); diff --git a/src/api/Service/Exe/stdafx.h b/src/api/Service/Exe/stdafx.h index c958b2c7..16b30f0e 100644 --- a/src/api/Service/Exe/stdafx.h +++ b/src/api/Service/Exe/stdafx.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include diff --git a/src/api/Transport/KSAggregateTransport/pch.h b/src/api/Transport/KSAggregateTransport/pch.h index d418b10d..79540fe1 100644 --- a/src/api/Transport/KSAggregateTransport/pch.h +++ b/src/api/Transport/KSAggregateTransport/pch.h @@ -19,8 +19,10 @@ #include #include +#include #include #include +#include #include #include #include