注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

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

 
 
 

日志

 
 

DirectSound入门  

2012-03-14 23:30:14|  分类: 技术类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
今天看了下关于DirectSound的内容:
创建DirectSound接口,初始化接口,创建缓冲区基本固定的管线。要关灯咯先贴代码:

//以下实现部分为DirectSound8借口对象声明
LPDIRECTSOUND8 g_pDirectSound = NULL;//DirectSound Interface;
LPDIRECTSOUNDBUFFER g_pPrimaryBuffer = NULL;//主缓冲借口
LPDIRECTSOUNDBUFFER8 g_pSecondaryBuffer = NULL;//辅助缓冲借口
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(wave_format));
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(ds_buf_desc));
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);

//在取得辅助缓冲区接口对象后,调用该对象的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);


  评论这张
 
阅读(107)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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