功能分层

代码分布

描述

音频应用业务层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集成的音频模拟前端的驱动


更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. Python技巧匿名函数、回调函数和高阶函数
  3. python list.sort()根据多个关键字排序的方法实现
  4. 浅析android通过jni控制service服务程序的简易流程
  5. Android(安卓)matrix 控制图片的旋转、缩放、移动
  6. android中文api(89)——ViewManager
  7. Android调用天气预报的WebService简单例子
  8. Android(安卓)Activity的启动
  9. android 自定义view

随机推荐

  1. 数据库中间件 MyCAT源码分析:【单库单表】
  2. linux系统中重启网卡后网络不通(NetworkMa
  3. 分布式事务 TCC-Transaction 源码分析 —
  4. Redis 哈希结构内存模型剖析
  5. FAlinux01-1基础
  6. 注册中心 Eureka 源码解析 —— Eureka-C
  7. 分布式消息队列 RocketMQ源码解析:事务消
  8. 数据库中间件 MyCAT 源码分析 —— 【单
  9. 使用Python开发客户端和服务端程序 理
  10. 分布式事务 TCC-Transaction 源码解析 —