#android audio

Why audio ?


由于个人兴趣的原因,从系统科调整到音频科。


一个礼拜前,对Audio的认识是这样的:


整体架构图

之后,慢慢接触代码之后,发现架构应该是这样的:


audio架构图


(图来自AOSP:https://source.android.com/devices/audio/index.html)

区别在于,下面这个图,是从源码和实现的角度上说的。


并且第一个图错误的地方在于media server属于本地服务,不应该在Java空间。


下面仔细说一下,每一层:(按照代码的位置来说)

JAVA层


(上层应用框架层)


framework/base/media/java/android/media 也就是android.media.*


java层


重点关注: AudioManager.java 以及 AudioSystem


因为这部分API是有SDK文档,所以结合文档看起来比较简单。


JNI


然后就是胶水部分:(JNI)


(这一部分并不能单独作为一层,只是起过渡到native层的作用,而native层接触audio hardware)


audio_jni_1

当然,还有一部分在:frameworks/base/media/jni (具体做什么还没有确定)


Native2jni


Native层(供jni直接调用的&或者直接通过NDK本地接口进行调用),称为native2jni


native_jni


重点就关注AudioPolicy.cpp AudioPolicy.cpp ….


Native2AudioFlinger


同样也是这个目录 frameworks/av/media/libmedia,不同的是这些代码,多是是留给audioFlinger实现的。


相当于这里才真正是media service这个本地服务的调用客户端,所以这里会保留很多I开头的文件(具体实现交给audioFilinger)


native2audioflinger


Audio*调用IAudio访问media server是通过引用头文件


native头文件

AudioFlinger


这里其实就是media_server, binder的服务端。


mx3FDC4

具体就是下面两个文件夹,其中audiopolicy不清楚(但看里面应该是engine)


media_server


主要关注一下 audiofilinger里面的内容


audioflinger


这是整个架构中核心,这里放的是真正和HAL层实现交互的代码。

HAL层(硬件抽象层)


这里放置了大量的函数指针,也就是会所这里就是留给你去实现。(或者硬件厂商去实现)


hal_h


硬件抽象层,由于要和内核交互,所以其实现会单独剖离出来,并没有放在内核里面(可能是为了硬件厂商保密)


但这里也给出了HAL供调用的基本思路(继承结构)


hal_c

具体的实现,一般放在hardware/目录下,具体不公开。


最后才是驱动层。

Driver层(内核层)


和HAL交互,并控制硬件(具体还不太清楚,先不探究,先搞定通用部分)


The audio driver interacts with your hardware and HAL implementation. You can use Advanced Linux Sound Architecture (ALSA), Open Sound System (OSS), or a custom driver (HAL is driver-agnostic).


以上就大致&并结合代码位置,说了下Android中Audio的相关架构。


整体上把握了一下,之后看代码需要很多基础,慢慢说。

Logo

开源、云原生的融合云平台

更多推荐