📄 ds.cpp
字号:
//------ Include Files ------//
#include "stdafx.h"
#include "DS.h"
#include "wave.h"
#include "resource.h"
////////////////////////////////////////////////////////////////////////
//
CDS::CDS()
{
//add some special code here?
}
////////////////////////////////////////////////////////////////////////
//
CDS::~CDS()
{
Destroy();
}
bool CDS::Initialize(HWND hWnd,LPCSTR szSourceWave[DSOUND_MAX_NUM],int nSoundNum)
{
HRESULT hr;
//(0)check sound number:
if(nSoundNum>DSOUND_MAX_NUM)goto Destroy;
m_nSoundNum=nSoundNum;
//(1)Create the DS object
hr=DirectSoundCreate(NULL, &m_lpDS, NULL);
if(hr!=DS_OK)goto Destroy;
//(2)Set the cooperation level for the DS object
hr=m_lpDS->SetCooperativeLevel(hWnd,DSSCL_NORMAL);
if(hr!=DS_OK)goto Destroy;
//(3)Initialize the DS buffers
if(!ReLoadSourceWaves(szSourceWave,m_nSoundNum))goto Destroy;
/*
LPCSTR szWave[88];
szWave[0]="main.wav";
if(!ReLoadSourceWaves(szWave,1))goto Destroy;
//*/
return true;
Destroy:;
Destroy();
MessageBox(NULL,"DirectSound Initialize Error","Sorry.",MB_OK);
return false;
}
///////////////////////////////////////////////////////////////////////////
//
void CDS::Destroy()
{
if(m_lpDS!=NULL)
{
m_lpDS->Release();
m_lpDS=NULL;
}
return;
}
//////////////////////////////////////////////////////////////////////////
//
bool CDS::LoadSourceWave(int nBufferIndex,LPCSTR szSourceWave)
{
HRESULT hr;
CWave wave;
if(nBufferIndex>=DSOUND_MAX_NUM)return false;
//(1)Initialize wave
wave.Create(szSourceWave);
//(2)Get the wave information
DWORD dwDataLen=wave.GetDataLen();
WAVEFORMATEX wfFormat;
wave.GetFormat(wfFormat);
//(3)Setup the DS buffer description
DSBUFFERDESC dsbdDesc;
ZeroMemory(&dsbdDesc, sizeof(DSBUFFERDESC));
dsbdDesc.dwSize =sizeof(DSBUFFERDESC);
dsbdDesc.dwFlags=DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN |
DSBCAPS_CTRLVOLUME | DSBCAPS_STATIC;
dsbdDesc.dwBufferBytes=dwDataLen;
dsbdDesc.lpwfxFormat =&wfFormat;
//(4)Create the DS buffer
hr=m_lpDS->CreateSoundBuffer(&dsbdDesc,
&(m_lpDSB[nBufferIndex]),
NULL);
if(hr!=DS_OK)return false;
//(5)Lock the DS buffer
BYTE* pDSBuffData;
hr=m_lpDSB[nBufferIndex]->Lock(0,dwDataLen,
(void**)&pDSBuffData,
&dwDataLen,NULL,0,0);
if(hr!=DS_OK)return false;
//(6)Write wave data to the DS buffer
dwDataLen=wave.GetData(pDSBuffData,dwDataLen);
//(7)Unlock the DS buffer
hr=m_lpDSB[nBufferIndex]->Unlock(pDSBuffData,
dwDataLen,
NULL, 0);
if(hr!=DS_OK)return false;
return true;
}
//////////////////////////////////////////////////////////////////////////////
//
bool CDS::ReLoadSourceWaves(LPCSTR szSourceWave[DSOUND_MAX_NUM],int nSoundNum)
{
if(nSoundNum>DSOUND_MAX_NUM)return false;
m_nSoundNum=nSoundNum;
for(int i=0;i<m_nSoundNum;i++)
{
//if(m_lpDSB[i]!=NULL)Stop(i);
if(m_lpDSB[i]!=NULL)m_lpDSB[i]->Release();
m_szSourceWave[i]=szSourceWave[i];
//if(!LoadSourceWave(i,m_szSourceWave[i]))return false;
if(!RestoreBuffer(i))return false;
}
return true;
}
///////////////////////////////////////////////////////////////////////
//
bool CDS::Play(int nBufferIndex,unsigned long luType,long lVolume,long lFrequency,long lPan)
{
DWORD dwStatus;
m_lpDSB[nBufferIndex]->GetStatus(&dwStatus);
if(dwStatus & DSBSTATUS_BUFFERLOST)
RestoreBuffer(nBufferIndex);
//if(!(dwStatus & DSBSTATUS_PLAYING))
{
m_lpDSB[nBufferIndex]->SetVolume(lVolume);
m_lpDSB[nBufferIndex]->SetPan(lPan);
m_lpDSB[nBufferIndex]->SetFrequency(lFrequency);
m_lpDSB[nBufferIndex]->Play(0,0,luType);
}
return true;
}
/*
if (dwStatus & DSBSTATUS_LOOPING)
lpDSBSounds[8]->Stop();
*/
///////////////////////////////////////////////////////////////////////////
//
bool CDS::Stop(int nBufferIndex)
{
DWORD dwStatus;
m_lpDSB[nBufferIndex]->GetStatus(&dwStatus);
if(dwStatus & DSBSTATUS_BUFFERLOST)
RestoreBuffer(nBufferIndex);
if((dwStatus & DSBSTATUS_PLAYING & DSBSTATUS_LOOPING))
m_lpDSB[nBufferIndex]->Stop();
return true;
}
//////////////////////////////////////////////////////////////////
//
bool CDS::RestoreBuffer(int nBufferIndex)
{
if(m_lpDSB[nBufferIndex]!=DS_OK)
return false;
return LoadSourceWave(nBufferIndex,
m_szSourceWave[nBufferIndex]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -