当前位置: 首页 > article >正文

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++开发程序媛~


http://www.kler.cn/a/470941.html

相关文章:

  • 使用 Conda创建新的环境遇到的问题
  • 历代iPhone运行内存大小和电池容量信息
  • 设计模式——泛型单例类
  • Leetcode 3414. Maximum Score of Non-overlapping Intervals
  • kafka使用以及基于zookeeper集群搭建集群环境
  • Spring AMQP ----注解篇
  • 网络安全领域中PHP防范常用语法
  • 安卓H5项目通过adb更新H5项目
  • jQuery二次元风格右键菜单插件HTML源码
  • C++ Latch 和 Barrier: 新手指南
  • 【网络云SRE运维开发】2025第1周-每日【2025/01/04】小测-【第5章 交换机的工作原理】理论和实操
  • 用c++构建的actor导致整个ue5蓝图项目打不开。
  • java 转义 反斜杠 Unexpected internal error near index 1
  • (leetcode算法题)371. 两整数之和
  • xilinx的高速接口构成原理和连接结构及ibert工具的使用-以k7 GTX为例
  • Ubuntu-bk搭建
  • springboot547产业园区智慧公寓管理系统(论文+源码)_kaic
  • PHP如何删除数组中的特定值?
  • 小R的蛋糕分享
  • 企业级Nosql数据库和Redis集群
  • 查找路由器的管理后台ip【通用找IP】
  • 在高德地图上加载3DTilesLayer图层模型/天地瓦片
  • excel填充十六进制
  • 2025年京东云快速搭建幻兽帕鲁联机服务器教程
  • STM32-笔记18-呼吸灯
  • docker 基本使用