MFC中的几种播放声音的方法
一.播放聲音文件的簡單方法
在VC++ 中的多媒體動態連接庫中提供了一組與音頻設備有關的函數。利用這些函數可以方便地播放聲音。最簡單的播放聲音方法就是直接調用VC++中提供的聲音播放函 數BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中參數lpszSound是需要播放聲音的.WAV文件的路徑和文件名, hmod在這里為NULL,fuSound是播放聲音的標志,具體說明請參考VC++中的幫助。例如播放C:\sound\music.wav可以用 sndPlaySound ("c:\\sound\\music.wav",SND_ASYNC);或PlaySound("c:\\sound \\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );假如沒有找到music.wav文件,第一種格式將播放系統默認的聲音,第二種格式不會播放系統默認的聲音。
二.將聲音文件加入到程序中
在VC++的程序設計中,可以利用各種標準的資源,如位圖,菜單,對話框等。同時VC++也答應用戶自定義資源,因此我們可以將聲音文件作為用戶自定義資源加入程序資源文件中,經過編譯連接生成EXE文件,實現無.WAV文件的聲音播放。
要實現作為資源的聲音文件的播放,首先要在資源管理器中加入待播放的聲音文件(實現過程并不復雜,這里不在敘述)。假設生成的聲音文件資源標識符為IDR_WAVE1。在播放時只需要調用下面的語句:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
其中MAKEINTRESOURCE()宏將整數資源標識符轉變為字符串,AfxGetResourceHandle()函數返回包含資源的模塊句柄,
SND_RESOURCE是必須的標志。
作為資源的聲音文件的第二種播放方法是把資源讀入內存后作為內存數據播放。具體步驟入下:
1.獲得包含資源的模塊句柄:
HMODULE hmod=AfxGetResourceHandle();
2.檢索資源塊信息:
HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
3. 裝載資源數據并加鎖:
HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
4.播放聲音文件:
sndPlaySound(lpMemSound,SND_MEMORY));
5.釋放資源句柄:
FreeResource(hGlobalMem);
第三種方法是用PlaySound播放系統聲音,Windows啟動的聲音是由SystemStart定義的系統聲音,因此可以用下面的方法播放啟動聲音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
函數sndPlaySound的功能與PlaySound類似,但少了一個參數。函數的聲明為:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);
除 了不能指定資源名字外,參數lpszSound與PlaySound的是一樣的。參數fuSound是如何播放聲音的標志,可以是SND_ASYNC、 SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的組合,這些標志的含義與 PlaySound的一樣。
可以看出,sndPlaySound不能直接播放聲音資源。要用該函數播放WAVE文件,可按下面的方式調用
?
=================================================================================
一、PlaySound函數的聲明為:
BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);
參數說明:
pszSound:是指定了要播放聲音的字符串,該參數可以是WAVE文件的名字,或是WAVE資源的名字,或是內存中聲音數據的指針,或是在系統注冊表WIN.INI中定義的系統事件聲音.假如該參數為NULL則停止正在播放的聲音.
hmod:是應用程序的實例句柄,當播放WAV資源時要用到該參數,否則它必須為NULL.
fdwSound: 是標志的組合,如下表所示。若成功則函數返回TRUE,否則返回FALSE。
二、播放標志以及含義:
SND_APPLICATION
用應用程序指定的關聯來播放聲音。
SND_ALIAS
pszSound參數指定了注冊表或WIN.INI中的系統事件的別名。
SND_ALIAS_ID
pszSound參數指定了預定義的聲音標識符。
SND_ASYNC
用異步方式播放聲音,PlaySound函數在開始播放后立即返回。
SND_FILENAME
pszSound參數指定了WAVE文件名。
SND_LOOP
反復播放聲音,必須與SND_ASYNC標志一塊使用。
SND_MEMORY
播放載入到內存中的聲音,此時pszSound是指向聲音數據的指針。
SND_NODEFAULT
不播放缺省聲音,若無此標志,則PlaySound在沒找到聲音時會播放缺省聲音。
SND_NOSTOP
PlaySound不打斷原來的聲音播出并立即返回FALSE。
SND_NOWAIT
假如驅動程序正忙則函數就不播放聲音并立即返回。
SND_PURGE
停止所有與調用任務有關的聲音。若參數pszSound為NULL,就停止所有的聲音,否則,停止pszSound指定的聲音。
SND_RESOURCE
pszSound參數是WAVE資源的標識符,這時要用到hmod參數。
SND_SYNC
同步播放聲音,在播放完后PlaySound函數才返回。
三、函數使用方法及代碼:
注重:在使用函數前要加入:
#include "mmsystem.h"//導入聲音頭文件
#pragma comment(lib,"winmm.lib")//導入聲音頭文件庫
1、直接播出聲音文件:
PlaySound("c:\\win95\\media\\The Microsoft Sound.wav", NULL, SND_FILENAME | SND_ASYNC);
注重:參數中的路徑使用兩個連續的反斜杠轉義代表一個反斜杠。
2、把聲音文件加入到資源中,然后從資源中播放聲音:
Visual C++支持WAVE型資源,用戶在資源視圖中單擊鼠標右鍵并選擇Import命令,然后在文件選擇對話框中選擇The Microsoft Sound.wav文件,則該文件就會被加入到WAVE資源中。假定聲音資源的ID為IDR_STARTWIN,則下面的調用同樣會輸出啟動聲音:
PlaySound((LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);
或:
PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);//將聲音文件寫入到程序中
3、用PlaySound播放系統聲音:
Windows啟動的聲音是由SystemStart定義的系統聲音,因此可以用下面的方法播放啟動聲音:
PlaySound("SystemStart",NULL,SND_ALIAS|SND_ASYNC);
????????????
sndPlaySound函數的聲明為:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);
用法:
除了不能指定資源名字外,參數lpszSound與PlaySound的是一樣的。參數 fuSound是如何播放聲音的標志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、 SND_NOSTOP和SND_SYNC的組合,這些標志的含義與PlaySound的一樣。
可以看出,sndPlaySound不能直接播放聲音資源。要用該函數播放WAVE文件,可按下面的方式調用:
sndPlaySound("MYSOUND.WAV",SND_ASYNC);
轉載于:https://www.cnblogs.com/dancheblog/p/4529636.html
總結
以上是生活随笔為你收集整理的MFC中的几种播放声音的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【mongodb系统学习之四】查看mon
- 下一篇: logstash 过虑nginx访问日志