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框架介紹Android框架
- HAL 硬體抽象層介紹抽象
- 以OpenGL/ES視角介紹gfx-hal(Vulkan) Framebuffer介面使用
- 以OpenGL/ES視角介紹gfx-hal(Vulkan) Texture介面使用
- Android音訊驅動學習(一) Audio HALAndroid音訊
- android音訊hal層簡介Android音訊
- Android之Zygote介紹AndroidGo
- Android開發之WebService介紹AndroidWeb
- Android中HAL如何向上層提供介面總結Android
- solr介面介紹Solr
- public interface View介面和public interface ViewResolver介面介紹View
- Android 11(R) Power HAL AIDL簡析 -- 基本介面AndroidAI
- Rust圖形庫gfx-hal 逐幀渲染流程介紹Rust
- gfx-rs/hal跨平臺圖形抽象庫使用介紹抽象
- Nacos 介面詳細介紹
- MATLAB(1) 介面介紹Matlab
- Android學習之 Scroller的介紹與使用Android
- android AsyncTask介紹Android
- Elasticsearch之介紹Elasticsearch
- android HAL層程式碼Android
- iftop介面顯示介紹[轉]
- Android SDK目錄結構和工具介紹Android
- Android四大元件之——BroadcastReceiver介紹Android元件AST
- Android Studio之gradle的配置與介紹AndroidGradle
- Chromimum Android渲染介紹Android
- Android.mk介紹Android
- Xamarin Android教程Android基本知識版本介紹與系統介紹Android
- Android Hal層簡要分析Android
- Android資料儲存之Sqlite的介紹及使用AndroidSQLite
- HDI硬體裝置介面介紹
- 遠控介紹及介面編寫
- Halcon介面介紹 第二講
- 微信公眾介面開發介紹
- SQLite 中 C/C++ 介面介紹SQLiteC++
- JDBC介面技術介紹1 (轉)JDBC
- JDBC介面技術介紹2 (轉)JDBC
- 生產者與消費者之Android audioAndroid
- MySQL Galera Cluster的特性和不足之處介紹MySql