柚子快報激活碼778899分享:QNX聲音架構(gòu)(翻譯)
柚子快報激活碼778899分享:QNX聲音架構(gòu)(翻譯)
QNX音頻架構(gòu) QSA
為了讓應(yīng)用程序產(chǎn)生聲音,系統(tǒng)必須包含幾個組成部分:
硬件,以聲卡或聲音芯片的形式硬件的設(shè)備驅(qū)動程序定義良好的應(yīng)用程序與驅(qū)動程序通信的方法,以(API)的形式提供
這整個系統(tǒng)被稱為QNX聲音架構(gòu)(QSA)。QSA設(shè)計在很大程度上借鑒了高級Linux聲音架構(gòu)(ALSA)版本0.5.2,繼承了大量ALSA的內(nèi)容,但隨著兩個系統(tǒng)的持續(xù)發(fā)展和擴(kuò)展,它們之間的直接兼容性丟失了。QSA還提供音頻并發(fā)管理,可以管理音頻降低、音頻搶占和音量漸增。
本文檔集中于定義API并提供如何使用它的示例。但在定義API調(diào)用之前,你需要先了解一些關(guān)于架構(gòu)的背景知識。如果你想立刻開始,可以參見附錄中的“wav”播放器和“wav”錄音機(jī)的示例,分別在wave.c和waverec.c中。
QSA與QNX聲學(xué)管理平臺 AMP
QNX聲學(xué)管理平臺(AMP)實(shí)現(xiàn)了從捕獲到播放的音頻路徑,該路徑針對低延遲、高幀率、小幀尺寸的實(shí)時聲學(xué)信號處理應(yīng)用進(jìn)行了優(yōu)化。
在播放和捕獲路徑上的并發(fā)訪問
QNX AMP通過使用io-audio低延遲音頻架構(gòu)擴(kuò)展了QSA的信號處理功能。在這個架構(gòu)中,可以加載一個或多個AMP功能模塊(AFMs)和聲學(xué)處理擴(kuò)展庫(APXs)。
AFM(AMP功能模塊)是音頻處理模塊,它們在數(shù)字領(lǐng)域內(nèi)連接到PCM(脈沖編碼調(diào)制)設(shè)備,以執(zhí)行專門的音頻處理功能。在大多數(shù)情況下,AFM被配置為從PCM輸入分離器獲取數(shù)據(jù),并將數(shù)據(jù)發(fā)送到PCM軟件混音器。這種配置允許AFM與使用同一音頻PCM硬件設(shè)備的其他音頻功能和應(yīng)用程序并行運(yùn)行。AFM為各種功能提供解決方案,例如聲學(xué)回聲消除、安全警報監(jiān)控、發(fā)動機(jī)降噪(engine order reduction)、發(fā)動機(jī)聲音增強(qiáng)、外部行人警報、車內(nèi)通信和噪聲降低。AFM還可以簡單地充當(dāng)捕獲在一個PCM設(shè)備上和播放在另一個PCM設(shè)備上的橋梁。
與AFM不同,APX(聲學(xué)處理擴(kuò)展庫)位于PCM軟件混音器和輸入分離器中,在這里,它們擴(kuò)展并優(yōu)化音頻流的感知質(zhì)量,并為音頻流的采集和注入提供接入點(diǎn),以便于分析目的。
這種低延遲軟件框架使得在應(yīng)用處理器上實(shí)現(xiàn)要求嚴(yán)苛的聲學(xué)算法成為可能,而不是依賴于專用的數(shù)字信號處理器(DSP)。它以模塊化、完全向后兼容的方式擴(kuò)展了QNX Neutrino現(xiàn)有的音頻基礎(chǔ)設(shè)施,因此像電話、語音識別、導(dǎo)航和媒體播放這樣的應(yīng)用程序都能完全不修改地運(yùn)行,并與系統(tǒng)的聲學(xué)信號處理功能積極互動。
這種設(shè)計允許QNX系統(tǒng)靈活地處理各種音頻處理任務(wù),同時保持低延遲和高性能。這對于需要實(shí)時音頻處理的應(yīng)用程序尤為重要,例如在汽車環(huán)境中的語音控制系統(tǒng)、先進(jìn)的噪聲控制系統(tǒng),或是其他需要實(shí)時音頻處理的環(huán)境。通過在軟件層面實(shí)現(xiàn)這些功能,QNX提供了一種更加靈活和成本效益高的解決方案,相比于使用專用的硬件DSP。
QSA(QNX Sound Architecture)允許單個音頻輸入和輸出硬件控制器同時服務(wù)于一個或多個麥克風(fēng)以及一個或多個揚(yáng)聲器,這些設(shè)備位于您的目標(biāo)環(huán)境中。為了能夠在模塊/進(jìn)程/線程之間同時共享這些設(shè)備,播放路徑上的PCM(脈沖編碼調(diào)制)軟件混音器將多個音頻流混合成一個單一的輸出音頻流,這個流被發(fā)送到主揚(yáng)聲器。同時,在捕獲路徑上的PCM輸入分離器復(fù)制并分發(fā)來自單一麥克風(fēng)(單聲道或多聲道)的音頻流到不同的模塊/進(jìn)程/線程。在播放路徑上并發(fā)訪問的一個例子是媒體播放器、車內(nèi)通信(ICC)模塊和QNX聲學(xué)用于語音(QAV)模塊同時向一個或多個車廂揚(yáng)聲器的播放設(shè)備寫入音頻。在捕獲路徑上的一個例子是語音識別應(yīng)用程序、ICC模塊和QAV模塊同時從一個或多個車廂麥克風(fēng)的捕獲設(shè)備獲取數(shù)據(jù)。如果沒有播放用的PCM軟件混音器和捕獲用的PCM輸入分離器,任何給定時間只有單個模塊/進(jìn)程/線程可以訪問硬件設(shè)備。
這種架構(gòu)使得多個音頻源和目標(biāo)能夠在不沖突的情況下共存和操作,極大地增強(qiáng)了系統(tǒng)的靈活性和多功能性。它對于需要處理多種音頻輸入和輸出的復(fù)雜應(yīng)用場景,如汽車娛樂和通信系統(tǒng),尤其有用。通過這種方式,QSA為開發(fā)人員提供了一個強(qiáng)大的框架,用于創(chuàng)建高度集成和響應(yīng)性的音頻應(yīng)用程序。
LiveAMP和聲學(xué)控制服務(wù)器(ACS)
QNX AMP包括LiveAMP,這是一套調(diào)優(yōu)、診斷和分析工具,它允許對系統(tǒng)參數(shù)進(jìn)行實(shí)時調(diào)整,能夠在系統(tǒng)中多個接入點(diǎn)進(jìn)行信號流的流式傳輸和注入,以及提供實(shí)時頻譜和波形顯示。AFM(AMP功能模塊)通過聲學(xué)控制服務(wù)器(ACS)進(jìn)行遠(yuǎn)程控制,ACS無縫鏈接LiveAMP到io-audio中的AFM和APX(聲學(xué)處理擴(kuò)展庫)模塊。
LiveAMP的功能使得工程師和開發(fā)者能夠在系統(tǒng)運(yùn)行時對音頻處理參數(shù)進(jìn)行實(shí)時的調(diào)整和優(yōu)化。這對于實(shí)時音頻應(yīng)用(如車載系統(tǒng)、高級通信設(shè)備等)至關(guān)重要,因?yàn)樗鼈冃枰诓煌沫h(huán)境和條件下保持最佳的音頻性能。
ACS作為控制中心,它提供了一個界面,通過這個界面,可以遠(yuǎn)程操控和調(diào)整AFM和APX模塊的設(shè)置。這種遠(yuǎn)程控制能力特別適用于需要精細(xì)調(diào)校的復(fù)雜音頻系統(tǒng),如在汽車中對噪聲控制和聲音增強(qiáng)系統(tǒng)的調(diào)整。
通過將LiveAMP和ACS結(jié)合使用,QNX AMP提供了一個強(qiáng)大且靈活的工具集,用于高級聲學(xué)信號處理的實(shí)時監(jiān)控、分析和調(diào)整。這樣的集成解決方案可以顯著提高音頻系統(tǒng)的性能和用戶體驗(yàn),尤其是在需要高度定制和實(shí)時反饋的應(yīng)用中。
AMP音頻設(shè)備
除了QSA支持的音頻設(shè)備外,AMP還提供了以下設(shè)備:
AFM設(shè)備(/dev/snd/afmCxDy)
AFM設(shè)備是控制和檢查AFM狀態(tài)的入口點(diǎn)??梢允褂胹nd_afm_*()函數(shù)來打開和與AFM交互。為了簡化AFM訪問,還發(fā)布了與相關(guān)聲學(xué)處理庫相對應(yīng)的符號鏈接(例如,對于車內(nèi)通信模塊,為/dev/snd/icc)。
AFM PCM設(shè)備(/dev/snd/pcmCxDy)
某些AFM會創(chuàng)建一個PCM設(shè)備,為應(yīng)用程序提供與AFM處理的音頻接口。這個設(shè)備簡單地作為一個新的播放、捕獲或播放和捕獲PCM設(shè)備出現(xiàn),其卡和設(shè)備編號與關(guān)聯(lián)的AFM相匹配。寫入此類PCM播放設(shè)備的數(shù)據(jù)在傳遞給PCM硬件或軟件混音器設(shè)備之前,會經(jīng)過AFM處理算法??梢允褂胹nd_pcm_*()函數(shù)以與非AFM PCM設(shè)備相同的方式打開和交互PCM設(shè)備。為了簡化PCM訪問,也發(fā)布了符號鏈接(以“p”結(jié)尾代表播放,或以“c”結(jié)尾代表捕獲),例如,對于QNX聲學(xué)用于語音模塊,會添加/dev/snd/voicep和dev/snd/voicec。
AFM混音器設(shè)備(/dev/snd/mixerCxDy)
創(chuàng)建PCM設(shè)備的AFM如果啟用了音量控制,也可以創(chuàng)建混音器設(shè)備?;煲羝髟O(shè)備的卡和設(shè)備編號與關(guān)聯(lián)的AFM匹配??梢允褂胹nd_mixer_*()函數(shù)以與非AFM混音器設(shè)備相同的方式打開和交互混音器設(shè)備。
由于聲學(xué)處理擴(kuò)展(APX)庫位于PCM軟件混音器或輸入分離器內(nèi),因此它們不作為單獨(dú)的設(shè)備存在。然而,仍然可以通過關(guān)聯(lián)的PCM設(shè)備使用snd_apx_*()函數(shù)與它們交互。
音頻庫
AMP通過snd_afm_()和snd_apx_()函數(shù)得到支持。除了基本控制和狀態(tài)之外,這些函數(shù)還提供了一個接口來輸入車輛輸入(VIN)數(shù)據(jù),這些數(shù)據(jù)來自CAN總線,供AFM使用。更多信息,請參見音頻庫。
配置io-audio
io-audio的-c選項(xiàng)允許您使用在啟動時加載的配置文件來配置低延遲軟件框架。
您使用配置文件來加載提供QNX AMP功能的DLL(動態(tài)鏈接庫)。
音頻設(shè)備索引基于各自音頻驅(qū)動程序在io-audio進(jìn)程中的掛載順序。在創(chuàng)建音頻配置文件時,請牢記這一點(diǎn)。[ctrl]部分的順序決定了音頻驅(qū)動程序掛載到io-audio進(jìn)程的順序,從而決定了每個音頻設(shè)備的索引。通常,這意味著您希望主音頻設(shè)備(主麥克風(fēng)和揚(yáng)聲器)的[ctrl]部分是音頻配置文件中的第一個[ctrl]部分,任何次要音頻設(shè)備(藍(lán)牙、無線電調(diào)諧器等)及與這些設(shè)備連接的AFM應(yīng)該跟隨其后。
音頻設(shè)備索引使用卡和設(shè)備編號。每個[ctrl]或[afm]創(chuàng)建一個卡片,卡片索引從0開始,每個[ctrl]或[afm]類型的部分遞增。每張卡下面有0個或多個設(shè)備。(如果有[audiomgmt]部分,它被分配卡0,除非使用unit鍵指定了不同的值。)
您可以在音頻配置文件中使用[acs]部分來加載deva-acs-link DLL。這個DLL創(chuàng)建了一個afm入口點(diǎn),并實(shí)例化了ACS鏈接。
有關(guān)io-audio配置文件的詳細(xì)描述,請參見Utilities Reference中的io-audio。
AMP和音頻并發(fā)管理
音頻鴨音特性[X1]?對AFM音頻流的影響與通過PCM軟件混音器的AFM混音路徑(默認(rèn)路由)路由的其他音頻流不同。
QSA音頻并發(fā)管理從不降低AFM的音頻流量。
ASD、CSA和ICC AFM不降低任何其他音頻流(在典型配置中,這些AFM始終處于開啟狀態(tài),如果允許,它們會永久降低車艙中的其他音頻)。
您可以配置QAV和Bridge AFM降低通過主混音器音頻路徑播放的特定音頻流(例如,媒體播放)。然而,通過AFM混音路徑路由Bridge AFM并不是該AFM的典型用例。
卡和設(shè)備
產(chǎn)生或捕捉(即錄制)聲音所需的基本硬件是音頻芯片或聲卡,簡稱為卡。QSA可以同時支持多個卡,并且甚至可以“即時”掛載和卸載卡(稍后將詳細(xì)介紹)。所有聲音設(shè)備都連接到一個卡上,因此要訪問一個設(shè)備,首先必須知道它連接到哪個卡上。
設(shè)備包括:
控制器Control
混音器Mixer
脈沖編碼調(diào)制 (PCM)
PCM 設(shè)備負(fù)責(zé)將數(shù)字聲音序列轉(zhuǎn)換為模擬波形,或?qū)⒛M波形轉(zhuǎn)換為數(shù)字聲音序列。每個設(shè)備只能以一種模式運(yùn)行。如果它將數(shù)字信號轉(zhuǎn)換為模擬信號,那么它是一個播放通道設(shè)備;如果它將模擬信號轉(zhuǎn)換為數(shù)字信號,那么它是一個捕獲通道設(shè)備。
PCM 設(shè)備通常以播放和捕獲成對的形式創(chuàng)建,在同一個卡下創(chuàng)建兩個具有相同設(shè)備索引的條目,并帶有方向標(biāo)識符后綴('p' 表示播放,'c' 表示捕獲)。
每個 deva-ctrl-* DLL 創(chuàng)建一個邏輯聲卡。對于每張卡,都有一個控制器(controlCx),以及一個或多個混音器(mixerCxDy)和 PCM 設(shè)備(pcmCxDyz)條目??ㄌ枺▁)從零開始,并按照 DLL 加載的順序遞增。io-audio 命令的 driver(unit=number)選項(xiàng)可用于指定在命令行上跟隨它的 DLL 使用的特定卡號。
您可以使用 ls 命令列出系統(tǒng)上的設(shè)備。例如:
# ls -l /dev/snd
total 0
lrw-rw-rw- 1 root root 0 May 31 11:11 capture -> pcmC0D0c
-rw-rw-rw- 1 root root 0 May 31 11:11 controlC0
-rw-rw-rw- 1 root root 0 May 31 11:11 mixerC0D0
-rw-rw-rw- 1 root root 0 May 31 11:11 pcmC0D0c
-rw-rw-rw- 1 root root 0 May 31 11:11 pcmC0D0p
lrw-rw-rw- 1 root root 0 May 31 11:11 pcmPreferredc -> pcmC0D0c
lrw-rw-rw- 1 root root 0 May 31 11:11 pcmPreferredp -> pcmC0D0p
lrw-rw-rw- 1 root root 0 May 31 11:11 playback -> pcmC0D0p0p
"C" 代表聲卡(Card)。每個聲卡都有一個唯一的編號,如 "C0"、"C1" 等。
"D" 代表設(shè)備(Device)。在每個聲卡上,可以有多個不同的設(shè)備,每個設(shè)備也有一個唯一的編號,如 "D0"、"D1" 等。
"p" 代表播放(Playback)。如果設(shè)備用于播放聲音,它的標(biāo)識符會以 "p" 結(jié)尾,表示這是一個播放通道。
"c" 代表捕獲(Capture)。相應(yīng)地,如果設(shè)備用于錄音或捕獲聲音,它的標(biāo)識符會以 "c" 結(jié)尾,表示這是一個捕獲通道。
因此,看到類似 "pcmC0D1p" 的命名時,它指的是聲卡 0 上的設(shè)備 1,用于播放功能。
控制設(shè)備
系統(tǒng)中的每張聲卡都有一個控制設(shè)備。
這個設(shè)備很特別,因?yàn)樗⒉恢苯涌刂迫魏螌?shí)際的硬件。它是關(guān)于其聲卡及與該聲卡連接的其他設(shè)備信息的聚集點(diǎn)??刂圃O(shè)備保存的主要信息包括與聲卡連接的其他設(shè)備的類型和數(shù)量。
控制事件
您可能有一個應(yīng)用程序需要監(jiān)控音頻并發(fā)管理事件,并在事件發(fā)生時得到通知。
這些事件跟蹤活躍的音頻流,并讓您知道系統(tǒng)上哪些音頻類型處于活躍狀態(tài)。您必須在select()之后調(diào)用snd_ctl_read()來從隊(duì)列中讀取事件。
如果它是一個SND_CTL_READ_AUDIOMGMT_STATUS_CHG事件,請使用snd_ctl_ducking_status_read()來獲取所有活躍音頻子通道的列表以及有關(guān)它們的優(yōu)先級和壓縮狀態(tài)的信息。
已被用戶暫停的音頻流(例如,snd_pcm_*_pause())被認(rèn)為是活躍的。
有關(guān)如何監(jiān)控事件并確定系統(tǒng)上活躍音頻流的狀態(tài)的示例,請參閱“audiomgmt_monitor.c示例”附錄。
您可以在音頻配置文件的[AUDIOMGMT]部分使用audiomgmt_id鍵來指定您想要監(jiān)控的輸出(音頻并發(fā)管理上下文或輸出)。更多信息請參閱Utilities Reference中的io-audio。
混音器設(shè)備
混音器設(shè)備負(fù)責(zé)將聲卡上的各種模擬信號組合或混合。
混音器還可能提供一系列控制,用于選擇哪些信號被混合以及它們是如何混合在一起的,調(diào)整信號的增益或衰減、靜音。
脈沖編碼調(diào)制(PCM)設(shè)備
PCM設(shè)備負(fù)責(zé)將數(shù)字聲音序列轉(zhuǎn)換為模擬波形,或?qū)⒛M波形轉(zhuǎn)換為數(shù)字聲音序列。
PCM設(shè)備通常成對創(chuàng)建,以播放和捕獲的形式,這樣在同一卡下的同一設(shè)備索引會創(chuàng)建兩個條目,且?guī)в蟹较驑?biāo)識符后綴(“p”代表播放,"c"代表捕獲)。每個設(shè)備只在一種模式下操作。如果它將數(shù)字轉(zhuǎn)換為模擬,則是一個播放通道設(shè)備;如果它將模擬轉(zhuǎn)換為數(shù)字,則是一個捕獲通道設(shè)備。
PCM設(shè)備的屬性包括:
設(shè)備支持的數(shù)據(jù)格式(例如,16位有符號小端格式、32位無符號大端格式等)。有關(guān)更多信息,請參見下文的“數(shù)據(jù)格式”。
設(shè)備能夠運(yùn)行的數(shù)據(jù)速率(例如,48 kHz、44.1 kHz等)。設(shè)備支持的通道或聲道數(shù)量(例如,2通道立體聲、單聲道、4通道環(huán)繞聲)。設(shè)備能夠支持的同時客戶端數(shù)量,即設(shè)備擁有的子通道數(shù)。大多數(shù)聲卡僅支持1個子通道,但有些卡可以支持更多;例如,Soundblaster Live! 支持32個子通道。支持的最大子通道數(shù)是硬件的限制。在只有單個子通道的卡上,通過軟件解決方案——軟件子通道混音器,可以人為地超越這一限制。這允許在單一硬件子通道之上存在64個軟件子通道。
設(shè)備宣稱支持的子通道數(shù)是針對最佳情況定義的;在現(xiàn)實(shí)世界中,設(shè)備可能支持較少的子通道。例如,如果所有客戶端都以48 kHz運(yùn)行,一個設(shè)備可能支持32個同時客戶端,但如果速率是44.1 kHz,可能僅支持8個客戶端。在這種情況下,設(shè)備一般會宣稱支持32個子通道。
數(shù)據(jù)格式
QNX聲音架構(gòu)支持多種數(shù)據(jù)格式。
數(shù)據(jù)格?? 式常量
SND_PCM_SFMT_*
這是數(shù)據(jù)格式集合中的單一選擇。有關(guān)支持的格式列表,請參見“音頻庫”章節(jié)中的 snd_pcm_get_format_name()。
SND_PCM_FMT_*
單個變量中的一組(一個或多個)格式。例如,這對于指定設(shè)備的格式能力很有用。
通常,SND_PCM_FMT_* 常量用于傳達(dá)有關(guān)原始潛力的信息,而 SND_PCM_SFMT_* 常量用于選擇和報告特定配置。
您可以通過調(diào)用 snd_pcm_build_linear_format() 來根據(jù)其寬度和其他屬性構(gòu)建格式。
您可以使用以下函數(shù)來檢查格式的特性:
snd_pcm_format_big_endian()
snd_pcm_format_linear()
snd_pcm_format_little_endian()
snd_pcm_format_signed()
snd_pcm_format_unsigned()
24位音頻格式
24位音頻的數(shù)據(jù)以3字節(jié)或4字節(jié)的形式表示。
在大多數(shù)情況下,音頻文件將24位數(shù)據(jù)存儲為3字節(jié)。
因?yàn)槟挠布赡苄枰?2位對齊的數(shù)據(jù)訪問,所以通常會將24位數(shù)據(jù)轉(zhuǎn)換為4字節(jié)。32位整數(shù)中的24位樣本可以具有以下類型之一的對齊方式:
左對齊 — QSA識別并處理32位整數(shù)中左對齊的24位值作為32位樣本值,沒有效率損失。
右對齊 — 如果硬件需要24位樣本在32位容器中右對齊,請使用24_4數(shù)據(jù)格式常量。對于播放,QSA將24位數(shù)據(jù)上采樣為32位進(jìn)行所有處理,然后在傳遞給硬件之前將其從32位轉(zhuǎn)換為24_4。同樣,對于捕獲,QSA可以接受24_4并將其轉(zhuǎn)換為32位進(jìn)行處理。
PCM狀態(tài)機(jī)
PCM設(shè)備最簡單的形式是一個數(shù)據(jù)緩沖區(qū),通過數(shù)字模擬轉(zhuǎn)換器(DAC)或模擬數(shù)字轉(zhuǎn)換器(ADC)逐個樣本轉(zhuǎn)換,這取決于數(shù)據(jù)傳輸?shù)姆较颉?/p>
在QSA中,這個簡單的想法因?yàn)镻CM子通道在任何給定時刻都處于某種狀態(tài)的概念而變得更加復(fù)雜。這些狀態(tài)定義如下:
SND_PCM_STATUS_NOTREADY
設(shè)備的初始狀態(tài)。
SND_PCM_STATUS_READY
設(shè)備已為其將操作的數(shù)據(jù)設(shè)置了參數(shù)。
SND_PCM_STATUS_PREPARED
設(shè)備已準(zhǔn)備好操作并能夠運(yùn)行。
SND_PCM_STATUS_RUNNING
設(shè)備正在運(yùn)行,向緩沖區(qū)傳輸數(shù)據(jù)或從緩沖區(qū)傳輸數(shù)據(jù)。
SND_PCM_STATUS_UNDERRUN
這種狀態(tài)只發(fā)生在播放設(shè)備上,當(dāng)緩沖區(qū)沒有更多數(shù)據(jù)可播放時進(jìn)入此狀態(tài)。
SND_PCM_STATUS_OVERRUN
這種狀態(tài)只發(fā)生在捕獲設(shè)備上,當(dāng)緩沖區(qū)沒有空間存放數(shù)據(jù)時進(jìn)入此狀態(tài)。
SND_PCM_STATUS_PAUSED
設(shè)備已暫停,不再播放音頻流。要恢復(fù)播放,必須顯式調(diào)用相應(yīng)的 snd_pcm_*_resume() 函數(shù)。
當(dāng)用戶顯式調(diào)用 snd_pcm_*_pause() 函數(shù)時,會發(fā)生這種狀態(tài)。它也可能因?yàn)榉胖玫囊纛l并發(fā)管理策略將之前處于 SND_PCM_STATUS_SUSPEND 的子通道移動到 SND_PCM_STATUS_PAUSED 狀態(tài)。
SND_PCM_STATUS_SUSPENDED
基于系統(tǒng)上配置的當(dāng)前音頻并發(fā)管理策略,音頻并發(fā)管理已暫停音頻流的播放。
SND_PCM_STATUS_SUSPENDED 是一個受系統(tǒng)上運(yùn)行的音頻并發(fā)管理策略控制的短暫或臨時狀態(tài)。這個短暫狀態(tài)有兩種模式,稱為軟暫停和硬暫停。有關(guān)這些模式及其工作方式的更多信息,請參見本指南中的“理解搶占”部分。
SND_PCM_STATUS_UNSECURE
應(yīng)用程序標(biāo)記流為受保護(hù),硬件級別支持安全傳輸(例如,用于HDMI的HDCP),并且認(rèn)證丟失。
SND_PCM_STATUS_ERROR
發(fā)生硬件錯誤,流必須再次準(zhǔn)備。
SND_PCM_STATUS_CHANGE
流已更改,音頻流必須重新配置。
當(dāng)子通道被置于 SND_PCM_STATUS_CHANGE 狀態(tài)時,客戶端必須重新配置音頻流,因?yàn)橛布芰σ迅?。例如,對于HDMI連接,HDMI源(顯示器、放大器等)的音頻模式可能已從立體聲更改為5.1環(huán)繞聲,因此,您的子通道必須重新配置以啟用語音轉(zhuǎn)換插件。
要重新配置音頻流,您必須調(diào)用 snd_pcm_plugin_params() 或 snd_pcm_channel_params(),然后調(diào)用相應(yīng)的 snd_pcm_plugin_setup() 或 snd_pcm_channel_setup() 函數(shù)。如果您想檢查有哪些新的硬件功能可用,可以調(diào)用 snd_pcm_channel_info(),它直接從硬件獲取信息。
重新配置音頻流后,您可以調(diào)用 snd_pcm_plugin_prepare() 或 snd_pcm_channel_prepare(),以移至 SND_PCM_STATUS_PREPARED 狀態(tài),并繼續(xù)向子通道寫入音頻數(shù)據(jù)。
調(diào)用 snd_pcm_plugin_params() 或 snd_pcm_channel_params() 函數(shù)可能會導(dǎo)致片段大小發(fā)生變化。因此,請確保在寫入音頻數(shù)據(jù)之前,您在進(jìn)行 snd_pcm_*_params() 調(diào)用后,調(diào)用 snd_pcm_*_setup() 和 snd_pcm_*_prepare() 函數(shù)。
SND_PCM_STATUS_PREEMPTED
音頻被阻塞,因?yàn)榱硪粋€ libasound 會話已啟動播放,音頻驅(qū)動程序已確定該會話具有更高優(yōu)先級,因此較低優(yōu)先級的會話以 SND_PCM_STATUS_PREEMPTED 狀態(tài)終止。僅當(dāng)系統(tǒng)上沒有足夠的資源可用時,才會發(fā)生此狀態(tài)。當(dāng)客戶端接收到此狀態(tài)時,應(yīng)放棄播放,并在要生成的聲音提高優(yōu)先級或用戶發(fā)起重試之前不要嘗試恢復(fù)。
不要將 SND_PCM_STATUS_PREEMPTED 狀態(tài)與 SND_PCM_STATUS_SUSPENDED 狀態(tài)混淆。當(dāng)子通道因發(fā)生音頻并發(fā)管理而被搶占時,它會轉(zhuǎn)移到 SND_PCM_STATUS_SUSPENDED 狀態(tài)。
圖 1. PCM 設(shè)備的一般狀態(tài)圖
在上面的圖中,橢圓將Underrun/Overrun、Error和Unsecure狀態(tài)組合在一起,以表示每個狀態(tài)都可以過渡到準(zhǔn)備好的狀態(tài)。
狀態(tài)之間的過渡是執(zhí)行 API 調(diào)用的結(jié)果,或在硬件中發(fā)生的條件的結(jié)果。有關(guān)更多詳細(xì)信息,請參見“播放和捕獲音頻數(shù)據(jù)”章節(jié)
PCM 軟件混音器
PCM 軟件混音器允許多個應(yīng)用程序流同時在單個硬件設(shè)備上播放,通過混合所有應(yīng)用程序流的音頻樣本。當(dāng)您在音頻配置文件中啟用 PCM 軟件混音器參考流(使用 sw_mixer_max_references)時,它還會創(chuàng)建一個捕獲設(shè)備,提供混合后的播放音頻流作為參考音頻流/信號。
對于每個硬件 PCM 播放設(shè)備,自動創(chuàng)建一個 PCM 軟件混音器實(shí)例,即使硬件支持多個硬件子通道。客戶端應(yīng)用程序?qū)τ布O(shè)備的請求會自動路由到 PCM 軟件混音器。您可以使用 -o disable_sw_mixer 選項(xiàng)禁用 PCM 軟件混音器。
當(dāng) PCM 軟件混音器未被禁用時,即使只有一個流,使用 CPU 的程度也會超過直接使用沒有混音器的硬件設(shè)備。PCM 軟件混音器不使用單獨(dú)的 PCM 設(shè)備。相反,它直接覆蓋由 deva-ctrl-* DLL 創(chuàng)建的硬件 PCM 設(shè)備。這種覆蓋意味著您無法直接訪問硬件。
當(dāng)您啟用 PCM 軟件混音器媒體參考時,會創(chuàng)建一個新的 PCM 捕獲設(shè)備,其索引比軟件混音器大一。當(dāng)您從這個設(shè)備捕獲時,您會得到來自應(yīng)用程序混音階段的混合音頻流。如果 PCM 軟件混音器沒有積極混合音頻流,您無法從 PCM 軟件混音器參考中捕獲。
客戶端應(yīng)用程序片段大小
附加到 PCM 軟件混音器設(shè)備的客戶端應(yīng)用程序可以使用片段大?。ㄒ宰止?jié)為單位),該大小是 PCM 軟件混音器底層片段大小的任意倍數(shù)。例如,如果 PCM 軟件混音器的片段大小為 4 KB,則應(yīng)用程序的片段可以是 4 KB 的倍數(shù)。
您可以使用以下選項(xiàng)之一來設(shè)置 PCM 軟件混音器片段的大?。?/p>
sw_mixer_ms
使用此選項(xiàng)時,io-audio 根據(jù)請求的周期和音頻控制器配置計算片段大小。您只能在音頻配置文件中指定此選項(xiàng)。使用以下格式:
sw_mixer_ms=<每個片段的毫秒數(shù)>
<每個片段的毫秒數(shù)> 必須是整數(shù)。
sw_mixer_samples
使用此選項(xiàng)通過樣本而不是毫秒值指定片段大小。使用以下格式:
sw_mixer_samples=<每個片段的樣本數(shù)>
使用以下公式計算 <每個片段的樣本數(shù)>:
音頻控制器采樣率 * 期望時間周期 / 音頻控制器的通道數(shù)
例如,如果音頻控制器的采樣率是 48 kHz,時間周期是 16 毫秒,音頻控制器的通道數(shù)是兩個,<每個片段的樣本數(shù)> 是 768:
48000Hz * 16ms / 1000 = 768
如果您正在使用 PCM 輸入分離器,則不能使用 sw_mixer_samples。
暫停軟件混音器音頻流
當(dāng)您的子通道通過軟件混音器("sw_mixer")并且您暫停音頻流(通過調(diào)用 snd_pcm_pause())時,snd_pcm_pause() 調(diào)用會阻塞,直到軟件混音器完成將音量降至零。子通道只有在音量降至零后才過渡到 PAUSED 狀態(tài)。如果您不使用軟件混音器,則不會發(fā)生減音。
使用預(yù)測限制器避免失真
PCM 軟件混音器操作 16 或 32 位 PCM 數(shù)據(jù)。在混合多個音頻流時,累積的音頻數(shù)據(jù)可能會溢出,并且可能需要將其夾持到 16 或 32 位值的最小/最大值。這種夾持會導(dǎo)致失真,信號溢出到越界區(qū)域的程度越高,失真就越明顯。隨著同時混合的音頻流數(shù)量的增加,溢出的程度和頻率也會增加。
為了避免失真,您可以在累積的混音器輸出上啟用預(yù)測限制器(sw_mixer_limiter),它使用一毫秒的延遲來提前觀察輸出音頻信號的即將到來的振幅。使用該信息,它計算出一個衰減值,將信號降低到 PCM 限制以下。如果輸出信號低于限制,則逐漸將衰減減少到零。這提供了比直接夾持更平滑的信號響應(yīng),并允許同時混合許多音頻流而不會產(chǎn)生任何可察覺的聽覺失真。
在目標(biāo)系統(tǒng)上播放多個音頻流并且音頻流使用完整的 16 或 32 位 PCM 范圍時,建議使用限制器。如果通常只播放一個音頻流,或者被混合的音頻流振幅較低,則不需要限制器。需要注意的是,如果啟用限制器,則播放輸出會延遲一毫秒。有關(guān)更多信息,請參閱 sw_mixer_limiter 配置選項(xiàng)。
PCM輸入分離器
PCM輸入分離器是一種虛擬的、僅用于捕獲的設(shè)備,它直接覆蓋在PCM捕獲設(shè)備上,使得原本只支持單個子通道的硬件可以支持多個子通道。PCM輸入分離器最多可以同時支持10個附加的子通道。
這個分離器允許多個進(jìn)程和線程同時從同一硬件設(shè)備捕獲音頻。例如,你可以使用不同的進(jìn)程同時進(jìn)行語音識別和錄音。PCM輸入分離器可以通過音頻配置文件中的input_splitter_enable鍵來啟用。默認(rèn)情況下,PCM輸入分離器是禁用的。
PCM輸入分離器和PCM軟件混音器必須在相同的數(shù)據(jù)片段大小上運(yùn)行,這可以通過sw_mixer_ms選項(xiàng)來設(shè)置。由于你不能使用樣本值來指定PCM輸入分離器使用的片段大小,因此在使用輸入分離器時,你不能使用樣本(sw_mixer_samples選項(xiàng))來設(shè)置PCM軟件混音器的片段大小。
關(guān)于使用輸入分離器的更多信息,可以在QNX Neutrino Utilities Reference指南的“io-audio”部分的“音頻配置文件”章節(jié)中找到input_splitter_enable鍵的描述。
?[X1]音頻鴨音(Audio Ducking)是一種音頻處理特性,用于在一個音頻流(如語音或警報)出現(xiàn)時自動減小其他音頻流(如背景音樂或媒體播放)的音量。這種特性在多種音頻和多媒體應(yīng)用中很常見,尤其是在需要突出特定音頻信號時。
例如,在汽車系統(tǒng)中,如果駕駛員接聽電話或?qū)Ш较到y(tǒng)發(fā)出指示,音頻鴨音功能可以自動降低車載娛樂系統(tǒng)的音量,以便駕駛員可以清晰地聽到電話或?qū)Ш街噶?。通話或?qū)Ш街噶罱Y(jié)束后,背景音樂或媒體的音量會自動恢復(fù)正常水平。
在QSA(QNX Sound Architecture)和相關(guān)的音頻管理系統(tǒng)中,音頻鴨音功能可以精確控制不同音頻流之間的交互,確保重要信號(如安全警告或語音通信)優(yōu)先,同時提供良好的用戶體驗(yàn)。
柚子快報激活碼778899分享:QNX聲音架構(gòu)(翻譯)
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。