From: Dan Minor Date: Tue, 17 Sep 2019 06:47:00 +0000 Subject: Bug 1581193 - Fix devicechange event on Windows; r=achronop This restores the code for generating devicechange events that was accidentally removed as part of updating the Windows video capture code in Bug 1552755. Differential Revision: https://phabricator.services.mozilla.com/D46033 Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/840c4edafa021eeac6a7e6ae0e828d0adcfea92e --- .../video_capture/windows/device_info_ds.cc | 39 +++++++++++++++++++ .../video_capture/windows/device_info_ds.h | 3 ++ 2 files changed, 42 insertions(+) diff --git a/modules/video_capture/windows/device_info_ds.cc b/modules/video_capture/windows/device_info_ds.cc index d0d274cb02..460ef3b7b9 100644 --- a/modules/video_capture/windows/device_info_ds.cc +++ b/modules/video_capture/windows/device_info_ds.cc @@ -20,6 +20,29 @@ namespace webrtc { namespace videocapturemodule { +LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + DeviceInfoDS* pParent; + if (uiMsg == WM_CREATE) + { + pParent = (DeviceInfoDS*)((LPCREATESTRUCT)lParam)->lpCreateParams; + SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pParent); + } + else if (uiMsg == WM_DESTROY) + { + SetWindowLongPtr(hWnd, GWLP_USERDATA, NULL); + } + else if (uiMsg == WM_DEVICECHANGE) + { + pParent = (DeviceInfoDS*)GetWindowLongPtr(hWnd, GWLP_USERDATA); + if (pParent) + { + pParent->DeviceChange(); + } + } + return DefWindowProc(hWnd, uiMsg, wParam, lParam); +} + // static DeviceInfoDS* DeviceInfoDS::Create() { DeviceInfoDS* dsInfo = new DeviceInfoDS(); @@ -77,6 +100,18 @@ DeviceInfoDS::DeviceInfoDS() << rtc::ToHex(hr); } } + + _hInstance = reinterpret_cast(GetModuleHandle(NULL)); + _wndClass = {0}; + _wndClass.lpfnWndProc = &WndProc; + _wndClass.lpszClassName = TEXT("DeviceInfoDS"); + _wndClass.hInstance = _hInstance; + + if (RegisterClass(&_wndClass)) { + _hwnd = CreateWindow(_wndClass.lpszClassName, NULL, 0, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, + NULL, _hInstance, this); + } } DeviceInfoDS::~DeviceInfoDS() { @@ -85,6 +120,10 @@ DeviceInfoDS::~DeviceInfoDS() { if (_CoUninitializeIsRequired) { CoUninitialize(); } + if (_hwnd != NULL) { + DestroyWindow(_hwnd); + } + UnregisterClass(_wndClass.lpszClassName, _hInstance); } int32_t DeviceInfoDS::Init() { diff --git a/modules/video_capture/windows/device_info_ds.h b/modules/video_capture/windows/device_info_ds.h index 1b52645cde..dc7b9b1a24 100644 --- a/modules/video_capture/windows/device_info_ds.h +++ b/modules/video_capture/windows/device_info_ds.h @@ -93,6 +93,9 @@ class DeviceInfoDS : public DeviceInfoImpl { IEnumMoniker* _dsMonikerDevEnum; bool _CoUninitializeIsRequired; std::vector _captureCapabilitiesWindows; + HWND _hwnd; + WNDCLASS _wndClass; + HINSTANCE _hInstance; }; } // namespace videocapturemodule } // namespace webrtc