andio:android 音訊的程式碼層次關係
功能分層 |
程式碼分佈 |
描述 |
音訊應用業務層layer1 |
如錄音應用: /trunk/vendor/mediatek/proprietary/packages/apps/iSMS…../Recorder.java |
應用業務 |
音訊介面(layer2)android.media.xx類 |
\frameworks\base\media\java\android\media |
提供應應用層的客戶端控制方法java(start/stop/setparameter等):如下 android.media.AudioFormat android.media.MediaPlayer(包括: 視訊;音訊;FM等應用都是統一呼叫該播放介面) android.media.MediaRecorder; AudioEffect.java---音效設定(eq等) …. 例如:應用要開啟一個視訊播放器進行播放, 需要以下幾行程式碼: MediaPlayer mp = new MediaPlayer(); /// 設定播放器Suface mp.setDisplay (...); mp.setDataSource(PATH_TO_FILE); ///設定媒體URI mp.prepare(); /// 初始化播放器 mp.start(); /// 開始播放 參考:VideoPlayer.java的用法。
|
音訊JNI(layer3) libmedia_jni.so |
1.\frameworks\base\media\jni 2.android_media_AudioEffect音訊效果 |
生層:libmedia_jni.so 1.jni本地方法介面; 2.音效引數loadding的介面; |
音訊media本地庫-layer4 (libmedia.so) |
\frameworks\av\media\libmedia |
提供與layer2一致的客戶端的控制方法cpp(start/stop/setparameter等): Audiotrack.cpp Audiorecord.cpp, Mediarecorder.cpp等等 音訊通道的開啟和關閉:AudioMTKPolicyManager: startOutput()/stopOutput() |
音訊service(layer5)libmediaservice.so |
1.\frameworks\av\media\libmediaplayerservice 2.\frameworks\av\media\mediaserver:main_mediaserver.cpp |
1 實現服務端的控制方法,(start/stop/setparameter等):如: MediaRecorderClient.cpp MediaPlayerService.cpp StagefrightPlayer.cpp(-->呼叫AwesomePlayer)
2.實現mediaserver服務程式; |
音訊引擎layer6 (StageFright框架) |
\frameworks\av\media\libstagefright |
多媒體引擎: 作用:就是迴圈控制了資料流的編解碼和讀寫檔案等。(應用層下了控制的方法指令後,去完成這些指令的就是StageFright引擎)。打個比方就是:類似layer12345 是發出指令啟動發動機,而layer6就是發動機引擎開始運轉。 |
音訊AudioFlinger-layer7 (libaudioflinger.so) |
兩部分:audio flinger 和 audiopolicy \frameworks\av\services\audioflinger \frameworks\av\services\audiopolicy |
實現:audiofliger,audiopolicyservice,AudioWatchdog等。 作用: 1.載入硬體抽象層HAL: load_audio_interface()--->載入audio.primary.mt6735.so 2.就是與硬體(DSP,ABE,AFE等)打交道。 |
音訊硬體抽象定義層-layer8 |
包括兩大部分: 1.介面定義 /hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h Mtk平臺又繼承封裝成AudioMTKHardwareInterface.h 2.policy定義: /hardware/libhardware_legacy/include/hardware_legacy/AudioPolicyInterface.h Mtk平臺又繼承封裝成AudioMTKPolicyInterface.h
|
|
音訊抽象層是例項化: HAL module層-layer8 |
1./hardware/libhardware/modules/audio/audio_hw.c audio_policy.c
2.hardware/libhardware_legacy/audio/
3./vendor/mediatek/proprietary/platform/mt6735/hardware/audio/例項化音訊抽象層: 建立一個音訊HW的流程: ladev->hwif = createMTKAudioHardware();---》 -》》AudioALSAHardware.cpp@AudioMTKHardwareInterface *AudioMTKHardwareInterface::create(){ ALOGV("Creating MTK AudioHardware"); hw = new android::AudioALSAHardware(); … } |
1.生成stub型別的module: audio.primary.default.so---預設的,當audioflinger找不到平臺制定的audio module(audio.primary.mt6735.so)時候,才使用預設的module。
audio_policy.stub.so:
2.生成audio_policy.default.so屬於legacy型別audio_module -----預設的policy---目前mtk是使用預設的policy:USE_LEGACY_AUDIO_POLICY 目前不用:/vendor/mediatek/proprietary/platform/common/hardware/audio/legacy/policy_driver
3.生成audio.primary.mt6735.so屬於legacy型別audio_module
為何還使用legacy介面?因為為了相容以前的計2.3及之前的音訊裝置介面定義。 |
音訊硬體抽象層-layer9 :audio HAL framework |
1./vendor/mediatek/proprietary/platform/common/hardware/audio包括如下部分: -- AudioALSAHardware.cpp: 抽象層建立介面,目前都是ALSA架構 -- aud_drv: IO控制AFE的模擬和數字器件; -- speech的驅動控制; --引數tunig; --音訊流的in/out控制;
2.音效和音訊引數 通過AudioALSAHardware::setParameters()函式根據不同的value(也就是應用)去設定不同的引數。包括( Voice Clarity Engine, VCE; speech/ACF/HCF/DMNR/HD/Audiotaste calibration)
-------程式碼分佈-----------: 音效(ACF、 HCF =EQ): SpeechEnhancementController類 AudioCompensationFilter類 音訊增益:audiocustparam 封裝了訪問nvram音訊引數的介面
-------引數介紹----------: 包括如下幾種引數: 2.1 audio 補償引數 ACF(audio Compensation filter):正常模式補償引數; HCF(headset Compensation filter):耳機模式補償引數; 以上兩者通過EQ引擎(軟體+硬體,mtk smart平臺是軟體實現libbessound_mtk.so)
“-BesEQ 和BESLondness;也稱軟EQ. 作用就是Londness:(壓低頻,提高高頻),IIR:(調節頻率增加音量)”
2.2 speech相關: Voice Clarity Engine/ calibrate speech parameters/ Mic/ HDRecord/ 流程,參考後面分析; libspeech_enh_lib.so 未知作用 2.3 音訊增益引數 AP_CFG_RDCL_FILE_AUDIO_VER1_VOLUME_CUSTOM_xxx
|
audio HAL framework層,就是對硬體(DSP,ABE,AFE等)的控制。 |
音訊硬體抽象層-layer10 |
/trunk/vendor/huaqin/libs/hq6735_64_ib1_l |
編解碼庫(OMX) |
tinyALSA--layer11 |
/external/tinyalsa |
TinyAlsa是 Android 預設的 alsalib, 封裝了核心 ALSA 的介面,用於簡化使用者空間的 ALSA 程式設計,簡單說就是提供ioctrl介面給layer9(audio HAL framework)完成對驅動的控制(音量大小,通道切換,等), 如API: 1.控制型別是api,對於ALSA 的control裝置(音量,通道切換等) mixer.c@mixer_get_ctl_by_name()//根據layer9給的引數,找到對應的mixer_ctl指標,傳給函式mixer_ctl_set_value(),所具備的功能有: "Audio HPL Offset";左聲道音量 "Audio HPR Offset"右聲道音量 "Audio Mrgrx Volume" "Audio FM I2S Volume"//fm I2S的音量 "Audio IRQ1 CNT" "Audio VOWCFG2 Data" "Audio VOWCFG3 Data" "Audio VOWCFG4 Data" 等 2.資料流型API,是控制PCM的資料流。 pcm.c@pcm_write() 應用例項是: AudioALSAPlaybackHandlerNormal.cpp-一般播放; AudioALSAPlaybackHandlerBTSCO.cpp --藍芽pcm資料流; AudioALSAPlaybackHandlerHDMI.cpp--HDMI的PCM資料流 |
音訊驅動層-layer12 |
驅動基於ALSA框架: /kernel-3.10/sound/soc/mediatek |
mtk整合的音訊模擬前端的驅動 |
相關文章
- Java中各程式碼層級的關係Java
- android HAL層程式碼Android
- Android 音視訊 - MediaCodec 編解碼音視訊Android
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- 5G跟音訊,有關係嗎?音訊
- Android Framework 音訊子系統(12)HAL層分析AndroidFramework音訊
- 物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)物件程式設計
- android studio 除錯 framework 層程式碼Android除錯Framework
- 從函式到包的Python程式碼層次函式Python
- Android HAL 層框架分析以及程式碼示例Android框架
- 使用GDB除錯Android Native 層程式碼除錯Android
- 卷積層和全連線層之間的關係卷積
- 小程式[InnerAudioContext]重複播放n次音訊Context音訊
- Android音視訊(四)MediaCodec編解碼AACAndroid
- Linux程式關係Linux
- Android如何回撥編碼後的音視訊資料Android
- android音視訊指南-管理音訊焦點Android音訊
- 基於SSM的小程式中後端各結構層作用及關係SSM後端
- android 音訊播放 SoundPoolAndroid音訊
- Android音訊(三)AudioPolicyServiceAndroid音訊
- 程式和產品的關係
- Android 音視訊錄製硬編碼實現Android
- Android 多媒體之 Silk 格式音訊解碼Android音訊
- Verilog程式碼和FPGA硬體的對映關係(五)FPGA
- Verilog程式碼和FPGA硬體的對映關係(四)FPGA
- android音視訊指南-處理音訊輸出的變化Android音訊
- 關於groupby與層次化索引的聯絡和層次化標籤的使用索引
- 多程式命名管通通訊【無血緣關係程式】PHP 版本PHP
- android window 層級的程式碼設定(PopUpWindow遮蓋問題)Android
- JAVA類的頂層Type抽象和繼承關係Java抽象繼承
- WordPress模板層次03:模板檔案中常見程式碼
- 層次分析法模型原理以及程式碼實現模型
- 一文讀懂層次聚類(Python程式碼)聚類Python
- Android音視訊之AudioRecordAndroid
- Android 音訊應用框架Android音訊框架
- android studio中如何檢視類的關係等Android
- 隱性成本:程式碼質量與產品迭代的關係
- Laravel核心程式碼學習 — 模型關聯底層程式碼實現Laravel模型
- Laravel核心程式碼學習 -- 模型關聯底層程式碼實現Laravel模型