游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3152|回复: 7

急!救助!DirectSound的声音播放问题!

[复制链接]

17

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2004-7-15 20:32:00 | 显示全部楼层 |阅读模式
如题,大哥说具体一点。怎么在DIrectSound中同一时间放数个相同的声音?不能是为每个声音创建缓存吧?浪费类存。或着是创建线程?请指教!!!!!!! [em24] [em24]

17

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
 楼主| 发表于 2004-7-16 17:52:00 | 显示全部楼层

Re:急!救助!DirectSound的声音播放问题!

怎么没人啊!!!自己顶!高手帮忙啊!!!!!我问了好多次了!!!!!!!

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2004-7-18 13:59:00 | 显示全部楼层

Re:急!救助!DirectSound的声音播放问题!

Different sound file need a directsoundbuffer, It is necessary

17

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
 楼主| 发表于 2004-7-19 12:52:00 | 显示全部楼层

Re:急!救助!DirectSound的声音播放问题!

终于有人回答了!
楼上的大哥,你说的我知道,我想问的是同一时间播放同一个声音。
比如游戏里面的爆炸声音,资源里面是唯一的吧,但是如果在游戏里面出现两个或多个爆炸,声音的播放是怎么弄的,需要线程吧!还是怎么弄的?高手指教啊。

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2004-7-20 01:29:00 | 显示全部楼层

Re:急!救助!DirectSound的声音播放问题!

使用多个后台缓冲就行了,
相关代码如下:
//sound.h
#include "windows.h"
#include "dsound.h"
#pragma comment(lib, "dsound")

#pragma  once

template <typename T>
void Release(T object)
{
        if (NULL != object)
        {
                object->Release ();
                object = NULL;
        }
}

template <typename T>
void ErrorExit(HWND hWindow,T describe)
{
        MessageBox(hWindow, describe, "错误", MB_OK);
        exit(1);
}

typedef struct _WAVE_HEADER_
{
        BYTE        RIFF[4];         
        DWORD       dwSize;           
        BYTE        WAVE[4];         
        BYTE        fmt_[4];         
        DWORD       dw16;            
        WORD        wOne_0;      
        WORD        wChnls;           
        DWORD       dwSRate;         
        DWORD       BytesPerSec;      
        WORD        wBlkAlign;        
        WORD        BitsPerSample;   
        BYTE        DATA[4];         
        DWORD       dwDSize;         
} WaveHeader, * pWaveHeader;

class fdSound
{
public:
        fdSound();
        ~fdSound();
        bool        Init(HWND hWindow);
        bool        LoadFile(int bufferIndex, LPSTR szFileName);
        bool        Play(int bufferIndex, bool iLoop);
        bool        Stop(void);
        bool        SetVolume(LONG iVolume);

protected:
        LPDIRECTSOUND8                m_lpkDSound;
        LPDIRECTSOUNDBUFFER m_lpkPSound;
        LPDIRECTSOUNDBUFFER m_lpkSound[16];
        HWND                                m_hWindow;
};
//sound.cpp
#include "sound.h"
#include "iostream"
using namespace std;

fdSound::fdSound()
{
        ZeroMemory(m_lpkSound, sizeof(LPDIRECTSOUNDBUFFER) * 16);
        m_lpkPSound        = NULL;
        m_lpkDSound        = NULL;
}
fdSound::~fdSound()
{
        Stop();
        for(int i = 0; i < 15; i++)
        {
                Release(m_lpkSound);
        }
        Release(m_lpkPSound);
        Release(m_lpkDSound);
}

bool        fdSound::Init(HWND hWindow)
{
        m_hWindow = hWindow;
        DirectSoundCreate8(NULL, &m_lpkDSound, NULL);
        if (NULL == m_lpkDSound)
        {
                ErrorExit(m_hWindow,"创建音频设备失败!");
        }
        if (FAILED (m_lpkDSound->SetCooperativeLevel(m_hWindow, DSSCL_PRIORITY)))
        {
                ErrorExit(m_hWindow,"创建音频设备失败!");
        }
        DSBUFFERDESC        dsbdesc;
        memset( &dsbdesc, 0, sizeof( DSBUFFERDESC ));
        dsbdesc.dwSize = sizeof( DSBUFFERDESC );
        dsbdesc.dwFlags = DSBCAPS_PRIMARYBUFFER | DSBCAPS_CTRLVOLUME ;
        dsbdesc.dwBufferBytes = 0;
        dsbdesc.lpwfxFormat = NULL;
        if (FAILED (m_lpkDSound->CreateSoundBuffer( &dsbdesc, &m_lpkPSound, NULL )))
        {
                ErrorExit(m_hWindow,"创建音频缓存失败!");
        }
        WAVEFORMATEX        wfm;
        memset( &wfm, 0, sizeof( WAVEFORMATEX ) );
        wfm.wFormatTag = WAVE_FORMAT_PCM;
        wfm.nChannels = 2;
        wfm.nSamplesPerSec = 44100;
        wfm.wBitsPerSample = 16;
        wfm.nBlockAlign = wfm.wBitsPerSample / 8 * wfm.nChannels;
        wfm.nAvgBytesPerSec = wfm.nSamplesPerSec * wfm.nBlockAlign;
        m_lpkPSound->SetFormat(&wfm);
        return true;
}

bool        fdSound::SetVolume(LONG iVolume)
{
                        if (FAILED (m_lpkPSound->SetVolume( -(100 - iVolume) * 100)))
                        {
                                return false;
                        }
        return true;
}

bool        fdSound:lay(int bufferIndex, bool iLoop)
{
        if (bufferIndex < 0 || bufferIndex > 15)
        {
                return false;
        }
        if(FAILED (m_lpkSound[bufferIndex]->SetCurrentPosition(0)))
        {
                return false;
        }
        if (FAILED (m_lpkSound[bufferIndex]-&gtlay(0, NULL, iLoop ? DSBPLAY_LOOPING : 0)))
        {
                return false;
        }
        return true;
}

bool        fdSound::Stop(void)
{
        if (!m_lpkSound)
        {
                return false;
        }
        for (int i = 0; i < 15; i++)
        {
                if(m_lpkSound)
                {
                        if(FAILED (m_lpkSound->Stop()))
                        {
                                return false;
                        }
                        if(FAILED (m_lpkSound->SetCurrentPosition(0)))
                        {
                                return false;
                        }
                }
        }
        return true;
}

bool        fdSound:oadFile(int bufferIndex, LPSTR szFileName)
{

        PCMWAVEFORMAT pcmwf;
        DSBUFFERDESC dsbdesc;
        FILE *pFile;

        pFile = fopen(szFileName, "rb");
        if (!pFile || bufferIndex < 0 || bufferIndex > 15)
        {
                return false;
        }

        WaveHeader Wavheader;
        if (fread(&Wavheader, sizeof(Wavheader), 1, pFile) != 1)
        {
                fclose(pFile);
                return false;
        }

        memset(&pcmwf, 0, sizeof(PCMWAVEFORMAT));
        pcmwf.wf.wFormatTag = WAVE_FORMAT_PCM;      
        pcmwf.wf.nChannels = Wavheader.wChnls;
        pcmwf.wf.nSamplesPerSec = Wavheader.dwSRate;
        pcmwf.wf.nBlockAlign = Wavheader.wBlkAlign;
        pcmwf.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign;
        pcmwf.wBitsPerSample = Wavheader.BitsPerSample;

        memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
        dsbdesc.dwSize = sizeof(DSBUFFERDESC);
        dsbdesc.dwFlags = DSBCAPS_STATIC;
        dsbdesc.dwBufferBytes = Wavheader.dwDSize;
        dsbdesc.lpwfxFormat = (LPWAVEFORMATEX)&pcmwf;

        if (FAILED (m_lpkDSound->CreateSoundBuffer(&dsbdesc, &m_lpkSound[bufferIndex], NULL)))
        {
                return false;
        }
        if (sizeof(Wavheader) != 0xffffffff)
        {
                if(fseek(pFile, sizeof(Wavheader), SEEK_SET) != 0)
                {
                        return false;
                }
        }

        LPVOID pData1;
        DWORD  dwData1Size;
        LPVOID pData2;
        DWORD  dwData2Size;

        if (FAILED (m_lpkSound[bufferIndex]->Lock(0, Wavheader.dwDSize, &pData1, &dwData1Size, &pData2, &dwData2Size, DSBLOCK_ENTIREBUFFER)))
        {
                return false;
        }
        if (dwData1Size > 0)
        {
                fread(pData1, dwData1Size, 1, pFile);
        }
        if (dwData2Size > 0)
        {
                fread(pData2, dwData2Size, 1, pFile);
        }
        if (FAILED (m_lpkSound[bufferIndex]->Unlock(pData1, dwData1Size, pData2, dwData2Size)))
        {
                return false;
        }
        fclose(pFile);
        return true;
}

17

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
 楼主| 发表于 2004-7-20 02:00:00 | 显示全部楼层

Re:急!救助!DirectSound的声音播放问题!

谢谢拉!不过你那样好浪费内存的呀。
是不是要播放的时候再创建缓冲区呀?就是new 一个对象,播放完马上释放?
问题是我在同一个时间播放相同的声音呀。没必要给相同的声音创建多个缓冲吧?

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2004-7-20 11:04:00 | 显示全部楼层

Re:急!救助!DirectSound的声音播放问题!

因为只在读取声音文件时才分配内存,
而用完后你可以直接把它Release()掉(上面代码偷了点懒,没写这个东东),
所以,
跟用new相比,
也就是浪费了多声明的那几个指针所占的空间而已(大小为sizeof(LPDIRECTSOUNDBUFFER) * 16),
当然,
如果同一声音在同一时间要重复很多次,
这样做的确很费内存,
解决的办法是锁定缓存再拷贝,
相关函数使用请查阅MSDN,
前两天旅游回家,
想高高兴兴在家上两天网再说,
哪知一时疏忽没开防火墙,
结果中了病毒很多资料都丢失了,
包括我正在做的那个游戏,5555......
现在MSDN那些东西都没有,
也不好乱教,
自己加油吧,
大家都是这么自己摸索过来的!

17

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
 楼主| 发表于 2004-7-20 13:20:00 | 显示全部楼层

Re:急!救助!DirectSound的声音播放问题!

哇!我感动!谢谢!原来怎么这么麻烦呀!
好象多几个指针不是很费内存的哈!
这个问题怎么讨论的人不多呀!游戏的声很重要的。希望高手多多指教!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-3 22:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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