解决方案 »

  1.   

    这个 wdmaud.drv 文件是微软 WDM Audio driver mapper 驱动程序。从你给出的截图来看,像是程序的收尾工作没有做好,导致程序崩溃。建议楼主贴出相关代码。
      

  2.   

    程序中使用了一个线程播放已经保存在list中的数据
    节点结构体是包含:
    nLen;     \\ 音频数据长度
    Data[640];  \\ 音频数据
    UINT PlaySoundProc(LPVOID lpParam)
    {
    HWAVEOUT        hwo;
        WAVEHDR         wh;
        WAVEFORMATEX    wfx;
        CEvent          wait;    unsigned long frames = 0; 
        unsigned long pos = 0;
    unsigned long playTimes = 0;    int ret = 0 ;
    HI_U8 buf[1 << 16];
    HI_U8 tempBuf[1 << 16]; memset(buf, 0, sizeof(buf));
    memset(tempBuf, 0 ,sizeof(tempBuf));

    wfx.cbSize = ((WAVEFORMATEX*)lpParam)->cbSize;
    wfx.nAvgBytesPerSec = ((WAVEFORMATEX*)lpParam)->nAvgBytesPerSec;
    wfx.nBlockAlign = ((WAVEFORMATEX*)lpParam)->nBlockAlign;
    wfx.nChannels = ((WAVEFORMATEX*)lpParam)->nChannels;
    wfx.nSamplesPerSec = ((WAVEFORMATEX*)lpParam)->nSamplesPerSec;
    wfx.wBitsPerSample = ((WAVEFORMATEX*)lpParam)->wBitsPerSample;
    wfx.wFormatTag = ((WAVEFORMATEX*)lpParam)->wFormatTag;    
        ret = waveOutOpen(&hwo, WAVE_MAPPER, &wfx, (ULONG)(wait.m_hObject), 0L, CALLBACK_EVENT); BOOL bPlay = FALSE;
    list<G711u_FrameData>::iterator iter = g_lstFrameData.begin(); while ( !g_lstFrameData.empty())
    {
    memcpy(tempBuf + pos, iter->Data, iter->nLen);
    pos += iter->nLen;
    frames ++;
    if ((pos + iter->nLen) > sizeof(tempBuf) || 1 == g_lstFrameData.size())
    {
    // 播放一次数据
    memcpy(buf, tempBuf, pos);
    wh.lpData = (LPSTR)buf;
    wh.dwBufferLength = pos;
    wh.dwFlags = 0L;
    wh.dwLoops = 1L;
    bPlay = TRUE;
    waveOutPrepareHeader(hwo, &wh, sizeof(WAVEHDR));
    waveOutWrite(hwo, &wh, sizeof(WAVEHDR));
    WaitForSingleObject(wait.m_hObject, INFINITE);

    playTimes ++;
    frames = 0;
    pos = 0;
    }
    // 删除list上头结点那一帧数据
    g_lstFrameData.pop_front();
    iter = g_lstFrameData.begin();
    } if (bPlay)
    {
    waveOutUnprepareHeader(hwo, &wh,sizeof(WAVEHDR));
    } waveOutClose(hwo);
    return 0;
    }
      

  3.   

    更新了系统声卡驱动之后提示的错误又变成查看问题详细信息展开后如下:问题签名:
      问题事件名称: APPCRASH
      应用程序名: testG711uPlayer.exe
      应用程序版本: 1.0.0.1
      应用程序时间戳: 534cfe54
      故障模块名称: msvcrt.dll
      故障模块版本: 7.0.7601.17744
      故障模块时间戳: 4eeaf722
      异常代码: c0000005
      异常偏移: 00009b60
      OS 版本: 6.1.7601.2.1.0.256.1
      区域设置 ID: 2052
      其他信息 1: 0a9e
      其他信息 2: 0a9e372d3b4ad19135b953a78882e789
      其他信息 3: 0a9e
      其他信息 4: 0a9e372d3b4ad19135b953a78882e789联机阅读隐私声明:
      http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0804如果无法获取联机隐私声明,请脱机阅读我们的隐私声明:
      C:\Windows\system32\zh-CN\erofflps.txt
      

  4.   

    c0000005 访问非法地址, vs打开异常c0000005捕捉 调试下
      

  5.   


    单步声音播放结束的时候, 出现问题的时候显示的调用堆栈是内核调用。堆栈上没有显示到API函数上。看不到错在调用错误的哪儿?
      

  6.   


    屏蔽了 
     waveOutWrite 
    和 
    WaitForSingleObject(wait.m_hObject, INFINITE);
     两行程序没有发生异常,说明程序问题可能出在 wait 这个CEvent上,但是确实不知道咋回事儿,
    方便 QQ 指点一下吗 ?  我 QQ : 735425967 谢谢。
      

  7.   

    waveOutWrite  有没有错误处理.
    初步判断是这个函数执行失败, 而你没有判断就直接wait.
      

  8.   

    感谢 xiaohuh421 的 指导, 程序在结束时候使用那个waveOutClose之前没有使用 waveOutReset 。结束时候应该写成
    if (bPlay)
    {
    waveOutUnprepareHeader(hwo, &wh, sizeof(WAVEHDR));
    }
    waveOutReset(hwo);
    waveOutClose(hwo);
    return 0;
    }