導航:首頁 > 操作系統 > android音頻hal

android音頻hal

發布時間:2022-06-20 17:51:49

1. android hal 返回string

1、androidhal層是硬體抽象層,安卓把硬體的介面放在了kernel層,把相應的邏輯放在了HAL層,安卓的kernel層驅動,和HAL層的驅動簡稱系統驅動。
2、返回string的方法:通過函數的參數指定一個指針,然後在函數體內對指針賦值。如:chartemp[10],voidfunc(char*t){strcpy(t,"test")}func(temp)即可。

2. Android引入HAL的真正目的究竟是什麼,HAL究竟有什麼用

HAL 是為了鏈接driver與FRAMEWORK層的很好的東西,方便與app層開發人員,你無須知道driver層的信息,就可以做相關開發.

3. android中camera的hal模塊怎麼被調用

CameraService.cpp (frameworks\base\services\camera\libcameraservice)

中調用hw_get_mole

[cpp] view plain print?
void CameraService::onFirstRef()
{
BnCameraService::onFirstRef();

<span style="color: rgb(255, 0, 0);">if (hw_get_mole(CAMERA_HARDWARE_MODULE_ID,
(const hw_mole_t **)&mMole) < 0)</span> {
LOGE("Could not load camera HAL mole");
mNumberOfCameras = 0;
}
else {
mNumberOfCameras = mMole->get_number_of_cameras();
if (mNumberOfCameras > MAX_CAMERAS) {
LOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",
mNumberOfCameras, MAX_CAMERAS);
mNumberOfCameras = MAX_CAMERAS;
}
for (int i = 0; i < mNumberOfCameras; i++) {
setCameraFree(i);
}
}
}
void CameraService::onFirstRef()
{
BnCameraService::onFirstRef();

if (hw_get_mole(CAMERA_HARDWARE_MODULE_ID,
(const hw_mole_t **)&mMole) < 0) {
LOGE("Could not load camera HAL mole");
mNumberOfCameras = 0;
}
else {
mNumberOfCameras = mMole->get_number_of_cameras();
if (mNumberOfCameras > MAX_CAMERAS) {
LOGE("Number of cameras(%d) > MAX_CAMERAS(%d).",
mNumberOfCameras, MAX_CAMERAS);
mNumberOfCameras = MAX_CAMERAS;
}
for (int i = 0; i < mNumberOfCameras; i++) {
setCameraFree(i);
}
}
}

看一下hw_get_mole是怎麼回事

[cpp] view plain print?
int hw_get_mole(const char *id, const struct hw_mole_t **mole)
{
return <span style="color: rgb(255, 0, 0);">hw_get_mole_by_class(id, NULL, mole);
</span>}
int hw_get_mole(const char *id, const struct hw_mole_t **mole)
{
return hw_get_mole_by_class(id, NULL, mole);
}

他只是一個封裝實際調用了[email protected] (hardware\libhardware)
好在不長,看看吧

[cpp] view plain print?
int hw_get_mole_by_class(const char *class_id, const char *inst,
const struct hw_mole_t **mole)
{
int status;
int i;
const struct hw_mole_t *hmi = NULL;
<span style="color: rgb(255, 0, 0);"> char prop[PATH_MAX];//幾個關鍵的數組
char path[PATH_MAX];//在下面起了重要
char name[PATH_MAX];//作用
</span>
if (inst)
snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
else
strlcpy(name, class_id, PATH_MAX);//走這里

/*
* Here we rely on the fact that calling dlopen multiple times on
* the same .so will simply increment a refcount (and not load
* a new of the library).
* We also assume that dlopen() is thread-safe.
*/

/* Loop through the configuration variants looking for a mole */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
if (i < HAL_VARIANT_KEYS_COUNT) {
if (property_get(variant_keys[i], prop, NULL) == 0)
<span style="color: rgb(255, 0, 0);">//在這里將prop的路徑得到,分別從
"ro.hardware[qcom]"
"ro.proct.board"[7x27],
"ro.board.platform"[msm7627a],
"ro.arch",
"ro.hw_platform"[QRD_SKU3-1100]
這幾個屬性文件中獲得硬體的信息
有些硬體信息的字元串會出現在編譯後生成的.so名字中</span>
{
continue;
}
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH2, name, prop);
if (access(path, R_OK) == 0) break;

snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH1, name, prop);<span style="color: rgb(255, 0, 0);">//走這里,在這里得到/system/lib/hw/camera.msm7627a.so
這樣一個路徑,這個庫里有QualcommCamera.cpp,這是
camera模塊HAL代碼開始的地方</span>
if (access(path, R_OK) == 0) break;
} else {
snprintf(path, sizeof(path), "%s/%s.default.so",
HAL_LIBRARY_PATH1, name);
if (access(path, R_OK) == 0) break;
}
}

status = -ENOENT;
if (i < HAL_VARIANT_KEYS_COUNT+1) {
/* load the mole, if this fails, we're doomed, and we should not try
* to load a different variant. */
status = load(class_id, path, mole);<span style="color: rgb(255, 0, 0);">//這里關鍵,函數的三個參數可以串聯成一句話:
到path(/system/lib/hw/camera.msm7627a.so)這個路徑下找到一個id(camera)匹配的mole</span>
}

return status;
}
int hw_get_mole_by_class(const char *class_id, const char *inst,
const struct hw_mole_t **mole)
{
int status;
int i;
const struct hw_mole_t *hmi = NULL;
char prop[PATH_MAX];//幾個關鍵的數組
char path[PATH_MAX];//在下面起了重要
char name[PATH_MAX];//作用

if (inst)
snprintf(name, PATH_MAX, "%s.%s", class_id, inst);
else
strlcpy(name, class_id, PATH_MAX);//走這里

/*
* Here we rely on the fact that calling dlopen multiple times on
* the same .so will simply increment a refcount (and not load
* a new of the library).
* We also assume that dlopen() is thread-safe.
*/

/* Loop through the configuration variants looking for a mole */
for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
if (i < HAL_VARIANT_KEYS_COUNT) {
if (property_get(variant_keys[i], prop, NULL) == 0)
//在這里將prop的路徑得到,分別從
"ro.hardware[qcom]"
"ro.proct.board"[7x27],
"ro.board.platform"[msm7627a],
"ro.arch",
"ro.hw_platform"[QRD_SKU3-1100]
這幾個屬性文件中獲得硬體的信息
有些硬體信息的字元串會出現在編譯後生成的.so名字中
{
continue;
}
snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH2, name, prop);
if (access(path, R_OK) == 0) break;

snprintf(path, sizeof(path), "%s/%s.%s.so",
HAL_LIBRARY_PATH1, name, prop);//走這里,在這里得到/system/lib/hw/camera.msm7627a.so
這樣一個路徑,這個庫里有QualcommCamera.cpp,這是
camera模塊HAL代碼開始的地方
if (access(path, R_OK) == 0) break;
} else {
snprintf(path, sizeof(path), "%s/%s.default.so",
HAL_LIBRARY_PATH1, name);
if (access(path, R_OK) == 0) break;
}
}

status = -ENOENT;
if (i < HAL_VARIANT_KEYS_COUNT+1) {
/* load the mole, if this fails, we're doomed, and we should not try
* to load a different variant. */
status = load(class_id, path, mole);//這里關鍵,函數的三個參數可以串聯成一句話:
到path(/system/lib/hw/camera.msm7627a.so)這個路徑下找到一個id(camera)匹配的mole
}

return status;
}

再來看看load這個函數@hardware.c (hardware\libhardware)

[cpp] view plain print?
static int load(const char *id,
const char *path,
const struct hw_mole_t **pHmi)
{
int status;
void *handle;
struct hw_mole_t *hmi;

/*
* load the symbols resolving undefined symbols before
* dlopen returns. Since RTLD_GLOBAL is not or'd in with
* RTLD_NOW the external symbols will not be global
*/
handle = dlopen(path, RTLD_NOW);
if (handle == NULL) {
char const *err_str = dlerror();
LOGE("load: mole=%s\n%s", path, err_str?err_str:"unknown");
status = -EINVAL;
goto done;
}

<span style="color: rgb(255, 0, 0);"> /* Get the address of the struct hal_mole_info. */
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_mole_t *)dlsym(handle, sym);
</span> if (hmi == NULL) {
LOGE("load: couldn't find symbol %s", sym);
status = -EINVAL;
goto done;
}

/* Check that the id matches */
if (strcmp(id, hmi->id) != 0) {
LOGE("load: id=%s != hmi->id=%s", id, hmi->id);
status = -EINVAL;
goto done;
}

hmi->dso = handle;

/* success */
status = 0;

done:
if (status != 0) {
hmi = NULL;
if (handle != NULL) {
dlclose(handle);
handle = NULL;
}
} else {
LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
id, path, *pHmi, handle);
}

*pHmi = hmi;

return status;
}
static int load(const char *id,
const char *path,
const struct hw_mole_t **pHmi)
{
int status;
void *handle;
struct hw_mole_t *hmi;

/*
* load the symbols resolving undefined symbols before
* dlopen returns. Since RTLD_GLOBAL is not or'd in with
* RTLD_NOW the external symbols will not be global
*/
handle = dlopen(path, RTLD_NOW);
if (handle == NULL) {
char const *err_str = dlerror();
LOGE("load: mole=%s\n%s", path, err_str?err_str:"unknown");
status = -EINVAL;
goto done;
}

/* Get the address of the struct hal_mole_info. */
const char *sym = HAL_MODULE_INFO_SYM_AS_STR;
hmi = (struct hw_mole_t *)dlsym(handle, sym);
if (hmi == NULL) {
LOGE("load: couldn't find symbol %s", sym);
status = -EINVAL;
goto done;
}

/* Check that the id matches */
if (strcmp(id, hmi->id) != 0) {
LOGE("load: id=%s != hmi->id=%s", id, hmi->id);
status = -EINVAL;
goto done;
}

hmi->dso = handle;

/* success */
status = 0;

done:
if (status != 0) {
hmi = NULL;
if (handle != NULL) {
dlclose(handle);
handle = NULL;
}
} else {
LOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",
id, path, *pHmi, handle);
}

*pHmi = hmi;

return status;
}

在打開的.so(camera.msm7627a.so)中查找HMI符號的地址,並保存在hmi中。至此,.so中的hw_mole_t已經被成功獲取,從而可以根
據它獲取別的相關介面。
1)HAL通過hw_get_mole函數獲取hw_mole_t
2)HAL通過hw_mole_t->methods->open獲取hw_device_t指針,並在此open函數中初始化hw_device_t的包裝結構中的
函數及hw_device_t中的close函數,如gralloc_device_open。
3)三個重要的數據結構:
a) struct hw_device_t: 表示硬體設備,存儲了各種硬體設備的公共屬性和方法
b)struct hw_mole_t: 可用hw_get_mole進行載入的mole
c)struct hw_mole_methods_t: 用於定義操作設備的方法,其中只定義了一個打開設備的方法open.

4. android 怎麼選擇audio hal

HAL 是為了鏈接driver與FRAMEWORK層的很好的東西,方便與app層開發人員,你無須知道driver層的信息,就可以做相關開發.
-

5. 怎樣實現Android系統的HAL

HAL層有既定的編寫規范,在規范下來寫,然後添加自己想提供給framework層的介面.
可以參考一下 http://blog.csdn.net/luoshengyang/article/details/6567257 。
裡面的博文從一到六,完整的描述的底層到應用層的調用,對於理解HAL有很大的幫助。
在android 4.4之前,這些介面調用不涉及到許可權問題,android 5.0 之後涉及到許可權問題,需要添加許可權。

6. 電池選項中的[email protected]是什麼

這是android音頻hal層服務,你手機放歌 錄音 調音量等等跟喇叭和mic有關的東西都是通過它來控制的。簡單來說就是通過驅動來控制硬體的組件

7. android hal 怎樣修改音頻增益

我也遇到過。給以下資料你參考下: 提示hal.dll損壞或丟失,實際上該文件並不一定不存在,可以說,拷個文件回去system32里,根本是不可以解決的.出現這個錯誤的原因是boot.ini文件出錯,導致引導不了機器從指定的路徑啟動,那樣系統搜索其他的路徑,而其他路徑上是沒有hal.dll文件的,就會提示這個錯誤.一般的解決辦法是進入故障恢復控制台,用fixboot命令,如果這樣修復不了boot.ini,就用bootcfg/add來重建boot.ini。 這個是由於C盤根目錄下的boot.ini文件非法,導致默認從C:\Windows啟動,但是又由於你的Windows XP沒有安裝在C盤,所以系統提示找不到HAL.DLL文件。啟動因而失敗。解決方法是重新編輯Boot.ini文件。 1)、使用Win9X啟動盤啟動,使用EDIT.EXE命令編輯這個文件。啟動EDIT.EXE以後只要按照正確的格式輸入Boot.ini文件的內容,保存為Boot.ini文件即可。 2)、使用COPY CON命令創建一個Boot.ini文件。在DOS下輸入Copy Con C:\boot.ini以後回車。然後按照Boot.ini文件的格式輸入,每輸入一行敲一次回車鍵,當全部內容輸入完畢以後,按CTRL+Z,屏幕上會看到^Z的提示。這個時候再敲一次回車,系統會提示1 file(s) copied.這就表示創建成功了。 3)、使用故障恢復控制台裡面的bootcfg命令。 4)、在別的電腦上創建好以後,拷貝到受損電腦的C盤根目錄上覆蓋源文件即可。 還有個辦法,你用個u盤從別個那裡拷一個 hal.dll文件,然後插在你的電腦上,再用一張系統安裝盤放進光碟機。在第一選擇里,選擇修復,就可以進入doc里了。然後從a: b: 一直試下去,看到了u盤就要吧用 hal.dll c:\windows\system32\hal.dll 就可以了, 原理是在安裝系統的時候,u盤也會被檢測到,就可以用了。軟盤也可以。但你應該不會有軟碟機 經過這樣的修復後 如果問題仍在 那麼可能是內存的故障

8. android的hal層用什麼語言實現

Android的硬體抽象層,簡單來說,就是對linux內核驅動程序的封裝,向上提供介面,屏蔽低層的實現細節。也就是說,把對硬體的支持分成了兩層,一層放在用戶空間(User Space),一層放在內核空間(Kernel Space),其中,硬體抽象層運行在用戶空間,而Linux內核驅動程序運行在內核空間。為什麼要這樣安排呢?把硬體抽象層和內核驅動整合在一起放在內核空間不可行嗎?從技術實現的角度來看,是可以的,然而從商業的角度來看,把對硬體的支持邏輯都放在內核空間,可能會損害廠家的利益。我們知道,Linux內核源代碼版權遵循GNU License,而Android源代碼版權遵循Apache License,前者在發布產品時,必須公布源代碼,而後者無須發布源代碼。如果把對硬體支持的所有代碼都放在Linux驅動層,那就意味著發布時要公開驅動程序的源代碼,而公開源代碼就意味著把硬體的相關參數和實現都公開了,在手機市場競爭激烈的今天,這對廠家來說,損害是非常大的。因此,Android才會想到把對硬體的支持分成硬體抽象層和內核驅動層,內核驅動層只提供簡單的訪問硬體邏輯,例如讀寫硬體寄存器的通道,至於從硬體中讀到了什麼值或者寫了什麼值到硬體中的邏輯,都放在硬體抽象層中去了,這樣就可以把商業秘密隱藏起來了。也正是由於這個分層的原因,Android被踢出了Linux內核主線代碼樹中。大家想想,Android放在內核空間的驅動程序對硬體的支持是不完整的,把Linux內核移植到別的機器上去時,由於缺乏硬體抽象層的支持,硬體就完全不能用了,這也是為什麼說Android是開放系統而不是開源系統的原因。
撇開這些爭論,學習Android硬體抽象層,對理解整個A

9. android系統支持那些格式的音頻文件

1、H.263:低碼率視頻編碼標准,廣泛應用於視頻會議。

文件格式:

• 3GPP (.3gp)

• MPEG-4 (.mp4)

2、H.264 AVC:和MPEG2和MPEG4 ASP等壓縮技術相比,在同等圖像質量下,採用H.264技術壓縮後的數據量只有MPEG2的1/8,MPEG4的1/3。提供了解決在不穩定網路環境下容易發生的丟包等錯誤的必要工具。從Android3.0+開始支持。在圖像編碼效率上,H.264演算法最為領先,MPEG-4和H.263演算法基本相同。

文件格式:

• 3GPP (.3gp)

• MPEG-4 (.mp4)

• MPEG-TS (.ts, AAC audio only, not seekable, Android 3.0+)

3、MPEG-4 SP:一種以矩形幀作為對象的編碼形式,是從H.263、MPEG1和MPEG2繼承而來的編碼標准。

文件格式:3GPP (.3gp)

4、VP8:Google親媽推出的,但壓縮率比H.264差很多,Android2.3.3+。

文件格式:

• WebM(.webm)

• Matroska (.mkv, Android 4.0+) 註:開源,基於html5標准

10. android HAL與linux HAL有什麼不同

嵌入式linux系統是在嵌入式設備中運行linux系統。 嵌入式android系統是在嵌入式設備中運行android系統。 其區別就是android系統和linux系統的區別。 android系統的底層是linux的內核,上面跑的是android的java虛擬機。

閱讀全文

與android音頻hal相關的資料

熱點內容
java定義異常類 瀏覽:707
的運行命令 瀏覽:585
24v電動駐車空調壓縮機 瀏覽:840
老程序員編程步驟 瀏覽:305
物理去除加密軟體 瀏覽:227
匯編語言可調試編譯器 瀏覽:447
jpeg如何轉成pdf 瀏覽:841
微機室為什麼有伺服器 瀏覽:657
安卓手機怎麼打語音電話不斷網 瀏覽:458
單片機匯編頭文件 瀏覽:946
juniper命令行 瀏覽:68
程序員咨詢銷售工作怎麼樣 瀏覽:782
蘋果文件伺服器是什麼 瀏覽:180
企業透明加密軟體有監視功能嗎 瀏覽:494
桌面的運行命令 瀏覽:10
主流廠商伺服器維護流程是什麼 瀏覽:807
壓縮棉的被子先洗洗在用 瀏覽:242
批處理bat代碼和文件夾 瀏覽:298
怎麼交叉編譯tslib14 瀏覽:494
致程序員生產力飆升 瀏覽:762