|
发表于 2004-4-14 22:40:00
|
显示全部楼层
Re:请问哪位高人可以给一个可以用的DSound函数
第一个参数是DirectSound对象,第二个参数是音效文件的名字。
返回一个DirectSoundBuffer对象。
然后调用返回的DirectSoundBuffer对象的
lpDSBData->SetCurrentPosition( 0 );
lpDSBData-> lay( 0, 0, 0 );
就可以播放音效了。
(请你以后在可能的情况下,也帮助别人,共同营造一个互助的游戏开发社区)
//********************************************************************
//函数:DSLoadSoundBuffer( )
//功能:载入声音
//********************************************************************
IDirectSoundBuffer* DSLoadSoundBuffer(IDirectSound *pDS, char* fn)
{
//获取声音文件的基本信息
DWORD Wave_Size = 0; // the size of this wave data
char * Wave_Data = NULL; // a point to the wave data;
WAVEFORMATEX * lpWaveFormatEx; // the wave format
HMMIO hmmio; // a MMio stucture;
MMCKINFO mmCkRiff; // The Riff chunk information
MMCKINFO mmCkChunk; // The Chunks information (Format 'Fmt 'and Data 'data');
MMRESULT result; // Check the result for each preparing stage
LONG bytesread;
Wave_Size = NULL;
// Open a file which name from the parameter
hmmio = mmioOpen(fn, NULL, MMIO_READ | MMIO_ALLOCBUF);
if(hmmio == NULL)
return FALSE;
// Find the first level chunk: Riff chunk, with fccType 'WAVE'
mmCkRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
result = mmioDescend(hmmio, &mmCkRiff, NULL, MMIO_FINDRIFF);
if (result != MMSYSERR_NOERROR)
return FALSE;
// find second level chunk: Format chunk, with ckid 'fmt '
mmCkChunk.ckid = mmioFOURCC('f', 'm', 't', ' ');
result = mmioDescend(hmmio, &mmCkChunk, &mmCkRiff, MMIO_FINDCHUNK);
if (result != MMSYSERR_NOERROR)
return FALSE;
lpWaveFormatEx = new WAVEFORMATEX;
// load all information about format to a WAVEFORMATEX structure
bytesread = mmioRead(hmmio, (char *)lpWaveFormatEx, sizeof(WAVEFORMATEX));
if (bytesread == -1)
return FALSE;
// return to first level of chunk: RIFF
result = mmioAscend(hmmio, &mmCkChunk, 0);
if (result != MMSYSERR_NOERROR)
return FALSE;
// find second level chunk: chunk data, with ckid 'data'
mmCkChunk.ckid = mmioFOURCC('d', 'a', 't', 'a');
result = mmioDescend(hmmio, &mmCkChunk, &mmCkRiff, MMIO_FINDCHUNK);
if (result != MMSYSERR_NOERROR)
return FALSE;
// save size of this wave file.
Wave_Size = mmCkChunk.cksize;
//now, allocate memory for Wave_Data
Wave_Data = (char *)GlobalAlloc(GMEM_FIXED, Wave_Size);
if (Wave_Data == NULL)
return FALSE;
// read all data from wave file
bytesread = mmioRead(hmmio, (char *)Wave_Data, Wave_Size);
if (bytesread == -1)
return FALSE;
// we've done, close up the file
mmioClose(hmmio, 0);
//读取声音文件的内容
LPDIRECTSOUNDBUFFER lpDSBTemp;
DWORD dwWaveSize;
LPSTR szFileName;
WAVEFORMATEX *lpWFmtEX;
char * lpWaveData;
dwWaveSize = Wave_Size;
szFileName = fn;
lpWFmtEX = new WAVEFORMATEX;
lpWaveData = (char *)GlobalAlloc(GMEM_FIXED,dwWaveSize);
memcpy(lpWFmtEX,lpWaveFormatEx, sizeof(WAVEFORMATEX));
memcpy(lpWaveData, Wave_Data,Wave_Size );
//建立DirectSoundBuffer对象并初始化
DSBUFFERDESC dsbc;
memset(&dsbc, 0, sizeof(DSBUFFERDESC));
dsbc.dwSize = sizeof(DSBUFFERDESC);
dsbc.dwFlags = DSBCAPS_STATIC;
dsbc.dwBufferBytes = dwWaveSize;
dsbc.lpwfxFormat = lpWFmtEX;
// construct the buffer
if(pDS->CreateSoundBuffer(&dsbc, &lpDSBTemp, NULL)!=DS_OK)
return FALSE;
//将实际的音频信息填充进DirectSoundBuffer内
LPVOID pSoundBlock1;
LPVOID pSoundBlock2;
DWORD bytes1;
DWORD bytes2;
if(lpDSBTemp->Lock(0, dwWaveSize,&pSoundBlock1, &bytes1, &pSoundBlock2,&bytes2,0)!=DS_OK)
return FALSE;
// load the data
memcpy((void *)pSoundBlock1, lpWaveData, dwWaveSize);
// unlock the memory buffer
if(lpDSBTemp->Unlock(pSoundBlock1, bytes1, pSoundBlock2, bytes2)!=DS_OK)
return FALSE;
GlobalFree(Wave_Data);
Wave_Data = NULL;
Wave_Size = 0;
delete lpWaveFormatEx;
return lpDSBTemp;
}
|
|