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

📄 dsobj.cpp

📁 经典飞机游戏的源代码 dx实现
💻 CPP
字号:
#include "dsobj.h"

// CDSObj()
//		- default constructor, initialize all the member
// INPUT: none;
// OUTPUT: none;
CDSObj::CDSObj()
{
	lpDS = NULL;
	for (int i = 0; i < 50; i++)
	{
		DSBufStack[i].lpDSBuffer = NULL;
		DSBufStack[i].dwWaveSize = 0;
		DSBufStack[i].szFileName = NULL;
		DSBufStack[i].lpWFmtEX = NULL;
		DSBufStack[i].lpWaveData = NULL;
	}
	size = 0;
}

// ~CDSObj()
//		- destructor, destroy all the memor we allocated
// INPUT: none;
// OUTPUT: none;
CDSObj::~CDSObj()
{
	Terminate();
}

// Initialize()
//		- construct DirectSound object and set the correct cooperative level
// INPUT: HWND object - the application window object.
// OUTPUT: none;
BOOL CDSObj::Initialize(HWND hwnd)
{
	HRESULT hr;

	// to make sure, we initialize again.
	lpDS = NULL;
	for (int i = 0; i < 50; i++)
	{
		DSBufStack[i].lpDSBuffer = NULL;
		DSBufStack[i].szFileName = NULL;
		DSBufStack[i].dwWaveSize = 0;
		DSBufStack[i].lpWFmtEX = NULL;
		DSBufStack[i].lpWaveData = NULL;
	}
	size = 0;

	// first construct a directsound object
	hr = DirectSoundCreate(NULL, &lpDS, NULL);
	if (hr != DS_OK)
	{
		MessageBox(hwnd, "ERROR: Can't construct directsound object!",
			"DirectSound initialization:", MB_OK);
		Terminate();
		return FALSE;
	}

	// set cooperative level as normal
	hr = lpDS->SetCooperativeLevel(hwnd, DSSCL_NORMAL);
	if (hr != DS_OK)
	{
		MessageBox(hwnd, "ERROR: Can't set cooperative level!",
			"DirectSound initialization:", MB_OK);
		Terminate();
		return FALSE;
	}
	return TRUE;
}

// Terminate()
//		- terminate DirectSound object and all the buffers we allocated.
// INPUT: none;
// OUTPUT: none;
void CDSObj::Terminate()
{
	if (lpDS != NULL)
	{
		for (int i = 0; i < 50; i++)
		{
			DestroySoundBuffer(i);
		}
		lpDS->Release();
		lpDS = NULL;
	}
	size = 0;
}

// DestroySoundBuffer()
//		- destroy a sound buffer with index num.
// INTPUT: num - the index of DSBufStack array.
// OUTPUT: none;
void CDSObj::DestroySoundBuffer(int num)
{
	if (DSBufStack[num].lpDSBuffer != NULL)
	{
		DSBufStack[num].lpDSBuffer->Release();
		DSBufStack[num].lpDSBuffer = NULL;
	}
	
	if(DSBufStack[num].dwWaveSize != 0)
		DSBufStack[num].dwWaveSize = 0;

	if(DSBufStack[num].szFileName != NULL)
		DSBufStack[num].szFileName = NULL;

	if(DSBufStack[num].lpWFmtEX != NULL)
	{
		delete DSBufStack[num].lpWFmtEX;
		DSBufStack[num].lpWFmtEX = NULL;
	}
	if(DSBufStack[num].lpWaveData != NULL)
	{
		GlobalFree(DSBufStack[num].lpWaveData);
		DSBufStack[num].lpWaveData = NULL;
	}
	if (size != 0)
		size -= 1;
}

// GetSoundFromFile
//		- Get sound data from a file.
// INPUT: 1. fn - the name of the file.
//        2. num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::GetSoundDataFromFile(LPSTR fn, int num)
{
	BOOL success;
	WAVEFORMATEX * lpTempWFmtEX;
	char * lpWaveDataTemp;
	CWave * lpTempWave = new CWave;
	success = lpTempWave->LoadWaveFile(fn);
	if(!success)
		return FALSE;

	if(IsBufferExisting(num))
		DestroySoundBuffer(num);

	lpTempWFmtEX = lpTempWave->GetWaveFormatEXPtr();
	lpWaveDataTemp = lpTempWave->GetWaveData();
	DSBufStack[num].dwWaveSize = lpTempWave->GetWaveSize();
	DSBufStack[num].szFileName = fn;
	DSBufStack[num].lpWFmtEX = new WAVEFORMATEX;
	DSBufStack[num].lpWaveData = (char *)GlobalAlloc(GMEM_FIXED, DSBufStack[num].dwWaveSize);
	memcpy(DSBufStack[num].lpWFmtEX, lpTempWFmtEX, sizeof(WAVEFORMATEX));
	memcpy(DSBufStack[num].lpWaveData, lpWaveDataTemp, DSBufStack[num].dwWaveSize);
	delete lpTempWave;
	lpTempWFmtEX = NULL;
	lpWaveDataTemp = NULL;
	size += 1;
	return TRUE;
}

// CreateBuffer
//		-create buffer with specified index.
//      * remember one thing: call GetSoundDataFrom() first.
// INPUT: num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::CreateBuffer(int num)
{
	DSBUFFERDESC dsbc;
	HRESULT      hr;

	if (IsStackFull())
		return FALSE;

	if(!IsIndexValid(num))
		return FALSE;

	memset(&dsbc, 0, sizeof(DSBUFFERDESC));
	dsbc.dwSize = sizeof(DSBUFFERDESC);
	dsbc.dwFlags = DSBCAPS_STATIC;
	if(DSBufStack[num].dwWaveSize == 0)
		return FALSE;
	dsbc.dwBufferBytes = DSBufStack[num].dwWaveSize;
	if(DSBufStack[num].lpWFmtEX == NULL)
		return FALSE;
	dsbc.lpwfxFormat = DSBufStack[num].lpWFmtEX;

	// construct the buffer
	hr = lpDS->CreateSoundBuffer(&dsbc, &DSBufStack[num].lpDSBuffer, NULL);
	if (hr != DS_OK)
	{
		DSBufStack[num].lpDSBuffer = NULL;
		return FALSE;
	}
	return TRUE;
}

// LoadDataToBuffer
//		- After create the sound buffer, load data to buffer.
//		* remember one thing: call CreateBuffer() first.
// INPUT: num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::LoadDataToBuffer(int num)
{
	LPVOID pSoundBlock1;
	LPVOID pSoundBlock2;
	DWORD  bytes1;
	DWORD  bytes2;
	HRESULT hr;

	if(DSBufStack[num].lpWaveData == NULL && DSBufStack[num].dwWaveSize == 0)
		return FALSE;

	hr = DSBufStack[num].lpDSBuffer->Lock(0, DSBufStack[num].dwWaveSize,
		&pSoundBlock1, &bytes1, &pSoundBlock2, &bytes2,0);
	if(hr != DS_OK)
		return FALSE;
	// load the data
	memcpy((void *)pSoundBlock1, DSBufStack[num].lpWaveData, DSBufStack[num].dwWaveSize);
	// unlock the memory buffer
	DSBufStack[num].lpDSBuffer->Unlock(pSoundBlock1, bytes1, pSoundBlock2, bytes2);
	if (hr != DS_OK)
		return FALSE;
	return TRUE;
}

// SetSoundTrack()
//		-load a valid sound file into specified dsound buffer.
//		* This method:
//			1. GetSoundDataFromFile()
//			2. CreateBuffer()
//			3. LoadSoundDataToBuffer().
// INPUT: 1. fn - the name of the file.
//        2. num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::SetSoundTrack(LPSTR fn, int num)
{
	if(!GetSoundDataFromFile(fn, num))
		return FALSE;
	if(!CreateBuffer(num))
		return FALSE;
	if(!LoadDataToBuffer(num))
		return FALSE;
	return TRUE;
}

// PlaySound()
//		- play the sound in the specified sound buffer with index num.
// INPUT: 1. loop - specify loop the sound. 
//        2. num - the index.
// OUTPUT: TRUE if this operation success, FALSE otherwise.
BOOL CDSObj::PlaySound(BOOL loop, int num)
{
	HRESULT hr;

	if(!IsIndexValid(num))
		return FALSE;
	
	if (!IsBufferExisting(num))
		return FALSE;

	hr = DSBufStack[num].lpDSBuffer->SetCurrentPosition(0);
	if (hr != DS_OK)
		return FALSE;
	if (loop)
	{
		hr = DSBufStack[num].lpDSBuffer->Play(0, 0, DSBPLAY_LOOPING);
		if(hr != DS_OK)
			return FALSE;
	}
	else 
	{
		hr = DSBufStack[num].lpDSBuffer->Play(0, 0, 0);
		if(hr != DS_OK)
			return FALSE;
	}
	return TRUE;

}

// StopSound()
//		-stop the sound in a specified sound buffer with index num.
// INPUT: num - the index.
// OUTPUT: none;
void CDSObj::StopSound(int num)
{
	if(!IsIndexValid(num))
		return;

	if (!IsBufferExisting(num))
		return;

	DSBufStack[num].lpDSBuffer->Stop();
}

⌨️ 快捷键说明

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