功能分層 |
代碼分佈 |
描述 |
音頻應用業務層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集成的音頻模擬前端的驅動 |