文明
(第七一五研究所,杭州,310023)
基于雙緩沖技術(shù)的音頻數(shù)據(jù)實(shí)時(shí)采集與播放
文明
(第七一五研究所,杭州,310023)
為提高聲吶模擬演示系統(tǒng)的真實(shí)性,并能迅速對(duì)目標(biāo)類型進(jìn)行初步判斷,設(shè)計(jì)一種實(shí)時(shí)采集、播放收聽聲吶數(shù)據(jù)的實(shí)現(xiàn)方法,采用雙緩沖技術(shù)來(lái)避免信號(hào)的不連續(xù)和延遲,完整的恢復(fù)了目標(biāo)的聲音特性,縮短操作員判別目標(biāo)的時(shí)間。
實(shí)時(shí)采集;播放;聲音信號(hào);雙緩沖
在聲吶模擬顯控設(shè)計(jì)中,設(shè)計(jì)者往往只關(guān)心目標(biāo)的圖形和字符信息,因此,操作員要根據(jù)目標(biāo)的多種信息(如警戒、目標(biāo)特征譜線等)來(lái)判斷目標(biāo)的類型,這就要求操作員對(duì)目標(biāo)進(jìn)行更多的操作和設(shè)置來(lái)獲得這些信息,這會(huì)在某種程度上延誤了戰(zhàn)機(jī)。經(jīng)驗(yàn)豐富的操作員往往對(duì)某些特定目標(biāo)(如魚雷)的聲音異常敏感。針對(duì)以往在設(shè)計(jì)中只是關(guān)心圖形和文字信息而無(wú)聲音信號(hào)輸出的遺漏,本文提出一種實(shí)時(shí)采集目標(biāo)的聲音信號(hào)并利用雙緩沖技術(shù)進(jìn)行播放出來(lái)的方法。
雙緩沖是圖形圖像處理編程過(guò)程的一種基本技術(shù)。窗體在響應(yīng)WM_PAINT消息時(shí)要進(jìn)行復(fù)雜的圖形處理,重繪時(shí)會(huì)因?yàn)轭l繁的刷新而引起閃爍,因此采用了雙緩沖技術(shù)來(lái)避免這種情況的發(fā)生。雙緩沖技術(shù)即在內(nèi)存中創(chuàng)建一個(gè)與屏幕繪圖區(qū)域一致的對(duì)象,先把圖形繪制到內(nèi)存中的這個(gè)對(duì)象上,再一次性將這個(gè)對(duì)象上的圖形拷貝到屏幕上[1]。在音頻數(shù)據(jù)處理時(shí),如果直接采集數(shù)據(jù)然后播放出來(lái)會(huì)明顯感覺到聲音的卡頓,因此想到能否把雙緩沖繪圖的方法延伸到雙緩沖播放上來(lái)。在數(shù)據(jù)采集時(shí),先把數(shù)據(jù)在內(nèi)存中分別用兩個(gè)數(shù)據(jù)驅(qū)動(dòng)中保存下來(lái),在播放時(shí)采用撥動(dòng)開關(guān)的模式選擇播放相應(yīng)數(shù)據(jù)驅(qū)動(dòng)上的數(shù)據(jù)。實(shí)踐證明,這種想法不但能大大加快數(shù)據(jù)的處理,并且避免播放聲音時(shí)會(huì)出現(xiàn)卡頓的現(xiàn)象。
要實(shí)現(xiàn)對(duì)聲吶數(shù)據(jù)的實(shí)時(shí)采集、處理、播放,我們采用Windows MDK的低層音頻服務(wù)比較合適,因?yàn)榈蛯右纛l服務(wù)中的回調(diào)機(jī)制為我們提供了很大的方便。當(dāng)應(yīng)用程序不斷向設(shè)備驅(qū)動(dòng)程序提供音頻數(shù)據(jù)時(shí),設(shè)備驅(qū)動(dòng)程序控制音頻設(shè)備在后臺(tái)完成放音的具體操作,通過(guò)回調(diào)機(jī)制,又可以檢測(cè)到什么時(shí)候用完一個(gè)數(shù)據(jù)塊,并及時(shí)傳送下一個(gè)數(shù)據(jù)塊,從而保證了聲音的連續(xù)。在網(wǎng)絡(luò)接收聲吶數(shù)據(jù)方面,選擇不需連接的UDP協(xié)議。在聲吶輸出的結(jié)果中,不僅僅只輸出聲吶收聽數(shù)據(jù),如果采用面向連接的TCP協(xié)議就可能產(chǎn)生數(shù)據(jù)堵塞而導(dǎo)致聲吶數(shù)據(jù)播放的時(shí)候出現(xiàn)卡頓或者延遲。實(shí)時(shí)采集和播放聲吶收聽數(shù)據(jù)的設(shè)計(jì)框圖如圖1。
圖1 聲吶實(shí)時(shí)數(shù)據(jù)處理設(shè)計(jì)框圖
首先要介紹一下Windows低層波形音頻數(shù)據(jù)塊結(jié)構(gòu) WAVEHDR,其聲明如下:
聲音的采集和播放都是在操作這個(gè)音頻數(shù)據(jù)塊結(jié)構(gòu),實(shí)際上主要用到的就是第一個(gè)成員變量lpData,所以只要在分配緩沖區(qū)(內(nèi)存)的同時(shí)相應(yīng)分配WAVEHDR數(shù)據(jù)塊結(jié)構(gòu),然后將緩沖區(qū)的指針賦給對(duì)應(yīng)的數(shù)據(jù)塊結(jié)構(gòu)的成員變量 lpData。這樣當(dāng)一個(gè)緩沖區(qū)填滿后,即一個(gè)音頻數(shù)據(jù)塊填滿了,通過(guò)消息機(jī)制可以在消息函數(shù)中進(jìn)行處理和播放,播放完后又可通過(guò)消息函數(shù)把緩沖區(qū)再送給音頻設(shè)備輸入驅(qū)動(dòng)程序,繼續(xù)進(jìn)行采集并播放。一次性分配多個(gè)緩沖區(qū)和數(shù)據(jù)塊結(jié)構(gòu)并賦給音頻設(shè)備輸入驅(qū)動(dòng)程序,這個(gè)過(guò)程完全由Windows控制(選擇緩沖區(qū)填滿,然后再把哪個(gè)空緩沖區(qū)賦給設(shè)備輸入驅(qū)動(dòng)程序),不需人為干預(yù)。這是一種用動(dòng)態(tài)循環(huán)緩沖區(qū)實(shí)現(xiàn)話音的實(shí)時(shí)采集、播放的簡(jiǎn)單而巧妙的辦法。具體實(shí)現(xiàn)設(shè)計(jì)框圖如圖2。
圖2 雙緩沖數(shù)據(jù)播放設(shè)計(jì)框圖
在實(shí)現(xiàn)的過(guò)程中,通過(guò)下面三個(gè)消息映射來(lái)完成數(shù)據(jù)接收和播放。
ON_MESSAGE(MM_WOM_OPEN,OnWomOpen)
ON_MESSAGE(MM_WOM_DONE,OnWomDone)
ON_MESSAGE(MM_WOM_CLOSE,OnWomClose)[3]
在waveOutOpen中要指定一個(gè)窗口來(lái)處理接收波形輸出,用消息機(jī)制向消息隊(duì)列發(fā)送了MM_WOM_OPEN消息。處理MM_WOM_OPEN消息時(shí),把兩個(gè)WAVEHDR結(jié)構(gòu)傳送給waveOutWrite,此函數(shù)將數(shù)據(jù)傳送到波形輸出硬件,才真正開始播放聲音,當(dāng)波形硬件播放完waveOutWrite函數(shù)傳送來(lái)的數(shù)據(jù)后,就向窗口發(fā)送MM_WOM_DONE消息。SINEWAVE在處理此消息時(shí),將計(jì)算緩沖區(qū)的新數(shù)據(jù),并調(diào)用waveOutWrite來(lái)重新提交緩沖區(qū)。
從技術(shù)設(shè)計(jì)上來(lái)說(shuō),這種雙緩沖數(shù)據(jù)播放技術(shù)優(yōu)點(diǎn)有兩個(gè)。首先,我們不需要關(guān)心聲卡底層的處理,只需要實(shí)時(shí)將數(shù)據(jù)塊填滿等待調(diào)度即可。其次,播放聲音連續(xù)且不失真。
為了驗(yàn)證這種方法的可行性,我們將這項(xiàng)技術(shù)用在和某院校合作的《基于信號(hào)級(jí)的聲吶仿真系統(tǒng)》上來(lái)。很明顯,模擬演示系統(tǒng)增加了目標(biāo)收聽這個(gè)功能后,不但提高了演示系統(tǒng)的真實(shí)性,更重要的是,在集中演練的時(shí)候,操作員只需根據(jù)目標(biāo)的聲音并結(jié)合基本的圖形輸出即可對(duì)目標(biāo)迅速做出反應(yīng)。如今的聯(lián)合作戰(zhàn)演練中,各作戰(zhàn)模塊的功能愈來(lái)愈多,在錯(cuò)綜復(fù)雜的功能中迅速做出選擇尤為重要。作為一種很直接的表現(xiàn)形式,演示系統(tǒng)中的收聽功能必不可少。
[1] 雙緩沖技術(shù)繪圖[EB/OL]. (2014-04-09). m.blog.csdn.net/ article/details? id=23269643.
[2] 林文煥. 基于WaveX低級(jí)音頻函數(shù)的實(shí)時(shí)語(yǔ)音通信[Z/OL]. (2007-04-03) http://www.wavecn.com/content.php? id=95.
[3] 記憶碎片. VC中實(shí)現(xiàn)語(yǔ)音數(shù)據(jù)的采集[Z/OL]. (2011-11-04). http://yaycici.log.163.com/blog/static/173759063201110 44 4857597/.