|
|
//创建DS对象P451
DirectSoundCreate8(0,&ds,0);
//设置DS的协调级别
ds->SetCooperativeLevel(ckjb,DSSCL_WRITEPRIMARY);
//创建主缓冲区
DSBUFFERDESC zhcqjg;//主缓冲区结构
ZeroMemory(&zhcqjg,sizeof(DSBUFFERDESC));
zhcqjg.dwSize=sizeof(DSBUFFERDESC);
zhcqjg.dwFlags=DSBCAPS_PRIMARYBUFFER;
zhcqjg.dwBufferBytes=0;
zhcqjg.lpwfxFormat=0;
ds->CreateSoundBuffer(&zhcqjg,&dshcq,0);
//主缓冲区格式
WAVEFORMATEX syjg;//声音结构
ZeroMemory(&syjg,sizeof(WAVEFORMATEX));
syjg.wFormatTag=WAVE_FORMAT_PCM;
syjg.nChannels=1;//单声道
syjg.nSamplesPerSec=22050;//采样频率
syjg.wBitsPerSample=16;//16bit
syjg.nBlockAlign=2;
syjg.nAvgBytesPerSec=44100;
dshcq->SetFormat(&syjg);
//创建次缓冲区
typedef struct sWaveHeader_tag
{
char RiffID[4]; //'RIFF'块
long WaveformChunkSize; //4个字节
char WaveID[4]; //.wav文件应为'WAVE'类型
char FormatID[4]; //'fmt '块(末尾有一个空格)
long FormatChunkSize; //16个字节
short FormatTag; //.wav文件应为WAVE_FORMAT_PCM
short Channels; //声道数
long SampleRate; //采样频率
long BytesPerSec; //每秒采样的字节数
short BlockAlign; //块对齐大小
short BitsPerSample; //bit位数(8bit或16bit)
char DataID[4]; //'data'块
long DataSize; //data块的大小(实际的声音数据)
}sWaveHeader;
FILE *fp;
fp=fopen("1.wav","rb");
sWaveHeader* pWaveHeader=new sWaveHeader();
fseek(fp,0,SEEK_SET);
fread(pWaveHeader,1,sizeof(sWaveHeader),fp);
//设置声音格式
WAVEFORMATEX waveFormat;
ZeroMemory(&waveFormat,sizeof(WAVEFORMATEX));
waveFormat.wFormatTag=WAVE_FORMAT_PCM;
waveFormat.nChannels=pWaveHeader->Channels; //声道数
waveFormat.nSamplesPerSec=pWaveHeader->SampleRate; //播放频率
waveFormat.wBitsPerSample=pWaveHeader->BitsPerSample; //位数
waveFormat.nBlockAlign=(waveFormat.wBitsPerSample / 8) * waveFormat.nChannels;
waveFormat.nAvgBytesPerSec=waveFormat.nSamplesPerSec * waveFormat.nBlockAlign;
DSBUFFERDESC chcqjg;//次缓冲区结构
ZeroMemory(&chcqjg,sizeof(DSBUFFERDESC));
chcqjg.dwSize=sizeof(DSBUFFERDESC);
chcqjg.dwFlags=DSBCAPS_CTRLVOLUME|DSBCAPS_GLOBALFOCUS|DSBCAPS_STATIC;
chcqjg.dwBufferBytes=pWaveHeader->DataSize;
chcqjg.lpwfxFormat=&waveFormat;
ds->CreateSoundBuffer(&chcqjg,&dshcq,0);
dshcq->QueryInterface(IID_IDirectSoundBuffer8,(void**)&dshcqc);
//装载声音到次缓冲区
//锁定缓冲区
BYTE *sya=NULL;//声音位置
BYTE *syb=NULL;
DWORD syarl,sybrl;//声音容量
dshcqc->Lock(0,pWaveHeader->DataSize,(void**)&sya, &syarl,(void**)&syb, &sybrl,0);
fread(sya,1,syarl,fp);
if(syb != NULL)
fread(syb,1,sybrl,fp);
dshcqc->Unlock(sya,syarl,syb,sybrl);
//声音的播放和控制
dshcqc-> lay(0,0,DSBPLAY_LOOPING); |
|