win7拔插耳机导致录音程序出错

a407790089 2015-08-21 10:43:40
我这边需要用c#开发一个录音软件,然后用winmm.dll 和directSound分别做了两个Demo
结果发现在WIN7系统下会有一个BUG

就是在录音过程中,如果拔插录音输入设备(例如耳麦),就会到只录音出现问题。
例如原本录制10秒 然后拔掉耳机,即使再次插上耳机此后的所有录音都将失败,只能保留前10秒的录音。

因为之前的DEMO分别用的是windows的音频组建 directx的声音组建
所以初步怀疑这是WIN7系统本身由于拔插设备导致硬件识别有问题的BUG。

但是苦寻两天,仍然找不到解决方案。
求论坛内各位大神帮忙指点迷津。
换组建或者利用某些方法解决拔插问题都可以。
非常感谢
...全文
148 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2015-08-21
  • 打赏
  • 举报
回复
如果你就是要直接访问硬件,那么硬件出问题的情况就必须自己写代码处理
於黾 2015-08-21
  • 打赏
  • 举报
回复
你应该放弃directx组件,而使用更高级的,.net封装好的音频对象 直接去访问硬件设备,那么设备被拔掉了,当然会引发异常
_lee_chong 2015-08-21
  • 打赏
  • 举报
回复
你这问题我以前也遇到过,应该不是所有电脑都会这样,我那时候是公司里所有戴尔的电脑都会这样;只要没插耳机就会出现找不到设备的问题,导致一系列的错误; 因为我是在播放声音,我那时候的处理: 步骤: 1,调用播放相关的初始化函数初始化 waveOutOpen或者DirectSound;如果没有耳机,会初始化失败, 失败了相关的句柄或者指针自然是null,假设 DirectSound初始化的是 pDirectSound8 ,waveOut初始化的是 m_hWaveOut; 2,play播放函数判断前面 初始化的结果哪套接口初始化成功就调用谁; 因为有可能初始化的时候有耳机,播放的时候突然没有,所以当两个指针都为null或者调用播放失败的时候,转入timer空跑一次;也就是说当初始化或者播放过程中一旦有出现没有耳机导致播放失败了,都会跳入timer去; 3,timer的处理函数中,如果一直正常则不会到这步,否则,在timer的处理函数中,一方面假设当前播放是成功的将相关的变量保持正常的递增下去,一方面调用一次初始化函数,这样如果耳机再次插上,在下次play的时候,依然能正常播放; 我是播放你是录制,可以参考下逻辑 以下是伪代码

// 声音播放相关初始化函数
void init()
{
	// pDirectSound8 初始化

	// m_hWaveOut 初始化
}

// 每秒数据的播放
void play(void* data, int dataSize)
{
	BOOL isok = FALSE;
	if(pDirectSound8) {
		// 播放无异常 isok = TRUE;
	} else if (m_hWaveOut) {
		// 播放无异常 isok = TRUE;
	}

	if(!isok) {
		// 播放异常开启timer延迟在1秒后触发,模拟播放1秒数据成功
		SetTimer
	}
}

// 定时器
static void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
	// 关闭当前timer
	KillTimer(hWnd, nTimerid);

	// 再次初始化
	init();
	
	// 调用播放完成处理函数
	OnWaveDone();
}

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧