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 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集成的音频模拟前端的驱动 |
更多相关文章
- mybatisplus的坑 insert标签insert into select无参数问题的解决
- Python技巧匿名函数、回调函数和高阶函数
- python list.sort()根据多个关键字排序的方法实现
- 浅析android通过jni控制service服务程序的简易流程
- Android(安卓)matrix 控制图片的旋转、缩放、移动
- android中文api(89)——ViewManager
- Android调用天气预报的WebService简单例子
- Android(安卓)Activity的启动
- android 自定义view