HWAVEIN m_hWaveIn;
这个输入设备的句柄还有效吗?waveInReset的输入参数判断下·

解决方案 »

  1.   

    参数有做检测,句柄有效。热插拔在XP下没有任何问题,而且waveinopen后插入麦克风,能够进行正常的通话,但在windows7下就不能进行正常通话了,关闭时程序崩溃(打印日志发现window7和windowsXP没有任何差别,就是windows7下在调用waveInReset/waveOutReset时崩溃的)。不处理录音,放音的回调函数的话当然不会有此问题了,网上很多都说是wave系列函数的死锁问题,不过我在waveinreset/waveoutreset时,发现回调函数并没调用,因此按网上所说的通过置标志位在waveinreset/waveoutreset时跳过回调函数处理不起作用。
      

  2.   

    CodeProject上的一个录音放音程序也有类似问题。链接如下:
    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掉,而且此时也没热插拔麦克风。
    这个问题困扰我很久了,希望各位能够帮忙啊!
      

  3.   

    我的录音过程跟如下链接类似http://www.hackchina.com/en/r/7960/HI_PLAY_AudioIN.cpp__html.
    回调函数有所不同: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)挂起的.
      

  4.   

    Call Stack Crash到什么地方?输出什么警告信息了吗?
      

  5.   

    十分感谢黑泡泡选手的回复。
    我的录音放音程序是写成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行 都是些无关的代码啊
      

  6.   

    嗯,大概跟我的错误差不多,我也在win7上试验了,报了 “栈溢出” 的错误,config.cpp的114行CopyMemory处崩溃·我这儿里有内存分配失败的警告信息,我怀疑是他分配内存realoc的地方有缺陷,你留一个邮箱,我给你发一个类似的代码,你可以参考一下·
      

  7.   

    好的 十分感谢 
    我在网上找到很多使用窗口消息回调方式callback_window做的录音程序,这些在windows7下都没问题,而我需要做成dll,因此用回调函数的方式处理,再次感谢黑泡泡选手
      

  8.   

    我在csdn和msdn上也找到了跟我类似情况的,但没有正确的解答
    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
      

  9.   

    我也遇到这个问题,现在已经解决了,
    我写了个测试程序,发现在回调函数中,
    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都失败,
    而且声音采集中间拔了的话,再插上耳麦,也不会再进入到采集回调函数中
      

  10.   

    黑泡泡选手  和  usb_usb  你们好,我也遇到同样的问题,你们能发一份代码给我参考一下吗?邮箱:[email protected]。再次感谢各位在这里面的指点
      

  11.   

    其实很简单(用线程),别用回调, NND 回调就是一个坑
      

  12.   

    16#正解,用线程就没这个问题了,感谢qicaofeng。解决我搞了2天的问题