VC++游戲編程6_第1頁
VC++游戲編程6_第2頁
VC++游戲編程6_第3頁
VC++游戲編程6_第4頁
VC++游戲編程6_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、.第一節(jié) 關于聲音聲音是空氣的一系列振蕩,稱為聲波,一般可以用二維的波形圖來表示。數(shù)字音頻是指使用某種設備將聲波記錄下來并保存為一種數(shù)字化的文件。播放相應的文件就可以產(chǎn)生某種聲音效果。數(shù)字音頻的音質隨著采樣頻率及所使用的位數(shù)不同而有很大的差異。因此,了解所使用音頻文件格式的有關標準是很有必要的。例如,cd中的音頻是16位,采樣頻率達到44.1mhz的立體聲數(shù)字音頻。在所有聲音文件的格式中,wav是最普遍的。這是windows平臺上最常見的格式,由微軟公司創(chuàng)造。支持8位和16位的音質、多樣本、對立體聲和單聲道音頻均可播放。它還支持多種音頻壓縮算法。要在游戲中取得好的聲音效果,例如,使用3d音效,

2、可以有兩種方法來實現(xiàn):一是使用一定的工具軟件對聲音文件進行處理,生成播放效果足夠好的文件,然后在游戲程序中直接將這樣的文件播放。顯然,這樣比較簡單,但是不靈活。如果需要音效隨著游戲場景的變化而不斷改變,且不受所具有聲音文件數(shù)量的限制,就需要進行實時混音了。第二節(jié)directsound結構directsound的功能模塊包括播放、聲音緩沖區(qū)、三維音效、音頻抓獲、屬性集等。directsound playback建構于idirectsound com接口之上。idirectsoundbuffer,idirectsound3dbuffer和idirectsound3dlistener接口則用以實現(xiàn)對

3、聲音緩沖區(qū)和三維音效的操作。directsound capture建構于idirectsoundcapture和idirectsoundcapturebuffer com接口之上。其它的com接口,如ikspropertyset,使應用程序能夠從聲卡的擴展功能中最大地受益。最后,idirectsoundnotify接口用于在播放或音頻抓獲達到一定地方時向產(chǎn)生一個事件。第三節(jié) 播放功能概述directsound緩沖區(qū)對象表示一個包含聲音數(shù)據(jù)的緩沖區(qū),這些數(shù)據(jù)以pcm格式被存儲。該對象不僅可以用于開始、停止或暫停聲音的播放,還能夠設置聲音數(shù)據(jù)中諸如頻率和格式等屬性。緩沖區(qū)分為主緩沖區(qū)和副緩沖區(qū)。主

4、緩沖區(qū)中是聽者將要聽到的音頻信號,一般是將副緩沖區(qū)中信號混音后的結果。而副緩沖區(qū)中存放著許多單獨的聲音信號,有的可以直接播放,有的要混音,有的循環(huán)播放。主緩沖區(qū)由directsound自動創(chuàng)建,而副緩沖區(qū)需由應用程序來創(chuàng)建。directsound將副緩沖區(qū)中的聲音混合后,存入主緩沖區(qū),再輸出到相應播放設備。directsound中沒有解析聲音文件的功能,需要您自己在應用程序中將不同格式的聲音信號改變過來(pcm)。緩沖區(qū)可以在主板的ram、波表存儲器、dma通道或虛擬存儲器中。多個應用程序可以用同一聲音設備來創(chuàng)建directsound對象。當輸入焦點在應用程序中發(fā)生變化時,音頻輸出將自動在各個

5、應用程序的流之間切換。于是,應用程序不用在輸入焦點改變中反復地播放和停止它們的緩沖區(qū)。通過idirectsoundnotify接口,當播放到了一個用戶指定的地方,或播放結束時,directsound將動態(tài)地通知擁護這一事件。精品.第四節(jié) 音頻抓獲概述directsoundcapture對象可以查詢音頻抓獲設備的性能,并為從輸入源抓獲音頻而創(chuàng)建緩沖區(qū)。其實,在win32中早已經(jīng)有了抓獲音頻的功能,而目前的(版本5)directsoundcapture與只比較并沒有什么新的功能。不過,directsoundcapture api使您能夠編寫使用相同接口的播放和音頻抓獲程序,而且,這也為將來可能出現(xiàn)

6、的api改進提供了原始模型,使您可以從中受益。directsoundcapture還能夠抓獲壓縮格式的音頻。directsoundcapturebuffer對象表示一個用于抓獲音頻的緩沖區(qū)。它可以循環(huán)利用,也就是說,當輸入指針達到緩沖區(qū)的最后時,它會回到開始的地方。directsoundcapturebuffer對象的各種方式使您能夠設定緩沖區(qū)的屬性、開始或停止操作、鎖定某部分存儲器(這樣就可以安全地將這些數(shù)據(jù)保存或用于其它目的)。與播放類似,idirectsoundnotify接口使在輸入指針到達一定地方時通知用戶。第五節(jié) 初始化對于一些簡單的操作,可以使用缺省的首選設備。不過,在游戲的制作

7、中,我們可能還是需要知道一些特定的聲音設備。于是,您應該先列舉出可用的聲音設備。在此之前,您需要先設定一個回收函數(shù),在每一次directsound發(fā)現(xiàn)新設備后調用該函數(shù)。函數(shù)中您可以做任何事情,但您必須將它定義得與dsenumcallback形式相同。如果希望列舉繼續(xù),函數(shù)應返回真,否則返回假。下面的例程來自光盤example目錄下的dsenum.c文件。它列舉可用的設備并在一個列表框中增加一條相應的信息。首先是他的回收函數(shù):精品.bool callback dsenumproc(lpguid lpguid, lpctstr lpszdesc, lpctstr lpszdrvname, lpv

8、oid lpcontext ) hwnd hcombo = *(hwnd *)lpcontext; lpguid lptemp = null; if( lpguid != null ) if( lptemp = localalloc( lptr, sizeof(guid) = null ) return( true ); memcpy( lptemp, lpguid, sizeof(guid); combobox_addstring( hcombo, lpszdesc ); combobox_setitemdata( hcombo, combobox_findstring( hcombo, 0

9、, lpszdesc ), lptemp ); return( true ); 當包含了列表框的對話框被初始化后,列舉開始:if (directsoundenumerate(lpdsenumcallback)dsenumproc, &hcombo) != ds_ok ) enddialog( hdlg, true ); return( true ); 精品.創(chuàng)建directsound對象最簡單的方法是使用directsoundcreate函數(shù)。其中的第一個參數(shù)為相應設備的全局獨有標志符(guid)。您可以通過列舉聲音設備得到guid,或使用null來為缺省設備創(chuàng)建對象。lpdirectsoun

10、d lpdirectsound; hresult hr;hr = directsoundcreate(null, &lpdirectsound, null);創(chuàng)建directsound對象后,應設置合作層。這是為了確定各個directsound應用程序被允許操作聲音設備的范圍,防止它們在錯誤的時間或通過錯誤的方式操作設備。所使用的方式為idirectsound:setcooperativelevel。這里hwnd參數(shù)是應用程序窗口的句柄:hresult hr = lpdirectsound-lpvtbl-setcooperativelevel( lpdirectsound, hwnd, dss

11、cl_normal);這里確定的合作層為normal,這樣使用聲卡的應用程序可以順序地進行切換。合作層包括normal、priority、exclusive和write-primary,級別依次增加。正如在前面提到過,directsound可以充分發(fā)揮硬件的增強功能,因此,它需要先設法了解設備的特性。我們可以通過idirectsound:getcaps方式來達到這個要求。如下所示:dscaps dscaps; dscaps.dwsize = sizeof(dscaps); hresult hr = lpdirectsound-lpvtbl-getcaps(lpdirectsound, &dsc

12、aps); dscaps結構接收關于聲音設備性能和資源的信息。注意,初始化該結構中dwsize成員是調用它之前所必須的。除此之外,您還可以查詢和設定揚聲器的設置,以及整理聲音存儲器使盡量獲得最大的備用空間。精品.第六節(jié) 如何播放初始化完成后,directsound將自動創(chuàng)建主緩沖區(qū)用于混音并傳送至輸出設備。而副緩沖區(qū)則需要您自己來創(chuàng)建了。下面的例程演示了用idirectsound:createsoundbuffer方式創(chuàng)建一個基本的副緩沖區(qū):bool appcreatebasicbuffer( lpdirectsound lpdirectsound, lpdirectsoundbuffer *

13、lplpdsb) pcmwaveformat pcmwf; dsbufferdesc dsbdesc; hresult hr; / 設定聲波格式結構 memset(&pcmwf, 0, sizeof(pcmwaveformat); pcmwf.wf.wformattag = wave_format_pcm; pcmwf.wf.nchannels = 2; pcmwf.wf.nsamplespersec = 22050; pcmwf.wf.nblockalign = 4; pcmwf.wf.navgbytespersec = pcmwf.wf.nsamplespersec * pcmwf.wf.

14、nblockalign; pcmwf.wbitspersample = 16; / 設置dsbufferdesc結構,用以設定緩沖區(qū)控制選項 memset(&dsbdesc, 0, sizeof(dsbufferdesc); dsbdesc.dwsize = sizeof(dsbufferdesc); / 要求缺省的控制 dsbdesc.dwflags = dsbcaps_ctrldefault; / 3秒的緩沖區(qū) dsbdesc.dwbufferbytes = 3 * pcmwf.wf.navgbytespersec; dsbdesc.lpwfxformat = (lpwaveformate

15、x)&pcmwf; / 創(chuàng)建緩沖區(qū) hr = lpdirectsound-lpvtbl-createsoundbuffer(lpdirectsound, 精品. &dsbdesc, lplpdsb, null); if(ds_ok = hr) / 成功,獲得的接口在*lplpdsb當中 return true; else / 失敗 *lplpdsb = null; return false; 您必須設定緩沖區(qū)的控制選項。這是使用dsbufferdesc結構中的dwflags成員,具體細節(jié)請參見directx 5的幫助。副緩沖區(qū)不支持混音等特效,因此,您需要能夠直接操作主緩沖區(qū)。不過,當您獲權寫

16、主緩沖區(qū)時,其它特性將失去作用,從而硬件加速混音失效。所以,大部分應用程序幾少直接操作主緩沖區(qū)。如果要求操作主緩沖區(qū),可以在調用idirectsound:createsoundbuffer方式時設定dsbufferdesc結構中的dsbcaps_primarybuffer標志符,而且,合作層必須是write-primary。下面的例程演示了如何得到對主緩沖區(qū)的寫操作能力:bool appcreatewriteprimarybuffer( lpdirectsound lpdirectsound, lpdirectsoundbuffer *lplpdsb, lpdword lpdwbuffersi

17、ze, hwnd hwnd) dsbufferdesc dsbdesc; dsbcaps dsbcaps; hresult hr; / 設置聲波格式結構 memset(&pcmwf, 0, sizeof(pcmwaveformat); pcmwf.wf.wformattag = wave_format_pcm; pcmwf.wf.nchannels = 2; pcmwf.wf.nsamplespersec = 22050; pcmwf.wf.nblockalign = 4; pcmwf.wf.navgbytespersec = 精品. pcmwf.wf.nsamplespersec * pcm

18、wf.wf.nblockalign; pcmwf.wbitspersample = 16; / 設置dsbufferdesc結構 memset(&lplpdsb, 0, sizeof(dsbufferdesc); dsbdesc.dwsize = sizeof(dsbufferdesc); dsbdesc.dwflags = dsbcaps_primarybuffer; / 緩沖區(qū)大小由聲音硬件決定 dsbdesc.dwbufferbytes = 0; dsbdesc.lpwfxformat = null; / 對主緩沖區(qū)必須設為null / 獲得write-primary合作層 hr = l

19、pdirectsound-lpvtbl-setcooperativelevel(lpdirectsound, hwnd, dsscl_writeprimary); if (ds_ok = hr) / 成功,試圖創(chuàng)建緩沖區(qū) hr = lpdirectsound-lpvtbl-createsoundbuffer(lpdirectsound, &dsbdesc, lplpdsb, null); if (ds_ok = hr) / 成功,設定主緩沖區(qū)為desired格式 hr = (*lplpdsb)-lpvtbl-setformat(*lplpdsb, &pcmwf); if (ds_ok = hr

20、) 精品. / 如果希望得知緩沖區(qū)大小,調用getcaps dsbcaps.dwsize = sizeof(dsbcaps); (*lplpdsb)-lpvtbl-getcaps(*lplpdsb, &dsbcaps); *lpdwbuffersize = dsbcaps.dwbufferbytes; return true; / 設定合作層失敗 / 創(chuàng)建緩沖區(qū),或設定結構 *lplpdsb = null; *lpdwbuffersize = 0; return false; 播放一段聲音的過程包括以下四個步驟:1 鎖定(idirectsoundbuffer:lock)副緩沖區(qū)的一部分。由您設定的偏移量決定下一步寫操作的起始點;2 寫數(shù)據(jù);3 解鎖(idirectsoundbuffer:unlock);4 將聲音傳送給主緩沖區(qū),并由那里輸出(idirectsoundbuffer:play)。下面的c程序向緩沖區(qū)中寫入數(shù)據(jù),由dwoffset指定開始時的偏移量:bool appwritedatatobuffer( lpdirectsoundbuffer lpdsb, / directsound緩沖區(qū) dword dwoffset, / 自己的寫標記位置 lpbyte lpbsounddata, / 數(shù)據(jù)的起點 dword d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論