DirectSound应用,播放wav文件

来源:互联网 发布:河南省软件协会 编辑:程序博客网 时间:2024/05/22 00:19

在项目的源文件中包含dsound.h头文件,分别定义DirectSound接口和主、辅助缓冲区接口的全局变量,以及保存WAV音频格式的文件头结构。


声明代码如下:

//--D3D用的头文件#include <d3d9.h>#include <d3dx9.h>#include <stdio.h>#include <dsound.h>
LPDIRECTSOUND8g_pDirectSound = NULL;//DirectSound接口LPDIRECTSOUNDBUFFER g_pPrimaryBuffer = NULL;//主缓冲接口LPDIRECTSOUNDBUFFER8 g_pSecondaryBuffer = NULL;//辅助缓冲接口

WAV文件的文件头定义如下:

struct WAVE_HEADER{char riff_sig[4];//RIFFlong waveform_chunk_size;//8char wave_sig[4];//WAVEchar format_sig[4];//FMTlong format_chunk_size;//16short format_tag;//WAVE_FORMAT_PCMshort channels;    //声道数long sample_rate;//采用频率long bytes_per_sec;//播放速度 字节/秒short block_align;//sample block alignmentshort bits_per_sample;//位/秒char data_sig[4];//datalong data_size;//音频数据大小};



//--D3D的初始化
HRESULT CD3DInit::InitD3D(HWND hWnd)
{
//--创建D3D对象


//---创建IDirectSound8接口-----------------DirectSoundCreate8(NULL,&g_pDirectSound,NULL);g_pDirectSound->SetCooperativeLevel(hWnd,DSSCL_NORMAL);//---读取WAV音频信息WAVE_HEADER wave_header;::ZeroMemory(&wave_header,sizeof(WAVE_HEADER));FILE* fp = fopen("example.wav","rb");fread((void*)&wave_header,1,sizeof(WAVE_HEADER),fp);//--创建主、辅助音频缓存WAVEFORMATEX wave_format;ZeroMemory(&wave_format,sizeof(WAVEFORMATEX));wave_format.wFormatTag = WAVE_FORMAT_PCM;wave_format.nChannels = wave_header.channels;wave_format.nSamplesPerSec = wave_header.sample_rate;wave_format.wBitsPerSample = wave_header.bits_per_sample;wave_format.nBlockAlign = wave_format.wBitsPerSample/8 * wave_format.nChannels;wave_format.nAvgBytesPerSec = wave_format.nSamplesPerSec*wave_format.nBlockAlign;DSBUFFERDESC ds_buf_desc;ZeroMemory(&ds_buf_desc,sizeof(DSBUFFERDESC));ds_buf_desc.dwSize = sizeof(DSBUFFERDESC);ds_buf_desc.dwFlags = DSBCAPS_CTRLVOLUME;ds_buf_desc.dwBufferBytes = wave_header.data_size;ds_buf_desc.lpwfxFormat = &wave_format;g_pDirectSound->CreateSoundBuffer(&ds_buf_desc,&g_pPrimaryBuffer,NULL);g_pPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8,(void**)&g_pSecondaryBuffer);//---加载MAV音频数据---------------------------char *ptr1,*ptr2;DWORD size1,size2;fseek(fp,sizeof(WAVE_HEADER),SEEK_SET);g_pSecondaryBuffer->Lock(0,wave_header.data_size,(void**)&ptr1,&size1,(void**)&ptr2,&size2,0);if(ptr1)fread(ptr1,1,size1,fp);if(ptr2)fread(ptr2,1,size2,fp);g_pSecondaryBuffer->Unlock(ptr1,size1,ptr2,size2);fclose(fp);

Render()函数中


g_pd3dDevice->BeginScene();

//---开始播放-----------static long lPan = 0,lVolume =DSBVOLUME_MAX;if(::GetAsyncKeyState(VK_SPACE)&0x8000f)g_pSecondaryBuffer->Play(0,0,DSBPLAY_LOOPING);//开始播放if(::GetAsyncKeyState('S')&0x8000f)g_pSecondaryBuffer->Stop();




很重要的一点,如果编译报告

unresolved external symbol _IID_IDirectSoundBuffer

错误,

_IID_IDirectSoundNotify 联结错误的原因是您没有联结dxguid.lib库,在Setting下设置它就ok了。

原创粉丝点击