前言
audio是Android系统是比较重要的一个模块,本人也涉足时间不是很长,经验还是很少的,只是把自己在工作中所遇到的问题记录。
正文
Audio 即音频, 也就是控制着手机中的各种声音的输出,比如说,音乐的播放,音量大小,按键音,插入耳机,声音从耳机播放,连接蓝牙,声音从蓝牙耳机中播放。还有一些HiFi播放, offload播放,高清播放。
常见的问题如下:
POP音,漏音,声音卡顿,耳机无法识别,还有一些音频通路等问题,还有一些稳定性的问题如:ANR、CRASH、tombstone。还有一些安全漏洞的问题(主要是核心库那里)。
回归正题
-------华丽的分割线-------
audio分为 应用层,fwk层,native fwk, hal层。
常见的文件有MediaPlayer.java、 AudioSystem.java、 AudioService.java、AudioManager.java 文件路径(framework/base/media)
AudioFlinger.cpp、AudioTrack.cpp、 AudioPolicyManager.cpp、 Threads.cpp、Tracks.cpp、 Engine.cpp、 Audiosystem.cpp 文件路径(framework/av)
audio_hw.c 文件路径(vendor/)
java文件我在这里就不过多的说了,没啥好讲的,主要说一下c++文件吧。
AudioFlinger 是音频策略的执行者, AudioPolicyManager是制作音频策略的,AudioTrack是负责播放从上层传过来的PCM数据,简单的说就是负责播放的。
audio_hw 是每个HAL层的文件,每个手机厂商自己定制的文件。当然Google也有。
一般呢,我们处理音频相关的问题呢,有一些特定的套路,需要AP 侧的log, 有时还需要kernel 的log, 当然最主要的是需要音频数据。也就是出现问题时,的声音数据,让我们可以快速的定位出现问题的位置。
简单的说下播放一首歌曲的流程:(以Android O 为例)
上层创建一个MediaPlayer对象,然后调用NuPlayer框架(播放器),NuPlayer先将当前歌曲的文件信息读取,采样率,比特率,等之类的东西。然后开始调用audio decoder (音频解码器) 将解码出来的PCM数据传给AudioTrack, Audiotrack 会创建一个Track,(每一个播放都会创建一个属于自己的track,不用了就销毁,最多可以同时创建32个),经过AudioFlinger重采样之后,送到HAL层,HAL层在经过一些混音,降噪之类的处理,将声音送到Codec,然后送给硬件输出,进行播放。
这个是一个大概的播放流程,如果我们在播放过程中遇到了一些问题,比如说是fwk层的问题,我们就在AudioTrack与AudioFlinger之间寻问题的原因。
比如说,播放无声,我们需要看AudioPolicyManager中的一些策略是不是将当前的track给mute了。或者是一些其他的原因等。
这里只是简单的介绍下Audio,Audio算是一个较为复杂的模块,还需要好好的研究。