游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1662|回复: 1

请问哪位高人可以给一个可以用的DSound函数

[复制链接]

9

主题

22

帖子

40

积分

注册会员

Rank: 2

积分
40
发表于 2004-4-13 20:27:00 | 显示全部楼层 |阅读模式
DSound载入wav文件的过程太复杂了,有哪位高人可以给我一个现成的DSound函数,可以直接拿来播放背景音乐和音效的

12

主题

58

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2004-4-14 22:40:00 | 显示全部楼层

Re:请问哪位高人可以给一个可以用的DSound函数


第一个参数是DirectSound对象,第二个参数是音效文件的名字。
返回一个DirectSoundBuffer对象。

然后调用返回的DirectSoundBuffer对象的
        lpDSBData->SetCurrentPosition( 0 );
        lpDSBData-&gtlay( 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;
}




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-30 02:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表