注册 登录  
 加关注

网易博客网站关停、迁移的公告:

将从2018年11月30日00:00起正式停止网易博客运营
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

DirectSound添加声音  

2012-03-15 21:23:25|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
结果N长时间的努力我终于在小人的背景中加入了音乐,不容易啊。代码一直是没有问题的,问题出现在音乐文件上,之前我是直接把一个MP3格式名直接改为WAV的格式,结果出现了无法运行的错误。刚才把一个原始WAV文件加入后就解决了这个问题。
创建接口->读取WAV文件->设置辅助缓冲区格式->设置主缓冲区格式->创建DirectSoundBuffer->开始播放->控制播放-安全释放。
嵌入的DirectSound全部源代码如下:

//头文件

#include<d3d9.h>
#include<d3dx9.h>
#include<stdio.h>//标准输入输出头文件,wav文件的读取用到这里的函数
#include<dsound.h>//DirectX Sound头文件


//以下实现部分为DirectSound8借口对象声明
LPDIRECTSOUND8 g_pDirectSound = NULL;//DirectSound Interface;
LPDIRECTSOUNDBUFFER g_pPrimaryBuffer = NULL;//主缓冲借口
LPDIRECTSOUNDBUFFER8 g_pSecondaryBuffer = NULL;//辅助缓冲区借口
//主缓冲区借口标示正在播放的声音,辅助缓冲区则标示在队列中的声音
//下面的结构体存储一个WAV文件的格式信息 助缓冲借口
struct WAVE_HEADER//WAV头文件结构
{
char riff_sig[4]; //RIFF
long waveform_chunk_size;//8
char wave_sig[4]; //WAVE
char format[4];//fmt(noyice space after)??
long format_chunk_size;//16
short format_tag;//WAVE_FORMAT_PCM
short channels; //声道数
long sample_rate;//采用频率
long bytes_per_sec;//比特率KBps
short block_align;//线性阻碍 block障碍物 alignment线性排列
short bits_per_sample; //位/每秒
char data_sig[4];
long data_size; //音频数据大小
};



//以下部分为DirectSound的初始化阶段
//创建DirectSound8借口
DirectSoundCreate8(NULL,&g_pDirectSound,NULL);
g_pDirectSound->SetCooperativeLevel(hWnd,DSSCL_NORMAL);//设置协作级别 //读取音频数据
WAVE_HEADER wave_header;
::ZeroMemory(&wave_header,sizeof(WAVE_HEADER));
FILE* fp=fopen("live.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);//j结构大小
ds_buf_desc.dwFlags = DSBCAPS_CTRLVOLUME;//控制标志
/*以下是若干可选的控制方式
dwFlags
Flags that specify buffer-object capabilities. Use one or more of the values shown in the following table. Value Description
DSBCAPS_CTRL3D The buffer has 3D control capability.
DSBCAPS_CTRLFREQUENCY The buffer has frequency control capability.
DSBCAPS_CTRLFX The buffer supports effects processing.
DSBCAPS_CTRLPAN The buffer has pan control capability.
DSBCAPS_CTRLVOLUME The buffer has volume control capability.
DSBCAPS_CTRLPOSITIONNOTIFY The buffer has position notification capability. See the Remarks for DSCBUFFERDESC.

*/
ds_buf_desc.dwBufferBytes = wave_header.data_size;//缓冲区大小
ds_buf_desc.lpwfxFormat = &wave_format;//WAVE音频格式

g_pDirectSound->CreateSoundBuffer(&ds_buf_desc,&g_pPrimaryBuffer,NULL);
g_pPrimaryBuffer->QueryInterface(IID_IDirectSoundBuffer8,(void**)&g_pSecondaryBuffer);

//在取得辅助缓冲区接口对象后,调用该对象的Lock方法对缓冲区加锁,并得到指向缓冲区的两个指针。
//然后WAV音频数据读取到这两个指针所指向的存储空间中

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);



static long lPan = 0,lVolume = DSBVOLUME_MAX;
if(::GetAsyncKeyState(VK_LEFT)&0x8000f)
{
lPan -= 500;g_pSecondaryBuffer->SetVolume(lVolume);
}
if(::GetAsyncKeyState(VK_RIGHT)&0x8000f)
{
lPan+=500;g_pSecondaryBuffer->SetPan(lPan);
}
if(::GetAsyncKeyState(VK_UP)&0x8000f)
{
lVolume += 500;g_pSecondaryBuffer->SetVolume(lVolume);
}
if(::GetAsyncKeyState(VK_DOWN)&0x8000f)
{
lVolume-=500;g_pSecondaryBuffer->SetVolume(lVolume);
}
if(::GetAsyncKeyState(VK_SPACE)&0x8000f)
{
g_pSecondaryBuffer->Play(0,0,DSBPLAY_LOOPING);
}
if(::GetAsyncKeyState('X')&0x8000f)
{
g_pSecondaryBuffer->Stop();
}



  评论这张
 
阅读(394)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018