




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、.第一節(jié) 關(guān)于聲音聲音是空氣的一系列振蕩,稱(chēng)為聲波,一般可以用二維的波形圖來(lái)表示。數(shù)字音頻是指使用某種設(shè)備將聲波記錄下來(lái)并保存為一種數(shù)字化的文件。播放相應(yīng)的文件就可以產(chǎn)生某種聲音效果。數(shù)字音頻的音質(zhì)隨著采樣頻率及所使用的位數(shù)不同而有很大的差異。因此,了解所使用音頻文件格式的有關(guān)標(biāo)準(zhǔn)是很有必要的。例如,cd中的音頻是16位,采樣頻率達(dá)到44.1mhz的立體聲數(shù)字音頻。在所有聲音文件的格式中,wav是最普遍的。這是windows平臺(tái)上最常見(jiàn)的格式,由微軟公司創(chuàng)造。支持8位和16位的音質(zhì)、多樣本、對(duì)立體聲和單聲道音頻均可播放。它還支持多種音頻壓縮算法。要在游戲中取得好的聲音效果,例如,使用3d音效,
2、可以有兩種方法來(lái)實(shí)現(xiàn):一是使用一定的工具軟件對(duì)聲音文件進(jìn)行處理,生成播放效果足夠好的文件,然后在游戲程序中直接將這樣的文件播放。顯然,這樣比較簡(jiǎn)單,但是不靈活。如果需要音效隨著游戲場(chǎng)景的變化而不斷改變,且不受所具有聲音文件數(shù)量的限制,就需要進(jìn)行實(shí)時(shí)混音了。第二節(jié)directsound結(jié)構(gòu)directsound的功能模塊包括播放、聲音緩沖區(qū)、三維音效、音頻抓獲、屬性集等。directsound playback建構(gòu)于idirectsound com接口之上。idirectsoundbuffer,idirectsound3dbuffer和idirectsound3dlistener接口則用以實(shí)現(xiàn)對(duì)
3、聲音緩沖區(qū)和三維音效的操作。directsound capture建構(gòu)于idirectsoundcapture和idirectsoundcapturebuffer com接口之上。其它的com接口,如ikspropertyset,使應(yīng)用程序能夠從聲卡的擴(kuò)展功能中最大地受益。最后,idirectsoundnotify接口用于在播放或音頻抓獲達(dá)到一定地方時(shí)向產(chǎn)生一個(gè)事件。第三節(jié) 播放功能概述directsound緩沖區(qū)對(duì)象表示一個(gè)包含聲音數(shù)據(jù)的緩沖區(qū),這些數(shù)據(jù)以pcm格式被存儲(chǔ)。該對(duì)象不僅可以用于開(kāi)始、停止或暫停聲音的播放,還能夠設(shè)置聲音數(shù)據(jù)中諸如頻率和格式等屬性。緩沖區(qū)分為主緩沖區(qū)和副緩沖區(qū)。主
4、緩沖區(qū)中是聽(tīng)者將要聽(tīng)到的音頻信號(hào),一般是將副緩沖區(qū)中信號(hào)混音后的結(jié)果。而副緩沖區(qū)中存放著許多單獨(dú)的聲音信號(hào),有的可以直接播放,有的要混音,有的循環(huán)播放。主緩沖區(qū)由directsound自動(dòng)創(chuàng)建,而副緩沖區(qū)需由應(yīng)用程序來(lái)創(chuàng)建。directsound將副緩沖區(qū)中的聲音混合后,存入主緩沖區(qū),再輸出到相應(yīng)播放設(shè)備。directsound中沒(méi)有解析聲音文件的功能,需要您自己在應(yīng)用程序中將不同格式的聲音信號(hào)改變過(guò)來(lái)(pcm)。緩沖區(qū)可以在主板的ram、波表存儲(chǔ)器、dma通道或虛擬存儲(chǔ)器中。多個(gè)應(yīng)用程序可以用同一聲音設(shè)備來(lái)創(chuàng)建directsound對(duì)象。當(dāng)輸入焦點(diǎn)在應(yīng)用程序中發(fā)生變化時(shí),音頻輸出將自動(dòng)在各個(gè)
5、應(yīng)用程序的流之間切換。于是,應(yīng)用程序不用在輸入焦點(diǎn)改變中反復(fù)地播放和停止它們的緩沖區(qū)。通過(guò)idirectsoundnotify接口,當(dāng)播放到了一個(gè)用戶(hù)指定的地方,或播放結(jié)束時(shí),directsound將動(dòng)態(tài)地通知擁護(hù)這一事件。精品.第四節(jié) 音頻抓獲概述directsoundcapture對(duì)象可以查詢(xún)音頻抓獲設(shè)備的性能,并為從輸入源抓獲音頻而創(chuàng)建緩沖區(qū)。其實(shí),在win32中早已經(jīng)有了抓獲音頻的功能,而目前的(版本5)directsoundcapture與只比較并沒(méi)有什么新的功能。不過(guò),directsoundcapture api使您能夠編寫(xiě)使用相同接口的播放和音頻抓獲程序,而且,這也為將來(lái)可能出現(xiàn)
6、的api改進(jìn)提供了原始模型,使您可以從中受益。directsoundcapture還能夠抓獲壓縮格式的音頻。directsoundcapturebuffer對(duì)象表示一個(gè)用于抓獲音頻的緩沖區(qū)。它可以循環(huán)利用,也就是說(shuō),當(dāng)輸入指針達(dá)到緩沖區(qū)的最后時(shí),它會(huì)回到開(kāi)始的地方。directsoundcapturebuffer對(duì)象的各種方式使您能夠設(shè)定緩沖區(qū)的屬性、開(kāi)始或停止操作、鎖定某部分存儲(chǔ)器(這樣就可以安全地將這些數(shù)據(jù)保存或用于其它目的)。與播放類(lèi)似,idirectsoundnotify接口使在輸入指針到達(dá)一定地方時(shí)通知用戶(hù)。第五節(jié) 初始化對(duì)于一些簡(jiǎn)單的操作,可以使用缺省的首選設(shè)備。不過(guò),在游戲的制作
7、中,我們可能還是需要知道一些特定的聲音設(shè)備。于是,您應(yīng)該先列舉出可用的聲音設(shè)備。在此之前,您需要先設(shè)定一個(gè)回收函數(shù),在每一次directsound發(fā)現(xiàn)新設(shè)備后調(diào)用該函數(shù)。函數(shù)中您可以做任何事情,但您必須將它定義得與dsenumcallback形式相同。如果希望列舉繼續(xù),函數(shù)應(yīng)返回真,否則返回假。下面的例程來(lái)自光盤(pán)example目錄下的dsenum.c文件。它列舉可用的設(shè)備并在一個(gè)列表框中增加一條相應(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)包含了列表框的對(duì)話(huà)框被初始化后,列舉開(kāi)始:if (directsoundenumerate(lpdsenumcallback)dsenumproc, &hcombo) != ds_ok ) enddialog( hdlg, true ); return( true ); 精品.創(chuàng)建directsound對(duì)象最簡(jiǎn)單的方法是使用directsoundcreate函數(shù)。其中的第一個(gè)參數(shù)為相應(yīng)設(shè)備的全局獨(dú)有標(biāo)志符(guid)。您可以通過(guò)列舉聲音設(shè)備得到guid,或使用null來(lái)為缺省設(shè)備創(chuàng)建對(duì)象。lpdirectsoun
10、d lpdirectsound; hresult hr;hr = directsoundcreate(null, &lpdirectsound, null);創(chuàng)建directsound對(duì)象后,應(yīng)設(shè)置合作層。這是為了確定各個(gè)directsound應(yīng)用程序被允許操作聲音設(shè)備的范圍,防止它們?cè)阱e(cuò)誤的時(shí)間或通過(guò)錯(cuò)誤的方式操作設(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,級(jí)別依次增加。正如在前面提到過(guò),directsound可以充分發(fā)揮硬件的增強(qiáng)功能,因此,它需要先設(shè)法了解設(shè)備的特性。我們可以通過(guò)idirectsound:getcaps方式來(lái)達(dá)到這個(gè)要求。如下所示: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)用它之前所必須的。除此之外,您還可以查詢(xún)和設(shè)定揚(yáng)聲器的設(shè)置,以及整理聲音存儲(chǔ)器使盡量獲得最大的備用空間。精品.第六節(jié) 如何播放初始化完成后,directsound將自動(dòng)創(chuàng)建主緩沖區(qū)用于混音并傳送至輸出設(shè)備。而副緩沖區(qū)則需要您自己來(lái)創(chuàng)建了。下面的例程演示了用idirectsound:createsoundbuffer方式創(chuàng)建一個(gè)基本的副緩沖區(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é)請(qǐng)參見(jiàn)directx 5的幫助。副緩沖區(qū)不支持混音等特效,因此,您需要能夠直接操作主緩沖區(qū)。不過(guò),當(dāng)您獲權(quán)寫(xiě)
16、主緩沖區(qū)時(shí),其它特性將失去作用,從而硬件加速混音失效。所以,大部分應(yīng)用程序幾少直接操作主緩沖區(qū)。如果要求操作主緩沖區(qū),可以在調(diào)用idirectsound:createsoundbuffer方式時(shí)設(shè)定dsbufferdesc結(jié)構(gòu)中的dsbcaps_primarybuffer標(biāo)志符,而且,合作層必須是write-primary。下面的例程演示了如何得到對(duì)主緩沖區(qū)的寫(xiě)操作能力: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; / 對(duì)主緩沖區(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; 播放一段聲音的過(guò)程包括以下四個(gè)步驟:1 鎖定(idirectsoundbuffer:lock)副緩沖區(qū)的一部分。由您設(shè)定的偏移量決定下一步寫(xiě)操作的起始點(diǎn);2 寫(xiě)數(shù)據(jù);3 解鎖(idirectsoundbuffer:unlock);4 將聲音傳送給主緩沖區(qū),并由那里輸出(idirectsoundbuffer:play)。下面的c程序向緩沖區(qū)中寫(xiě)入數(shù)據(jù),由dwoffset指定開(kāi)始時(shí)的偏移量:bool appwritedatatobuffer( lpdirectsoundbuffer lpdsb, / directsound緩沖區(qū) dword dwoffset, / 自己的寫(xiě)標(biāo)記位置 lpbyte lpbsounddata, / 數(shù)據(jù)的起點(diǎn) dword d
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 能源統(tǒng)計(jì)報(bào)表培訓(xùn)課件
- 抖音商戶(hù)直播樣品回收再利用登記制度
- 抖音商戶(hù)主播直播狀態(tài)穩(wěn)定管理制度
- 公交優(yōu)先與城市交通擁堵治理:2025年政策效果與優(yōu)化策略研究
- 公交優(yōu)先策略在2025年城市交通擁堵治理中的實(shí)踐探索報(bào)告
- 公眾參與在2025年環(huán)境影響評(píng)價(jià)中的實(shí)際操作案例報(bào)告
- 湖南汽車(chē)工程職業(yè)學(xué)院《醫(yī)學(xué)影像診斷學(xué)B》2023-2024學(xué)年第一學(xué)期期末試卷
- 陜西機(jī)電職業(yè)技術(shù)學(xué)院《社會(huì)調(diào)查方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 遼寧省興城市紅崖子滿(mǎn)族鄉(xiāng)初級(jí)中學(xué)2025屆化學(xué)九年級(jí)第一學(xué)期期末調(diào)研模擬試題含解析
- 吉林建筑大學(xué)《導(dǎo)游俄語(yǔ)視聽(tīng)說(shuō)》2023-2024學(xué)年第一學(xué)期期末試卷
- 《專(zhuān)業(yè)導(dǎo)論光電信息科學(xué)與工程》教學(xué)大綱
- 少兒美術(shù)國(guó)畫(huà)- 少兒希望 《紫藤課件》
- 建立良好的同伴關(guān)系-課件-高二心理健康
- 老年人健康管理隨訪(fǎng)表
- 高一物理競(jìng)賽試題和答案
- 物理學(xué)與現(xiàn)代高科技課件
- 一畝茶園認(rèn)養(yǎng)合同
- 2022年鎮(zhèn)海中學(xué)提前招生模擬卷科學(xué)試卷
- 水井坊自動(dòng)化釀酒設(shè)備技術(shù)方案文件
- 變電站新建工程土方開(kāi)挖專(zhuān)項(xiàng)施工方案
- 廣東話(huà)粵語(yǔ)姓名拼音大全
評(píng)論
0/150
提交評(píng)論