1
//#include <stdafx.h>2
#include <fcntl.h>3
#include <sys/types.h>4
#include <sys/stat.h>5
#include <io.h>6
#include <stdio.h>7

8
//#include "dsound.h"9
//#include "direct.h"10

11
#define WAV_HDR_SIZE 4412
//#define MAX_SOUNDFX 413
#define SND_GATE 014
#define SND_PING 115
#define SND_STATIC 216
#define SND_WALK 317

18
BOOL SoundAble=TRUE;19
LPDIRECTSOUND lpDSObj=NULL;20

21
LPDIRECTSOUNDBUFFER LoadSoundFX(HWND hwnd,char *filename)22


{23
if( SoundAble==FALSE ) return FALSE;24
LPDIRECTSOUNDBUFFER DSSoundFX=NULL; //临时对象25

26
DSBUFFERDESC dsbd; //结构27
LPWAVEFORMATEX wav; //声音格式28
DWORD len; //文件长度29
BYTE *buf; //临时缓冲区30
LPVOID ptr1; //指针131
LPVOID ptr2; //指针232
DWORD size1; 33
DWORD size2;34
DWORD BufferSize; //DirectSoundBuffer 大小35

36
FILE *f;37
long WavLong;38
if( (f=fopen(filename,"rb"))==NULL )39

{40
MessageBox(hwnd,"error open file",filename,MB_OK);41
return FALSE;42
}43
fseek(f,0x28,SEEK_SET);44
fread(&WavLong,sizeof(long),1,f); //读取声音数据长度45
len=WavLong+WAV_HDR_SIZE; //文件长度46
BufferSize=len-WAV_HDR_SIZE; //设置缓冲去大小47

48
buf=(BYTE *)GlobalAlloc(GPTR,len);49
if( buf==NULL )50

{51
MessageBox(hwnd,"error buf","error",MB_OK);52
return FALSE;53
}54
fseek(f,0x00,SEEK_SET);55
fread(buf,len,1,f);56
fclose(f);57
//读取声音数据到临时缓冲区58

59

60
ptr1=buf+20;61
wav=(LPWAVEFORMATEX)(ptr1);62
memset(&dsbd,0,sizeof(dsbd));63
dsbd.dwSize=sizeof(dsbd);64
dsbd.dwFlags=DSBCAPS_CTRLDEFAULT|DSBCAPS_STATIC;65
dsbd.dwBufferBytes=len-WAV_HDR_SIZE;66
dsbd.lpwfxFormat=wav;67
if(lpDSObj->CreateSoundBuffer(&dsbd,&DSSoundFX,NULL)!=DS_OK)68

{69
MessageBox(hwnd,"error createsoundbuffer","error",MB_OK);70
return FALSE;71
}72
if( (DSSoundFX->Lock(0,BufferSize,&ptr1,&size1,&ptr2,&size2,0))!=DS_OK)73

{74
MessageBox(hwnd,"error Lock","error",MB_OK);75
return FALSE;76
}77
memcpy(ptr1,buf+WAV_HDR_SIZE,size1); //拷贝数据到声音缓冲区78
if(size2)79
memcpy(ptr2,buf+size1+WAV_HDR_SIZE,size2);//拷贝数据到声音缓冲区80
if( DSSoundFX->Unlock(ptr1,size1,ptr2,size2)!=DS_OK)81

{82
MessageBox(hwnd,"error UnLock","error",MB_OK);83
return FALSE;84
}85
GlobalFree(buf);86
87
return DSSoundFX;//返回88
}89

90

91
BOOL InitDirectSound(HWND hwnd) //初始化声音设备92


{ 93
94
if( DirectSoundCreate(NULL,&lpDSObj,NULL)!=DS_OK )95

{96
MessageBox(hwnd,"error on Create","error",MB_OK);97
SoundAble=FALSE;98
return FALSE;99
}100

101
if( lpDSObj->SetCooperativeLevel(hwnd,DSSCL_NORMAL)!=DS_OK)102

{103
MessageBox(hwnd,"error on set","error",MB_OK);104
SoundAble=FALSE;105
return FALSE;106
}107
return TRUE; // 初始化成功108
}109

110
void ReleaseDirectSound(void) //释放声音设备111


{ 112
if( SoundAble==FALSE ) return; 113
if( lpDSObj != NULL )114

{115
lpDSObj->Release();116
lpDSObj=NULL;117
}118

119
}120

121
void PlayDirectSound(LPDIRECTSOUNDBUFFER sbuf,DWORD loop=0)//播放声音122


{123
if( SoundAble==FALSE ) return;124
DWORD *Status1=NULL;125
if( (sbuf->GetStatus(Status1))!=DS_OK ) goto next;126
127
if( *Status1 & DSBSTATUS_PLAYING == DSBSTATUS_PLAYING ) return;128
next:129
sbuf->SetCurrentPosition(0);130
sbuf->Play(0,0,loop);131
}132

浙公网安备 33010602011771号