andio:android 音频的代码层次关系

来源:互联网 发布:p2p网络理财产品好吗 编辑:程序博客网 时间:2024/05/29 13:23

功能分层

代码分布

描述

音频应用业务层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,对于ALSAcontrol设备(音量,通道切换等)

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集成的音频模拟前端的驱动

 


1 0
原创粉丝点击