一个vc++ direct sound播放wav文件的类

这是一个VC++类,用于利用DirectSound库播放WAV文件。类包含构造函数、析构函数以及播放、停止、暂停等操作。通过加载资源或指定数据来创建DirectSound对象,并设置声音数据缓冲区。类内部处理了错误检查和DirectSoundBuffer的创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件

#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_)

 

 

类的主体

  1. #include "stdafx.h"    
  2. #include "DirectSound.h"    
  3.    
  4. // The following macro is defined since DirectX 5, but will work with    
  5. // older versions too.    
  6. #ifndef DSBLOCK_ENTIREBUFFER    
  7.     #define DSBLOCK_ENTIREBUFFER        0x00000002    
  8. #endif    
  9.    
  10. #ifdef _DEBUG    
  11. #undef THIS_FILE    
  12. static char THIS_FILE[]=__FILE__;   
  13. #define new DEBUG_NEW    
  14. #endif    
  15.    
  16. static void DSError( HRESULT hRes ) {   
  17.     switch(hRes) {   
  18.         case DS_OK: TRACE0("NO ERROR/n"); break;   
  19.         case DSERR_ALLOCATED: TRACE0("ALLOCATED/n"); break;   
  20.         case DSERR_INVALIDPARAM: TRACE0("INVALIDPARAM/n"); break;   
  21.         case DSERR_OUTOFMEMORY: TRACE0("OUTOFMEMORY/n"); break;   
  22.         case DSERR_UNSUPPORTED: TRACE0("UNSUPPORTED/n"); break;   
  23.         case DSERR_NOAGGREGATION: TRACE0("NOAGGREGATION/n"); break;   
  24.         case DSERR_UNINITIALIZED: TRACE0("UNINITIALIZED/n"); break;   
  25.         case DSERR_BADFORMAT: TRACE0("BADFORMAT/n"); break;   
  26.         case DSERR_ALREADYINITIALIZED: TRACE0("ALREADYINITIALIZED/n"); break;   
  27.         case DSERR_BUFFERLOST: TRACE0("BUFFERLOST/n"); break;   
  28.         case DSERR_CONTROLUNAVAIL: TRACE0("CONTROLUNAVAIL/n"); break;   
  29.         case DSERR_GENERIC: TRACE0("GENERIC/n"); break;   
  30.         case DSERR_INVALIDCALL:&n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值