第八部分 MFC中的声音

上传人:ldj****22 文档编号:48517311 上传时间:2018-07-16 格式:PPT 页数:15 大小:85.50KB
返回 下载 相关 举报
第八部分 MFC中的声音_第1页
第1页 / 共15页
第八部分 MFC中的声音_第2页
第2页 / 共15页
第八部分 MFC中的声音_第3页
第3页 / 共15页
第八部分 MFC中的声音_第4页
第4页 / 共15页
第八部分 MFC中的声音_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《第八部分 MFC中的声音》由会员分享,可在线阅读,更多相关《第八部分 MFC中的声音(15页珍藏版)》请在金锄头文库上搜索。

1、第八部分 MFC中声音 VC中声音的使用 nBEEPnMCI控制WAVnDirectSound BEEPn使用主板喇叭发声BOOL Beep( DWORD dwFreq /sound frequency, in hertz /频率 DWORD dwDuration / sound duration, in milliseconds /时间 ); 包含头文件:#include “windows.h“ 音符频率表n音符 频率/HZ 半周期/us 音符 频率/HZ 半周期/us-低1DO 262 1908 #4FA# 740 0676#1DO# 277 1805 中5SO 784 0638低2RE

2、294 1700 #5SO# 831 0602#2RE# 311 1608 中6LA 880 0568低3M 330 1516 #6LA# 932 0536低4FA 349 1433 中7SI 988 0506#4FA# 370 1350 高1DO 1046 0478低5SO 392 1276 #DO# 1109 0451#5SO# 415 1205 高2RE 1175 0426低6LA 440 1136 #2RE# 1245 0402#6LA# 466 1072 高3M 1318 0372低7SI 494 1012 高4FA 1397 0358中1DO 523 0956 #4FA# 1480

3、 0338#1DO# 554 0903 高5SO 1568 0319中2RE 578 0842 #5S0# 1661 0292#2RE# 622 0804 高6LA 1760 0284中3M 659 0759 #6LA# 1865 0268中4FA 698 0716 高7SI 1976 0253-(“#“表示半音,用于上升或下降半个音) 使用声卡发声 针对微软专门为Windows系统定义的波形文件格式(Waveform Audio),其扩展名为“*.wav“ 用Windows提供的API函数BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound)可以实

4、现小型WAV文件的播放,其中参数lpszSound 为所要播 放的声音文件,fuSound为播放声音文件时所用的标志位 例如实现Sound.wav 文件的异步播放,只要调用函数 sndPlaySound(“c:windowsSound.wav”,SND_ASYNC)就可以了(需要在你开发的项目设置Project-Setting-Link-Object/library modules中加入winmm.lib )并在头文件中包括“mmsystem.h“头文件。 nsndPlaySound(NULL, SND_SYNC); n停止播放程序中声音文件MCI 播放声音n当WAVE文件较大时,系统无法将声

5、音数据一次性 的读入内存,sndPlaySound函数就不能很好的播放 声音了。n为了解决这个问题,可用MicroSoft API提供的MCI( The Media Control Interface)方法来操作声音文件。n在使用MCI方法之前,首先需要在你开发的项目设 置Project-Setting-Link-Object/library modules中加 入winmm.lib。并在头文件中包括“mmsystem.h“头文 件。 MCI 播放声音nvoid CBEEP_ONView:OnMci() nn/ TODO: Add your command handler code heren

6、MCI_OPEN_PARMS mciOpenParms;nMCI_PLAY_PARMS PlayParms; n /定义音频文件相关参数nmciOpenParms.dwCallback=0; nmciOpenParms.lpstrElementName=“ressuccess.wav“;/打开的声音文件nmciOpenParms.wDeviceID=0;nmciOpenParms.lpstrDeviceType=“waveaudio“;nmciOpenParms.lpstrAlias=“ “;nPlayParms.dwCallback=0;nPlayParms.dwTo=0;nPlayParm

7、s.dwFrom=0;nmciSendCommand(NULL,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(D WORD)(LPVOID)/打开音频设备 ;nmciSendCommand(mciOpenParms.wDeviceID,MCI_PLAY,MCI_WAIT,(DWORD)(LP VOID)/播放WAVE声音文件;nmciSendCommand(mciOpenParms.wDeviceID,MCI_CLOSE,NULL,NULL);/关闭音 频设备 ;DirectSound操作WAVE文件的方法nMCI虽然调用简单,功能强大,可以满足声音文件处理

8、的基本 需要,但是MCI也有它的缺点,那就是它一次只能播放一个 WAVE文件,有时在实际应用中,为了实现混音效果,需要同 时播放两个或两个以上的WAVE文件时,就需要使用微软 DirectX技术中的DirectSound了,该技术直接操作底层声卡设 备,可以实现八个以上WAV文件的同时播放。n实现DirectSound需要以下几个步骤:1.创建及初始化 DirectSound;2.设定应用程序的声音设备优先级别方式,一般 为DSSCL_NORMAL;2. 将WAV文件读入内存,找到格式块、数 据块位置及数据长度;3.创建声音缓冲区;4.载入声音数据; 5.播放及停止 n注:项目设置中要包含“d

9、sound.lib、dxguid.lib“ DirectSound操作WAVE文件的方法nvoid CPlaysoundView:OnPlaySound() / TODO: Add your command handler code here LPVOID lpPtr1;/指针1; LPVOID lpPtr2;/指针2; HRESULT hResult; DWORD dwLen1,dwLen2; LPVOID m_pMemory;/内存指针; LPWAVEFORMATEX m_pFormat;/LPWAVEFORMATEX变量; LPVOID m_pData;/指向语音数据块的指针; DWOR

10、D m_dwSize;/WAVE文件中语音数据块的长度; CFile File;/Cfile对象; DWORD dwSize;/存放WAV文件长度; /打开sound.wav文件; if (!File.Open (“d:/sound.wav“, CFile:modeRead |CFile:shareDenyNone) return ; dwSize = File.Seek (0, CFile:end);/获取WAVE文件长度; ile.Seek (0, CFile:begin);/定位到打开的WAVE文件头;DirectSound操作WAVE文件的方法n/为m_pMemory分配内存,类型为L

11、PVOID,用来存放WAVE文件中的数据;m_pMemory = GlobalAlloc (GMEM_FIXED, dwSize);if (File.ReadHuge (m_pMemory, dwSize) != dwSize)/读取文件中的数据;File.Close ();return ;File.Close ();LPDWORD pdw,pdwEnd;DWORD dwRiff,dwType, dwLength;if (m_pFormat) /格式块指针m_pFormat = NULL;if (m_pData) /数据块指针,类型:LPBYTEm_pData = NULL;if (m_dwS

12、ize) /数据长度,类型:DWORDm_dwSize = 0;pdw = (DWORD *) m_pMemory;dwRiff = *pdw+;dwLength = *pdw+;dwType = *pdw+;if (dwRiff != mmioFOURCC (R, I, F, F)return ;/判断文件头是否为“RIFF“字符;if (dwType != mmioFOURCC (W, A, V, E)return ;/判断文件格式是否为“WAVE“;DirectSound操作WAVE文件的方法n/寻找格式块,数据块位置及数据长度pdwEnd = (DWORD *)(BYTE *) m_p

13、Memory+dwLength -4);bool m_bend=false;while (pdw SetCooperativeLevel(this-GetSafeHwnd(), DSSCL_NORMAL);/设置声音设备优先级别为“NORMAL“;/创建声音数据缓冲;LPDIRECTSOUNDBUFFER m_pDSoundBuffer;if (m_lpDirectSound-CreateSoundBuffer (if (hResult = DS_OK)memcpy (lpPtr1, m_pData, dwLen1);if(dwLen20) BYTE *m_pData1=(BYTE*)m_pData+dwLen1;m_pData=(void *)m_pData1;memcpy(lpPtr2,m_pData, dwLen2);m_pDSoundBuffer-Unlock (lpPtr1, dwLen1, lpPtr2, dwLen2);DWORD dwFlags = 0;m_pDSoundBuffer-Play (0, 0, dwFlags); /播放WAVE声音数据;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号