VC下实现DirectSound,第1张

VC下实现DirectSound,第2张

加入音乐是所有增强应用程序功能的方法中最简单的一种。音乐能让用户感到快乐;在合适的地方放合适的音乐,可以让程序员和他的VC++程序焕发光彩。

Microsoft多媒体API提供了三种播放WAV文件的方法:

PlaySound()函数。它可以通过单线编码播放Wave格式的声音。这个函数有两个限制:声音数据必须完全加载到物理内存中;所配置的音频驱动程序之一必须支持该数据格式。根据经验,PlaySound()适合100K以下的文件。

媒体控制接口.MCI功能强大,它不仅可以播放WAV文件,还可以播放MIDI和CD音频。

低电平波音频设备。使用这些设备,您可以运行完全控制波形数据的应用程序文件。
前两种方法比较好用,但是不能播放两个或两个以上的WAV文件;第三种方法实现起来非常复杂,非专业人员很难完成。DirectSound可以同时播放八个或八个以上的WAV文件,可以使多媒体程序更加生动,易于使用。但它只适用于Windows 95下的程序,不支持WAV文件的录制和存储。”“这很可惜。实现DirectSound需要以下步骤:
1 .创建并初始化direct sound
LP direct sound m _ pdirectobject;If (direct sound create (null,&m _ pdirectobject,null)= = ds _ ok)file://设置应用程序声音设备优先级的方式,一般为DSSCL _ normal _ pdirectobject-> setcooperativelevel(this-> m _ hwnd,DSSCL _ normal);elseAfxMessageBox("DirectSound创建失败");

2.将WAV文件读入内存,查找格式块、数据块位置和数据长度。
m_pMemory、m_pFormat、m_pData和m_dwSize是在头文件中声明的。
BOOL CDirectWave::LoadFile(CString Filename){
CFile文件;
DWORD dwSize;
如果(!文件。Open (Filename,
CFile::modeRead | CFile::shared enynone))
返回FALSE
dwSize = File。Seek (0,CFile::end);
文件。Seek (0,CFile::begin);
file://m_pMemory内存存储块指针,类型:lpvoid
m _ p memory = global lloc(gmem _ fixed,dwsize);
if(文件。ReadHuge (m_pMemory,dwSize)!= dwSize){
文件。close();
返回FALSE
}
文件。close();

LPDWORD pdw,pdwEnd
DWORD dwRiff,dwType,dwLength,dwLength。
if(m _ p format)file://format块指针,type:lpwaveformatex
m _ p format = null;
if(m _ pData)file://data block指针,type:LP byte
m _ pData = NULL;
if(m _ dwSize)file://data length,type:DWORD
m _ dwSize = 0;
PDW =(DWORD *)m _ p memory;
dw riff = * pdw++;
dw length = * pdw++;
dwType = * pdw++;

如果(dwRiff!= mmiosourcc(' R ',' I ',' F ',' F ')
返回FALSE
if (dwType!= mmiosourcc(' W ',' A ',' V ',' E ')
返回FALSE
file:// Find格式块、数据块位置和数据长度
PDW end =(dword *)((byte *)PDW+dwlength-4);
while(PDW < PD wend){
dwType = * pdw++;
dw length = * pdw++;
switch(dwType){
case mmiosourcc(' f ',' m ',' t ',' '):
if(!m _ p format){
if(dwLength < sizeof(wave format))
返回FALSE
m _ p format =(LPWAVEFORMATEX)PDW;
if(m _ pData & & m _ dwSize)
返回TRUE
}
break;

case mmiosourcc(' d ',' a ',' t ',' a'):
if(!m_pData ||!m _ dwSize){
m _ pData =(LP byte)PDW;
m _ dw size = dw length;
if(m _ p format)
返回TRUE
}
break;
}
PDW =(DWORD *)((BYTE *)PDW+
((dwLength+1)& ~ 1));
}
file://未找到,返回FALSE
返回FALSE;
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VC下实现DirectSound

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情