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

📄 dsound.cpp

📁 圣剑英雄1的源代码(英雄救美版)。经典PRG游戏编程示例。
💻 CPP
字号:
//================ DirectSound 模块===============


//#include <stdafx.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>

//#include "dsound.h"
//#include "direct.h"

#define WAV_HDR_SIZE  44
//#define MAX_SOUNDFX  4
#define SND_GATE  0
#define SND_PING  1
#define SND_STATIC 2
#define SND_WALK 3

BOOL SoundAble=TRUE;
LPDIRECTSOUND lpDSObj=NULL;

LPDIRECTSOUNDBUFFER LoadSoundFX(HWND hwnd,char *filename)
{
if( SoundAble==FALSE ) return FALSE;
	LPDIRECTSOUNDBUFFER DSSoundFX=NULL; //临时对象

	DSBUFFERDESC dsbd; 	//结构
	LPWAVEFORMATEX wav;  	//声音格式
	DWORD len; 		//文件长度
	BYTE *buf; 		//临时缓冲区
	LPVOID ptr1;		//指针1
	LPVOID ptr2;		//指针2
	DWORD size1;		
	DWORD size2;
	DWORD BufferSize;	//DirectSoundBuffer 大小

	FILE *f;
	long WavLong;
	if( (f=fopen(filename,"rb"))==NULL )
	{
		MessageBox(hwnd,"error open file",filename,MB_OK);
		return FALSE;
	}
	fseek(f,0x28,SEEK_SET);
	fread(&WavLong,sizeof(long),1,f);	//读取声音数据长度
	len=WavLong+WAV_HDR_SIZE;	//文件长度
	BufferSize=len-WAV_HDR_SIZE;	//设置缓冲去大小

	buf=(BYTE *)GlobalAlloc(GPTR,len);
	if( buf==NULL )
	{
		MessageBox(hwnd,"error buf","error",MB_OK);
		return FALSE;
	}
	fseek(f,0x00,SEEK_SET);
	fread(buf,len,1,f);
	fclose(f);
	//读取声音数据到临时缓冲区


	ptr1=buf+20;
	wav=(LPWAVEFORMATEX)(ptr1);
	memset(&dsbd,0,sizeof(dsbd));
	dsbd.dwSize=sizeof(dsbd);
	dsbd.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_STATIC;
	dsbd.dwBufferBytes=len-WAV_HDR_SIZE;
	dsbd.lpwfxFormat=wav;
	if(lpDSObj->CreateSoundBuffer(&dsbd,&DSSoundFX,NULL)!=DS_OK)
	{
		MessageBox(hwnd,"error createsoundbuffer","error",MB_OK);
		return FALSE;
	}
	if( (DSSoundFX->Lock(0,BufferSize,&ptr1,&size1,&ptr2,&size2,0))!=DS_OK)
	{
		MessageBox(hwnd,"error Lock","error",MB_OK);
		return FALSE;
	}
	memcpy(ptr1,buf+WAV_HDR_SIZE,size1); //拷贝数据到声音缓冲区
	if(size2)
		memcpy(ptr2,buf+size1+WAV_HDR_SIZE,size2);//拷贝数据到声音缓冲区
	if( DSSoundFX->Unlock(ptr1,size1,ptr2,size2)!=DS_OK)
	{
		MessageBox(hwnd,"error UnLock","error",MB_OK);
		return FALSE;
	}
	GlobalFree(buf);
	
return DSSoundFX;//返回
}


BOOL InitDirectSound(HWND hwnd)	//初始化声音设备
{	
	
	if( DirectSoundCreate(NULL,&lpDSObj,NULL)!=DS_OK )
	{
		MessageBox(hwnd,"error on Create","error",MB_OK);
		SoundAble=FALSE;
		return FALSE;
	}

	if( lpDSObj->SetCooperativeLevel(hwnd,DSSCL_NORMAL)!=DS_OK)
	{
		MessageBox(hwnd,"error on set","error",MB_OK);
		SoundAble=FALSE;
		return FALSE;
	}
	return TRUE;  // 初始化成功
}

void ReleaseDirectSound(void)	//释放声音设备
{	
if( SoundAble==FALSE ) return;	
	if( lpDSObj != NULL )
	{
		lpDSObj->Release();
		lpDSObj=NULL;
	}

}

void PlayDirectSound(LPDIRECTSOUNDBUFFER sbuf,DWORD loop=0)//播放声音
{
if( SoundAble==FALSE ) return;
DWORD *Status1=NULL;
	if( (sbuf->GetStatus(Status1))!=DS_OK ) goto next;
		
	if( *Status1 & DSBSTATUS_PLAYING == DSBSTATUS_PLAYING  ) return;
next:
	sbuf->SetCurrentPosition(0);
	sbuf->Play(0,0,loop);
}

⌨️ 快捷键说明

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