本节书摘来华章计算机出版社《深入理解Android:卷III A》一书中的第3章,第3.5节,作者:张大伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。1
3.5AudioService的其他功能
这一章已经介绍了音量控制、外设管理及AudioFocus几个常用重要功能的实现。然而,AudioService仍然有很多其他相互独立的功能。限于篇幅,这里没有办法一一详细说明。在这里简单介绍一下,以便读者自行研究。
(1)RemoteConrolClient/Display机制
RemoteControlClient/Display是从Android 4.0引入的一套新机制。它定义了一个远程控制端、一个远程显示端。这使得媒体播放过程中的元数据(例如标题、艺术家等)与其他信息可以跨应用显示。远程控制端由进行播放的应用管理,而远程显示端被一个显示界面管理,比如说一个AppWidget。由AudioService作为中介为它们进行配对与数据传递。
(2)MediaButton的管理
所谓的MediaButton是指线控耳机上的一个按键,虽然耳机线上只有这一个按键,但是它的功能却异常得多,例如接听/挂断电话,启动音乐播放器,暂停/继续/下一首,等等。加上其使用方便,很多应用,尤其是播放器,争相操作(Handle)这个按键的事件。AudioService就是为了能够协调争抢这个按键的应用才插手管理这个按键的派发。
(3)指定声音的输出设备
这个功能在AudioManger中表现为一系列名为setXXXOn的函数,其中的XXX表示了一个音频输出设备的名字。它们其实都使用了AudioService的setForceUse()函数。准确地说,AudioService并没有为这个功能做过实际工作,只是作为应用到AudioPolicy的一个中介。
(4)音效管理
AudioService在启动时,会使用SoundPool工具预加载一系列的音效文件,用于系统中的一些短小而频繁的音频播放,比如按键音。
SoundPool的工作原理是什么呢?在初始化时,AudioService要求SoundPool加载所需的音频文件。SoundPool会把这些音频文件解码为PCM音频流并缓存。同时为每段音频流分配一个ID,每当AudioService需要播放一段音效时,把对应的ID传递给SoundPool,SoundPool就会找到这块缓存的音频流,通过AudioTrack直接写入AudioFlinger中,实现音效播放。相对于MediaPlayer,由于每次播放时省却了prepare与编解码的过程,因此效率比其高很多,很适合用在游戏等对声音的及时性要求很高的场合。问题是,这个工具太消耗内存了。
(5)情景模式
情景模式和音量的关联是比较紧密的,或者说,情景模式是在音量控制的基础上实现的一个功能。
(6)音频状态管理
在AudioService中就是两个函数:getMode()与setMode()。音频状态表示了手机的4种状态,待机状态、音频通话状态、视频/VoIP通话状态与响铃状态。这4种状态对底层的音频输出设备的选择影响很大,同时也影响了AudioService的一些行为,例如MediaButton的管理。