From abe59f71874d0f3d60ced08d5affc1e078845204 Mon Sep 17 00:00:00 2001 From: Igor Bochkariov Date: Sat, 20 Apr 2019 03:35:08 -0700 Subject: [PATCH 1/3] win-wasapi: Call CoInitializeEx in reconnect thread Fixes an issue where COM might not be available to calls within the reconnect thread. --- plugins/win-wasapi/win-wasapi.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/win-wasapi/win-wasapi.cpp b/plugins/win-wasapi/win-wasapi.cpp index a806e151a..60b8bc193 100644 --- a/plugins/win-wasapi/win-wasapi.cpp +++ b/plugins/win-wasapi/win-wasapi.cpp @@ -366,6 +366,8 @@ DWORD WINAPI WASAPISource::ReconnectThread(LPVOID param) os_set_thread_name("win-wasapi: reconnect thread"); + CoInitializeEx(0, COINIT_MULTITHREADED); + while (!WaitForSignal(source->stopSignal, RECONNECT_INTERVAL)) { if (source->TryInitialize()) break; From 041d3b4155d2942e499318c28a893fe8a567daaf Mon Sep 17 00:00:00 2001 From: Igor Bochkariov Date: Tue, 12 Mar 2019 18:58:26 +0400 Subject: [PATCH 2/3] win-wasapi: Fix audio capture after unplugging device This commit fixes a bug where the user would have to restart OBS when certain types of devices are unplugged and plugged back in again (particularly USB devices). A wait interval is required (RECONNECT_INTERVAL) because Windows does not send any events to IAudioCaptureClient on device invalidation. --- plugins/win-wasapi/win-wasapi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/win-wasapi/win-wasapi.cpp b/plugins/win-wasapi/win-wasapi.cpp index 60b8bc193..574f5280b 100644 --- a/plugins/win-wasapi/win-wasapi.cpp +++ b/plugins/win-wasapi/win-wasapi.cpp @@ -448,7 +448,7 @@ DWORD WINAPI WASAPISource::CaptureThread(LPVOID param) bool reconnect = false; /* Output devices don't signal, so just make it check every 10 ms */ - DWORD dur = source->isInputDevice ? INFINITE : 10; + DWORD dur = source->isInputDevice ? RECONNECT_INTERVAL : 10; HANDLE sigs[2] = { source->receiveSignal, From 69b4df41c6f8e99e2d5681e4b805fad9b1100e77 Mon Sep 17 00:00:00 2001 From: Igor Bochkariov Date: Tue, 12 Mar 2019 19:10:24 +0400 Subject: [PATCH 3/3] win-wasapi: Unapply/reapply audio monitoring on reconnect Saves and disable monitoring before entering recover loop, and restores it after recovery is complete. --- plugins/win-wasapi/win-wasapi.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/win-wasapi/win-wasapi.cpp b/plugins/win-wasapi/win-wasapi.cpp index 574f5280b..21103a3f5 100644 --- a/plugins/win-wasapi/win-wasapi.cpp +++ b/plugins/win-wasapi/win-wasapi.cpp @@ -1,6 +1,7 @@ #include "enum-wasapi.hpp" #include +#include #include #include #include @@ -368,11 +369,16 @@ DWORD WINAPI WASAPISource::ReconnectThread(LPVOID param) CoInitializeEx(0, COINIT_MULTITHREADED); + obs_monitoring_type type = obs_source_get_monitoring_type(source->source); + obs_source_set_monitoring_type(source->source, OBS_MONITORING_TYPE_NONE); + while (!WaitForSignal(source->stopSignal, RECONNECT_INTERVAL)) { if (source->TryInitialize()) break; } + obs_source_set_monitoring_type(source->source, type); + source->reconnectThread = nullptr; source->reconnecting = false; return 0;