版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、.第一節(jié) 關(guān)于聲音聲音是空氣的一系列振蕩,稱為聲波,一般可以用二維的波形圖來表示。數(shù)字音頻是指使用某種設(shè)備將聲波記錄下來并保存為一種數(shù)字化的文件。播放相應(yīng)的文件就可以產(chǎn)生某種聲音效果。數(shù)字音頻的音質(zhì)隨著采樣頻率及所使用的位數(shù)不同而有很大的差異。因此,了解所使用音頻文件格式的有關(guān)標(biāo)準(zhǔn)是很有必要的。例如,cd中的音頻是16位,采樣頻率達(dá)到44.1mhz的立體聲數(shù)字音頻。在所有聲音文件的格式中,wav是最普遍的。這是windows平臺上最常見的格式,由微軟公司創(chuàng)造。支持8位和16位的音質(zhì)、多樣本、對立體聲和單聲道音頻均可播放。它還支持多種音頻壓縮算法。要在游戲中取得好的聲音效果,例如,使用3d音效,
2、可以有兩種方法來實(shí)現(xiàn):一是使用一定的工具軟件對聲音文件進(jìn)行處理,生成播放效果足夠好的文件,然后在游戲程序中直接將這樣的文件播放。顯然,這樣比較簡單,但是不靈活。如果需要音效隨著游戲場景的變化而不斷改變,且不受所具有聲音文件數(shù)量的限制,就需要進(jìn)行實(shí)時混音了。第二節(jié)directsound結(jié)構(gòu)directsound的功能模塊包括播放、聲音緩沖區(qū)、三維音效、音頻抓獲、屬性集等。directsound playback建構(gòu)于idirectsound com接口之上。idirectsoundbuffer,idirectsound3dbuffer和idirectsound3dlistener接口則用以實(shí)現(xiàn)對
3、聲音緩沖區(qū)和三維音效的操作。directsound capture建構(gòu)于idirectsoundcapture和idirectsoundcapturebuffer com接口之上。其它的com接口,如ikspropertyset,使應(yīng)用程序能夠從聲卡的擴(kuò)展功能中最大地受益。最后,idirectsoundnotify接口用于在播放或音頻抓獲達(dá)到一定地方時向產(chǎn)生一個事件。第三節(jié) 播放功能概述directsound緩沖區(qū)對象表示一個包含聲音數(shù)據(jù)的緩沖區(qū),這些數(shù)據(jù)以pcm格式被存儲。該對象不僅可以用于開始、停止或暫停聲音的播放,還能夠設(shè)置聲音數(shù)據(jù)中諸如頻率和格式等屬性。緩沖區(qū)分為主緩沖區(qū)和副緩沖區(qū)。主
4、緩沖區(qū)中是聽者將要聽到的音頻信號,一般是將副緩沖區(qū)中信號混音后的結(jié)果。而副緩沖區(qū)中存放著許多單獨(dú)的聲音信號,有的可以直接播放,有的要混音,有的循環(huán)播放。主緩沖區(qū)由directsound自動創(chuàng)建,而副緩沖區(qū)需由應(yīng)用程序來創(chuàng)建。directsound將副緩沖區(qū)中的聲音混合后,存入主緩沖區(qū),再輸出到相應(yīng)播放設(shè)備。directsound中沒有解析聲音文件的功能,需要您自己在應(yīng)用程序中將不同格式的聲音信號改變過來(pcm)。緩沖區(qū)可以在主板的ram、波表存儲器、dma通道或虛擬存儲器中。多個應(yīng)用程序可以用同一聲音設(shè)備來創(chuàng)建directsound對象。當(dāng)輸入焦點(diǎn)在應(yīng)用程序中發(fā)生變化時,音頻輸出將自動在各個
5、應(yīng)用程序的流之間切換。于是,應(yīng)用程序不用在輸入焦點(diǎn)改變中反復(fù)地播放和停止它們的緩沖區(qū)。通過idirectsoundnotify接口,當(dāng)播放到了一個用戶指定的地方,或播放結(jié)束時,directsound將動態(tài)地通知擁護(hù)這一事件。精品.第四節(jié) 音頻抓獲概述directsoundcapture對象可以查詢音頻抓獲設(shè)備的性能,并為從輸入源抓獲音頻而創(chuàng)建緩沖區(qū)。其實(shí),在win32中早已經(jīng)有了抓獲音頻的功能,而目前的(版本5)directsoundcapture與只比較并沒有什么新的功能。不過,directsoundcapture api使您能夠編寫使用相同接口的播放和音頻抓獲程序,而且,這也為將來可能出現(xiàn)
6、的api改進(jìn)提供了原始模型,使您可以從中受益。directsoundcapture還能夠抓獲壓縮格式的音頻。directsoundcapturebuffer對象表示一個用于抓獲音頻的緩沖區(qū)。它可以循環(huán)利用,也就是說,當(dāng)輸入指針達(dá)到緩沖區(qū)的最后時,它會回到開始的地方。directsoundcapturebuffer對象的各種方式使您能夠設(shè)定緩沖區(qū)的屬性、開始或停止操作、鎖定某部分存儲器(這樣就可以安全地將這些數(shù)據(jù)保存或用于其它目的)。與播放類似,idirectsoundnotify接口使在輸入指針到達(dá)一定地方時通知用戶。第五節(jié) 初始化對于一些簡單的操作,可以使用缺省的首選設(shè)備。不過,在游戲的制作
7、中,我們可能還是需要知道一些特定的聲音設(shè)備。于是,您應(yīng)該先列舉出可用的聲音設(shè)備。在此之前,您需要先設(shè)定一個回收函數(shù),在每一次directsound發(fā)現(xiàn)新設(shè)備后調(diào)用該函數(shù)。函數(shù)中您可以做任何事情,但您必須將它定義得與dsenumcallback形式相同。如果希望列舉繼續(xù),函數(shù)應(yīng)返回真,否則返回假。下面的例程來自光盤example目錄下的dsenum.c文件。它列舉可用的設(shè)備并在一個列表框中增加一條相應(yīng)的信息。首先是他的回收函數(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 ); 當(dāng)包含了列表框的對話框被初始化后,列舉開始:if (directsoundenumerate(lpdsenumcallback)dsenumproc, &hcombo) != ds_ok ) enddialog( hdlg, true ); return( true ); 精品.創(chuàng)建directsound對象最簡單的方法是使用directsoundcreate函數(shù)。其中的第一個參數(shù)為相應(yīng)設(shè)備的全局獨(dú)有標(biāo)志符(guid)。您可以通過列舉聲音設(shè)備得到guid,或使用null來為缺省設(shè)備創(chuàng)建對象。lpdirectsoun
10、d lpdirectsound; hresult hr;hr = directsoundcreate(null, &lpdirectsound, null);創(chuàng)建directsound對象后,應(yīng)設(shè)置合作層。這是為了確定各個directsound應(yīng)用程序被允許操作聲音設(shè)備的范圍,防止它們在錯誤的時間或通過錯誤的方式操作設(shè)備。所使用的方式為idirectsound:setcooperativelevel。這里hwnd參數(shù)是應(yīng)用程序窗口的句柄:hresult hr = lpdirectsound-lpvtbl-setcooperativelevel( lpdirectsound, hwnd, dss
11、cl_normal);這里確定的合作層為normal,這樣使用聲卡的應(yīng)用程序可以順序地進(jìn)行切換。合作層包括normal、priority、exclusive和write-primary,級別依次增加。正如在前面提到過,directsound可以充分發(fā)揮硬件的增強(qiáng)功能,因此,它需要先設(shè)法了解設(shè)備的特性。我們可以通過idirectsound:getcaps方式來達(dá)到這個要求。如下所示:dscaps dscaps; dscaps.dwsize = sizeof(dscaps); hresult hr = lpdirectsound-lpvtbl-getcaps(lpdirectsound, &dsc
12、aps); dscaps結(jié)構(gòu)接收關(guān)于聲音設(shè)備性能和資源的信息。注意,初始化該結(jié)構(gòu)中dwsize成員是調(diào)用它之前所必須的。除此之外,您還可以查詢和設(shè)定揚(yáng)聲器的設(shè)置,以及整理聲音存儲器使盡量獲得最大的備用空間。精品.第六節(jié) 如何播放初始化完成后,directsound將自動創(chuàng)建主緩沖區(qū)用于混音并傳送至輸出設(shè)備。而副緩沖區(qū)則需要您自己來創(chuàng)建了。下面的例程演示了用idirectsound:createsoundbuffer方式創(chuàng)建一個基本的副緩沖區(qū):bool appcreatebasicbuffer( lpdirectsound lpdirectsound, lpdirectsoundbuffer *
13、lplpdsb) pcmwaveformat pcmwf; dsbufferdesc dsbdesc; hresult hr; / 設(shè)定聲波格式結(jié)構(gòu) 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; / 設(shè)置dsbufferdesc結(jié)構(gòu),用以設(shè)定緩沖區(qū)控制選項(xiàng) 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當(dāng)中 return true; else / 失敗 *lplpdsb = null; return false; 您必須設(shè)定緩沖區(qū)的控制選項(xiàng)。這是使用dsbufferdesc結(jié)構(gòu)中的dwflags成員,具體細(xì)節(jié)請參見directx 5的幫助。副緩沖區(qū)不支持混音等特效,因此,您需要能夠直接操作主緩沖區(qū)。不過,當(dāng)您獲權(quán)寫
16、主緩沖區(qū)時,其它特性將失去作用,從而硬件加速混音失效。所以,大部分應(yīng)用程序幾少直接操作主緩沖區(qū)。如果要求操作主緩沖區(qū),可以在調(diào)用idirectsound:createsoundbuffer方式時設(shè)定dsbufferdesc結(jié)構(gòu)中的dsbcaps_primarybuffer標(biāo)志符,而且,合作層必須是write-primary。下面的例程演示了如何得到對主緩沖區(qū)的寫操作能力:bool appcreatewriteprimarybuffer( lpdirectsound lpdirectsound, lpdirectsoundbuffer *lplpdsb, lpdword lpdwbuffersi
17、ze, hwnd hwnd) dsbufferdesc dsbdesc; dsbcaps dsbcaps; hresult hr; / 設(shè)置聲波格式結(jié)構(gòu) 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; / 設(shè)置dsbufferdesc結(jié)構(gòu) memset(&lplpdsb, 0, sizeof(dsbufferdesc); dsbdesc.dwsize = sizeof(dsbufferdesc); dsbdesc.dwflags = dsbcaps_primarybuffer; / 緩沖區(qū)大小由聲音硬件決定 dsbdesc.dwbufferbytes = 0; dsbdesc.lpwfxformat = null; / 對主緩沖區(qū)必須設(shè)為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) / 成功,設(shè)定主緩沖區(qū)為desired格式 hr = (*lplpdsb)-lpvtbl-setformat(*lplpdsb, &pcmwf); if (ds_ok = hr
20、) 精品. / 如果希望得知緩沖區(qū)大小,調(diào)用getcaps dsbcaps.dwsize = sizeof(dsbcaps); (*lplpdsb)-lpvtbl-getcaps(*lplpdsb, &dsbcaps); *lpdwbuffersize = dsbcaps.dwbufferbytes; return true; / 設(shè)定合作層失敗 / 創(chuàng)建緩沖區(qū),或設(shè)定結(jié)構(gòu) *lplpdsb = null; *lpdwbuffersize = 0; return false; 播放一段聲音的過程包括以下四個步驟:1 鎖定(idirectsoundbuffer:lock)副緩沖區(qū)的一部分。由您設(shè)定的偏移量決定下一步寫操作的起始點(diǎn);2 寫數(shù)據(jù);3 解鎖(idirectsoundbuffer:unlock);4 將聲音傳送給主緩沖區(qū),并由那里輸出(idirectsoundbuffer:play)。下面的c程序向緩沖區(qū)中寫入數(shù)據(jù),由dwoffset指定開始時的偏移量:bool appwritedatatobuffer( lpdirectsoundbuffer lpdsb, / directsound緩沖區(qū) dword dwoffset, / 自己的寫標(biāo)記位置 lpbyte lpbsounddata, / 數(shù)據(jù)的起點(diǎn) dword d
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 全案設(shè)計整套合同范例
- 2024年利塞磷酸鈉項(xiàng)目可行性研究報告
- 外包業(yè)務(wù)合同范例
- 一年級數(shù)學(xué)計算題專項(xiàng)練習(xí)集錦
- 2024至2030年阿膠項(xiàng)目投資價值分析報告
- 2024至2030年自動補(bǔ)償控制器項(xiàng)目投資價值分析報告
- 奶牛認(rèn)養(yǎng)合同范例
- 電腦軟件銷售合同范例
- 2024至2030年平面圣誕襪項(xiàng)目投資價值分析報告
- 工地 工具配送合同范例
- 小班小主持課件
- 律師強(qiáng)制執(zhí)行協(xié)議書模板
- 教學(xué)計劃(教學(xué)計劃)-2024-2025 學(xué)年六年級上冊科學(xué)教科版
- 《積極心理學(xué)(第3版)》 課件 篇終 積極心理學(xué)的應(yīng)用與展望
- 2024應(yīng)急管理部國家自然災(zāi)害防治研究院公開招聘34人(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 八年級英語上冊 Unit 4 Whats the best movie theater(第1課時)說課稿
- 《醫(yī)學(xué)專業(yè)介紹》課件
- 《物聯(lián)網(wǎng)應(yīng)用技術(shù)專業(yè)頂崗實(shí)習(xí)》課程標(biāo)準(zhǔn)
- 2024年小區(qū)地下車位租賃合同
- 2024-2030年中國不良資產(chǎn)管理行業(yè)市場發(fā)展分析及競爭格局與投資發(fā)展研究報告
- 2024年病理醫(yī)師三基考試試題
評論
0/150
提交評論