📄 d3dsound.cpp
字号:
#include "d3dsound.h"
LPDIRECTSOUND8 lpDSound; //DirectSound界面
DSBUFFERDESC dsbd;
pcm_sound sound_fx[MAX_SOUNDS]; //DirectSound次缓冲列表
int sound_id;
WAVEFORMATEX pcmwf;
D3DSound::D3DSound()
{
}
D3DSound::~D3DSound()
{
}
int D3DSound::MyDirectSoundInit(HWND hwnd)
{
hWnd = hwnd;
if (DirectSoundCreate8(NULL, &lpDSound, NULL)!=DS_OK )
return 0;
//设置DirectSound协作等级
if (lpDSound->SetCooperativeLevel(hWnd,DSSCL_NORMAL)!=DS_OK)
return 0;
//清空声音数组
memset(sound_fx,0,sizeof(pcm_sound)*MAX_SOUNDS);
//初始声音数组
for (int index=0; index<MAX_SOUNDS; index++)
{
//是否已经存在
if (sound_fx[index].dsbuffer)
{
//停止
sound_fx[index].dsbuffer->Stop();
//释放缓冲
sound_fx[index].dsbuffer->Release();
}
//清空声音数组
memset(&sound_fx[index],0,sizeof(pcm_sound));
sound_fx[index].state = SOUND_NULL;
sound_fx[index].id = index;
}
return 1;
}
int D3DSound::MyDirectSoundShut()
{
if (sound_fx[sound_id].dsbuffer)
sound_fx[sound_id].dsbuffer->Release();
if (lpDSound!=NULL)
lpDSound->Release();
return 1;
}
int D3DSound::DSoundLoadWAV(char *filename, int control_flags)
{
HMMIO hwav; //文件句柄
MMCKINFO parent,
child;
WAVEFORMATEX wfmtx; //WAV结构
int sound_id = -1, index;
UCHAR *snd_buffer, //缓冲
*audio_ptr_1=NULL, //第一写指针
*audio_ptr_2=NULL; //第二写指针
DWORD audio_length_1=0, //第一缓冲
audio_length_2=0; //第二缓冲
//初始化
for (index=0; index < MAX_SOUNDS; index++)
{
//声音是否被使用
if (sound_fx[index].state==SOUND_NULL)
{
sound_id = index;
break;
}
}
//id是否被使用
if (sound_id==-1)
return(-1);
//设置结构
parent.ckid = (FOURCC)0;
parent.cksize = 0;
parent.fccType = (FOURCC)0;
parent.dwDataOffset = 0;
parent.dwFlags = 0;
//复制数据
child = parent;
//打开WAV文件
if ((hwav = mmioOpen(filename, NULL, MMIO_READ | MMIO_ALLOCBUF)) == NULL)
return(-1);
//RIFF
parent.fccType = mmioFOURCC('W', 'A', 'V', 'E');
if (mmioDescend(hwav, &parent, NULL, MMIO_FINDRIFF))
{
//关闭
mmioClose(hwav, 0);
return -1;
}
//WAVEfmt
child.ckid = mmioFOURCC('f', 'm', 't', ' ');
if (mmioDescend(hwav, &child, &parent, 0))
{
//关闭
mmioClose(hwav, 0);
return -1;
}
//读取格式
if (mmioRead(hwav, (char *)&wfmtx, sizeof(wfmtx)) != sizeof(wfmtx))
{
//关闭
mmioClose(hwav, 0);
return -1;
}
//是否PCM格式
if (wfmtx.wFormatTag != WAVE_FORMAT_PCM)
{
//关闭
mmioClose(hwav, 0);
return -1;
}
//data chunk
if (mmioAscend(hwav, &child, 0))
{
//关闭
mmioClose(hwav, 0);
return -1 ;
}
//确定data chunk
child.ckid = mmioFOURCC('d', 'a', 't', 'a');
if (mmioDescend(hwav, &child, &parent, MMIO_FINDCHUNK))
{
//关闭
mmioClose(hwav, 0);
return -1;
}
//分配空间
snd_buffer = (UCHAR *)malloc(child.cksize);
//读取WAV数据
mmioRead(hwav, (char *)snd_buffer, child.cksize);
//关闭
mmioClose(hwav, 0);
//设置频率
sound_fx[sound_id].rate = wfmtx.nSamplesPerSec;
sound_fx[sound_id].size = child.cksize;
sound_fx[sound_id].state = SOUND_LOADED;
//设置结构
memset(&pcmwf, 0, sizeof(WAVEFORMATEX));
pcmwf.wFormatTag = WAVE_FORMAT_PCM; // pulse code modulation
pcmwf.nChannels = 2; // mono
pcmwf.nSamplesPerSec = 22050; // always this rate
pcmwf.nBlockAlign = 4;
pcmwf.nAvgBytesPerSec = pcmwf.nSamplesPerSec * pcmwf.nBlockAlign;
pcmwf.wBitsPerSample = 16;
pcmwf.cbSize = 0;
//描述创建缓冲
dsbd.dwSize = sizeof(DSBUFFERDESC);
if(control_flags == 0)
dsbd.dwFlags = DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME |
DSBCAPS_CTRLFREQUENCY | DSBCAPS_STATIC | DSBCAPS_LOCSOFTWARE;
dsbd.dwBufferBytes = child.cksize;
dsbd.lpwfxFormat = &pcmwf;
//创建缓冲
if (FAILED(lpDSound->CreateSoundBuffer(&dsbd,&sound_fx[sound_id].dsbuffer,NULL)))
{
//释放
free(snd_buffer);
return -1;
}
//拷贝数据
if (FAILED(sound_fx[sound_id].dsbuffer->Lock(0,
child.cksize,
(void **) &audio_ptr_1,
&audio_length_1,
(void **)&audio_ptr_2,
&audio_length_2,
DSBLOCK_FROMWRITECURSOR)))
return 0;
//复制第一循环缓冲
memcpy(audio_ptr_1, snd_buffer, audio_length_1);
//复制第二循环缓冲
memcpy(audio_ptr_2, (snd_buffer+audio_length_1),audio_length_2);
//解锁
if (FAILED(sound_fx[sound_id].dsbuffer->Unlock(audio_ptr_1,
audio_length_1,
audio_ptr_2,
audio_length_2)))
return 0;
//释放临时缓冲
free(snd_buffer);
return sound_id;
}
void D3DSound::PlaySound(int sound_id)
{
sound_fx[sound_id].dsbuffer->Play(0,0,1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -