HWAVEIN m_hWaveIn;
这个输入设备的句柄还有效吗?waveInReset的输入参数判断下·
这个输入设备的句柄还有效吗?waveInReset的输入参数判断下·
解决方案 »
- 怎么提高硬盘的写入速度啊 帮帮忙啊 这个程序结构有没有问题?
- 向目标进程注入DLL用完之后再释放掉!
- 如何用VC60实现搜索文件的功能,针对文件名进行忽略大小写的模糊查找,
- 用vc写了个界面程序,发现vista系统下,当按下 ALT 键导致对话框窗口上的文字消失,这是什么原因呢?(附上代码)
- IPictureDisp怎么用?急
- 如何定制消息框(MessageBox),改变其背景色,并自画按钮?
- 问个关于MovieCollector的问题
- 关于如何穿过网关问题,请各位指教 ^_^。
- windows CE6.0 R3 版本购买 和软件集成问题 [嵌入开发(WinCE)]
- 如何做驱动程序
- debug模式下与release模式生成的exe有啥区别
- VS2010下状态栏显示字体颜色
http://www.codeproject.com/Articles/10648/recording-and-play-using-Waveform-audio-interface?msg=4231527#xx4231527xx
该程序在release模式下编译有问题,我在link选项里选择了不使用预编译头文件,然后将config.h和config.cpp中的内容都挪到了FINALSOUNDDlg.cpp文件中.
同样的能在WindowsXP下运行,但在windows 7中停止录音时就crash掉,而且此时也没热插拔麦克风。
这个问题困扰我很久了,希望各位能够帮忙啊!
回调函数有所不同:void CALLBACK AudioInProc(HWAVEIN hwi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{ switch ( uMsg )
{
case MM_WIM_DATA:
{
WAVEHDR *pWaveHdr = (WAVEHDR *)dwParam1;
CHI_PLAY_AudioIn *pAudioIn = (CHI_PLAY_AudioIn *)(pWaveHdr->dwUser); if (pAudioIn->m_bStartData)
{
if (pWaveHdr && hwi)
{
if (pWaveHdr->dwFlags & WHDR_DONE == WHDR_DONE)
{ if (pWaveHdr->dwBytesRecorded > 0)
{
CHI_PLAY_AudioBuffer buff(pWaveHdr->lpData, pWaveHdr->dwBytesRecorded);
pAudioIn->m_Audio_RB.RB_Write_X(buff.ptr.u8, buff.iByteLen, &(pAudioIn->m_u32Len));
waveInAddBuffer(hwi, pWaveHdr, sizeof(WAVEHDR));
}
}
}
}
}
break;
default:
break;
}
}
程序是在void CHI_PLAY_AudioIn::CloseData(void)中的m_mmr = waveInReset(m_hWaveIn)挂起的.
我的录音放音程序是写成dll动态连接库供主程序调用的,通过打印日志发现在waveinreset处挂起的。对于CodeProject上的录音放音程序在windows7调试时发现实在下面这一行
=>memcpy(unsigned char * 0x0029beb0, unsigned char * 0x00293de0, unsigned long 16384) line 171
waveInProc(HWAVEIN__ * 0x002d1580, unsigned int 960, unsigned long 0, unsigned long 2702712, unsigned long 0) line 332 + 31
....
但没发现这条信息有什么用处啊 什么171行 都是些无关的代码啊
我在网上找到很多使用窗口消息回调方式callback_window做的录音程序,这些在windows7下都没问题,而我需要做成dll,因此用回调函数的方式处理,再次感谢黑泡泡选手
http://topic.csdn.net/u/20090911/00/cefa6d16-dd57-4b8b-a7ec-24e3dc530f4b.html
http://social.msdn.microsoft.com/Forums/en/Vsexpressvcs/thread/c28d87cb-42b4-497b-a95f-02f146f6a0ed
我写了个测试程序,发现在回调函数中,
void CALLBACK CTestaudioDlg::waveInProc(
HWAVEIN hWaveIn,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2 )
{
CTestaudioDlg* pTemp = (CTestaudioDlg*)dwInstance;
switch (uMsg)
{
case WIM_CLOSE:
{
// waveInUnprepareHeader (pTemp->m_hWaveIn, pTemp->m_pWaveHdr1, sizeof (WAVEHDR)) ;
// waveInUnprepareHeader (pTemp->m_hWaveIn, pTemp->m_pWaveHdr2, sizeof (WAVEHDR)) ;
// SetEvent(pTemp->m_hEvent);
OutputDebugStr("CStdHKInterAudio::waveInProc++++++++++++++++++= closed\n");
break;
}
case WIM_DATA:
{
if (pTemp->m_bClosed)
{
OutputDebugStr(".............0 \n");
// waveInUnprepareHeader (pTemp->m_hWaveIn, (PWAVEHDR) dwParam1, sizeof (WAVEHDR)) ;
if (--pTemp->m_bufferRef==0)
{
// MMRESULT result = waveInClose(pTemp->m_hWaveIn);
OutputDebugStr(".............1 \n" );
SetEvent(pTemp->m_hEvent);
}
return;
}
((PWAVEHDR)dwParam1)->lpData;
int size = ((PWAVEHDR)dwParam1)->dwBytesRecorded;
pTemp->ProcessAudioData(((PWAVEHDR)dwParam1)->lpData,size);
waveInAddBuffer (pTemp->m_hWaveIn, (PWAVEHDR) dwParam1, sizeof (WAVEHDR)) ;
CString ss;
ss.Format("--------%d \n",size);
OutputDebugStr(ss);
}
break;
default:
{
OutputDebugStr(".............default \n" );
}
break;
}
}
只要一拔掉麦克风,回调上来的数据的size,int size = ((PWAVEHDR)dwParam1)->dwBytesRecorded;
这个值是一个非1280的值,然后通过打印发现,调用waveInAddBuffer 后,就一直在这个函数阻住了,后面的打印是不打印的,从而导致关闭的时候调用waveInReset也阻在那里,于是我在调用waveInAddBuffer 加个判断
if (size!=1280)
{
LOG_ERROR("CStdHKInterAudio::waveInProc,length error:"<<size);
return;
}
如果长度不对,则直接返回,不再调用waveInAddBuffer ,这样关闭时调用waveInReset时就没问题了
window7做的比较恶心,如果不插入耳麦,连waveInOpen都失败,
而且声音采集中间拔了的话,再插上耳麦,也不会再进入到采集回调函数中