#android audio
Why audio ?
由于个人兴趣的原因,从系统科调整到音频科。
一个礼拜前,对Audio的认识是这样的:
之后,慢慢接触代码之后,发现架构应该是这样的:
(图来自AOSP:https://source.android.com/devices/audio/index.html)
区别在于,下面这个图,是从源码和实现的角度上说的。
并且第一个图错误的地方在于media server属于本地服务,不应该在Java空间。
下面仔细说一下,每一层:(按照代码的位置来说)
JAVA层
(上层应用框架层)
framework/base/media/java/android/media 也就是android.media.*
重点关注: AudioManager.java 以及 AudioSystem
因为这部分API是有SDK文档,所以结合文档看起来比较简单。
JNI
然后就是胶水部分:(JNI)
(这一部分并不能单独作为一层,只是起过渡到native层的作用,而native层接触audio hardware)
当然,还有一部分在:frameworks/base/media/jni (具体做什么还没有确定)
Native2jni
Native层(供jni直接调用的&或者直接通过NDK本地接口进行调用),称为native2jni
重点就关注AudioPolicy.cpp AudioPolicy.cpp ….
Native2AudioFlinger
同样也是这个目录 frameworks/av/media/libmedia,不同的是这些代码,多是是留给audioFlinger实现的。
相当于这里才真正是media service这个本地服务的调用客户端,所以这里会保留很多I开头的文件(具体实现交给audioFilinger)
Audio*调用IAudio访问media server是通过引用头文件
AudioFlinger
这里其实就是media_server, binder的服务端。
具体就是下面两个文件夹,其中audiopolicy不清楚(但看里面应该是engine)
主要关注一下 audiofilinger里面的内容
这是整个架构中核心,这里放的是真正和HAL层实现交互的代码。
HAL层(硬件抽象层)
这里放置了大量的函数指针,也就是会所这里就是留给你去实现。(或者硬件厂商去实现)
硬件抽象层,由于要和内核交互,所以其实现会单独剖离出来,并没有放在内核里面(可能是为了硬件厂商保密)
但这里也给出了HAL供调用的基本思路(继承结构)
具体的实现,一般放在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的相关架构。
整体上把握了一下,之后看代码需要很多基础,慢慢说。