通過對androia audio架構的整體分析,我們知道android audio framework中的audio flinger是通過操作audio hal層對間接的對底層設備進行操作的。(音頻數據的讀寫以及各種參數的設定);
那么audio hal到底具備哪些能力,以及向上提供了哪些功能接口自然也是我們關注重點。
(個人認為分析軟件無非就是兩條路線,數據流與控制流;數據流是指軟件底層具備怎樣的能力,而控制流就是上層軟件使用怎樣的策略對底層進行控制。先了解底層具備怎樣的能力,這樣對於以后分析控制流會有很大的幫助,否則很容易出現知其然而不知其所以然的現象)
參照安卓官方文檔(https://source.android.google.cn/devices/audio/implement),我們知道audio hal一定要實現system/media/audio/include/system/audio.h文件中的全部接口。那么我們就可以認為這個文件中所描述的就是audio hal的必須具備的基本能力與功能。
文件內容大概如圖中表示,其中audio_hw_device 代表的是實際物理硬件的抽象;
這個對象中主要包括了如下兩類內容:
(1)對實際物理硬件的操作,比如init_check檢測硬件是否初始化完畢;set_mic_mute設置靜音等;
(2)用stream對數據流進行抽象,用stream來對實際的物理數據來進行控制。使用audio_stream_in來表示輸入流;用audio_stream_out表示輸出流;
在stream中使用int (*set_device)(struct audio_stream *stream, audio_devices_t device);讓stream與具體物理設備進行綁定。對此我們可以用linux中的文件描述符與文件之間的關系來進行理解。
由此,我們就可以大致理解audio底層軟件的基本設計。由於audio hal只對上層提供了這些能力,那么上層軟件中的audio fligner以及audio policy無非就是使用這些能力來做自己內部的邏輯設計,來滿足不同的業務場景。
而且,對此我們也可以對上層軟件設計的基本邏輯作出一些初步的判斷,其基本時序為:
(1)使用load等方法,加載hal動態庫。
(2)通過init_check來檢車物理硬件初始化狀態
(3)使用get_supported_devices來獲得audio hal所支持的物理硬件類型
(4)通過open_output_stream或者open_input_stream方法創建輸出、輸入數據流。
(5)通過stream_out以及stream_in中的write以及read方法對數據進行讀寫。
(6)當需要操作音量等物理硬件能力時,則使用audio_hw_device 的相關方法。如果需要對數據流中的內容,則應該直接或者間接的調用到stream_out或者stream_in中的方法。
對此,我們則對audio hal層的內容有了大致的了解。
其中詳細內容,我們以后會結合上層代碼進一步分析。