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 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集成的音频模拟前端的驱动
- andio:android 音频的代码层次关系
- info()的层次关系
- UIView的层次关系
- 字符串的层次关系
- Android中打印代码的调用层次
- Android中打印代码的调用层次
- Android中打印代码的调用层次
- Android中打印代码的调用层次
- Android中打印代码的调用层次
- Android中打印代码的调用层次 .
- Android中打印代码的调用层次
- Android界面元素的层次关系(译)
- Android界面元素的层次关系(译)
- 带有层次关系的css
- dom对象的层次关系
- Linux进程的层次关系
- Linux进程的层次关系
- Linux进程的层次关系
- POJ 3632 Optimal Parking(简单题)
- 点的三维旋转坐标及在屏幕上的坐标
- java.io.File类
- JDBC PreparedStatement 处理区间查询
- 逻辑回归--Octave实现
- andio:android 音频的代码层次关系
- 素数
- 对讲解OS文献的反思
- using thymeleaf之二简单表达式
- unity3d之http多线程异步资源下载
- 美国医学美容护肤品MDSUN 妍心赏
- 育杰游乐设备厂家直销
- jsp中的contentType与pageEncoding的区别和作用
- Ubuntu 14.04 系统基础