andio:android 音訊的程式碼層次關係

Jet_小馬過河發表於2014-10-18

功能分層

程式碼分佈

描述

音訊應用業務層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整合的音訊模擬前端的驅動

 


相關文章