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 flingeraudiopolicy

\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接口給layer9audio 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集成的音頻模擬前端的驅動

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章