最近接了一个棋牌游戏,在播放游戏声音的时候需要采用混音技术。
用原来的PlaySound同步方式声音是会一条接一条跟着发出来的,有时候会导致游戏都开始了,上一把的声音还没有结束。
为了解决问题,用到了多线程和MCI。
创建了一个sound线程,线程函数如下:
UINT sound(LPVOID pParam) //播放线程
{
OutputDebugString("---------------------------------\n");
SoundPath * s_SoundPath = (SoundPath *)pParam;
char pTmp[512] ;
wsprintf(pTmp,"%s",s_SoundPath->p);
char  seps[]=",";  
char  *token,*nextToken;  
//CString ousound; 
token  =  strtok_s(pTmp,seps ,&nextToken);  
while( token  !=  NULL  )  

 CFileFind   finder;     
if( !finder.FindFile(  (LPCSTR)token  )) return 0;
//AfxMessageBox(((LPCSTR)token));
HWND hWnd;
hWnd = MCIWndCreate(NULL,NULL,WS_MINIMIZE,(LPCSTR)token);
MCIWndSetRepeat(hWnd,true);
int ilen;
ilen = MCIWndGetLength(hWnd);
//if(ilen==0) {AfxMessageBox((LPCSTR)token);}
MCIWndPlay(hWnd);
Sleep(ilen-10);
MCIWndDestroy(hWnd); token  =  strtok_s(NULL,  seps ,&nextToken );  
}   
//sndPlaySound(tmlSound,SND_ASYNC|SND_FILENAME);
return 0;

可是现在问题来了,有时候用户会尔偶出现“MCI错误:找不到指定的文件或路径不对”之类的问题,大虾们一定注意到线程函数里面我加了一个CFileFind   finder;     
if( !finder.FindFile(  (LPCSTR)token  )) return 0; 语句,意思就是没有发现该文件都不提示错误,但是,现在我不明白的就是为什么MCI会提示这样的错误,这个问题非常急,希望高手们帮忙解决为谢。

解决方案 »

  1.   

    昨天用DirectSound做混音,可是仍然有问题,有时候会出现下家声音无法完全播放出来(就像有人想要说话,却又说出不来那种样子),2楼说的应该有道理,问题解决了即给分,谢谢你们!
    以下是用dsound做的源码:
    UINT sound(LPVOID pParam) //播放线程
    {
    SoundPath * m_SoundPath1 = (SoundPath *)pParam;
    char pTmp[512] ;
    wsprintf(pTmp,"%s",m_SoundPath1->p);
    char  seps[]=",";  
    char  *token,*nextToken;  
    token  =  strtok_s(pTmp,seps ,&nextToken);  
    while( token  !=  NULL  )  
    {
    CDSList DSlist1;
    if(!DSlist1.Init())
    AfxMessageBox("声卡初始化失败");
    DSlist1.AddNewBuffer(pTmp);
    DSlist1.PlayBuffer(0,1);
    Sleep(DSlist1.m_DSBuffer->m_WavTime); //时间到了
    token  =  strtok_s(NULL,  seps ,&nextToken );  
    }
    return 0;

      

  2.   

    Dlist析构的时候会ReleaseBuffer。
      

  3.   

    如果你对于回放代码书写没有信心,建议如下:
    1.看DShow SDK 的范例
    2.可以尝试用SDL http://www.libsdl.org/, ffmpeg的播放器也是用SDL做的