本申請涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,尤其涉及一種android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理方法和裝置。
背景技術(shù):
在一些互動(dòng)場景下,通常配置多個(gè)有android系統(tǒng)的移動(dòng)設(shè)備進(jìn)行無線互聯(lián)。例如,唱歌場景,配置麥克和音箱采用藍(lán)牙進(jìn)行互聯(lián)。
在android系統(tǒng)接收到一個(gè)移動(dòng)設(shè)備的藍(lán)牙音頻數(shù)據(jù)后,經(jīng)過“藍(lán)牙協(xié)議?!边M(jìn)行協(xié)議解析,然后再將上述音頻數(shù)據(jù)包寫入到驅(qū)動(dòng)層的虛擬設(shè)備節(jié)點(diǎn)uhid。android系統(tǒng)的核心服務(wù)即音頻數(shù)據(jù)實(shí)體auduiflinger對上述音頻數(shù)據(jù)進(jìn)行處理,將每次采樣的音頻包送到不同的線程進(jìn)行混音,然后再送往處理該音頻數(shù)據(jù)的進(jìn)程進(jìn)行處理以及輸出。
但是,為兼容不同設(shè)備的音頻格式,auduiflinger采用相同或者相近的流程處理不同格式的音頻數(shù)據(jù)。由于auduiflinger需要對音頻數(shù)據(jù)做大量的邏輯運(yùn)算并多線程處理,導(dǎo)致android系統(tǒng)冗余,延緩了音頻數(shù)據(jù)的傳輸。也就是說,android原生平臺(tái)所有類型的音頻數(shù)據(jù),例如藍(lán)牙音頻數(shù)據(jù),按鍵音音頻數(shù)據(jù),系統(tǒng)聲音音頻數(shù)據(jù)等等都需要從audioflinger中進(jìn)行音效處理,而audiofliger需要兼容所有的設(shè)備節(jié)點(diǎn)上傳的音頻數(shù)據(jù)進(jìn)行分割和混音處理,造成用戶常用的外接音頻設(shè)備例如藍(lán)牙外設(shè)輸入的藍(lán)牙音頻數(shù)據(jù)流程處理比較慢,延遲比較明顯;以藍(lán)牙音頻數(shù)據(jù)為例,由于人耳對音頻的延遲感受大約是50ms,特別是在某些場景時(shí)對藍(lán)牙音頻數(shù)據(jù)具有低延遲要求。例如在唱歌場景中,利用上述音頻處理方法處理藍(lán)牙音頻數(shù)據(jù)時(shí),從用戶發(fā)聲到聽到聲音之間延時(shí)超過110ms,聲音延遲過大而影響交互效果。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請?zhí)峁┮环Nandroid系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理方法和裝置,用于緩解現(xiàn)有android系統(tǒng)處理藍(lán)牙音頻數(shù)據(jù)時(shí)延時(shí)過長的問題。
具體地,本申請是通過如下技術(shù)方案實(shí)現(xiàn)的:
一方面,本申請實(shí)施例提供了一種android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理方法,該處理方法包括:
在接收到目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)后,將所述音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger流程切換為寫入緩存buffer;
對寫入所述緩存buffer的音頻數(shù)據(jù)進(jìn)行左右聲道的混音操作;
讀取混音后的音頻數(shù)據(jù),并將所述混音后的音頻數(shù)據(jù)寫入至所述android系統(tǒng)的脈沖編碼調(diào)制pcm音頻驅(qū)動(dòng)。
可選地,在接收到目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)之后,且在將所述音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger切換為寫入緩存buffer之前,所述方法進(jìn)一步包括:
確定音頻處理模式;
若確定出的音頻處理模式為用于指示寫入緩存buffer的模式,則繼續(xù)執(zhí)行所述將所述音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger切換為寫入緩存buffer的步驟。
可選地,確定音頻處理模式的步驟,包括;
檢查android系統(tǒng)當(dāng)前是否僅有指定類型的音頻數(shù)據(jù);所述指定類型為所述目標(biāo)設(shè)備支持的音頻數(shù)據(jù)類型;
若是,則確定所述音頻模式為指示寫入緩存buffer的模式;
若否,則輸出模式切換選擇消息以使用戶選擇音頻處理模式;
依據(jù)用戶的選擇確定音頻處理模式。
可選地,確定音頻處理模式的步驟,包括;
檢查已配置的音頻處理模式的標(biāo)記位;
若所述標(biāo)記位為用于指示將所述音頻數(shù)據(jù)寫入緩存buffer的第一預(yù)設(shè)值,則確定所述音頻模式為指示寫入緩存buffer的模式;
若所述標(biāo)記位為用于指示上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的第二預(yù)設(shè)值,則確定所述音頻模式為上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的模式。
可選地,將所述音頻數(shù)據(jù)寫入緩存buffer的步驟,包括:
對所述音頻數(shù)據(jù)進(jìn)行解析并將解析后的音頻數(shù)據(jù)輸出至目標(biāo)設(shè)備驅(qū)動(dòng)節(jié)點(diǎn)hidrow;
所述目標(biāo)設(shè)備驅(qū)動(dòng)節(jié)點(diǎn)hidrow將所述解析后的音頻數(shù)據(jù)輸出至音頻讀取接口voicecap;
所述音頻讀取接口voicecap將所述解析后的音頻數(shù)據(jù)輸出至所述緩存buffer。
另一方面,本申請實(shí)施例提供了一種android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理裝置,所述裝置包括:
切換模塊,用于在接收到目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)后,將所述音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger流程切換為寫入緩存buffer;
混音模塊,用于對寫入所述緩存buffer的音頻數(shù)據(jù)進(jìn)行左右聲道的混音操作;
讀取模塊,用于讀取混音后的音頻數(shù)據(jù),并將所述混音后的音頻數(shù)據(jù)寫入至所述android系統(tǒng)的脈沖編碼調(diào)制pcm音頻驅(qū)動(dòng)。
可選地,所述裝置還包括:
模式確定模塊,用于確定音頻處理模式;
數(shù)據(jù)寫入模塊,用于在確定出的音頻處理模式為用于指示寫入緩存buffer的模式時(shí),繼續(xù)執(zhí)行所述將所述音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger切換為寫入緩存buffer的步驟。
可選地,所述模式確定模塊包括:
類型檢測單元,用于檢查android系統(tǒng)當(dāng)前是否僅有指定類型的音頻數(shù)據(jù);所述指定類型為所述目標(biāo)設(shè)備支持的音頻數(shù)據(jù)類型;
第一音頻模式確定單元,用于在所述android系統(tǒng)當(dāng)前僅有指定類型的音頻數(shù)據(jù)時(shí),確定所述音頻模式為指示寫入緩存buffer的模式;
第二音頻模式確定單元,用于在所述android系統(tǒng)當(dāng)前包括指定類型之外的音頻數(shù)據(jù)時(shí),輸出模式切換選擇消息以使用戶選擇音頻處理模式;依據(jù)用戶的選擇確定音頻處理模式。
可選地,所述模式確定模塊包括:
標(biāo)記位檢測單元,用于檢測已配置的音頻處理模式的標(biāo)記位;
第三音頻模式確定單元,用于在所述標(biāo)記位為用于指示將所述音頻數(shù)據(jù)寫入緩存buffer的第一預(yù)設(shè)值時(shí),確定所述音頻模式為指示寫入緩存buffer的模式;
第四音頻模式確定單元,用于在所述標(biāo)記位為用于指示上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的第二預(yù)設(shè)值時(shí),則確定所述音頻模式為上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的模式。
可選地,所述切換模塊包括:
數(shù)據(jù)解析單元,用于對所述音頻數(shù)據(jù)進(jìn)行解析并將解析后的音頻數(shù)據(jù)輸出至目標(biāo)設(shè)備驅(qū)動(dòng)節(jié)點(diǎn)hidrow;
目標(biāo)設(shè)備驅(qū)動(dòng)節(jié)點(diǎn)hidrow單元,用于將所述解析后的音頻數(shù)據(jù)輸出至音頻讀取接口voicecap;
音頻讀取接口voicecap單元,用于將所述解析后的音頻數(shù)據(jù)輸出至所述緩存buffer。
由上述技術(shù)方案可知,本申請實(shí)施例通過在接收到目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)后,將音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger流程切換為寫入緩存buffer;然后對寫入所述緩存buffer的音頻數(shù)據(jù)進(jìn)行左右聲道的混音操作;最后讀取混音后的音頻數(shù)據(jù),并將所述混音后的音頻數(shù)據(jù)寫入至所述android系統(tǒng)的脈沖編碼調(diào)制pcm音頻驅(qū)動(dòng)。與相關(guān)技術(shù)相比較,本申請實(shí)施例針對指定類型的音頻數(shù)據(jù)設(shè)置單獨(dú)的進(jìn)入緩存buffer處理的流程,從而避免現(xiàn)有android系統(tǒng)為兼容所有類型的音頻數(shù)據(jù)而造成的音頻數(shù)據(jù)輸出延遲,可以滿足低延遲場景的需求,提升用戶體驗(yàn)。并且,本申請中在僅有指定類型的音頻數(shù)據(jù)時(shí),可避免使用audioflinger處理預(yù)設(shè)類型的音頻數(shù)據(jù),能夠減少android系統(tǒng)的進(jìn)程間通信開銷,提高android系統(tǒng)的處理效率。
附圖說明
圖1是本申請一實(shí)施例中提供的android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理方法的流程示意圖;
圖2是圖1所示步驟101中確定音頻處理模式的流程示意圖;
圖3是本申請一實(shí)施例中用戶切換音頻處理模式示意圖;
圖4是圖2所示步驟201中確定音頻數(shù)據(jù)類型的流程示意圖;
圖5是圖2所示步驟201中確定音頻數(shù)據(jù)類型的流程示意圖;
圖6是本申請另一實(shí)施例中用戶切換音頻處理模式示意圖;
圖7是android系統(tǒng)中音頻子系統(tǒng)audio處理音頻數(shù)據(jù)的流程示意圖;
圖8是本申請一實(shí)施例中提供的android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理方法的流程示意圖;
圖9是本申請一實(shí)施例中提供的android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理裝置的框圖;
圖10是本申請另一實(shí)施例中提供的android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理裝置的框圖;
圖11是圖10所示處理裝置中模式確定模塊的一種結(jié)構(gòu)示意圖;
圖12是圖10所示處理裝置中模式確定模塊的另一種結(jié)構(gòu)示意圖;
圖13是圖9所示處理裝置中切換模塊的結(jié)構(gòu)示意圖。
此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本申請的實(shí)施例,并與說明書一起用于解釋本申請的原理。
具體實(shí)施方式
這里將詳細(xì)地對示例性實(shí)施例進(jìn)行說明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請的一些方面相一致的裝置和方法的例子。
在本申請使用的術(shù)語是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請。在本申請和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。取決于語境,如在此所使用的詞語“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。
本申請實(shí)施例提供了一種android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理方法,如圖1所示,該處理方法包括:
步驟101,在接收到目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)后,將音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger流程切換為寫入緩存buffer。
現(xiàn)有android系統(tǒng)中,所有音頻設(shè)備上報(bào)的音頻數(shù)據(jù)都會(huì)上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger,由audioflinger進(jìn)行處理。在步驟101中,若是目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)(可以理解為指定類型,即目標(biāo)設(shè)備支持的音頻數(shù)據(jù)的類型)則由上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger流程(后續(xù)稱全通道音頻處理方式)切換至寫入緩存buffer(后續(xù)稱指定音頻處理方式),能夠避免音頻數(shù)據(jù)實(shí)體audioflinger處理音頻數(shù)據(jù)時(shí)引起的延遲問題,在低延遲的特定場景中可提升用戶使用體驗(yàn)。
為實(shí)現(xiàn)全通道音頻處理方式和指定音頻處理方式之間靈活切換,本申請一實(shí)施例中,步驟101中的在接收到目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)之后,將音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger流程切換為寫入緩存buffer之前,確定音頻處理模式,如圖2所示,包括:
步驟201,確定音頻處理模式。
實(shí)際應(yīng)用中,音頻處理模式配置方式可以包括靜態(tài)配置和動(dòng)態(tài)配置。
本申請一實(shí)施例中,靜態(tài)配置可由人工設(shè)置音頻處理模式,此時(shí)模式切換選擇可以設(shè)置在android系統(tǒng)的操作菜單中。如圖3所示,用戶可以選擇“設(shè)置”按鈕(如圖3(a)所示),得到如圖3(b)所示的“設(shè)置”菜單。然后在上述“設(shè)置”菜單中選擇“音頻處理模式”選項(xiàng),得到如圖3(c)所示的“音頻處理模式”子菜單,觸發(fā)“指定音頻處理模式”選項(xiàng)或者“全通道音頻處理模式”即可。本申請一實(shí)施例中,音頻處理模式可以由標(biāo)記位確定,當(dāng)標(biāo)記位為第一預(yù)設(shè)值“1”時(shí),指示將所述音頻數(shù)據(jù)寫入緩存buffer,當(dāng)標(biāo)記位為第二預(yù)設(shè)值“0”時(shí),指示上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger。即在確定音頻處理模式的類型時(shí),可以上述標(biāo)記位的預(yù)設(shè)值來確定。本申請僅用移動(dòng)終端進(jìn)行示例性說明,本領(lǐng)域技術(shù)人員可以結(jié)合具體使用場景調(diào)整設(shè)置方式以及觸發(fā)方式,本申請不作限定。
在靜態(tài)配置完成之后,本申請一實(shí)施例中確定音頻處理模式可以采用如圖4所示步驟,包括:
步驟401,檢查已配置的音頻處理模式的標(biāo)記位。
步驟402,若標(biāo)記位為用于指示將音頻數(shù)據(jù)寫入緩存buffer的第一預(yù)設(shè)值“1”,則確定音頻模式為指示寫入緩存buffer的模式即指定音頻處理模式。
步驟403,若標(biāo)記位為用于指示上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的第二預(yù)設(shè)值“0”,則確定音頻模式為上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的模式即全通道音頻處理模式。
本申請一實(shí)施例中,動(dòng)態(tài)配置可以由android系統(tǒng)完成。此時(shí),android系統(tǒng)輪詢所有音頻驅(qū)動(dòng)(例如,藍(lán)牙驅(qū)動(dòng)、usb音頻驅(qū)動(dòng)或者揚(yáng)聲器音頻驅(qū)動(dòng)等)。此時(shí),確定音頻處理模式可以采用如圖5所示步驟,包括:
步驟501,檢查android系統(tǒng)當(dāng)前是否僅有指定類型的音頻數(shù)據(jù);指定類型為目標(biāo)設(shè)備支持的音頻數(shù)據(jù)類型。
步驟502,若僅有指定類型的音頻數(shù)據(jù),則確定音頻模式為指示寫入緩存buffer的模式。
步驟503,若除指定類型的音頻數(shù)據(jù),還包括其他類型的音頻時(shí),則輸出模式切換選擇消息以使用戶選擇音頻處理模式;依據(jù)用戶的選擇確定音頻處理模式。
本申請一實(shí)施例中,若指定類型的音頻數(shù)據(jù)為一種時(shí),android系統(tǒng)檢測當(dāng)前音頻數(shù)據(jù)的類型和數(shù)量,若檢測到僅有目標(biāo)設(shè)備有音頻數(shù)據(jù)輸入時(shí),此時(shí)android系統(tǒng)可以將音頻處理模式切換到指定音頻處理模式;若有多路音頻數(shù)據(jù)輸入,可以直接切換到全通道音頻處理模式,此切換過程用戶無感知。當(dāng)然,有多路音頻數(shù)據(jù)輸入時(shí),如圖6(a)所示,也可以由android系統(tǒng)發(fā)出模式切換選擇消息,如圖6(b)所示,根據(jù)用戶觸發(fā)選擇切換到確定音頻處理模式為全通道音頻處理模式或者藍(lán)牙音頻處理模式。
步驟202,若確定出的音頻處理模式為用于指示上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的模式,則將音頻數(shù)據(jù)上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger。
本申請一實(shí)施例中,以藍(lán)牙音頻數(shù)據(jù)為例進(jìn)行說明,如圖7所示,藍(lán)牙音頻數(shù)據(jù)通過藍(lán)牙設(shè)備接收后輸入到android系統(tǒng)中,然后經(jīng)過“藍(lán)牙協(xié)議棧”進(jìn)行音頻數(shù)據(jù)解析得到音頻數(shù)據(jù)包,然后寫入到虛擬設(shè)備節(jié)點(diǎn)uhid中。上述過程為藍(lán)牙音頻數(shù)據(jù)的物理鏈路傳輸過程。音頻數(shù)據(jù)進(jìn)入到android系統(tǒng)內(nèi),經(jīng)過硬件抽象層(hal),送至audioflinger進(jìn)行音頻數(shù)據(jù)的處理。然后audioflinger將每次采樣的音頻包送到不同的線程進(jìn)行混音,之后通過進(jìn)程間通信機(jī)制ipc送往專門負(fù)責(zé)處理該音頻數(shù)據(jù)的進(jìn)程來實(shí)現(xiàn)音頻的輸出。
為兼容不同的音頻數(shù)據(jù)格式,audioflinger需要復(fù)雜的線程結(jié)構(gòu)進(jìn)行大量的邏輯運(yùn)算,并且為每個(gè)放音/錄音設(shè)備創(chuàng)建一個(gè)處理線程,以實(shí)現(xiàn)音頻數(shù)據(jù)的合成、輸入和輸出。換言之,audioflinger對各種類型的音頻數(shù)據(jù)采用相同的處理方式。
步驟203,若確定出的音頻處理模式為用于指示寫入緩存buffer的模式,則繼續(xù)執(zhí)行將音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger切換為寫入緩存buffer的步驟。
步驟102,對寫入緩存buffer的音頻數(shù)據(jù)進(jìn)行左右聲道的混音操作。
在步驟102中,對寫入緩存buffer的音頻數(shù)據(jù)進(jìn)行左右聲道的混音操作時(shí),可以采用現(xiàn)有的混音方式實(shí)現(xiàn),在此不再說明。
繼續(xù)以藍(lán)牙音頻數(shù)據(jù)為例進(jìn)行說明,本申請一實(shí)施例中,如圖8所示,藍(lán)牙音頻數(shù)據(jù)通過藍(lán)牙設(shè)備接收后上報(bào)至android系統(tǒng)中,經(jīng)過“藍(lán)牙協(xié)議?!边M(jìn)行音頻數(shù)據(jù)解析得到音頻數(shù)據(jù)包,直接寫入到虛擬藍(lán)牙設(shè)備節(jié)點(diǎn)hidrow中。當(dāng)指定類型為其他音頻數(shù)據(jù)類型時(shí),該藍(lán)牙設(shè)備節(jié)點(diǎn)hidrow可以由其他目標(biāo)設(shè)備節(jié)點(diǎn)替換。藍(lán)牙音頻數(shù)據(jù)包經(jīng)過音頻讀取接口voicecap被寫入第一緩存(即上述緩存buffer)。與全通道音頻處理模式相比較,本申請中藍(lán)牙音頻處理模式不需要采樣處理,可以直接寫入hidrow中,可以減少數(shù)據(jù)緩存,讀取效率更高。
本申請一實(shí)施例中,創(chuàng)建處理進(jìn)程對藍(lán)牙音頻數(shù)據(jù)進(jìn)行左右聲道混音處理。為降低進(jìn)程間調(diào)用的開銷,上述處理進(jìn)程包括兩個(gè)線程(即第一線程和第二線程)。第一線程從第一緩存中讀取藍(lán)牙音頻數(shù)據(jù),將分割成預(yù)設(shè)大小的音頻數(shù)據(jù)包,例如,音頻數(shù)據(jù)包的大小為128字節(jié),之后發(fā)送給第二線程。第一線程在處理藍(lán)牙音頻數(shù)據(jù)的過程中,將標(biāo)識(shí)嵌入到音頻數(shù)據(jù)包的頭數(shù)據(jù)中,例如,第一緩存中的地址、第二緩存中的地址、音頻數(shù)據(jù)包中音頻數(shù)據(jù)的大小、前后包標(biāo)記等。第二線程對上述音頻數(shù)據(jù)包進(jìn)行左右聲道混音處理,在混音過程中插入存儲(chǔ)地址的標(biāo)記,并將混音后的音頻數(shù)據(jù)包發(fā)送到第二緩存保存。當(dāng)然,處理進(jìn)程還可以直接記錄混音處理后的音頻數(shù)據(jù)在第二緩存中的存儲(chǔ)地址,然后將存儲(chǔ)地址和偏移量直接發(fā)送給后續(xù)的播放進(jìn)程。
需要說明的是,第一緩存和第二緩存僅用于區(qū)別音頻數(shù)據(jù)在處理過程中進(jìn)行存儲(chǔ)的過程,實(shí)際應(yīng)用中,第一緩存和第二緩存可以由同一個(gè)物理實(shí)體實(shí)現(xiàn)。
可理解的是,存儲(chǔ)地址是音頻數(shù)據(jù)包在第二緩存中的位置。在藍(lán)牙音頻數(shù)據(jù)傳輸?shù)拇蠖鄶?shù)場景下,用戶基本上不關(guān)心其他音頻數(shù)據(jù),僅將用戶關(guān)注的藍(lán)牙音頻數(shù)據(jù)進(jìn)行有效處理,因此以上設(shè)置可以提高音頻數(shù)據(jù)的處理效率。
步驟103,讀取混音后的音頻數(shù)據(jù),并將混音后的音頻數(shù)據(jù)寫入至android系統(tǒng)的脈沖編碼調(diào)制pcm音頻驅(qū)動(dòng)。
步驟103中,直接從第二緩存中讀取混音后的音頻數(shù)據(jù)包,并將上述音頻數(shù)據(jù)包直接寫入android系統(tǒng)的pcm音頻驅(qū)動(dòng)以及喇叭中。
實(shí)際應(yīng)用中,處理音頻數(shù)據(jù)時(shí),本申請實(shí)施例提供的處理方法可以實(shí)現(xiàn)延時(shí)小于100ms,在如唱歌、視頻通話等具體交互場景下,可以滿足用戶的要求,提升交互體驗(yàn)。本申請實(shí)施例能夠提高藍(lán)牙音頻數(shù)據(jù)輸出的效率。
需要說明的是,本申請一實(shí)施例中,在藍(lán)牙音頻數(shù)據(jù)模式時(shí)可以創(chuàng)建三個(gè)線程:讀取進(jìn)程、處理進(jìn)程和播放進(jìn)程。其中讀取進(jìn)程完成步驟102中從第一緩存中讀取指定類型的音頻數(shù)據(jù)的過程,處理進(jìn)程完成步驟102中對音頻數(shù)據(jù)的左右聲道的混音處理。播放進(jìn)程完成步驟103中音頻數(shù)據(jù)的讀取以及輸出至pcm音頻驅(qū)動(dòng)的過程。當(dāng)然,上述讀取進(jìn)程、處理進(jìn)程和播放進(jìn)程可以采用android系統(tǒng)中的相應(yīng)進(jìn)程實(shí)現(xiàn),本申請不作限定。
需要說明的是,本申請上述實(shí)施例中僅以藍(lán)牙音頻數(shù)據(jù)為例描述了上述處理方法,當(dāng)然根據(jù)特殊場景的需求以及音頻數(shù)據(jù)的特點(diǎn)可以對上述處理方法作適當(dāng)?shù)恼{(diào)整,實(shí)現(xiàn)在指定音頻數(shù)據(jù)模式和全通道音頻數(shù)據(jù)模式之間切換,同樣可以達(dá)到減少android系統(tǒng)開銷,提高處理效率的效果。
本申請實(shí)施例中指定音頻處理模式可以獨(dú)立完成指定音頻數(shù)據(jù)的處理,即不需要通過android系統(tǒng)的音頻子系統(tǒng)audio處理(無需啟動(dòng)audioflinger),減少進(jìn)程開銷以及指定類型的音頻數(shù)據(jù)在android系統(tǒng)中的存留時(shí)間。
依據(jù)上述處理方法,本申請實(shí)施例還提供了一種android系統(tǒng)中對輸入的音頻數(shù)據(jù)的處理裝置,如圖9所示,所述裝置包括:
切換模塊901,用于在接收到目標(biāo)設(shè)備上報(bào)的音頻數(shù)據(jù)后,將所述音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger流程切換為寫入緩存buffer;
混音模塊902,用于對寫入所述緩存buffer的音頻數(shù)據(jù)進(jìn)行左右聲道的混音操作;
讀取模塊903,用于讀取混音后的音頻數(shù)據(jù),并將所述混音后的音頻數(shù)據(jù)寫入至所述android系統(tǒng)的脈沖編碼調(diào)制pcm音頻驅(qū)動(dòng)。
本申請一實(shí)施例中,如圖10所示,該處理裝置還包括:
模式確定模塊1001,用于確定音頻處理模式;
數(shù)據(jù)寫入模塊1002,用于在確定出的音頻處理模式為用于指示寫入緩存buffer的模式時(shí),繼續(xù)執(zhí)行所述將所述音頻數(shù)據(jù)從上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger切換為寫入緩存buffer的步驟。
本申請另一實(shí)施例中,如圖10所示,該處理裝置還包括:
數(shù)據(jù)上報(bào)模塊1003,用于在確定出的音頻處理模式為用于指示上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的模式時(shí),將所述音頻數(shù)據(jù)上報(bào)至所述音頻數(shù)據(jù)實(shí)體audioflinger;
本申請一實(shí)施例中,如圖11所示,上述模式確定模塊1001包括:
類型檢測單元1101,用于檢查android系統(tǒng)當(dāng)前是否僅有指定類型的音頻數(shù)據(jù);所述指定類型為所述目標(biāo)設(shè)備支持的音頻數(shù)據(jù)類型;
第一音頻模式確定單元1102,用于在所述android系統(tǒng)當(dāng)前僅有指定類型的音頻數(shù)據(jù)時(shí),確定所述音頻模式為指示寫入緩存buffer的模式;
第二音頻模式確定單元1103,用于在所述android系統(tǒng)當(dāng)前包括指定類型之外的音頻數(shù)據(jù)時(shí),輸出模式切換選擇消息以使用戶選擇音頻處理模式;依據(jù)用戶的選擇確定音頻處理模式。
本申請一實(shí)施例中,如圖12所示,上述模式確定模塊1001包括:
標(biāo)記位檢測單元1201,用于檢測已配置的音頻處理模式的標(biāo)記位;
第三音頻模式確定單元1202,用于在所述標(biāo)記位為用于指示將所述音頻數(shù)據(jù)寫入緩存buffer的第一預(yù)設(shè)值時(shí),確定所述音頻模式為指示寫入緩存buffer的模式;
第四音頻模式確定單元1203,用于在所述標(biāo)記位為用于指示上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的第二預(yù)設(shè)值時(shí),則確定所述音頻模式為上報(bào)至音頻數(shù)據(jù)實(shí)體audioflinger的模式。
本申請一實(shí)施例中,如圖13所示,上述切換模塊901包括:
數(shù)據(jù)解析單元1301,用于對所述音頻數(shù)據(jù)進(jìn)行解析并將解析后的音頻數(shù)據(jù)輸出至目標(biāo)設(shè)備驅(qū)動(dòng)節(jié)點(diǎn)hidrow;
目標(biāo)設(shè)備驅(qū)動(dòng)節(jié)點(diǎn)hidrow單元1302,用于將所述解析后的音頻數(shù)據(jù)輸出至音頻讀取接口voicecap;
音頻讀取接口voicecap單元1303,用于將所述解析后的音頻數(shù)據(jù)輸出至所述緩存buffer。
關(guān)于上述實(shí)施例中的裝置,其中各個(gè)單元或者模塊執(zhí)行操作的具體方式已經(jīng)在有關(guān)該方法的實(shí)施例中進(jìn)行了詳細(xì)描述,此處將不做詳細(xì)闡述說明。
以上所述僅為本申請的較佳實(shí)施例而已,并不用以限制本申請,凡在本申請的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請保護(hù)的范圍之內(nèi)。