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