Android4.2中目前支援的裝置介面有以下幾種(定義在AudioFlinger.cpp):
* audio_interfaces[] = AUDIO_HARDWARE_MODULE_ID_PRIMARY, AUDIO_HARDWARE_MODULE_ID_A2DP, AUDIO_HARDWARE_MODULE_ID_USB, };
數組中的常量又定義在/hardware/libhardware/include/audio.h中:
AUDIO_HARDWARE_MODULE_ID_PRIMARY "primary" AUDIO_HARDWARE_MODULE_ID_A2DP "a2dp" AUDIO_HARDWARE_MODULE_ID_USB "usb"
AudioFlinger在初始化時,並不會主動去載入audio module,它提供了一個loadHwModule(const char *name)介面給AudioPolicyService調用,name就是支援的幾種裝置之一。以下一primary裝置為例:
int hw_get_module_by_class( *class_id, * hw_module_t ** hw_module_t *hmi = (i= ; i<HAL_VARIANT_KEYS_COUNT+ ; i++ (i < (property_get(variant_keys[i], prop, NULL) == (path), (access(path, R_OK) == ) (path), (access(path, R_OK) == ) (path), (access(path, R_OK) == ) = - (i < HAL_VARIANT_KEYS_COUNT+=
其中的參數inst就是“primary”,class_id為AUDIO_HARDWARE_MODULE_ID,定義在audio.h中:
AUDIO_HARDWARE_MODULE_ID "audio"
這個方法會遍曆variant_keys數組:
*variant_keys[] =,
在system property中,取道以這些為key的值,按照順序將傳遞過來的primary拼接起來,尋找對應的*.so檔案是否存在。
比如我們公司的平台,數組中前兩個property都為null,而ro.board.platform為“mrvl”,那麼就拼接得到這個so檔案的名稱:audio.primary.mrvl.so。
然後在兩個不同的目錄下搜尋:
HAL_LIBRARY_PATH1 "/system/lib/hw" HAL_LIBRARY_PATH2 "/vendor/lib/hw"
4.然後調用load函數,開啟這個*.so。