用DirectX Audio和DirectShow播放聲音和音樂(lè)(7) 摘要:
MP3是一種音頻壓縮格式,它通過(guò)刪除或修改音樂(lè)中不易被人耳察覺(jué)的部分來(lái)使音樂(lè)更小,占用的存儲(chǔ)空間更少。在項(xiàng)目中使用MP3(.MP3文件)需要使用
DirectX中的DirectShow組件,在這個(gè)組件的幫助下,只需幾行短短的代碼,就能使用任意的MP3文件了(DirectShow也支持其他的媒體文件,比如WMA,AVI,MPG等)。當(dāng)然要想使用更多的媒體文件,必須已經(jīng)在操作系統(tǒng)中安裝了解碼器。
解碼器(codec)是一個(gè)程序,用于解碼或編碼一些指定的格式(比如MP3解碼器專(zhuān)門(mén)解碼.MP3文件)。通常可以從發(fā)明或者創(chuàng)建這種格式的公司中獲取這種格式的解碼器。比如,
MP3解碼器來(lái)自于Fraunhofer Insitute。幸運(yùn)的是,MP3解碼器等幾種比較流行的解碼器已經(jīng)被集成到操作系統(tǒng)中(比如.mp3,.avi,.mpg等),而無(wú)需另外從
internet下載這些格式的解碼器了。
要在項(xiàng)目中使用DirectShow,需要包含dshow.h頭文件,并且在鏈接庫(kù)中加入strmiids.lib。
用DirectX Audio和DirectShow播放聲音和音樂(lè)(6) 摘要:
DirectMusic加載器在使用固有文件或者M(jìn)IDI文件的時(shí)候會(huì)自動(dòng)加載默認(rèn)的音色庫(kù)。樂(lè)器總是被一組一組地使用,很多組樂(lè)器音色的集合被稱(chēng)之為 DLS音色庫(kù)(可下載的音樂(lè))。每組樂(lè)器使用三個(gè)值編號(hào),它們是:最高有效位(most-significant
byte,MSB),最低有效位(least-significant byte,LSB)和組編號(hào)。
通常播放MIDI文件的樂(lè)器組是標(biāo)準(zhǔn)化的,也就是說(shuō)編號(hào)為1的樂(lè)器總是鋼琴,如果想使用新的鋼琴作為樂(lè)器,可以從DLS集合中加載。
DirectMusic包含了標(biāo)準(zhǔn)的樂(lè)器集合,通常稱(chēng)之為GM/GS集合(GM = General MIDI,GS = General
Synthesizer),這個(gè)集合由日本羅蘭(Roland)公司提出,稱(chēng)為MIDI合成器標(biāo)準(zhǔn)。
用DirectX Audio和DirectShow播放聲音和音樂(lè)(5) 摘要: 在DirectAudio中,DirectSound負(fù)責(zé)數(shù)字音頻方面的處理,而DirectMusic則負(fù)責(zé)Midi文件(Musical
Instrument Data
Interface,數(shù)字音樂(lè)格式,.mid作為文件擴(kuò)展名),DirectMusic固有音樂(lè)文件(.sgt文件)和數(shù)字錄音設(shè)備錄制的波形格式文件(.wav文件)等文件的播放操作。
能體現(xiàn)DirectMusic的強(qiáng)大之處是DirectMusic固有文件格式,一首用DirectMusic固有文件格式制作的音樂(lè)包括數(shù)個(gè)小音樂(lè)格式,這些樣式還能用不同的樂(lè)器組合一個(gè)接一個(gè)地播放。隨機(jī)的樣式和樂(lè)器的選取創(chuàng)造出了隨時(shí)都在改變的音樂(lè),再加上節(jié)拍變化,就形成了一個(gè)魅力無(wú)窮的音樂(lè)系統(tǒng)。DirectMusic的另一個(gè)特性是可以使用“基調(diào)”,就是在正在播放的音樂(lè)片段上疊加一段其他音樂(lè),新加入的音樂(lè)可以很平滑的融入到原有的音樂(lè)中。這在很多時(shí)候都有用,比如一個(gè)玩家完成了一個(gè)目標(biāo),可以馬上播放一段“獲得榮譽(yù)”的音樂(lè)提示他。
用DirectX Audio和DirectShow播放聲音和音樂(lè)(4) 摘要:
“通告”是一種觸發(fā)機(jī)制,當(dāng)緩存中播放位置達(dá)到某個(gè)固定的位置時(shí),就會(huì)向程序發(fā)出通知。有了通告,就可以知道播放什么時(shí)候結(jié)束,這種機(jī)制在比較長(zhǎng)的聲音中特別有效。通告使用一個(gè)叫做IDirectSoundNotify8的對(duì)象,這個(gè)程序的作用就是在音頻緩存中標(biāo)記一個(gè)位置,然后觸發(fā)事件通知應(yīng)用程序,而應(yīng)用程序可以通過(guò)消息循環(huán)或者單獨(dú)的線程進(jìn)行處理。
標(biāo)記的位置可以是一個(gè)緩存中的偏移值,也可以是由宏指定的停止標(biāo)記,這個(gè)表示停止的宏是DSBPN_OFFSETSTOP。并不是任何偏移值都可以用來(lái)作為通告發(fā)生的位置,這個(gè)值必須和音頻的數(shù)據(jù)塊對(duì)齊,并且通告的偏移必須按照從小到大的順序排列。偏移值是不能夠共享的,如果使用
DSBPN_OFFSETSTOP宏,它必須被放在最后。舉例來(lái)說(shuō),對(duì)于一個(gè)塊大小為2的音頻(單聲道、16位),嘗試對(duì)偏移為4和5的位置設(shè)通告會(huì)導(dǎo)致失敗,因?yàn)槠屏课恢?和5都在同一個(gè)數(shù)據(jù)塊中。
用DirectX Audio和DirectShow播放聲音和音樂(lè)(3) 摘要: 所謂聲道平衡就是調(diào)節(jié)左右聲道的大小,
DirectSound定義了兩個(gè)宏幫助把聲道平衡調(diào)節(jié)到最左邊和最右邊,使用DSBPAN_LEFT將聲道調(diào)整到最左邊,使用DSBPAN_RIGHT
將聲道調(diào)整到最右邊。
通過(guò)調(diào)用IDirectSoundBuffer8::SetPan函數(shù)可以調(diào)節(jié)聲道平衡。
用DirectX Audio和DirectShow播放聲音和音樂(lè)(2) 摘要:
讓緩存在程序啟動(dòng)的時(shí)候開(kāi)始播放可以節(jié)省不少處理器時(shí)間。因?yàn)閮?nèi)存資源是有限的,特別是在硬件設(shè)備中,而你使用的數(shù)據(jù)緩存可能需要任意大小,因此主音頻緩沖區(qū)和輔助緩沖區(qū)使用環(huán)形緩存。因?yàn)閿?shù)據(jù)緩沖是一個(gè)一維數(shù)組,所以可以讓這個(gè)緩沖區(qū)頭尾相接。這是一個(gè)十分強(qiáng)大的技術(shù),利用這個(gè)技術(shù)我們可以節(jié)省大量的內(nèi)存。
聲音在進(jìn)行混音處理后,被送入環(huán)形主音頻緩存。一旦播放位置到達(dá)主音頻緩存的終點(diǎn),聲音又從頭開(kāi)始播放,這樣聲音就被無(wú)間隙地連續(xù)播放。如果想要使用緩存的這種循環(huán)特性,需要指定啟用循環(huán)播放的特性,若不然當(dāng)播放到緩沖區(qū)終點(diǎn)時(shí),播放就停止了。
為了播放緩存中的音頻數(shù)據(jù)(在開(kāi)啟循環(huán)選項(xiàng)的情況下播放),需要調(diào)用Play函數(shù)。
用DirectX Audio和DirectShow播放聲音和音樂(lè)(1) 摘要:
音樂(lè)就是一系列的音符,這些音符在不同的時(shí)間用不同的幅度被播放或者停止。有非常多的指令被用來(lái)播放音樂(lè),但是這些指令的操作基本相同,都在使用各種各樣不同的音符。在計(jì)算機(jī)上進(jìn)行作曲,實(shí)際上是存儲(chǔ)了很多組音樂(lè),回放時(shí)由音頻硬件將這些音符播放出來(lái)。
Midi格式(文件擴(kuò)展名是.MID)是存儲(chǔ)數(shù)字音樂(lè)的標(biāo)準(zhǔn)格式。
DirectMusic 音樂(lè)片段(music segments)使用.SGT文件擴(kuò)展名,其他的相關(guān)文件包括樂(lè)隊(duì)文件(band file .BND),這種文件里面包含樂(lè)器信息;弦映射表文件(chordmaps
file .CDM)包含在回放時(shí)修改音樂(lè)的和弦指令;樣式文件(styles file .STY)包含回放樣式信息;模板文件(templates file
.TPL)包含創(chuàng)造音樂(lè)片段的模板。