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

📄 gamesound.cpp

📁 一个类似坦克大战的小小游戏
💻 CPP
字号:

#include "GameSound.h"
#include "GlobalDefs.h"
#include <mmsystem.h>

static char szSoundEffects[SOUND_COUNT][64] =
{
	".\\sound\\fire.wav",
	".\\sound\\explode.wav",
	".\\sound\\win.wav",
	".\\sound\\lost.wav",
	".\\sound\\bonus.wav",
	".\\sound\\circumvention.wav",
	".\\sound\\lvup.wav",
	".\\sound\\alarm.wav",
	".\\sound\\hit.wav",
	".\\sound\\reborn.wav",
};

CGameSound::CGameSound(void)
{
	m_pSound = NULL;
	int i;
	for (i = 0; i < SOUND_COUNT; i++)
	{
		if (NULL != m_pdsBuffer[i])
		{
			m_pdsBuffer[i] = NULL;
		}
	}
}

CGameSound::~CGameSound(void)
{
	Release();
}

// Create and release /////////////////////////////////////////////////

BOOL CGameSound::Create(HWND hWnd)
{
	// Create DirectSound interface
	if (FAILED(DirectSoundCreate(NULL, &m_pSound, NULL)))
	{
		MessageBox(NULL, "Create DirectSound Failed!!!", "ERROR!", MB_OK);
		return FALSE;
	}

	// Set Cooperative level
	if (FAILED(m_pSound->SetCooperativeLevel(hWnd, DSSCL_NORMAL)))
	{
		Release();
		return FALSE;
	}

	// Set up directsound buffer
	int i;
	for (i = 0; i < SOUND_COUNT; i++)
	{
		if (!CreateBuffer(m_pdsBuffer[i], szSoundEffects[i]))
		{
			return FALSE;
		}
	}
	return TRUE;
}

BOOL CGameSound::CreateBuffer(LPDIRECTSOUNDBUFFER &pBuffer, LPSTR inFileName)
{
	WAVEFORMATEX swfmt;	// Holds the format description
	MMCKINFO ckRiff;	// Parent duck
	MMCKINFO ckInfo;	// Child duck
	MMRESULT mmresult;
	HMMIO hmmio;		// Handle to wave file

	// Open a file, if can not find, return
	hmmio = mmioOpen(inFileName, NULL, MMIO_ALLOCBUF | MMIO_READ );
	if(NULL == hmmio)
	{
		char szError[255];
		wsprintf(szError, "%s is not exsit!", inFileName);
		MessageBox(NULL, szError, "ERROR!", MB_OK);
		return FALSE;
	}

	// Descend into the RIFF
	ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
	mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
	if (MMSYSERR_NOERROR != mmresult)
	{
		MessageBox(NULL, "File's Type Wrong!", "ERROR!", MB_OK);
		mmioClose(hmmio, 0);
		return FALSE;
	}

	// Descend to the WAVEfmt
	ckInfo.ckid = mmioFOURCC('f', 'm', 't', ' '); 
	mmresult = mmioDescend(hmmio, &ckInfo, &ckRiff, MMIO_FINDCHUNK);
	if(MMSYSERR_NOERROR != mmresult)
	{
		mmioClose(hmmio, 0);
		return FALSE;
	}

	// Read the wave format information from file
	if(-1 == mmioRead(hmmio, (HPSTR)&swfmt, sizeof(swfmt)))
	{
		mmioClose(hmmio, 0);
		MessageBox(NULL, "File read failed!", "ERROR!" ,MB_OK);
		return FALSE;
	}
	
	// Ascend up one level, then access data chunk
	mmresult = mmioAscend(hmmio, &ckInfo, 0);   
	ckInfo.ckid = mmioFOURCC('d', 'a', 't', 'a');  
	mmresult = mmioDescend(hmmio, &ckInfo, &ckRiff, MMIO_FINDCHUNK);
	if(MMSYSERR_NOERROR != mmresult)
	{
		mmioClose(hmmio, 0);
		return FALSE;
	}

//	WAVEFORMATEX pcmwf;	// Holds the format description
	DSBUFFERDESC dsbd;	// DirectSound buffer description

	// Set up the format data sturcture, Set as DEFAULT
/*	memset((void *)&pcmwf, 0, sizeof(WAVEFORMATEX));
	pcmwf.wFormatTag = WAVE_FORMAT_PCM;
	pcmwf.nChannels = 1;
	pcmwf.nSamplesPerSec = 22050;
	pcmwf.nBlockAlign = 2;	// nChannels * bytespersample(here is 2 byte)
	pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign;
	pcmwf.wBitsPerSample = 8;
	pcmwf.cbSize = 0;
*/
	// Set up the directsound buffer description
	memset((void *)&dsbd, 0, sizeof(DSBUFFERDESC));
	dsbd.dwSize = sizeof(DSBUFFERDESC);
	dsbd.dwFlags = DSBCAPS_STATIC | DSBCAPS_LOCSOFTWARE;
	dsbd.dwBufferBytes = ckInfo.cksize;	// Enough for file
	dsbd.lpwfxFormat = &swfmt;

	// Create the sound buffer
	if (FAILED(m_pSound->CreateSoundBuffer(&dsbd, &pBuffer, NULL)))
	{
		mmioClose(hmmio, 0);
		MessageBox(NULL, "Create Sound Buffer Failed!", "ERROR!", MB_OK);
		return FALSE;
	}

	void *pAudio = NULL;
	DWORD dwAudioLengh = 0;

	// Lock
	if (FAILED(pBuffer->Lock(0, ckInfo.cksize, 
			&pAudio, &dwAudioLengh, NULL, NULL, NULL)))
	{
		mmioClose(hmmio, 0);
		pBuffer->Release();
		return FALSE;
	}

	// Read file
	if (-1 == mmioRead(hmmio, (HPSTR)pAudio, dwAudioLengh))
	{
		mmioClose(hmmio, 0);
		pBuffer->Release();
		return FALSE;
	}

	// Unlock
	if (FAILED(pBuffer->Unlock(pAudio, dwAudioLengh, NULL, NULL)))
	{
		mmioClose(hmmio, 0);
		pBuffer->Release();
		return FALSE;
	}

	// Close file
	mmioClose(hmmio, 0);
	return TRUE;
}

void CGameSound::Release()
{
	int i;
	for (i = 0; i < SOUND_COUNT; i++)
	{
		if (NULL != m_pdsBuffer[i])
		{
			SAFE_RELEASE(m_pdsBuffer[i]);
		}
	}
	if (NULL != m_pSound)
	{
		SAFE_RELEASE(m_pSound);
	}
}

// Sound controls //////////////////////////////////////////////

BOOL CGameSound::Play(Sound_Type inType)
{
	int nIndex = (int)inType;
	if (FAILED(m_pdsBuffer[nIndex]->Play(0, 0, 0)))
	{
		return FALSE;
	}
	return TRUE;
}

void CGameSound::Stop(Sound_Type inType)
{
	int nIndex = (int)inType;
	m_pdsBuffer[nIndex]->Stop();
}

⌨️ 快捷键说明

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