【音视频】实现windows视音频设备热插拔功能(5-1)

本文详细介绍了如何在Windows系统中实现摄像头、麦克风、扬声器等视音频设备的热插拔功能。通过创建DeviceDetector类,监测设备的GUID,启动监测线程并处理窗口消息。监测过程中,当设备发生热插拔时,会进行设备检查并通过回调通知相应操作。文章还提及了停止监测设备热插拔的流程。
摘要由CSDN通过智能技术生成

最近想完善视音频设备功能,所以研究下windows的热插拔实现。本篇主要介绍视音频设备,如摄像头、麦克风、扬声器等热插拔的代码实现。
新建一个DeviceDetector类来实现热插拔功能,如下:

1、开始监测设备热插拔

要监测的设备GUID

static GUID GUID_DEVINTERFACE_LIST[] =
{
   
	// KSCATEGORY_AUDIO
	{
    0x6994AD04, 0x93EF, 0x11D0,{
    0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 } },
	// GUID_DEVINTERFACE_USB_DEVICE
	{
    0xA5DCBF10, 0x6530, 0x11D2,{
    0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } } 
};

启动监测线程

int DeviceDetector::startDetect()
{
   
	if (m_detecting) {
   
		return ERROR_CODE_OK;
	}

	m_detecting = true;
	m_thread = std::thread(std::bind(&DeviceDetector::detecting, this));
	return ERROR_CODE_OK;
}

监测线程函数。获取摄像头、麦克风、扬声器设备列表,注册监测窗口并处理窗口消息。

void DeviceDetector::detecting()
{
   
	m_hwnd = createDevice();
	registerDevice(m_hwnd);

	VideoDevice::getCameraDevices(m_cameras);
	AudioDevice::getMicDevices(m_mics);
	AudioDevice::getSpeakerDevices(m_speakers);

	MSG msg;
	while (GetMessageA(&msg, m_hwnd, 0, 0) > 0) {
   
		TranslateMessage(&msg);
		DispatchMessageA(&msg);
	}
}

获取摄像头、麦克风、扬声器设备列表的实现详见《【音视频】获取音频设备-mmdeviceapi(八)》和《【音视频】获取视频设备-MMDeviceAPI&MONITORINFOEX(2-3)》。
下面是创建、注册监测窗口(隐藏窗口)实现。

HWND DeviceDetector::createDevice()
{
   
	WNDCLASSA wc;
	SecureZeroMemory(&wc, sizeof(wc));
	wc.lpszClassName = "__hcmdr_device_detector__";
	wc.lpfnWndProc = DeviceDetector::deviceChanged;
	RegisterClassA(&wc);

	HWND hwnd = CreateWindowA(wc.lpszClassName, "", 0, 0, 0, 0, 0, nullptr, nullptr,
		GetModuleHandleA(nullptr), nullptr);
	return hwnd;
}

void DeviceDetector::registerDevice(HWND hwnd)
{
   
	HDEVNOTIFY hDevNotify;
	DEV_BROADCAST_DEVICEINTERFACE_A notificationFilter;
	SecureZeroMemory(&notificationFilter, sizeof(notificationFilter));
	notificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE_A)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值