头文件
#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"
-
-
-
#ifndefDSBLOCK_ENTIREBUFFER
-
#defineDSBLOCK_ENTIREBUFFER0x00000002
-
#endif
-
#ifdef_DEBUG
-
#undefTHIS_FILE
-
staticcharTHIS_FILE[]=__FILE__;
-
#definenewDEBUG_NEW
-
#endif
-
staticvoidDSError(HRESULThRes){
-
switch(hRes){
-
caseDS_OK:TRACE0("NOERROR/n");break;
-
caseDSERR_ALLOCATED:TRACE0("ALLOCATED/n");break;
-
caseDSERR_INVALIDPARAM:TRACE0("INVALIDPARAM/n");break;
-
caseDSERR_OUTOFMEMORY:TRACE0("OUTOFMEMORY/n");break;
-
caseDSERR_UNSUPPORTED:TRACE0("UNSUPPORTED/n");break;
-
caseDSERR_NOAGGREGATION:TRACE0("NOAGGREGATION/n");break;
-
caseDSERR_UNINITIALIZED:TRACE0("UNINITIALIZED/n");break;
-
caseDSERR_BADFORMAT:TRACE0("BADFORMAT/n");break;
-
caseDSERR_ALREADYINITIALIZED:TRACE0("ALREADYINITIALIZED/n");break;
-
caseDSERR_BUFFERLOST:TRACE0("BUFFERLOST/n");break;
-
caseDSERR_CONTROLUNAVAIL:TRACE0("CONTROLUNAVAIL/n");break;
-
caseDSERR_GENERIC:TRACE0("GENERIC/n");break;
-
caseDSERR_INVALIDCALL:TRACE0("INVALIDCALL/n");break;
-
caseDSERR_OTHERAPPHASPRIO:TRACE0("OTHERAPPHASPRIO/n");break;
-
caseDSERR_PRIOLEVELNEEDED:TRACE0("PRIOLEVELNEEDED/n");break;
-
default:TRACE1("%lu/n",hRes);break;
- }
- }
-
-
-
- LPDIRECTSOUNDCDirectSound::m_lpDirectSound;
-
DWORDCDirectSound::m_dwInstances;
- CDirectSound::CDirectSound()
- {
- m_lpDirectSound=0;
- m_pDsb=0;
- m_pTheSound=0;
- m_dwTheSound=0;
- m_bEnabled=TRUE;
- ++m_dwInstances;
- }
- CDirectSound::~CDirectSound()
- {
-
if(m_pDsb)
- m_pDsb->Release();
-
if(!--m_dwInstances&&m_lpDirectSound){
- m_lpDirectSound->Release();
- m_lpDirectSound=0;
- }
- }
-
BOOLCDirectSound::Create(LPCTSTRpszResource,CWnd*pWnd)
- {
-
-
-
HINSTANCEhApp=::GetModuleHandle(0);
- ASSERT(hApp);
-
HRSRChResInfo=::FindResource(hApp,pszResource,TEXT("WAVE"));
-
if(hResInfo==0)
-
returnFALSE;
-
HGLOBALhRes=::LoadResource(hApp,hResInfo);
-
if(hRes==0)
-
returnFALSE;
-
LPVOIDpTheSound=::LockResource(hRes);
-
if(pTheSound==0)
-
returnFALSE;
-
returnCreate(pTheSound,pWnd);
- }
-
BOOLCDirectSound::Create(LPVOIDpSoundData,CWnd*pWnd){
-
-
if(pWnd==0)
- pWnd=AfxGetApp()->GetMainWnd();
- ASSERT(pWnd!=0);
- ASSERT(::IsWindow(pWnd->GetSafeHwnd()));
- ASSERT(pSoundData!=0);
-
-
if(m_lpDirectSound==0)
- {
-
HRESULThRes=DS_OK;
-
shortnRes=0;
-
do{
-
if(nRes)
- ::Sleep(500);
- hRes=::DirectSoundCreate(0,&m_lpDirectSound,0);
- ++nRes;
-
}while(nRes<10&&(hRes==DSERR_ALLOCATED||hRes==DSERR_NODRIVER));
-
if(hRes!=DS_OK)
-
returnFALSE;
-
- m_lpDirectSound->SetCooperativeLevel(pWnd->GetSafeHwnd(),DSSCL_NORMAL);
- }
- ASSERT(m_lpDirectSound!=0);
-
- WAVEFORMATEX*pcmwf;
-
if(!GetWaveData(pSoundData,pcmwf,m_pTheSound,m_dwTheSound)||
- !CreateSoundBuffer(pcmwf)||
- !SetSoundData(m_pTheSound,m_dwTheSound))
-
returnFALSE;
-
returnTRUE;
- }
-
BOOLCDirectSound::GetWaveData(void*pRes,WAVEFORMATEX*&pWaveHeader,void*&pbWaveData,DWORD&cbWaveSize){
- pWaveHeader=0;
- pbWaveData=0;
- cbWaveSize=0;
-
DWORD*pdw=(DWORD*)pRes;
-
DWORDdwRiff=*pdw++;
-
DWORDdwLength=*pdw++;
-
DWORDdwType=*pdw++;
-
-
if(dwRiff!=mmioFOURCC('R','I','F','F'))
-
returnFALSE;
-
-
if(dwType!=mmioFOURCC('W','A','V','E'))
-
returnFALSE;
-
-
DWORD*pdwEnd=(DWORD*)((BYTE*)pdw+dwLength-4);
-
-
while(pdw<pdwEnd)
- {
- dwType=*pdw++;
- dwLength=*pdw++;
-
switch(dwType){
-
casemmioFOURCC('f','m','t',''):
-
if(!pWaveHeader)
- {
-
if(dwLength<sizeof(WAVEFORMAT))
-
returnFALSE;
- pWaveHeader=(WAVEFORMATEX*)pdw;
-
if(pbWaveData&&cbWaveSize)
-
returnTRUE;
- }
-
break;
-
casemmioFOURCC('d','a','t','a'):
-
pbWaveData=LPVOID(pdw);
- cbWaveSize=dwLength;
-
if(pWaveHeader)
-
returnTRUE;
-
break;
- }
-
pdw=(DWORD*)((BYTE*)pdw+((dwLength+1)&~1));
- }
-
returnFALSE;
- }
-
BOOLCDirectSound::CreateSoundBuffer(WAVEFORMATEX*pcmwf)
- {
- DSBUFFERDESCdsbdesc;
-
-
memset(&dsbdesc,0,sizeof(DSBUFFERDESC));
-
dsbdesc.dwSize=sizeof(DSBUFFERDESC);
-
- dsbdesc.dwFlags=DSBCAPS_STATIC;
- dsbdesc.dwBufferBytes=m_dwTheSound;
- dsbdesc.lpwfxFormat=pcmwf;
-
HRESULThRes;
-
if(DS_OK!=(hRes=m_lpDirectSound->CreateSoundBuffer(&dsbdesc,&m_pDsb,0)))
- {
-
- DSError(hRes);
- m_pDsb=0;
-
returnFALSE;
- }
-
returnTRUE;
- }
-
BOOLCDirectSound::SetSoundData(void*pSoundData,DWORDdwSoundSize){
-
LPVOIDlpvPtr1;
-
DWORDdwBytes1;
-
-
HRESULThr=m_pDsb->Lock(0,0,&lpvPtr1,&dwBytes1,0,0,DSBLOCK_ENTIREBUFFER);
-
-
if(DSERR_BUFFERLOST==hr)
- {
- m_pDsb->Restore();
- hr=m_pDsb->Lock(0,0,&lpvPtr1,&dwBytes1,0,0,DSBLOCK_ENTIREBUFFER);
- }
-
if(DS_OK==hr){
-
- ::CopyMemory(lpvPtr1,pSoundData,dwBytes1);
-
- hr=m_pDsb->Unlock(lpvPtr1,dwBytes1,0,0);
-
if(DS_OK==hr)
-
returnTRUE;
- }
-
returnFALSE;
- }
-
voidCDirectSound::Play(DWORDdwStartPosition,BOOLbLoop)
- {
-
if(!IsValid()||!IsEnabled())
-
return;
-
-
if(dwStartPosition>m_dwTheSound)
- dwStartPosition=m_dwTheSound;
-
- m_pDsb->SetCurrentPosition(dwStartPosition);
-
-
if(DSERR_BUFFERLOST==m_pDsb->Play(0,0,bLoop?DSBPLAY_LOOPING:0)){
- SetSoundData(m_pTheSound,m_dwTheSound);
- m_pDsb->Play(0,0,bLoop?DSBPLAY_LOOPING:0);
- }
- }
-
voidCDirectSound::Stop()
- {
-
if(IsValid())
- m_pDsb->Stop();
- }
-
voidCDirectSound::Pause()
- {
- Stop();
- }
-
voidCDirectSound::Continue()
- {
-
if(IsValid())
- {
-
DWORDdwPlayCursor,dwWriteCursor;
- m_pDsb->GetCurrentPosition(&dwPlayCursor,&dwWriteCursor);
- Play(dwPlayCursor);
- }
- }
-
BOOLCDirectSound::IsValid()const
- {
-
return(m_lpDirectSound&&m_pDsb&&m_pTheSound&&m_dwTheSound)?TRUE:FALSE;
- }
分享到:
相关推荐
。。。
。。。
VC++ 采用DirectSound播放声音示例 LPDIRECTSOUNDBUFFER Lock、Unlock、SetCurrentPosition、Play、Stop
使用mmio解码wav,DirectSound播放的代码。很好理解,还可以即时多声音混音。推荐初学者查看。不使用CWaveFile类,这比开发手册更容易理解和学习。
DirectSound实现静态播放wav文件和动态播放wav文件,内附源码
利用DirectSound 播放自定义wave文件.
C#在VS2019中使用DirectSound播放wav音频文件,里面已包括了2个必要的库文件(Microsoft.DirectX.DirectSound.dll、Microsoft.DirectX.dll)。
使用DirectSound播放MP3文件
c语言directsound实现wav文件的播放,亲测可用...
DirectSound 播放 wave 文件的程序代码
封装directsound播放为一个类 做成dll形式供对话框测试程序调用 。 完整源代码 可直接编译执行。
在vs2010环境下 用DirectSound类库播放wav的声音
directsound播放wave文件 可用于实现3D音效
VC++ 采用DirectSound播放声音示例,使用DirectSound实现音频文件的播放。
使用DirectSound播放wave文件的程序代码,VC完整应用程序代码
使用directsound播放pcm流、DirectSound开发手册
c#使用DirectSound播放wav,所需的两个库文件Microsoft.DirectX.dll和Microsoft.DirectX.DirectSound.dll,这是32位的库,为了在64位机器运行必须要x86编译,否则将报错
C# DirectSound 实现录音 播放 查看WAV文件头等功能
一.声卡录音的基本原理 为了实现一个录音的基本过程,至少需要以下对象的支持: 1. 录音设备,对我们的PC设备就是声卡。这个录音设备可以进行的操作应该...除了以上三个主要的DirectSound类,还需要以下几个辅助类。
C#利用DirectSound可以实现把PCM音频流保存成WAV文件,进行播放。