头文件
#if !defined(AFX_DIRECTSOUND_H__A20FE86F_118F_11D2_9AB3_0060B0CDC13E__INCLUDED_)
#define AFX_DIRECTSOUND_H__A20FE86F_118F_11D2_9AB3_0060B0CDC13E__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include
#include
#pragma message("linking with Microsoft's DirectSound library ...")
#pragma comment(lib, "dsound.lib")
class CDirectSound
{
public:
// 构造、析构函数
CDirectSound();
virtual ~CDirectSound();
//创建DirectSound对象
BOOL Create(LPCTSTR pszResource, CWnd * pWnd = 0);
BOOL Create(UINT uResourceID, CWnd * pWnd = 0) {
return Create(MAKEINTRESOURCE(uResourceID), pWnd);
}
BOOL Create(LPVOID pSoundData, CWnd * pWnd = 0);
public:
//操作函数
BOOL IsValid() const;
void Play(DWORD dwStartPosition = 0, BOOL bLoop = FALSE);
void Stop();
void Pause();
void Continue();
CDirectSound & EnableSound(BOOL bEnable = TRUE) {
m_bEnabled = bEnable;
if( ! bEnable )
Stop();
return * this;
}
BOOL IsEnabled() const { return m_bEnabled; }
protected:
//设置声音数据缓冲区
BOOL SetSoundData(LPVOID pSoundData, DWORD dwSoundSize);
//创建DirectSoundBuffer
BOOL CreateSoundBuffer(WAVEFORMATEX * pcmwf);
//获取Wave数据
BOOL GetWaveData(void * pRes, WAVEFORMATEX * & pWaveHeader, void * & pbWaveData, DWORD & cbWaveSize);
private:
//声音数据
LPVOID m_pTheSound;
//数据大小
DWORD m_dwTheSound;
//DirectSoundBuffer指针
LPDIRECTSOUNDBUFFER m_pDsb;
BOOL m_bEnabled;
//DirectSound对象
static LPDIRECTSOUND m_lpDirectSound;
static DWORD m_dwInstances;
};
#endif // !defined(AFX_DIRECTSOUND_H__A20FE86F_118F_11D2_9AB3_0060B0CDC13E__INCLUDED_)
类的主体
- #include "stdafx.h"
- #include "DirectSound.h"
- // The following macro is defined since DirectX 5, but will work with
- // older versions too.
- #ifndef DSBLOCK_ENTIREBUFFER
- #define DSBLOCK_ENTIREBUFFER 0x00000002
- #endif
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
- static void DSError( HRESULT hRes ) {
- switch(hRes) {
- case DS_OK: TRACE0("NO ERROR/n"); break;
- case DSERR_ALLOCATED: TRACE0("ALLOCATED/n"); break;
- case DSERR_INVALIDPARAM: TRACE0("INVALIDPARAM/n"); break;
- case DSERR_OUTOFMEMORY: TRACE0("OUTOFMEMORY/n"); break;
- case DSERR_UNSUPPORTED: TRACE0("UNSUPPORTED/n"); break;
- case DSERR_NOAGGREGATION: TRACE0("NOAGGREGATION/n"); break;
- case DSERR_UNINITIALIZED: TRACE0("UNINITIALIZED/n"); break;
- case DSERR_BADFORMAT: TRACE0("BADFORMAT/n"); break;
- case DSERR_ALREADYINITIALIZED: TRACE0("ALREADYINITIALIZED/n"); break;
- case DSERR_BUFFERLOST: TRACE0("BUFFERLOST/n"); break;
- case DSERR_CONTROLUNAVAIL: TRACE0("CONTROLUNAVAIL/n"); break;
- case DSERR_GENERIC: TRACE0("GENERIC/n"); break;
- case DSERR_INVALIDCALL:&n