⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mydsound.cpp

📁 坦克大战游戏.很值得学习的东东.希望对大家有帮助
💻 CPP
字号:
// MyDSound.cpp: implementation of the MyDSound class.
//
//////////////////////////////////////////////////////////////////////

#include "MyDSound.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MyDSound::MyDSound()
{

}

MyDSound::~MyDSound()
{

}

bool MyDSound::InitDSound(HWND ghWnd)
{
//===================建立DirectSound对象==================================================================
    result = DirectSoundCreate(NULL,&pDS,NULL);  
	if(result != DS_OK)
	{MessageBox(GetFocus(),"建立DirectSound对象失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//======================设置程序协调层级==================================================================
    result = pDS->SetCooperativeLevel(ghWnd,DSSCL_PRIORITY);
	if(result != DS_OK)
	{MessageBox(GetFocus(),"设置程序协调层级失败!","错误!",MB_OK|MB_ICONHAND);return false;}
//=========================建立主缓冲区===================================================================
	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 );
	if(result != DS_OK)
	{MessageBox(GetFocus(),"建立主缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
//=========================设定播放格式====================================================================
	memset( &pwfmt,0, sizeof(pwfmt) );
    pwfmt.wFormatTag      = WAVE_FORMAT_PCM;
    pwfmt.nChannels       = 2;           //播放声道
    pwfmt.nSamplesPerSec  = 44100;       //播放频率
    pwfmt.wBitsPerSample  = 16;          //位  
    pwfmt.nBlockAlign     = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels;
    pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;
    result = pPBuf->SetFormat(&pwfmt);   //设置播放格式   
	if(result != DS_OK)
	{MessageBox(GetFocus(),"设定播放格式失败!","错误!",MB_OK|MB_ICONHAND);}

	//CreateBuffer("Music\\menu.WAV",1);
	//CreateBuffer("Music\\butt_press.wav",0);

	return true;
}

LPDIRECTSOUNDBUFFER MyDSound::CreateBuffer(char *filename,int n)
{
//	LPDIRECTSOUNDBUFFER buf;
//=====================读取文件内容====================================================================
	hmmio = mmioOpen(filename, NULL, MMIO_ALLOCBUF|MMIO_READ );                      
    if(hmmio == NULL){MessageBox(GetFocus(),"文件不存在!","错误!",MB_OK|MB_ICONHAND);}  //判断是否为空
	ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
//设置文件类型
	mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
//查找类型
    if(mmresult != MMSYSERR_NOERROR)
	{MessageBox(GetFocus(),"文件格式错误!","错误!",MB_OK|MB_ICONHAND);}  
//设置区块类型
	ckInfo.ckid = mmioFOURCC('f','m','t',' ');  
	mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//查找区块
    if(mmresult != MMSYSERR_NOERROR)
	{MessageBox(GetFocus(),"文件格式错误!","错误!",MB_OK|MB_ICONHAND);}  
	if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1)
	{MessageBox(GetFocus(),"读取格式失败!","错误!",MB_OK|MB_ICONHAND);}
	mmresult = mmioAscend(hmmio,&ckInfo,0);    //跳出子区块 
	ckInfo.ckid = mmioFOURCC('d','a','t','a');  //设置区块类型
	mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
//查找区块
    if(mmresult != MMSYSERR_NOERROR){MessageBox(GetFocus(),"文件格式错误!","错误!",MB_OK|MB_ICONHAND);}
	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, &pSBuf[n], NULL );
	if(result != DS_OK)
	{MessageBox(GetFocus(),"建立次缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
//=====================加载声音到次缓冲区=================================================================================================
//锁定缓冲区	
	result = pSBuf[n]->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);  
    if(result != DS_OK)
	{MessageBox(GetFocus(),"锁定次缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
	mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
//读取声音文件数据	
	if(mmresult == -1)
	{MessageBox(GetFocus(),"读取音效文件失败!","错误!",MB_OK|MB_ICONHAND);}
//解除锁定缓冲区	
	result = pSBuf[n]->Unlock(pAudio,bytesAudio,NULL,NULL);  
	if(result != DS_OK)
	{MessageBox(GetFocus(),"解除锁定次缓冲区失败!","错误!",MB_OK|MB_ICONHAND);}
    mmioClose(hmmio,0);	

	return  pSBuf[n];

}

void MyDSound::PlayWav(int n,short round)
{
    pSBuf[n]->Play(0,0,round);
}

void MyDSound::StopWav(int n)
{
    pSBuf[n]->Stop();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -