HWAVEIN m_hWaveIn;
这个输入设备的句柄还有效吗?waveInReset的输入参数判断下·
这个输入设备的句柄还有效吗?waveInReset的输入参数判断下·
解决方案 »
- 在VC++工程中链接cximage.lib文件后,运行结果只有空白对话框,知道的帮帮忙!谢谢!
- 求救:在VC2008下,自己生成了一个静态库文件DataOperator.lib,在另外的工程只使用时,编译时出现错误:LNK1104: 无法打开文件“DataOperator.lib”,
- 短信AT指令,如何放弃当前输入,进入新指令输入状态
- 【攒人品散分】为排队买票攒人品~~~
- waveOutWrite的问题
- CListCtrl的Item选中如何能继续保持?
- 有谁知道从Dialog中获得HWND,方法是什么
- 在从CWinThread继承的线程类中使用SetTimer的问题!好困惑~~~
- 解决这个问题我送200分
- visual c++ QQ群
- 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都失败,
而且声音采集中间拔了的话,再插上耳麦,也不会再进入到采集回调函数中