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

📄 myplaysound.h

📁 gamecode 很不错的小游戏源代码
💻 H
字号:
//================ DirectSound 模块===============
#ifndef MyPlaysound_h_
#define MyPlaysound_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


LPDIRECTSOUNDBUFFER		bgmusic;//背景音乐
LPDIRECTSOUNDBUFFER		getmoney;//得到金钱
LPDIRECTSOUNDBUFFER		losemoney;//丢经验
LPDIRECTSOUNDBUFFER		build;//修建筑
LPDIRECTSOUNDBUFFER		getexp;//得到经验
LPDIRECTSOUNDBUFFER		stepsound;//脚步声
LPDIRECTSOUNDBUFFER		selectsnd;//移动菜单上的指针
LPDIRECTSOUNDBUFFER		suresnd;//确认
LPDIRECTSOUNDBUFFER		success;//操作成功
LPDIRECTSOUNDBUFFER		fail;//操作失败

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.dwFlags=DSBCAPS_CTRLPAN|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLFREQUENCY|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 ) 
	{
		sbuf->SetCurrentPosition(0);
		sbuf->Play(0,0,loop);
	}
	
	if( *Status1 & DSBSTATUS_PLAYING == DSBSTATUS_PLAYING  )
		return;
	
}

#endif

⌨️ 快捷键说明

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