windwos下检测3.5毫米耳机插入

由于产品的一个新需求,所以开始研究耳机检测,网络上大部分的代码都是通过com接口实现的。我也是使用这总方法做检测的,继承了IMMNotificationClient类在OnPropertyValueChanged这个方法中收到插拔耳机的回调。但是你一定会发现一个问题就是消息太多了。根本无法识别哪一个回调是插耳机哪一个是拔耳机。我当时的想法就是通过这个消息作为回调触发。而检测耳机是否插拔在其他的地方处理。我自己实现一个检测耳机是否插拔的函数。

int CMMNotificationClientModel::IsCurInsertEarPhone()
{
	IKsJackDescription *pJackDesc = NULL;
	HRESULT hr = S_OK;

	if (!_pPart)
		return -1;

	//获取描述外接设备信息
	hr = _pPart->Activate(CLSCTX_INPROC_SERVER, __uuidof(IKsJackDescription), (void**)&pJackDesc);
	if (hr != S_OK)
	{
		return -1;
	}
	UINT num = 0;
	pJackDesc->GetJackCount(&num);
	//wprintf_s(_T("GetJackCount: %d\n"), num);
	for (UINT j = 0; j < num; ++j)
	{
		KSJACK_DESCRIPTION ksjack_desc = { 0 };

		hr = pJackDesc->GetJackDescription(j, &ksjack_desc);
		if (hr == S_OK)
		{
			//wprintf_s(_T("Jack%d PortConnection: %d\n"), j + 1, ksjack_desc.PortConnection);  //端口类型
			//wprintf_s(_T("Jack%d ConnectionType: %d\n"), j + 1, ksjack_desc.ConnectionType); //连接类型
			//wprintf_s(_T("Jack%d IsConnected: %d\n\n"), j + 1, ksjack_desc.IsConnected); //连接状态
			if (ksjack_desc.IsConnected)
			{
				if (ksjack_desc.ConnectionType == eConnType3Point5mm)//连接类型
				{
					SAFE_RELEASE(pJackDesc)
						m_iType = 1;
						return 1;
				}
			}
		}
	}
	m_iType = 0;
	return 0;
}
通过这个函数可以查询耳机是否插入。其他代码在网上都能查到,如果有什么不明白的可以提问,具体的例子可以可以参考https://download.csdn.net/download/u011569253/10113274

猜你喜欢

转载自blog.csdn.net/u011569253/article/details/80282398