Qt|麦克风设备热插拔检测功能

最近在开发的项目中用到了麦克风进行语音识别功能,此时就需要知道麦克风是否被连接。今天我为大家分享一下,如何实时检测麦克风是否连接。

在Qt的想要QAudioDeviceInfo类中,没有实时检测的方法,那么对于实时检测麦克风,那一定是用开线程的方式,在下面的Demo中,我设定的是1s检测一次。

功能讲解

开发环境:windows,VS2019 + Qt 5.15.2

1:设置连接状态

麦克风的连接状态,分为两种:连接、断开。

为了后续赋值方便,我才用了枚举的方式

enum ENUM_MicrophoneState
{
	MicrophoneState_successful, //连接成功
	MicrophoneState_offline, //麦克风中途掉线
};

2:开启、关闭线程

开启线程检测

m_bStartThread = true; //开启线程检测
//开启线程,检测麦克风的热插拔效果
std::thread pThread = std::thread(&MicrophoneHostSwap::ThreadDetectionMicrophoneState, this);
pThread.detach();

开线程的方式,我才用了C11的方法,主要是因为我不习惯用Qt的方式(╮(╯▽╰)╭)

关闭线程检测

//取消,麦克风监听
m_bStartThread = false; 
std::lock_guard<std::mutex> lck(m_mutexData);  //C11用法

3:线程代码设置

void MicrophoneHostSwap::ThreadDetectionMicrophoneState()
{
	while (true)
	{
		std::lock_guard<std::mutex> lck(m_mutexData);  //C11用法
		if (m_bStartThread == false)
		{
			break;
		}
		//检测麦克风是否实时存在
		QAudioDeviceInfo deviceTemp = QAudioDeviceInfo::defaultInputDevice();
		bool bSupport = deviceTemp.isFormatSupported(m_pFormatIn);
		if (bSupport == false)
		{
			//当前设备不支持麦克风录制
			if (m_stCurrentDevice.deviceName().length() != 0)
			{
				//说明:之前已经存在有效地麦克风,此时没有获取到有效地麦克风数据,麦克风已掉线!
				m_enumMicrophoneState = MicrophoneState_offline;
				emit Msg_SendAIModel_MicrophoneConnectState(MicrophoneState_offline); //通知外界,麦克风断开连接
			}
			m_stCurrentDevice = QAudioDeviceInfo(); //此时,将当前存储的麦克风最新数据,设置为默认
		}
		else
		{
			//当前设备支持麦克风
			if (m_stCurrentDevice.deviceName().length() == 0)
			{
				//查询到了有效地麦克风,并且之前没有连接过有效的麦克风,进行数据赋值
				m_stCurrentDevice = deviceTemp;
				m_enumMicrophoneState = MicrophoneState_successful;
				emit Msg_SendAIModel_MicrophoneConnectState(MicrophoneState_successful);
			}
		}

		Sleep(1000); //间隔一秒进行一次检测
	}
}

以上就是实现的核心代码了!

具体的代码内容,这个链接里面哟:热插拔核心代码

我是糯诺诺米团,一名C++开发程序媛~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糯诺诺米团

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值