Android Audio HAL 介面介紹之 adev_set_parameters()和out_set_parameters()
前言
這幾天一直再解決BUG,是兩個usease同時存在的場景,插入耳機來實現音訊切換的問題。有Recroding+HFP_Call場景,有兩個Recording同時存在的場景。當插入有線耳機後,音訊裝置切換出現問題。由於有HFP Call,所有就涉及了 adev_set_parameters(),HFP的開始和停止都是通過它來控制的。插入耳機後,音訊裝置切換時通過out_set_parameters()來控制的。之前沒怎麼太注意,為了解決BUG,詳細的跟蹤這兩個介面的實現和呼叫流程。
1. adev_set_parameters()
在HAL模組在AudioFlinger裡被載入時,在adev_open()中實現和AudioFlinger中set_parameters()關聯的。如果應用程式中要呼叫set_parameters()介面,需要匯入AudioManager。他們供應用程式呼叫的標準介面。這個介面一般被用來控制feature的開啟和關閉。我們可以根據自己專案的需求來定製自己的功能控制。在我所經歷的專案中,這個介面使用的頻率是很高的,如果想控制某些功能的關閉和開啟,推薦使用這個介面。具體的程式碼就不貼在這裡,太多了影響閱讀效率,可以自己找資源檢視。
static struct hw_module_methods_t hal_module_methods = {
.open = adev_open,
};
adev->device.init_check = adev_init_check;
adev->device.set_voice_volume = adev_set_voice_volume;
adev->device.set_master_volume = adev_set_master_volume;
adev->device.get_master_volume = adev_get_master_volume;
adev->device.set_master_mute = adev_set_master_mute;
adev->device.get_master_mute = adev_get_master_mute;
adev->device.set_mode = adev_set_mode;
adev->device.set_mic_mute = adev_set_mic_mute;
adev->device.get_mic_mute = adev_get_mic_mute;
adev->device.set_parameters = adev_set_parameters;
adev->device.get_parameters = adev_get_parameters;
adev->device.get_input_buffer_size = adev_get_input_buffer_size;
adev->device.open_output_stream = adev_open_output_stream;
adev->device.close_output_stream = adev_close_output_stream;
adev->device.open_input_stream = adev_open_input_stream;
adev->device.close_input_stream = adev_close_input_stream;
adev->device.dump = adev_dump;
2.out_set_parameters()
這個介面主要是在AudioPolicyManager中被呼叫,在有新裝置被連線後,在AudioPolicyManager會為所有的輸出和輸入流做裝置切換,如果需要做裝置切換就呼叫set_parameters()介面。在Thread.cpp中會呼叫到audio HAL層去切換音訊裝置。這介面第三方應用軟體是無法使用的。
AudioParameter inputCmd = AudioParameter();
ALOGV("%s: inform input %d of device:%d", __func__,
inputDescriptor->mIoHandle, device);
inputCmd.addInt(String8(AudioParameter::keyRouting),device);
mpClientInterface->setParameters(inputDescriptor->mIoHandle,inputCmd.toString(),delayMs);
AudioParameter param = AudioParameter(String8(address));
free(address);
param.addInt(String8(AUDIO_PARAMETER_STREAM_ROUTING), (int)type);
status = mOutput->stream->common.set_parameters(&mOutput->stream->common,param.toString().string());
*out = (struct stream_out *)calloc(1, sizeof(struct stream_out));*
*out->stream.common.set_parameters = out_set_parameters;*
相關文章
- Android音訊驅動學習(一) Audio HALAndroid音訊
- Android之Zygote介紹AndroidGo
- HAL 硬體抽象層介紹抽象
- 以OpenGL/ES視角介紹gfx-hal(Vulkan) Framebuffer介面使用
- 以OpenGL/ES視角介紹gfx-hal(Vulkan) Texture介面使用
- Android 11(R) Power HAL AIDL簡析 -- 基本介面AndroidAI
- public interface View介面和public interface ViewResolver介面介紹View
- Android packageManager.setComponentEnabledSetting()和setApplicationEnabledSetting()方法介紹AndroidPackageAPP
- Android四大元件之——BroadcastReceiver介紹Android元件AST
- Rust圖形庫gfx-hal 逐幀渲染流程介紹Rust
- android HAL層程式碼Android
- 生產者與消費者之Android audioAndroid
- Nacos 介面詳細介紹
- gfx-rs/hal跨平臺圖形抽象庫使用介紹抽象
- Elasticsearch之介紹Elasticsearch
- Android Jetpack: LiveData 和 Lifecycle 介紹 | 中文教學視訊AndroidJetpackLiveData
- Android平臺架構的介紹和原始碼分析Android架構原始碼
- Halcon介面介紹 第二講
- 虛擬機器之linux介紹和命令虛擬機Linux
- [Android P] Android P版本 新功能介紹和相容性處理(一)Android
- Android系統介紹與框架Android框架
- Android模組化框架介紹Android框架
- Android 輸入系統介紹Android
- Android 應用程式元件介紹Android元件
- Android 動畫 介紹與使用Android動畫
- hadoop實戰3(web管理介面介紹及NN,DN,SNN介紹)HadoopWeb
- 遠控介紹及介面編寫
- HDI硬體裝置介面介紹
- SAP工作流介紹之ABAP Business Workflow介紹
- HTTP介紹和HTML簡介HTTPHTML
- Android開發 - 掌握ConstraintLayout(二)介紹AndroidAI
- Android 常用佈局 介紹與使用Android
- Android RxJava:基礎介紹與使用AndroidRxJava
- Kotlin on Android 開發環境介紹KotlinAndroid開發環境
- Android多渠道打包相關介紹Android
- Android入門教程 | AsyncTask 使用介紹Android
- Android Monkey 壓力測試 介紹Android
- Android執行緒池使用介紹Android執行緒