在windows平台下使用wave API进行录音播放时,设备插拔会导致程序死锁而崩溃;通过调试程序发现在程序运行过程中插拔设备后会阻塞在回调函数中的任何调用中,也即发生了死锁。所以得出结论是 采用回调用的方法,当你异常拔插设备的时候,很容易导致程序死锁。最后改用线程处理,设备插拔死锁的问题解决了。
下面是录音采集使用线程:
//开启音频采集
MMRESULT mmReturn = ::waveInOpen( &m_hRecord, inAudioId/*WAVE_MAPPER*/,
&m_WaveFormatEx, threadid, 0, CALLBACK_THREAD);
下面是音频输出:
//打开音频输出设备
mmReturn = ::waveOutOpen( &m_hPlay, OutAudioId/*WAVE_MAPPER*/,
&m_WaveFormatEx, threadid, 0, CALLBACK_THREAD);
完整实现工程下载地址:https://download.youkuaiyun.com/download/qq_28581781/11845838
使用Qt Creator编译时,需要添加winmm.lib user32.lib