Android 音频系统 1. 系统架构 Android 的音频系统拥有一个比较标准和健全的架构, 从上层应用, java framework 服务 AudioMananger , 本地服务 AudioFlinger , 抽象层 AlsaHAL , 本地库, 再调用 external 的 tinyalsa 外部支持库,最后到底层驱动的 codec 。 Jav a服务 AudioManage r 作为服务端, 本地服务 AudioFlinge r 作为客户端, 两者通过 Binde r 机制交互。 AudioFlinger 对硬件功能的具体实现交给硬件抽象层 AlsaHAL 完成。抽象层可以调用本地标准接口,或者直接调用 Tinyalsa 库去操作底层驱动。详细调用过程如下图: 简单说来,轨迹如下: Java 端发起调用, MediaPlayer 会转至 MediaPlayerService , 然后会调用相应的解码工具解码后创建 AudioTrack , 所有待输出的 AudioTrack 在 AudioFlinger::AudioMixer 里合成, 然后通过 AudioHAL(AudioHardwareInterface 的实际实现者) 传至实际的硬件来实现播放。2. AudioFlinger AudioFlinger 是 android 中的一个 service ,在 android 启动时就已经被加载。 AudioFlinge r 向下访问 AudioHardware , 实现输出音频数据, 控制音频参数。同时, AudioFlinger 向上通过 IAudioFinger 接口提供服务。所以, AudioFlinger 在 Android 的音频系统框架中起着承上启下的作用,地位相当重要。 AudioFlinger 的类结构下面的图示描述了 AudioFlinger 类的内部结构和关系: ? IAudioFlinger 接口这是 AudioFlinger 向外提供服务的接口,例如 openOutput , openInput , createTrack , openRecord 等等,应用程序或者其他 service 通过 ServiceManager 可以获得该接口。该接口通过继承 BnAudioFlinger 得到。? ThreadBase 在 AudioFlinger 中, Android 为每一个放音/ 录音设备均创建一个处理线程, 负责音频数据的 I/O 和合成, ThreadBase 是这些线程的基类, 所有的播放和录音线程都派生自 ThreadBase ? TrackBase 应用程序每创建一个音轨( AudioTrack/AudioRecord ),在 AudioFlinger 中都会创建一个对应的 Track 实例, TrackBase 就是这些 Track 的基类,他的派生类有: PlaybackTread::Track // 用于普通播放,对应于应用层的 AudioTrack PlaybackThread::OutputTrack // 用于多重设备输出,当蓝牙播放开启时使用 RecordThread::RecordTrack // 用于录音,对应于应用层的 AudioRecord ?播放默认的播放线程是 MixerT
Android Audio System.doc 来自淘豆网m.daumloan.com转载请标明出处.