當前位置:
首頁 > 科技 > USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Musiland 樂之邦 Monitor 06 Plus USB音效卡 - 連接小米Note Pro

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

OPPO HA-2 攜帶型耳機放大器及解碼器-捆一個綁

在前兩篇文章中,我們通過偶然機會發現了Android智能手機在搭配外接USB音效卡、解碼器等音頻設備時存在的一些兼容性問題。除了OTG模式不穩定、供電不佳、設置無效、經常需要重啟外,多數Android設備的音樂播放器會將外接USB音效卡的播放採樣率鎖定在一個較高值上[通常是192kHz],而主流的44.1kHz音樂源均會SRC至192kHz播放,對音質體驗帶來了負面影響。

Android設備連接USB音效卡時的工作流程分析

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Samsung 三星 Galaxy Nexus [i9250] 智能手機 Android 4.1-頻率掃描@48kHz

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Google 谷歌 Nexus 6 智能手機 - 音質測評 - 頻響掃描[44.1kHz]

雖然從Android 5.0版本以來,許多Android設備即使存在SRC現象,也比更早時期的Android SRC對音質的負面影響改善不少,處於可以接受的程度。但對於對音質要求更高的使用場合來說,尤其是欣賞無損和高清音樂時,其聲音相對應有的正常音質水平還是明顯粗糙。那麼這個問題從何而來?那麼首先應該簡單了解一下Android的USB音頻架構的大致工作流程。

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

高通音頻子系統於Android2.3的 SRC示意圖

在[Doc]Link=00002164[/Doc]一文中,我們已經簡單介紹了Android音頻架構的工作流程,雖然這個流程圖是用於解釋高通手機在Android系統下的音頻架構,而在連接USB設備時,其工作原理是完全一致的,只不過硬體驅動由手機內置音頻CODEC晶元或SoC廠商的驅動改成了通用的UAC[USB Audio Class]驅動。另外在我們翻譯自海外網站的一篇文章[Doc]Link=00006276[/Doc]中,裡面有一張動態gif圖也直觀地體現了Android音頻系統的工作流程,將兩者結合,我們可以得出一個新的圖表。

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Android 4.X以後連接USB音頻設備SRC工作流程圖

和當前多數Android設備的內置音頻系統SRC一樣,在連接USB2.0音效卡時,系統的採樣率會鎖定在192kHz採樣率上,在使用系統內置的音樂播放器或網易雲等應用時,也會統一SRC至192kHz播放。

Android系統外接USB音頻設備時採樣率鎖定深度分析

雖然明白了Android設備SRC的工作流程,但這並不能解釋外接USB音效卡時會SRC至192而不是Android手機更常見的48kHz,一開始我個人初步判斷為Android系統去傾向於設置USB音效卡或UAC驅動所支持的最高採樣率值。然而蛋爺表示,許多USB音效卡所支持的最高採樣率已經達到384kHz,為何卻偏偏是鎖定192呢?這裡便涉及到一個有關Android系統底層的問題:Android系統是如何獲得和設置USB音效卡的採樣率的?

為了獲得答案,我們首先要確認Android的UAC驅動能支持多高的採樣率,和桌面Linux系統一樣,Android的內核音效卡驅動主要來源自開源的ALSA。其音效卡信息會在系統的/proc/asound/目錄下顯示,我們在接上樂之邦或XMOS音效卡後,可以從/proc/asound/card1目錄中獲得外接USB音效卡的信息。

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Android設備連接樂之邦數字時代2時顯示的硬體信息

從顯示信息來看,數字時代2在Android下最高支持至384kHz,看來鎖定192並非來自硬體驅動的限制。看來這個問題是源自Android系統自身了,很大概率問題是出現在Android的硬體抽象管理層HAL驅動上,那麼我們所獲得的信息是否就到此為止了呢?答案當然是否定的,由於Android的絕大部分代碼是開源的,任何人都能在網上通過網頁瀏覽器和git等開發工具軟體隨意查看。本著還殘留一些碼農的編程基礎和Linux系統知識,在花費了兩小時後,找到了鎖定採樣率的真正原因,由於涉及編程知識,對這方面缺乏了解的讀者如果覺得內容實在太硬,可以直接跳過看本文結尾的總結。

Android的HAL部分源代碼基本公開,其USB音頻管理部分源碼位於/hal/audio_extn/usb.c中。從代碼片段中,我們可以輕易找到涉及採樣率的幾個關鍵點:

Android HAL的USB音頻源碼片段

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Android HAL的USB音頻源碼片段

這兩段代碼片段包含的內容是:定義了一個數組,裡面包含了USB音頻設備支持的採樣率集合supported_sample_rates{44100, 48000, 64000, 88200, 96000, 176400, 192000, 384000}。還定義了一個整數為MAX_SAMPLE_RATE_SIZE,也就是這個集合的最高值,根據算式可以得出結果為八[即384000,384kHz,在編程語言中數組集合從0開始,實際結果是7]。而在初始化usb_card_config中,系統設定的採樣率正是最高的MAX_SAMPLE_RATE_SIZE。也就意味著,在正常的情況下,Android系統的USB外接音頻設備初始化採樣率應該是設備所支持的最大值而非192kHz。

根據這三段代碼線索,我們在同一個代碼文件中找到了HAL獲取USB設備採樣率的方式函數usb_get_sample_rates。毫不意外的是,HAL正是讀取/proc/asound目錄中的音效卡信息獲得了採樣率列表,然而在判斷音效卡最大採樣率上,源代碼是這麼寫的:

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Android HAL的USB音頻源碼片段

由於在這段遍歷循環代碼中,由於需要判斷音效卡實際支持的採樣率和supported_sample_rates中的數字對應,也就是合集,由於剔除了許多USB音效卡不支持的64000採樣率,以及supported_sample_rates中沒有的352800,HAL自己所知的設備採樣率將永遠是合集{44100, 48000, 88200, 96000, 176400, 192000, 384000},也就是七個數,而supported_sample_rates第七個數是192000[計算機語言中是supported_sample_rates[6]]。這也正是初始化USB音效卡usb_card_config時所獲得的最大值,如果是SA9027或PCM270X等採樣率低於192kHz的USB音頻方案,則採用音效卡硬體驅動所支持的採樣率最大值,例如48kHz、96kHz等,這也就是Android系統設備在連接樂之邦、XMOS等USB2.0高性能非同步音頻方案時鎖定192kHz的「罪魁禍首」。

總結

USB音效卡解碼器連接Android手機時問題的出現和分析[三] 從Android源碼找出採樣率鎖定的原因 [農步祥]

Android 4.X以後連接USB音頻設備SRC工作流程圖

造成如此奇妙的SRC問題,原因卻如此的簡單:只是單純的由於Android HAL抽象層源代碼開發者的一個的數學錯誤,就造成了USB音頻設備在Android系統下採樣率鎖定在192kHz的問題。如果一個代碼技能荒廢了5年的業餘碼農花了2小時就能輕易找出的源碼BUG,為何至今卻沒有被谷歌旗下任何高級攻城獅和碼農們發現和解決?最直接的原因自然是Android源代碼的擁有者谷歌對於這部分應用從來沒有真正上心過,Android手機是目前普及度最高的個人終端設備,音頻愛好者自然會對音質有更高的要求,那谷歌在Android 6.0開始就著力在PDF上宣傳的所謂專業Android音頻系統,到底是對誰說的?

儘管外接USB音頻設備時,Android用戶的確還有海貝音樂應用這一選擇,也有類似OPPO R11等系統自帶USB音頻採樣率自動識別切換的手機個例,但海貝畢竟無法支持雲音樂應用,而OPPO則是由於自身也是高端音頻設備的廠商,自然需要讓HA-2等攜帶型或台式解碼器在OPPO手機下正常工作。對於廣大Android手機用戶群體以及忠實的雲音樂用戶來說,是否就只能等待谷歌或者手機廠商自己去良心發現或利益需求後才能解決呢?

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 數碼多 的精彩文章:

vivo X9s Plus智能手機攝像頭實拍 樣張圖集第二期[22P] [Soomal]
Apple 蘋果 iPhone 8 Plus智能手機 圖集 [Soomal]
Matrix矩聲 M-Stage HPA-2 Classic 外置解碼器及耳放測評報告 [Soomal]
Oculus Rift 頭戴式VR虛擬現實設備[+Touch套裝]體驗[二] 使用體驗和總結 [Soomal]
聊聊手機攝影的測光 [夏昆岡]

TAG:數碼多 |