VC下实现DirectSound

文章作者 100test 发表时间 2008:03:18 15:06:40
来源 100Test.Com百考试题网


加入音乐是增强应用程序功能的所有方法中最简单的一个。音乐可以使用户心情愉快;在合适的场合播放恰当的音乐能够使程序员和他的VC 程序焕发光彩。

   Microsoft Windows Multimedia API提供了三种方法来播放WAV文件:

  PlaySound()函数。它可以通过单行编码来播放Wave格式的声音。此函数有两个限制:必须将声音数据完整地载入物理内存;数据格式必须被所配置的某一音频驱动器支持。根据经验,PlaySound()适用于100K以下的文件。

  MCI(The Media Control Interface)。MCI功能强大,不仅可以实现WAV文件的播放,而且还可以播放MIDI及CD音频。

  低级Wave音频设备。用这些设备可以运行完全控制Wave数据的应用文件。
  前两种方法使用简单,但无法实现两个及两个以上的WAV文件的播放;第三种方法实现起来非常复杂,非专业人员很难完成。DirectSound可以实现八个及八个以上WAV文件的同时播放,能使多媒体程序更加生动,而且简单易用,但它仅适合于Windows 95下的程序,也不支持WAV文件的记录及存储""这是唯一让人遗憾的地方。实现DirectSound需要以下几个步骤:
  1. 创建及初始化DirectSound
  LPDIRECTSOUND m_pDirectObject.if(DirectSoundCreate(NULL,&.m_pDirectObject,NULL)==DS_OK)file://设定应用程序的声音设备优先级别方式,一般为DSSCL_NORMALm_pDirectObject->SetCooperativeLevel(this- >m_hWnd,DSSCL_NORMAL).elseAfxMessageBox("DirectSound Create failed").

  2. 将WAV文件读入内存,找到格式块,数据块位置及数据长度。
m_pMemory,m_pFormat,m_pData,m_dwSize在头文件中声明。
BOOL CDirectWave::LoadFile (CString Filename){
CFile File.
DWORD dwSize.
if (!File.Open (Filename,
CFile::modeRead | CFile::shareDenyNone))
return FALSE.
dwSize = File.Seek (0, CFile::end).
File.Seek (0, CFile::begin).
file://m_pMemory内存存储块指针,类型:LPVOID
m_pMemory = GlobalAlloc (GMEM_FIXED, dwSize).
if (File.ReadHuge (m_pMemory, dwSize) != dwSize){
File.Close ().
return FALSE.
}
File.Close ().

LPDWORD pdw,pdwEnd.
DWORD dwRiff,dwType, dwLength, dwLength.
if (m_pFormat) file://格式块指针,类型:LPWAVEFORMATEX
m_pFormat = NULL.
if (m_pData) file://数据块指针,类型:LPBYTE
m_pData = NULL.
if (m_dwSize) file://数据长度,类型:DWORD
m_dwSize = 0.
pdw = (DWORD *) m_pMemory.
dwRiff = *pdw .
dwLength = *pdw .
dwType = *pdw .

if (dwRiff != mmioFOURCC (R, I, F, F))
return FALSE.
if (dwType != mmioFOURCC (W, A, V, E))
return FALSE.
file://寻找格式块,数据块位置及数据长度
pdwEnd = (DWORD *)((BYTE *) pdw dwLength - 4).
while (pdw < pdwEnd){
dwType = *pdw .
dwLength = *pdw .
switch (dwType){
case mmioFOURCC(f, m, t, ):
if (!m_pFormat){
if (dwLength < sizeof (WAVEFORMAT))
return FALSE.
m_pFormat = (LPWAVEFORMATEX) pdw.
if (m_pData &.&. m_dwSize)
return TRUE.
}
break.

case mmioFOURCC(d, a, t, a):
if (!m_pData || !m_dwSize){
m_pData = (LPBYTE) pdw.
m_dwSize = dwLength.
if (m_pFormat)
return TRUE.
}
break.
}
pdw = (DWORD *)((BYTE *) pdw
((dwLength 1) &.~ 1)).
}
file://未找到,返回FALSE
return FALSE.
}


相关文章


物流名词:联合采购cooperarivebuying
货代综合辅导:风险管理--货代篇
货代综合辅导:如何报关、结关、清关
货代综合辅导:佣金和折扣的运用
VC下实现DirectSound
创建不在任务条中显示窗口按钮的应用
在同一系统中显示GB字符和BIG5字符
用TAPI为掌上电脑开发通讯应用程序
利用VC 实现局域网实时视频传输
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛