mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-06 19:26:39 +02:00
Add new VideoConference module for muting mic/cam (#11798)
* add new VideoConference module for muting mic/cam Co-authored-by: PrzemyslawTusinski <61138537+PrzemyslawTusinski@users.noreply.github.com> Co-authored-by: Niels Laute <niels.laute@live.nl>
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
#include "VideoCaptureDeviceList.h"
|
||||
#include "Logging.h"
|
||||
#include <mfapi.h>
|
||||
#include <Mfidl.h>
|
||||
|
||||
#include <wil/resource.h>
|
||||
#include <wil/com.h>
|
||||
|
||||
void VideoCaptureDeviceList::Clear()
|
||||
{
|
||||
for (UINT32 i = 0; i < m_numberDevices; i++)
|
||||
{
|
||||
CoTaskMemFree(m_deviceFriendlyNames[i]);
|
||||
if (m_ppDevices[i])
|
||||
{
|
||||
m_ppDevices[i]->Release();
|
||||
}
|
||||
}
|
||||
CoTaskMemFree(m_ppDevices);
|
||||
m_ppDevices = nullptr;
|
||||
if (m_deviceFriendlyNames)
|
||||
{
|
||||
delete[] m_deviceFriendlyNames;
|
||||
}
|
||||
|
||||
m_deviceFriendlyNames = nullptr;
|
||||
m_numberDevices = 0;
|
||||
}
|
||||
|
||||
HRESULT VideoCaptureDeviceList::EnumerateDevices()
|
||||
{
|
||||
HRESULT hr = S_OK;
|
||||
wil::com_ptr<IMFAttributes> pAttributes;
|
||||
Clear();
|
||||
|
||||
// Initialize an attribute store. We will use this to
|
||||
// specify the enumeration parameters.
|
||||
|
||||
hr = MFCreateAttributes(&pAttributes, 1);
|
||||
|
||||
// Ask for source type = video capture devices
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = pAttributes->SetGUID(
|
||||
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE,
|
||||
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG("VideoCaptureDeviceList::EnumerateDevices(): Couldn't MFCreateAttributes");
|
||||
}
|
||||
// Enumerate devices.
|
||||
if (SUCCEEDED(hr))
|
||||
{
|
||||
hr = MFEnumDeviceSources(pAttributes.get(), &m_ppDevices, &m_numberDevices);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG("VideoCaptureDeviceList::EnumerateDevices(): Couldn't SetGUID");
|
||||
}
|
||||
|
||||
|
||||
if (FAILED(hr))
|
||||
{
|
||||
LOG("VideoCaptureDeviceList::EnumerateDevices(): MFEnumDeviceSources failed");
|
||||
return hr;
|
||||
}
|
||||
|
||||
m_deviceFriendlyNames = new (std::nothrow) wchar_t*[m_numberDevices];
|
||||
for (UINT32 i = 0; i < m_numberDevices; i++)
|
||||
{
|
||||
UINT32 nameLength = 0;
|
||||
m_ppDevices[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &m_deviceFriendlyNames[i], &nameLength);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
HRESULT VideoCaptureDeviceList::GetDevice(UINT32 index, IMFActivate** ppActivate)
|
||||
{
|
||||
if (index >= Count())
|
||||
{
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
*ppActivate = m_ppDevices[index];
|
||||
(*ppActivate)->AddRef();
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
std::wstring_view VideoCaptureDeviceList::GetDeviceName(UINT32 index)
|
||||
{
|
||||
if (index >= Count())
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
return m_deviceFriendlyNames[index];
|
||||
}
|
||||
Reference in New Issue
Block a user