專利名稱:多程序共享音頻設(shè)備的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及嵌入式操作系統(tǒng)環(huán)境下的音頻設(shè)備訪問技術(shù),特別涉及一種多個程序共享音 頻設(shè)備的方法。
背景技術(shù):
在嵌入式操作系統(tǒng)下,音頻程序?qū)σ纛l設(shè)備的訪問方式都是獨占式訪問, 一個音頻程序 打開了音頻設(shè)備,其它音頻程序都無法打開音頻設(shè)備。音頻程序?qū)σ纛l設(shè)備的獨占式訪問會 導(dǎo)致在該系統(tǒng)中多個音頻程序無法同時獲取音頻輸出資源,只有當(dāng)前音頻程序釋放掉音頻設(shè) 備,其它音頻程序才能訪問音頻設(shè)備。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是,提供一種實現(xiàn)多個程序同時訪問音頻設(shè)備的多程序共享 音頻設(shè)備的方法。
本發(fā)明解決所述技術(shù)問題采用的技術(shù)方案是,多程序共享音頻設(shè)備的方法,其特征在于 ,設(shè)置音頻服務(wù)模塊,所述音頻服務(wù)模塊執(zhí)行下列步驟
al、初始化音頻設(shè)備,創(chuàng)建至少2個聲音數(shù)據(jù)通道,音頻程序獨占式訪問所述聲音數(shù)據(jù) 通道;
a2、循環(huán)檢測各聲音數(shù)據(jù)通道是否有聲音數(shù)據(jù)輸出,若是,則讀取聲音數(shù)據(jù),并進行音 頻參數(shù)歸一化處理后進入步驟a3;否則重復(fù)步驟a2;
a3、將各聲音數(shù)據(jù)通道的聲音數(shù)據(jù)疊加合成輸出到音頻設(shè)備;
所述聲音數(shù)據(jù)通道執(zhí)行下列步驟
bl、聲音數(shù)據(jù)通道初始化;
b2、音頻程序向聲音數(shù)據(jù)通道輸入聲音數(shù)據(jù)音。
進一步的,所述步驟a2中,音頻參數(shù)歸一化處理為若聲音數(shù)據(jù)通道的通道音頻參數(shù)與 初始化音頻設(shè)備的音頻設(shè)備配置參數(shù)不一致,則聲音數(shù)據(jù)通道對聲音數(shù)據(jù)重采樣,使通道音 頻參數(shù)與音頻設(shè)備配置參數(shù)一致;
進一步的,所述聲音數(shù)據(jù)通道包括數(shù)據(jù)區(qū)、通道控制信息區(qū)、服務(wù)控制信息區(qū),音頻程 序的聲音數(shù)據(jù)存放在所述數(shù)據(jù)區(qū);通道開啟標(biāo)志、通道的寫信息、通道音頻參數(shù)存放在所述 通道控制信息區(qū);音頻設(shè)備配置參數(shù)、通道的讀信息存放在所述服務(wù)控制信息區(qū);進一步的,所述步驟b2包括下列步驟
① 根據(jù)通道控制信息區(qū)和服務(wù)控制信息區(qū)的信息決定可用數(shù)據(jù)區(qū)大小,音頻程序輸入所 述可用數(shù)據(jù)區(qū)大小的聲音數(shù)據(jù)到聲音數(shù)據(jù)通道的數(shù)據(jù)區(qū),并更新通道控制信息區(qū)的信息;
② 重復(fù)步驟①,直到音頻程序的所有聲音數(shù)據(jù)都輸入完畢;
進一步的,所述各聲音數(shù)據(jù)通道還執(zhí)行步驟b3:判斷是否再無聲音數(shù)據(jù)輸出,若是,則 關(guān)閉通道開啟標(biāo)志;
所述音頻服務(wù)模塊還執(zhí)行下步驟a4:根據(jù)通道開啟標(biāo)志判斷是否關(guān)閉聲音數(shù)據(jù)通道,若 是,則關(guān)閉,并返回步驟a2。
本發(fā)明的有益效果是,多個程序可以同時、透明訪問同一音頻設(shè)備,提供了一個嵌入式 系統(tǒng)中音頻設(shè)備共享的中間件。
圖l是本發(fā)明具體實施方式
的流程圖。
具體實施例方式
以下結(jié)合具體實施方式
和附圖,對本發(fā)明作進一步說明。
在現(xiàn)有的嵌入式操作系統(tǒng)基礎(chǔ)上,增加一個音頻服務(wù)模塊,該音頻服務(wù)模塊對音頻設(shè)備 進行獨占式訪問。音頻服務(wù)模塊創(chuàng)建至少2個聲音數(shù)據(jù)通道,并對所創(chuàng)建的聲音數(shù)據(jù)通道的 數(shù)據(jù)進行控制和處理;音頻程序?qū)β曇魯?shù)據(jù)通道進行獨占式訪問。頻程序根據(jù)音頻服務(wù)模塊 的控制參數(shù)定期定量的向聲音數(shù)據(jù)通道輸入聲音數(shù)據(jù),然后音頻服務(wù)模塊將各聲音數(shù)據(jù)通道 的聲音數(shù)據(jù)進行轉(zhuǎn)換、疊加合成等處理,變成統(tǒng)一聲音數(shù)據(jù)最終輸出到音頻設(shè)備。
參見圖l,音頻服務(wù)模塊的工作流程如下
音頻服務(wù)模塊預(yù)先啟動,初始化音頻設(shè)備(獨占音頻設(shè)備緩沖區(qū))。創(chuàng)建聲音數(shù)據(jù)通道 1、聲音數(shù)據(jù)聲音數(shù)據(jù)通道2……聲音數(shù)據(jù)通道n,分配聲音數(shù)據(jù)通道l、聲音數(shù)據(jù)通道2…… 聲音數(shù)據(jù)通道n的數(shù)據(jù)區(qū)、通道控制信息區(qū)及服務(wù)控制信息區(qū),通道控制信息區(qū)的信息包括 通道開啟標(biāo)志、通道的寫信息(通道當(dāng)前滑動窗口寫起始、通道當(dāng)前已寫數(shù)據(jù)量)、通道音 頻參數(shù)(通道數(shù)據(jù)采樣率、通道數(shù)據(jù)聲道數(shù)、通道數(shù)據(jù)采樣大小);服務(wù)控制信息區(qū)的信息 包括音頻設(shè)備配置參數(shù)(設(shè)備數(shù)據(jù)采樣率、設(shè)備數(shù)據(jù)聲道數(shù)、設(shè)備數(shù)據(jù)采樣大小)、通道的 讀信息(服務(wù)進程當(dāng)前滑動窗口讀起始、服務(wù)進程當(dāng)前已讀數(shù)據(jù)量、緩沖區(qū)大小),將當(dāng)前 音頻設(shè)備的配置參數(shù)(設(shè)備數(shù)據(jù)采樣率、設(shè)備數(shù)據(jù)聲道數(shù)、設(shè)備數(shù)據(jù)采樣大小)填寫到服務(wù) 控制信息區(qū),初始化當(dāng)前服務(wù)進程當(dāng)前滑動窗口讀起始為O,服務(wù)進程當(dāng)前已讀數(shù)據(jù)量為O; 緩沖區(qū)大小為通道的數(shù)據(jù)區(qū)大小;初始化通道控制信息區(qū)中的通道開啟標(biāo)志為O。音頻服務(wù)模塊進入待命狀態(tài)通過通道控制信息區(qū)中的通道開啟標(biāo)志循環(huán)檢測每個聲音 數(shù)據(jù)通道的開啟狀態(tài)(通道開啟標(biāo)志為l,則表示開啟;通道開啟標(biāo)志為0,則表示未開啟。 )。如果有聲音數(shù)據(jù)通道開啟,則執(zhí)行幀輸出處理,完成后回到待命狀態(tài);如果無通道開啟 ,則繼續(xù)停留在待命狀態(tài);如果有聲音數(shù)據(jù)通道的通道開啟標(biāo)志由1變?yōu)?,則清除其通道控 制信息區(qū)和服務(wù)控制信息區(qū)的信息,關(guān)閉該聲音數(shù)據(jù)通道,并繼續(xù)停留在待命狀態(tài)。音頻服 務(wù)模塊也可以直接根據(jù)各聲音數(shù)據(jù)通道的通道控制信息區(qū)、服務(wù)控制信息區(qū)的信息直接判斷 是否關(guān)閉該聲音數(shù)據(jù)通道,若果是,則清除其通道控制信息區(qū)和服務(wù)控制信息區(qū)的信息,關(guān) 閉該聲音數(shù)據(jù)通道,并繼續(xù)停留在待命狀態(tài)。當(dāng)系統(tǒng)需要關(guān)閉,則音頻服務(wù)模塊關(guān)閉音頻設(shè) 備,并退出。
對聲音數(shù)據(jù)通道執(zhí)行幀輸出處理為如果聲音數(shù)據(jù)通道l開啟,則從聲音數(shù)據(jù)通道l的數(shù) 據(jù)區(qū)中服務(wù)進程滑動窗口當(dāng)前讀起始位置讀取一幀的數(shù)據(jù)(通道當(dāng)前已寫數(shù)據(jù)量與服務(wù)進程 當(dāng)前已經(jīng)讀取數(shù)據(jù)量之差,即為當(dāng)前可供服務(wù)進程可以讀取的數(shù)據(jù)量。 一幀數(shù)據(jù)默認(rèn)可以選 擇為2048字節(jié),通道控制模塊一次至少寫2幀數(shù)據(jù),即滑動窗口大小可以選擇為4096字節(jié)) 到音頻服務(wù)模塊的數(shù)據(jù)緩沖區(qū),并更新服務(wù)進程當(dāng)前已讀數(shù)據(jù)量、將服務(wù)進程滑動窗口當(dāng)前 讀起始位置移動到下一幀數(shù)據(jù)的位置;如果聲音數(shù)據(jù)通道l的通道控制信息區(qū)中的通道音頻 參數(shù)與服務(wù)控制信息區(qū)中的音頻設(shè)備配置參數(shù)不一致,則對聲音數(shù)據(jù)通道l的幀數(shù)據(jù)進行頻 率重采樣等音頻參數(shù)歸一化處理,使通道音頻參數(shù)與音頻設(shè)備配置參數(shù)一致。音頻服務(wù)模塊 每讀一幀聲音數(shù)據(jù)通道的數(shù)據(jù)區(qū)的聲音數(shù)據(jù),就判斷其是否需要進行音頻參數(shù)歸一化處理。 若聲音數(shù)據(jù)通道l的通道當(dāng)前已寫數(shù)據(jù)量與服務(wù)進程當(dāng)前已經(jīng)讀取數(shù)據(jù)量之差為零,說明聲 音數(shù)據(jù)通道l目前為暫停狀態(tài),沒有聲音數(shù)據(jù)輸入,則音頻服務(wù)模塊產(chǎn)生數(shù)據(jù)全部為零的靜 音數(shù)據(jù)幀,該數(shù)據(jù)幀即被認(rèn)為是聲音數(shù)據(jù)通道l本次的輸入數(shù)據(jù)。從聲音數(shù)據(jù)通道n讀取聲音 數(shù)據(jù)的與上述讀取聲音數(shù)據(jù)通道l的方法相同。音頻服務(wù)模塊將已開啟的聲音數(shù)據(jù)通道l、聲 音數(shù)據(jù)通道2……及聲音數(shù)據(jù)通道n (音頻參數(shù)歸一化處理后)的幀數(shù)據(jù)進行疊加合成為一幀 音頻數(shù)據(jù),輸出到音頻設(shè)備緩沖區(qū)中由音頻設(shè)備輸出。如果聲音數(shù)據(jù)通道的可用聲音數(shù)據(jù)量 大于一幀數(shù)據(jù),那么循環(huán)執(zhí)行幀輸出處理。
比如音頻服務(wù)模塊將音頻設(shè)備初始化成如下工作模式采樣率44. 1KHZ,每個采樣大小 16比特,雙聲道;音頻程序A占用聲音數(shù)據(jù)通道1,音頻程序A將要播放的音頻數(shù)據(jù)的參數(shù)為 :采樣率44. 1KHZ,每個采樣大小16比特,雙聲道;音頻程序B占用聲音數(shù)據(jù)聲音數(shù)據(jù)通道2 ,音頻程序B將要播放的音頻數(shù)據(jù)的參數(shù)為采樣率24KHZ,每個采樣大小16比特,單聲道, 那么在幀輸出處理時,對聲音數(shù)據(jù)聲音數(shù)據(jù)通道2的聲音數(shù)據(jù)進行音頻參數(shù)歸一化處理軟件重新采樣到44. 1KHZ,采樣后復(fù)制聲道數(shù)據(jù),將單聲道數(shù)據(jù)合成為雙聲道數(shù)據(jù);最后,將 聲音數(shù)據(jù)通道1的數(shù)據(jù)與處理后的聲音數(shù)據(jù)通道2的數(shù)據(jù),進行加法操作疊加并進行溢出處理 ,送到音頻設(shè)備輸出,音頻設(shè)備聽到的就是兩個通道疊加合成后的數(shù)據(jù)了。
參見圖l,聲音數(shù)據(jù)通道的工作流程為音頻程序A訪問音頻聲音數(shù)據(jù)通道1,音頻聲音 數(shù)據(jù)通道l初始化獲取音頻服務(wù)模塊預(yù)先為聲音數(shù)據(jù)通道l分配的數(shù)據(jù)區(qū)、通道控制信息區(qū)
及服務(wù)控制信息區(qū)地址,并將其通道音頻參數(shù)(通道數(shù)據(jù)采樣率、通道數(shù)據(jù)聲道數(shù)、通道數(shù)
據(jù)采樣大小)填寫到聲音數(shù)據(jù)通道l的通道控制信息區(qū)中。音頻程序A向聲音數(shù)據(jù)通道1輸入
聲音數(shù)據(jù)為聲音數(shù)據(jù)通道l的控制模塊根據(jù)聲音數(shù)據(jù)通道l的通道當(dāng)前已寫數(shù)據(jù)量、服務(wù)進 程當(dāng)前已讀數(shù)據(jù)量及通道數(shù)據(jù)區(qū)大小,計算出聲音數(shù)據(jù)通道l的當(dāng)前通道滑動窗口可用數(shù)據(jù) 區(qū)大小如果可用數(shù)據(jù)區(qū)大小大于零,則音頻程序A輸入該可用數(shù)據(jù)區(qū)大小的聲音數(shù)據(jù)到聲 音數(shù)據(jù)通道l的數(shù)據(jù)區(qū)的緩沖區(qū)中,并更新聲音數(shù)據(jù)通道l的通道當(dāng)前已寫數(shù)據(jù)量、將通道當(dāng) 前滑動窗口寫起始移動到下一幀數(shù)據(jù)的位置;反復(fù)執(zhí)行上述操作,直到音頻程序A本次需要
輸入的所有聲音數(shù)據(jù)(一般每次循環(huán)輸入的聲音數(shù)據(jù)的數(shù)據(jù)量為滑動窗口大小,即可保證人 耳聽到的聲音是連續(xù)的)都輸入完畢。如果聲音數(shù)據(jù)通道l中再無聲音數(shù)據(jù)需要輸出,則關(guān)
閉聲音數(shù)據(jù)通道i的通道開啟標(biāo)志,即將通道開啟標(biāo)志設(shè)為o,并將通道的寫信息、通道音頻
參數(shù)清除。如果可用數(shù)據(jù)區(qū)大小小于零,則表示音頻服務(wù)模塊還未將當(dāng)前通道滑動窗口中的
聲音數(shù)據(jù)輸出,聲音數(shù)據(jù)通道i進入等待狀態(tài),等待指定時間后(比如io毫秒),重新工作
。向聲音數(shù)據(jù)通道n輸入聲音數(shù)據(jù)的工作流程與聲音數(shù)據(jù)通道l相同。若聲音數(shù)據(jù)通道中有聲 音數(shù)據(jù)需要輸出,則將其通道開啟標(biāo)志設(shè)為l。
經(jīng)實驗驗證,本發(fā)明能夠有效解決嵌入式系統(tǒng)音頻設(shè)備獨占性,方便實現(xiàn)設(shè)備在多程序 間的透明共享。本發(fā)明提供了一個嵌入式系統(tǒng)中音頻設(shè)備共享的中間件。
例如,將本發(fā)明應(yīng)用在車載導(dǎo)航終端上。車載導(dǎo)航終端具有語音播報路名和音樂播放的 功能。在實時導(dǎo)航過程中,打開音樂播放功能;后臺播放音樂,前臺顯示導(dǎo)航畫面,同時導(dǎo) 航軟件在需要播報語音路名時,并不會因為音頻設(shè)備沖突而需要暫停掉音樂播放,播放完路 名后再恢復(fù)音樂播放,而是通過本發(fā)明共享音頻設(shè)備,音樂播放和語音路名播放可以同時疊 加進行。在具體實施中,又音頻服務(wù)模塊創(chuàng)建2個聲音數(shù)據(jù)通道,并定義每個聲音數(shù)據(jù)通道 的音量增益功能。音樂播放占用聲音數(shù)據(jù)通道l,語音路名播報占用聲音數(shù)據(jù)通道2,只有聲 音數(shù)據(jù)通道1或2工作時,該通道的音量為100%,當(dāng)兩個聲音數(shù)據(jù)通道同時工作時,聲音數(shù) 據(jù)通道1的音量變?yōu)?0%,聲音數(shù)據(jù)通道2的音量為80%。這樣雖然音樂和語音路名聲音數(shù)據(jù) 進行了疊加,但是聽上去的效果是音樂聲音小下去了,而語音路名播報的音量就相對更大更清晰了。
權(quán)利要求
1.多程序共享音頻設(shè)備的方法,其特征在于,設(shè)置音頻服務(wù)模塊,所述音頻服務(wù)模塊執(zhí)行下列步驟a1、初始化音頻設(shè)備,創(chuàng)建至少2個聲音數(shù)據(jù)通道,音頻程序獨占式訪問所述聲音數(shù)據(jù)通道;a2、循環(huán)檢測各聲音數(shù)據(jù)通道是否有聲音數(shù)據(jù)輸出,若是,則讀取聲音數(shù)據(jù),并進行音頻參數(shù)歸一化處理后進入步驟a3;否則重復(fù)步驟a2;a3、將各聲音數(shù)據(jù)通道的聲音數(shù)據(jù)疊加合成輸出到音頻設(shè)備;所述聲音數(shù)據(jù)通道執(zhí)行下列步驟b1、聲音數(shù)據(jù)通道初始化;b2、音頻程序向聲音數(shù)據(jù)通道輸入聲音數(shù)據(jù)。
2. 如權(quán)利要求l所述的多程序共享音頻設(shè)備的方法,其特征在于,所 述步驟a2中,音頻參數(shù)歸一化處理為若聲音數(shù)據(jù)通道的通道音頻參數(shù)與初始化音頻設(shè)備的 音頻設(shè)備配置參數(shù)不一致,則聲音數(shù)據(jù)通道對聲音數(shù)據(jù)重采樣,使通道音頻參數(shù)與音頻設(shè)備 配置參數(shù)一致。
3. 如權(quán)利要求1或2所述的多程序共享音頻設(shè)備的方法,其特征在于 ,所述聲音數(shù)據(jù)通道包括數(shù)據(jù)區(qū)、通道控制信息區(qū)、服務(wù)控制信息區(qū),音頻程序的聲音數(shù)據(jù) 存放在所述數(shù)據(jù)區(qū);通道開啟標(biāo)志、通道的寫信息、通道音頻參數(shù)存放在所述通道控制信息 區(qū);音頻設(shè)備配置參數(shù)、通道的讀信息存放在所述服務(wù)控制信息區(qū)。
4.如權(quán)利要求3所述的多程序共享音頻設(shè)備的方法,其特征在于,所 述步驟b2包括下列步驟① 根據(jù)通道控制信息區(qū)和服務(wù)控制信息區(qū)的信息決定可用數(shù)據(jù)區(qū)大小,音頻程序輸入 所述可用數(shù)據(jù)區(qū)大小的聲音數(shù)據(jù)到聲音數(shù)據(jù)通道的數(shù)據(jù)區(qū),并更新通道控制信息區(qū)的信息;② 重復(fù)步驟①,直到音頻程序的所有聲音數(shù)據(jù)都輸入完畢。
5.如權(quán)利要求3所述的多程序共享音頻設(shè)備的方法,其特征在于,所 述各聲音數(shù)據(jù)通道還執(zhí)行步驟b3:判斷是否再無聲音數(shù)據(jù)輸出,若是,則關(guān)閉通道開啟標(biāo)志所述音頻服務(wù)模塊還執(zhí)行步驟a4:根據(jù)通道開啟標(biāo)志判斷是否關(guān)閉聲音數(shù)據(jù)通道,若 是,則關(guān)閉,并返回步驟a2。
6.如權(quán)利要求3所述的多程序共享音頻設(shè)備的方法,其特征在于,所 述通道音頻參數(shù)包括通道數(shù)據(jù)采樣率、通道數(shù)據(jù)聲道數(shù)、通道數(shù)據(jù)采樣大?。凰鲆纛l設(shè)備 配置參數(shù)包括設(shè)備數(shù)據(jù)采樣率、設(shè)備數(shù)據(jù)聲音道數(shù)、設(shè)備數(shù)據(jù)采樣大小。
全文摘要
本發(fā)明涉及嵌入式操作系統(tǒng)環(huán)境下的音頻設(shè)備訪問技術(shù)。本發(fā)明針對音頻程序?qū)σ纛l設(shè)備的獨占式訪問導(dǎo)致的問題,公開了一種多程序共享音頻設(shè)備的方法。本發(fā)明的技術(shù)方案為由設(shè)置的音頻服務(wù)模塊初始化音頻設(shè)備,并創(chuàng)建至少2個聲音數(shù)據(jù)通道,音頻程序?qū)ζ洫氄际皆L問;各聲音數(shù)據(jù)通道初始化,音頻程序向其輸入聲音數(shù)據(jù);循環(huán)檢測各聲音數(shù)據(jù)通道是否有聲音數(shù)據(jù)輸出,若是,則讀取聲音數(shù)據(jù),并進行音頻參數(shù)歸一化處理;否則繼續(xù)循環(huán)檢測各聲音數(shù)據(jù)通道是否有聲音數(shù)據(jù)輸出;將各聲音數(shù)據(jù)通道的聲音數(shù)據(jù)疊加合成輸出到音頻設(shè)備。本發(fā)明用于嵌入式系統(tǒng)的音頻設(shè)備,其有益效果是,多個程序可以同時、透明地訪問同一音頻設(shè)備。
文檔編號G06F3/16GK101286114SQ20081030147
公開日2008年10月15日 申請日期2008年5月8日 優(yōu)先權(quán)日2008年5月8日
發(fā)明者廖福成 申請人:四川長虹電器股份有限公司