C++播放wav音乐和音效

我的恶魔城BOSS关的代码基本上快完成了,虽然还有许多恼人的细节需要完善,比如血槽拉,跳跃攻击拉,Game over的画面拉,Boss出现和死亡后的过场啦。本来想在全部完成后把全部代码贴上来做纪念,但是已经有点迫不及待了。毕竟编了3个月,是我一边打工,一边准备考试的艰难岁月的留念。

我曾经把它想象成一个咒语:当我把全部代码写完的时候,我的I-20表格就会寄到,也可以顺利入学。现在I-20表格还在路上,而软工9月3日才开学。好担心啊,现在把这些代码贴上来,希望它们可以保佑我。                        

编完这个游戏就表明我的2D的ARPG的编程就可以过关一部分了。虽然我还很菜,进展也满慢的,但是也是会了一些东西拉。技术突破不是很多,会使用ATI的结构,会用C++贴图,明白时间间隔的原理即可。比较大的技术问题是如何播放声音,在网上查了好久发现也没有一端可以使用的完整代码,大多数文章综合性很强,但是使用的代码的方法却一代而过,很不适合我这样的菜鸟。所以咬咬牙把书上如何使用directsound的章节看了,我把类封装的代码去掉了,综合了一下发现竟然可以顺利播放,虽然我不能解释每句代码的意思,但是对于菜鸟这样就够了。

Directsound比soundplay()好的地方就是可以混音,就是可以同时播放几种声音,这样就可以在播放背景音乐的时候播放音效了。

首先,将下面的库添加到工程中comctl32.lib dxerr9.lib winmm.lib dsound.lib dxguid.lib odbc32.lib odbccp32.lib。(不是都用的到)

在头文件中添加:

#include <mmsystem.h>
#include <dsound.h>

在窗口程序中添加:

//全局变量声明中添加

//==============directsound相关变量=========================

LPDIRECTSOUND pDS; //声明DirectSound对象指针,声明主缓冲区指针,声明次级缓冲区指针
HRESULT result; //声明HRESULT类型变量
LPDIRECTSOUNDBUFFER pPBuf,pSBuf[3];
DSBUFFERDESC desc; //声明描述结构
MMCKINFO ckRiff,ckInfo; //Riff区块和子区块的信息
MMRESULT mmresult;
HMMIO hmmio; //打开的多媒体文件
DWORD size,bytesAudio; //实际资料的大小,存储区要存入资料的长度
LPVOID pAudio; //指向缓冲区开始记录资料的地址
WAVEFORMATEX swfmt;

//在BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)函数中添加

//=====================directsound初始化==================

result=DirectSoundCreate(NULL,&pDS,NULL); //建立DirectSound对象

result=pDS->SetCooperativeLevel(hWnd,DSSCL_PRIORITY); //hWnd为应用程序主窗口

memset(&desc,0,sizeof(desc)); //清空结构内容
desc.dwSize=sizeof(desc);
desc.dwFlags=DSBCAPS_PRIMARYBUFFER;
desc.dwBufferBytes=0;
desc.lpwfxFormat=NULL;
result=pDS->CreateSoundBuffer(&desc,&pPBuf,NULL);

pSBuf[0]=CreateBuffer("wing.wav"); //要播放的wav文件,煽动翅膀的音效
pSBuf[1]=CreateBuffer("thunder.wav"); //打雷音效
pSBuf[2]=CreateBuffer("thunder.wav"); //打雷2音效

//*****************自定义函数*********************

LPDIRECTSOUNDBUFFER CreateBuffer(char * filename)
{
LPDIRECTSOUNDBUFFER buf;
hmmio = mmioOpen(filename, NULL, MMIO_ALLOCBUF|MMIO_READ );

ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');

mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);

ckInfo.ckid = mmioFOURCC('f','m','t',' ');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt));
mmresult = mmioAscend(hmmio,&ckInfo,0);
ckInfo.ckid = mmioFOURCC('d','a','t','a');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);

size = ckInfo.cksize;
memset( &desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;
desc.dwBufferBytes = size;
desc.lpwfxFormat = &swfmt;
result = pDS->CreateSoundBuffer( &desc, &buf, NULL );

result = buf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);

mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);

result = buf->Unlock(pAudio,bytesAudio,NULL,NULL);

mmioClose(hmmio,0);
return buf;
}

之后,比如需要播放扇动翅膀的音效,就在需要播放音乐或者音效的地方加入 pSBuf[1]->Play(0,0,0);

 

原文链接: https://www.cnblogs.com/lzhitian/archive/2012/02/12/2347684.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++播放wav音乐和音效

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/41450

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 下午6:17
下一篇 2023年2月8日 下午6:19

相关推荐