zoukankan      html  css  js  c++  java
  • CSound类源文件

    #ifndef __SoundH__
    #define __SoundH__

    #include <dsound.h>
    #include "SDKwavefile.h"
    #include <vector>
    using namespace std;

    struct SSound
    {
     IDirectSoundBuffer8* pSoundBuffer;
     bool bLooping;
     SSound() { pSoundBuffer = 0; bLooping = false; }
    };

    class CSound
    {
    private:
     IDirectSound8* m_pSound;
     vector<SSound> m_Sound;
    public:
     void Init(HWND hWnd);
     void CreateSound(WCHAR* wsFileName);
     void Play(int nIndex);
     void Pause(int nIndex);
     void ChangeState(int nIndex);
     void Start(int nIndex);
    };
    void CSound::Init(HWND hWnd)
    {
     DirectSoundCreate8(0, &m_pSound, 0);
     m_pSound->SetCooperativeLevel(hWnd, DSSCL_PRIORITY); 
    }
    void CSound::CreateSound(WCHAR* wsFileName)
    {
     SSound Sound, Sound0;
     CWaveFile WaveFile;
     ZeroMemory(&WaveFile, sizeof(CWaveFile));
     if(WaveFile.Open(wsFileName, 0, WAVEFILE_READ) != S_OK) { m_Sound.push_back(Sound0); return; }
     DSBUFFERDESC dsbd;
     ZeroMemory(&dsbd, sizeof(DSBUFFERDESC));
     dsbd.dwSize = sizeof(DSBUFFERDESC);
     dsbd.dwFlags = DSBCAPS_CTRLPAN |   DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPOSITIONNOTIFY;
     dsbd.dwBufferBytes = WaveFile.GetSize();
     dsbd.lpwfxFormat = WaveFile.m_pwfx;
     IDirectSoundBuffer* pBuffer = 0;
     if(m_pSound->CreateSoundBuffer(&dsbd, &pBuffer, 0) != S_OK) { m_Sound.push_back(Sound0); return; }
     if(pBuffer->QueryInterface(IID_IDirectSoundBuffer8, (void**)&Sound.pSoundBuffer) != S_OK) { m_Sound.push_back(Sound0); return; }
     pBuffer->Release();
     void* pvoid = 0;
     DWORD nLen = 0;
     DWORD dwWrite = 0;
     if(Sound.pSoundBuffer->Lock(0, 0, &pvoid, &nLen, 0, 0, DSBLOCK_ENTIREBUFFER) != S_OK) { m_Sound.push_back(Sound0); return; }
     if(WaveFile.Read((BYTE*)pvoid, nLen, &dwWrite) != S_OK) { m_Sound.push_back(Sound0); return; }
     if(Sound.pSoundBuffer->Unlock(pvoid, nLen, 0, 0)) { { m_Sound.push_back(Sound0); return; } }
     m_Sound.push_back(Sound);
    }
    void CSound::Play(int nIndex)
    {
     if(nIndex >= m_Sound.size() || m_Sound[nIndex].pSoundBuffer == NULL) return;
     m_Sound[nIndex].pSoundBuffer->Play(0, 0, DSBPLAY_LOOPING);
     m_Sound[nIndex].bLooping = true;
    }
    void CSound::Pause(int nIndex)
    {
     if(nIndex >= m_Sound.size() || m_Sound[nIndex].pSoundBuffer == NULL) return;
     m_Sound[nIndex].pSoundBuffer->Stop();
     m_Sound[nIndex].bLooping = false;
    }
    void CSound::ChangeState(int nIndex)
    {
     if(nIndex >= m_Sound.size() || m_Sound[nIndex].pSoundBuffer == NULL) return;
     if(m_Sound[nIndex].bLooping) Pause(nIndex);
     else Play(nIndex);
    }
    void CSound::Start(int nIndex)
    {
     if(nIndex >= m_Sound.size() || m_Sound[nIndex].pSoundBuffer == NULL) return;
     m_Sound[nIndex].pSoundBuffer->SetCurrentPosition(0);
     m_Sound[nIndex].pSoundBuffer->Play(0, 0, DSBPLAY_LOOPING);
     m_Sound[nIndex].bLooping = true;
    }

    #endif

    //Init初始化
    //CreateSound加载声音资源,没加载成功的仍进行管理,这样就可以根据加载的顺序知道对应声音文件的下标
    //Play继续播放
    //Pause暂停播放
    //ChangeState在继续播放与暂停播放间改变状态
    //Start开始播放

    //由于使用了DXUT,所以需要把DXUT的相关文件都添加进项目

    //可能需要的lib文件包括dsound.lib;version.lib;imm32.lib;comctl32.lib;d3dx10d.lib;d3dx9d.lib;dxerr.lib;dxguid.lib;winmm.lib;d3d9.lib;d3dx9.lib;

  • 相关阅读:
    区块链 超级节点什么鬼?
    堆排序--模版类
    梯度下降算法Python简单试验
    svn: Can't convert string from 'UTF-8' to native encoding
    常用加密算法比较
    快速排序结合插入排序
    无法解析的外部符号
    mysql 远程连接出错问题
    50个C/C++经典面试题
    设计算法找出字符串中重复出现最长的子串
  • 原文地址:https://www.cnblogs.com/ketmales/p/2466759.html
Copyright © 2011-2022 走看看