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

📄 d3dsound.cpp

📁 游戏是我在3月5日离职后花3周时间做的。主要目的是验证自己在游戏上相关的编程能力
💻 CPP
字号:
#include "d3dsound.h"


LPDIRECTSOUND8		lpDSound;       //DirectSound界面
DSBUFFERDESC        dsbd;


pcm_sound			sound_fx[MAX_SOUNDS];    //DirectSound次缓冲列表
int                 sound_id;
WAVEFORMATEX        pcmwf; 

D3DSound::D3DSound()
{
}
D3DSound::~D3DSound()
{
}

int D3DSound::MyDirectSoundInit(HWND hwnd)
{
	hWnd = hwnd;
	if (DirectSoundCreate8(NULL, &lpDSound, NULL)!=DS_OK )
		return 0;

	//设置DirectSound协作等级
	if (lpDSound->SetCooperativeLevel(hWnd,DSSCL_NORMAL)!=DS_OK)
		return 0;

	//清空声音数组
	memset(sound_fx,0,sizeof(pcm_sound)*MAX_SOUNDS);
	
	//初始声音数组
	for (int index=0; index<MAX_SOUNDS; index++)
	{
		//是否已经存在
		if (sound_fx[index].dsbuffer)
		{
			//停止
			sound_fx[index].dsbuffer->Stop();

			//释放缓冲
			sound_fx[index].dsbuffer->Release();
		} 

		//清空声音数组
		memset(&sound_fx[index],0,sizeof(pcm_sound));

		sound_fx[index].state = SOUND_NULL;
		sound_fx[index].id    = index;
	}
	return 1;
}

int D3DSound::MyDirectSoundShut()
{
	if (sound_fx[sound_id].dsbuffer)
		sound_fx[sound_id].dsbuffer->Release();
	
	if (lpDSound!=NULL)
		lpDSound->Release();

	return 1;
}

int D3DSound::DSoundLoadWAV(char *filename, int control_flags)
{
	HMMIO 			hwav;    //文件句柄
	MMCKINFO		parent,  
		            child;  

	WAVEFORMATEX    wfmtx;   //WAV结构

	int	sound_id = -1, index;               
	UCHAR *snd_buffer,        //缓冲
		*audio_ptr_1=NULL,    //第一写指针
		*audio_ptr_2=NULL;    //第二写指针
	DWORD audio_length_1=0,   //第一缓冲
		audio_length_2=0;     //第二缓冲

	//初始化
	for (index=0; index < MAX_SOUNDS; index++)
	{	
		//声音是否被使用
		if (sound_fx[index].state==SOUND_NULL)
		{
			sound_id = index;
			break;
		} 
	} 
	//id是否被使用
	if (sound_id==-1)
		return(-1);

	//设置结构
	parent.ckid 	    = (FOURCC)0;
	parent.cksize 	    = 0;
	parent.fccType	    = (FOURCC)0;
	parent.dwDataOffset = 0;
	parent.dwFlags		= 0;

	//复制数据
	child = parent;

	//打开WAV文件
	if ((hwav = mmioOpen(filename, NULL, MMIO_READ | MMIO_ALLOCBUF)) == NULL)
		return(-1);

	//RIFF 
	parent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
	if (mmioDescend(hwav, &parent, NULL, MMIO_FINDRIFF))
    {
		//关闭
		mmioClose(hwav, 0);
		return -1; 	
    } 
	//WAVEfmt 
	child.ckid = mmioFOURCC('f', 'm', 't', ' ');
	if (mmioDescend(hwav, &child, &parent, 0))
    {
		//关闭
		mmioClose(hwav, 0);
		return -1; 	
    } 

	//读取格式
	if (mmioRead(hwav, (char *)&wfmtx, sizeof(wfmtx)) != sizeof(wfmtx))
    {
		//关闭
		mmioClose(hwav, 0);
		return -1;
    } 

	//是否PCM格式
	if (wfmtx.wFormatTag != WAVE_FORMAT_PCM)
    {
		//关闭
		mmioClose(hwav, 0);
		return -1; 
    }

	//data chunk
	if (mmioAscend(hwav, &child, 0))
	{
		//关闭
		mmioClose(hwav, 0);
		return -1 ; 	
	}

	//确定data chunk 
	child.ckid = mmioFOURCC('d', 'a', 't', 'a');
	if (mmioDescend(hwav, &child, &parent, MMIO_FINDCHUNK))
    {
		//关闭
		mmioClose(hwav, 0);
		return -1; 	
    } 
	
	//分配空间
	snd_buffer = (UCHAR *)malloc(child.cksize);
	//读取WAV数据
	mmioRead(hwav, (char *)snd_buffer, child.cksize);
	//关闭
	mmioClose(hwav, 0);
	//设置频率
	sound_fx[sound_id].rate  = wfmtx.nSamplesPerSec;
	sound_fx[sound_id].size  = child.cksize;
	sound_fx[sound_id].state = SOUND_LOADED;
	//设置结构
	memset(&pcmwf, 0, sizeof(WAVEFORMATEX));
	pcmwf.wFormatTag	  = WAVE_FORMAT_PCM;  // pulse code modulation
	pcmwf.nChannels		  = 2;                // mono 
	pcmwf.nSamplesPerSec  = 22050;            // always this rate
	pcmwf.nBlockAlign	  = 4;                
	pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign;
	pcmwf.wBitsPerSample  = 16;
	pcmwf.cbSize		  = 0;
	//描述创建缓冲
	dsbd.dwSize			= sizeof(DSBUFFERDESC);
	if(control_flags == 0)
		dsbd.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME |
		DSBCAPS_CTRLFREQUENCY  | DSBCAPS_STATIC | DSBCAPS_LOCSOFTWARE;

	dsbd.dwBufferBytes	= child.cksize;
	dsbd.lpwfxFormat	= &pcmwf;

	//创建缓冲
	if (FAILED(lpDSound->CreateSoundBuffer(&dsbd,&sound_fx[sound_id].dsbuffer,NULL)))
	{
		//释放
		free(snd_buffer);
		return -1;
	}

	//拷贝数据
	if (FAILED(sound_fx[sound_id].dsbuffer->Lock(0,					 
		child.cksize,			
		(void **) &audio_ptr_1, 
		&audio_length_1,
		(void **)&audio_ptr_2, 
		&audio_length_2,
		DSBLOCK_FROMWRITECURSOR)))
		return 0;

	//复制第一循环缓冲
	memcpy(audio_ptr_1, snd_buffer, audio_length_1);

	//复制第二循环缓冲
	memcpy(audio_ptr_2, (snd_buffer+audio_length_1),audio_length_2);

	//解锁
	if (FAILED(sound_fx[sound_id].dsbuffer->Unlock(audio_ptr_1, 
		audio_length_1, 
		audio_ptr_2, 
		audio_length_2)))
		return 0;

	//释放临时缓冲
	free(snd_buffer);

	return sound_id;

}

void D3DSound::PlaySound(int sound_id)
{
sound_fx[sound_id].dsbuffer->Play(0,0,1);
}

⌨️ 快捷键说明

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