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整合的音訊模擬前端的驅動 |
相關文章
- android音訊hal層簡介Android音訊
- 關於三層架構中各層次的關係與實現模型 (轉)架構模型
- 利用connect by顯示類目層次關係
- 5G跟音訊,有關係嗎?音訊
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- Android 音視訊 - MediaCodec 編解碼音視訊Android
- Android Framework 音訊子系統(12)HAL層分析AndroidFramework音訊
- android HAL層程式碼Android
- ORB 相關的次程式碼ORB
- 不同層之間的物件關係物件
- 物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)物件程式設計
- 部門層級關係表
- 卷積層和全連線層之間的關係卷積
- 從函式到包的Python程式碼層次函式Python
- C++ 層次程式碼最佳化 (轉)C++
- android音視訊指南-管理音訊焦點Android音訊
- Android音視訊之MediaPlayer音視訊播放Android
- 小程式[InnerAudioContext]重複播放n次音訊Context音訊
- 公司程式碼與採購組織的關係
- 改變eclipse工程中程式碼的層次結構Eclipse
- Android音視訊之MediaRecorder音視訊錄製Android
- android音視訊指南-處理音訊輸出的變化Android音訊
- android 音訊播放 SoundPoolAndroid音訊
- Android如何回撥編碼後的音視訊資料Android
- Android MediaCodec硬解碼AAC音訊檔案(實時AAC音訊幀)並播放Android音訊
- 程式設計師的成長和程式碼行數的關係程式設計師
- 多程式命名管通通訊【無血緣關係程式】PHP 版本PHP
- Android音視訊(四)MediaCodec編解碼AACAndroid
- Android 多媒體之 Silk 格式音訊解碼Android音訊
- Android 音視訊錄製硬編碼實現Android
- Android HAL 層框架分析以及程式碼示例Android框架
- android studio 除錯 framework 層程式碼Android除錯Framework
- 基於SSM的小程式中後端各結構層作用及關係SSM後端
- 相親交友原始碼中,音訊AAC解碼的實現程式碼原始碼音訊
- WordPress模板層次03:模板檔案中常見程式碼
- 一加和OPPO什麼關係?一加跟OV竟有這層關係
- 關於表現層、業務層、持久層及他們所包含的物件之間的關係的理解,高手指點物件
- 如何查詢和關閉Safari的音訊聲音音訊