Skip to content

Add feature to detect device's remove/insert events. - #30

Open
walker-WSH wants to merge 2 commits into
obsproject:masterfrom
walker-WSH:dshow_InsertRemove_branch
Open

Add feature to detect device's remove/insert events.#30
walker-WSH wants to merge 2 commits into
obsproject:masterfrom
walker-WSH:dshow_InsertRemove_branch

Conversation

@walker-WSH

@walker-WSH walker-WSH commented Apr 28, 2021

Copy link
Copy Markdown

Description

Add feature to detect device's remove/insert events. When device is inserted, win-dshow can restore camera when received event.
However, to be enable to detect remove/insert, we must success to initialize dshow firstly.
Besides, it seems insert/remove events won't be sent for audio filter.

Motivation and Context

Help win-dshow to restore camera when device is inserted.

How Has This Been Tested?

Tested on Window10 with Legitech C920

Types of changes

New feature (non-breaking change which adds functionality)

Checklist:

  • My code has been run through clang-format.
  • I have read the contributing document.
  • My code is not on the master branch.
  • The code has been tested.
  • All commit messages are properly formatted and commits squashed where appropriate.
  • I have included updates to all appropriate documentation.

@walker-WSH

walker-WSH commented Apr 28, 2021

Copy link
Copy Markdown
Author

After merging this PR, we can improve win-dshow to restore camera automatically:

1619590349

@walker-WSH

Copy link
Copy Markdown
Author

@jp9000 Request your review

@dodgepong

Copy link
Copy Markdown
Member

This will not be reviewed until some time after v27 is released.

@walker-WSH

Copy link
Copy Markdown
Author

This will not be reviewed until some time after v27 is released.

Got it!

@walker-WSH

Copy link
Copy Markdown
Author

Hmm~
will this PR be merged ?

@jp9000

jp9000 commented Jan 18, 2022

Copy link
Copy Markdown
Member

sorry about that, I'll try to get around to it sooner than later, it's just easy for things to slide (especially when they're on repositories other than the main repository)

@walker-WSH

Copy link
Copy Markdown
Author

@PatTheMav @RytoEX
can you help review this PR ? thanks~

@PatTheMav PatTheMav left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Conceptually this looks correct as far as the Win32 APIs are concerned, so I got mostly code style nits.

Might need someone else to debug this on an actual Windows machine with a DirectShow device.

Comment thread source/device.hpp

HDevice();
// handle insert/remove events
HANDLE msgEvt;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
HANDLE msgEvt;
HANDLE mediaEvent;

Comment thread source/device.hpp
HDevice();
// handle insert/remove events
HANDLE msgEvt;
HANDLE exitEvt;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
HANDLE exitEvt;
HANDLE exitEvent;

Comment thread source/device.hpp
// handle insert/remove events
HANDLE msgEvt;
HANDLE exitEvt;
HANDLE msgThread;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
HANDLE msgThread;
HANDLE mediaEventThread;

Comment thread source/device.hpp
~HDevice();

// handle insert/remove events
static unsigned __stdcall EventThread(void *pParam);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why use a static class function rather than a free-standing function in an anonymous namespace for this? Also why use _beginthreadex over the CreateThread API?

Comment thread source/device.cpp
Comment on lines +78 to +83
HANDLE events[] = {
exitEvt, // must be first one
msgEvt,
};

DWORD count = sizeof(events) / sizeof(HANDLE);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The array is static and the count never changes, so an std::array could be used, which has a size() method to get the count for WaitForMultipleObjects and the data() method to get a raw pointer.

Comment thread source/device.cpp
Comment on lines +96 to +97
#define FLAG_REMOVE_DEVICE 0
#define FLAG_INSERT_DEVICE 1

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace with constexpr int.

Comment thread source/device.cpp
Comment on lines +118 to +119
if (WAIT_OBJECT_0 == WaitForSingleObject(exitEvt, 0))
return false;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The idea here is to check whether the exit event was signalled after the current media event and thus make the media event thread exit?

Comment thread source/device.cpp

void HDevice::StopEventThread()
{
::SetEvent(exitEvt);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is it necessary to use the global scope identifier explicitly here and for other functions like ResetEvent above?

Comment thread source/dshow-base.cpp
}

if (pevent) {
hr = graph->QueryInterface(IID_IMediaEventEx, (void **)&event);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
hr = graph->QueryInterface(IID_IMediaEventEx, (void **)&event);
hr = graph->QueryInterface(IID_IMediaEventEx, static_cast<void **>(&event));

Use static_cast instead of C-style casts in C++ code.

Comment thread source/device.cpp

unsigned __stdcall HDevice::EventThread(void *pParam)
{
HDevice *self = reinterpret_cast<HDevice *>(pParam);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it necessary to use reinterpret_cast here? Would static_cast suffice?

@github-project-automation github-project-automation Bot moved this from Ready For Review to Requires Changes in 33.0 Release Tracker Aug 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Requires Changes

Development

Successfully merging this pull request may close these issues.

7 participants