最近接了一个棋牌游戏,在播放游戏声音的时候需要采用混音技术。
用原来的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会提示这样的错误,这个问题非常急,希望高手们帮忙解决为谢。
用原来的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会提示这样的错误,这个问题非常急,希望高手们帮忙解决为谢。
解决方案 »
- MsChart 在VS2008 C++和C#中的的表现为什么不一样???
- 求助,BCGControlBar执行出错
- 很简单的COM程序与输入法切换键冲突
- SDK中CEdit类的创建
- 关于Tab control的问题.
- 大家来讨论一下用UDP做有大量客户端的ChatServer的方法!
- 候捷与候俊杰是同一人吗
- 我在编译我的Win CE程序时,报这样的错:“TimeOut:Failed to connect to the device”,该怎么办?
- 知道一个计算机的IP地址,怎么知道该计算机使用的操作系统呢
- 寻求帮助
- 用BCG 如何动态设置 Tooltip
- 采用UDP,两个发送端,一个接收端,怎么做才能不丢包?
以下是用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;
}
1.看DShow SDK 的范例
2.可以尝试用SDL http://www.libsdl.org/, ffmpeg的播放器也是用SDL做的