說明:本問最早于2009年發(fā)于驅(qū)動(dòng)開發(fā)網(wǎng),現(xiàn)原文拷貝過來,將其收入我的博文中,供大家參考
最近很多朋友在討論虛擬聲卡驅(qū)動(dòng)的問題,
借此機(jī)會(huì)我簡(jiǎn)單說下虛擬聲卡及其應(yīng)用.
參考代碼:
DDK中msvad.
推薦參考軟件:
VAC(VirtaulAudoo Cable),大家可以在下面“http://software.muzychenko.net/eng/vac.html ”下到Demo版的可執(zhí)行文件。
該軟件是俄國人寫的,說實(shí)話,該軟件的代碼可讀性很差,甚至是相當(dāng)糟糕(或許作者有意將代碼寫成這樣的),同時(shí)也很佩服作者能把那樣難讀的代碼寫到如此功能。
應(yīng)用:
通常情況下,虛擬聲卡驅(qū)動(dòng)主要應(yīng)用到截取聲音,理論上可以做到截取幾乎所有軟件的聲音,包括(但不限于)Windows自身的聲音(如:警告提示等);MediaPlayer、PowerDVD、錄音機(jī)和MP3播放器等流行軟件,注意:這里所說的是幾乎所有的聲音,具體原因?qū)⒃谙旅嬲f明。
下面將以VAC的應(yīng)用簡(jiǎn)單說明下如何實(shí)現(xiàn)音頻截取功能(時(shí)間關(guān)系,這里僅說明Playback的截?。?。
首先,VAC是一個(gè)虛擬聲卡驅(qū)動(dòng),所謂虛擬聲卡有兩個(gè)含義,其一他是一個(gè)聲卡驅(qū)動(dòng),其而,該聲卡驅(qū)動(dòng)沒有對(duì)應(yīng)相應(yīng)硬件(說到這里我想指出一個(gè)很多人的錯(cuò)誤概念,經(jīng)常聽人把DDK中的kbdfilter等驅(qū)動(dòng)說成是虛擬鍵盤驅(qū)動(dòng),其實(shí)這個(gè)概念是不正確的,kbdfilter實(shí)際是一個(gè)鍵盤filter驅(qū)動(dòng),而并無“虛擬”的概念。)。
了解了VAC的具體含義后,我們?cè)賮砜碫AC如何實(shí)現(xiàn)聲音截取功能的,我們還得先成音頻播放和錄音說起。
通常我們?cè)谶M(jìn)行錄音和回放的時(shí)候,應(yīng)用程序中我們可以選擇wave API或者DirectSound等來實(shí)現(xiàn),無論應(yīng)用使用什么接口去實(shí)現(xiàn),最終的數(shù)據(jù)流都將經(jīng)過驅(qū)動(dòng)到達(dá)聲卡從而達(dá)到發(fā)音的目的,所以這里就僅以wave API來做說明。
通常我們播放聲音是通過waveOutOpen打開聲音設(shè)備,然后調(diào)用waveOutPrepareHeader、waveOutWrite將數(shù)據(jù)寫聲卡,當(dāng)播放結(jié)束后,我們將收到MM_WOM_DONE消息或者事件被觸發(fā)(具體是消息還是事件是根據(jù)waveOutOpen的fdwOpen和dwCallback決定的,這里就不多說了),然后我們可以waveOutUnprepareHeader來回收使用的資源,并將新的數(shù)據(jù)寫入,這樣聲音就可以播放出來了,同樣的道理我們可以實(shí)現(xiàn)錄音(當(dāng)然使用的API有所不同)。
大家都知道,當(dāng)我們?cè)谡{(diào)用waveOutOpen打開聲卡的時(shí)候,有給一個(gè)uDeviceID,這個(gè)ID是用來標(biāo)識(shí)別音頻設(shè)備的,從0到N(最大設(shè)備ID),通常的軟件都是使用缺省的音頻設(shè)備,當(dāng)安裝了VAC后,系統(tǒng)中將有另外一個(gè)聲卡,也就是說這里的deviceid將增加一個(gè),正常情況下,即使我們安裝了VAC,系統(tǒng)缺省的音頻設(shè)備仍然是原始聲卡,所以這個(gè)時(shí)候播放器并不能將聲音發(fā)送到VAC,而是原始聲卡,為了讓聲音能發(fā)送到VAC,我們需要改變這個(gè)數(shù)據(jù)流向,方法就是:我們將系統(tǒng)缺省設(shè)備設(shè)置為VAC,這樣數(shù)據(jù)被發(fā)送到了VAC中,因?yàn)閂AC并不對(duì)應(yīng)聲卡,所以我們將聽不到聲音了,當(dāng)然這個(gè)并不是我們所需要,為了不影響使用,我們將必須將數(shù)據(jù)回寫到真實(shí)聲卡,在VAC中,它是通過waveIn來采集到其它軟件寫入的聲音,然后通過waveOut來回寫聲卡實(shí)現(xiàn)的(具體實(shí)現(xiàn)代碼很簡(jiǎn)單,我就不在這里show了)。
說到這里,我想大家已經(jīng)很清楚前面說到通過VAC我們可以抓到“幾乎所有的聲音”的原因了,如還不明白的請(qǐng)大家仔細(xì)思考下應(yīng)該可以想到原因。
上面簡(jiǎn)單說明了下虛擬聲卡的應(yīng)用和應(yīng)用原理,詳細(xì)細(xì)節(jié)還需要大家仔細(xì)琢磨和實(shí)踐。
有興趣的朋友可以去下一個(gè)VAC來玩玩,也可以去修改msvad實(shí)現(xiàn)你自己的VAC功能。
愛華網(wǎng)



