www.gusucode.com > VC++游戏雷霆战机源代码-源码程序 > VC++游戏雷霆战机源代码-源码程序\code\Sound.cpp

    //Download by http://www.NewXing.com
// Sound.cpp: implementation of the CSound class.
//
//////////////////////////////////////////////////////////////////////

#include "Sound.h"

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

CSound::CSound(HWND hWnd)
{
	m_hWnd = hWnd;
	lpds = NULL;
	lpPrimaryBuf = NULL;
	for( int i = 0; i < 10; i++ )
	{
		lpSndObj[i]=NULL;
	}
	InitDirectSound();

}


CSound::~CSound()
{
	if(lpds)
    {
		ClearBuffer();
		lpds->Release();
        lpds=NULL;
    }

}

BOOL CSound::InitDirectSound()
{
	if(DS_OK != DirectSoundCreate(NULL,&lpds,NULL))		// 建立DirectSound对象	
		return FALSE;


	if(DS_OK != lpds->SetCooperativeLevel(m_hWnd,DSSCL_NORMAL)) //设定协调层次
	{
		return FALSE;
	}
		
//	if(!CreatePrimaryBuf())
//		return FALSE;
	
	LoadSoundResource();

	return TRUE;
}

LPDIRECTSOUNDBUFFER CSound::CreateSndBuffer(char *path)
{
	WAVEFORMATEX swfmt;				// 声明声音结构
	MMCKINFO ckRiff;				// RIFF区块的信息
	MMCKINFO ckInfo;				// 子区块的信息
	HMMIO hmmio;					// 打开的多媒体文件
	DWORD size;						// 实际数据大小

	hmmio = mmioOpen(path,NULL,MMIO_ALLOCBUF|MMIO_READ);

	ckRiff.fccType = mmioFOURCC('W','A','V','E');   // 设定文件类型
	mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF); // 查找类型

	ckInfo.ckid = mmioFOURCC( 'f', 'm' , 't' , ' ');	  // 设定区块类型
	mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK); // 查找区块

	mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt));

	mmioAscend(hmmio,&ckInfo,0);				// 跳出子区块
	ckInfo.ckid = mmioFOURCC('d','a','t','a');			// 设定区块类型

	mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);	// 查找区块

	size = ckInfo.cksize;

	LPDIRECTSOUNDBUFFER pSBuf;			// 声明缓冲区指针			
	DSBUFFERDESC desc;					// 声明描述结构
	memset(&desc,0,sizeof(desc));		// 清空结构内容
	desc.dwSize = sizeof(desc);			// 配置结构大小
	desc.dwBufferBytes = size;			// 设定缓冲区大小
	desc.lpwfxFormat = &swfmt;			// 设定缓冲区格式
	desc.dwFlags = DSBCAPS_STATIC | DSBCAPS_CTRLPAN | 
				DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;
	lpds->CreateSoundBuffer(&desc,&pSBuf,NULL);
	
	LPVOID pAudio;
	DWORD bytesAudio;
	pSBuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);

	mmioRead(hmmio,(HPSTR)pAudio,bytesAudio); // 读取音文件数据
	
	pSBuf->Unlock(pAudio,bytesAudio,NULL,NULL);

	mmioClose(hmmio,0);	

	return pSBuf;
}

void CSound::ClearBuffer()
{
	SAFE_RELEASE(lpPrimaryBuf)
	for( int i = 0; i < 10; i++ )
	{
		SAFE_RELEASE(lpSndObj[i])
	}
}

BOOL CSound::CreatePrimaryBuf()
{
	DSBUFFERDESC dsdesc;
	HRESULT result;
	WAVEFORMATEX pwfmt;         //声明声音结构

	memset( &dsdesc,0, sizeof(dsdesc) );          //清空结构内容
    dsdesc.dwSize        = sizeof(dsdesc);        //配置描述结构大小
    dsdesc.dwFlags       = DSBCAPS_PRIMARYBUFFER;
    dsdesc.dwBufferBytes = 0;
    dsdesc.lpwfxFormat   = NULL;
    result = lpds->CreateSoundBuffer( &dsdesc, &lpPrimaryBuf, NULL );
	if(result != DS_OK)
		return FALSE;
    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 = lpPrimaryBuf->SetFormat(&pwfmt);       //设定播放格式
	if(result != DS_OK)
		return FALSE;		
	return TRUE;
}

void CSound::PlaySound(int seq,int loop)
{
	lpSndObj[seq]->SetCurrentPosition(0);
	lpSndObj[seq]->Play(0,0,loop);
}

void CSound::LoadSoundResource()
{
	lpSndObj[0] = CreateSndBuffer( "sound//eExplode.wav" );
	lpSndObj[1] = CreateSndBuffer( "sound//pExplode.wav" );
	lpSndObj[2] = CreateSndBuffer( "sound//bossexp.wav" );
	lpSndObj[3] = CreateSndBuffer( "sound//Bomb.wav" );
	lpSndObj[4] = CreateSndBuffer( "sound//bonus.wav" );
	lpSndObj[5] = CreateSndBuffer( "sound//hit.wav" );
	lpSndObj[6] = CreateSndBuffer( "sound//fire.wav" );	
	lpSndObj[7] = CreateSndBuffer( "sound//addlife.wav" );
}