Android 4.4 Kitkat 音频实现及简要分析

  • 来源:csdn
  • 作者:jingxia2008
  • 字体:【
  • 时间:2014-05-23
  • 点击:
  • 收藏本文

 

在 Android 4.4 上实现录放音
 
背景
Android 自 ICS 开始,音频系统就有了很大的变化,先是抛弃了 alsalib,然后是采用了 AIO,各级框架上,都有了自己的特色,与 Linux 的音频应用渐行渐远,形成了自己独特的音频管理和音频配置功能。总的来说改进还是非常大,至少在用户体验上已经大大的超越了之前的版本。我们就从 4.4 的音频实现上来分析其中的一些变化和实现机制。
 
 
要求
 
首先是硬件功能正常,这个不表。 Linux 支持 alsa 驱动,生成 alsa 子系统,最好是能够在 buildroot 等其他文件系统上事先测试音频的播放和录制。
 
HAL
音频的 HAL 简单实现,参考 device/asus/grouper/audio , 如果没有太复杂的音频配置,基本上可以在这个代码基础上稍微修改,主要是一些播放和录制的参数。这个 HAL 已经实现了通用的接口,并且调用的也是标准的 tinyalsa 的接口,移植性非常高。我们这里使用的 wm8904,功能不多,直接使用即可。
 
 
Android 的配置
 
主要是4个文件 audio_policy.conf  media_profiles.xml media_codecs.xml mixer_paths.xml 参考 asus ,不必大改,基本照抄,完全可以直接使用,开源万岁。
 
做好文件系统,这个时候系统应该就不使用 default 的 stub 音频 HAL , 而是用我们添加的 audio HAL 了。 但是能否发声,这个多半还是不能。
 
调试
 
audio 系统调用了  libtinyalsa libaudioutils libaudioroute 几个底层库。 这几个移植了一些通用的 alsa 设备打开配置功能,但是具体平台却并不一定都能正常执行,主要是这些库实现都很简单,没有考虑全面,你的硬件细节可能刚好被他们忽略了,同样以我们的 wm8904 来说,我们不支持 time stamp ,但是 tinyalsa 是默认打开的必须将其关掉。
具体哪些参数不对,或者不合适,就需要 Android 驱动工程师根据硬件设计和芯片手册,逐个查证,配置到一个音频系统工作的最佳状态。那么用户体验才能最好。
 
 
 
Android 音频系统分析
以下分析基于 4.4.2
 
audio HAL
 
tinyalsa 与 audioroute
Android 音频系统基于 Linux 的 ALSA 驱动, tinyalsa 在 alsa 的驱动基础上封装音频接口,提供给 audio HAL, audio HAL 提供接口给 Android audioflinger 等 framework
HAL 需要实现 audio 硬件的打开与关闭(这里是 android 认为的硬件)。
需要实现 in 和 out 的 数据流
struct audio_stream_out   struct audio_stream_in 
in 主要有 read 方法用于读取音频数据,   out 主要有 write 方法,写入数据到设备,分别实现录音和放音。
详见: hardware/libhardware/include/hardware/audio.h
 
其中的方法又是调用的 tinyalsa 的接口,关于 pcm 的操作:
值得一提的是 HAL 现在不包含 route 的操作, audio route 交给了 libaudioroute.so , 它也是调用 tinyalsa 的接口,并包含一个 xml 解析器,解析 mixer_paths.xml 里面的 route 配置数据。这样系统就可以对 alsa 的 pcm 和 mixer 进行操作了,理论上应该可以放音了,使用 tinyalsa 提供的工具可以进行测试,当然无法测试 HAL 的接口。
tinycap      tinymix      tinypcminfo  tinyplay
 
tinyplay 可以播放 wav 格式的纯音频数据。 tinymix 可以查看和配置音频路径:
audioflinger
 
audioflinger 是 audio 音频服务器,它会加载 audio hal ,并处理 audio 应用发出音频请求。这个分析的有很多
暂无评论
  • 1:请一针见血的评论。
  • 2:评论需要审核通过后才能显示。
  • 3:评论字数限制在1000字以内。
  • 当前字数:0
热门文章
推荐文章
随机文章
关于本站 - 广告服务 - 版权声明 - 联系我们 - 友情链接 - 网站地图 - 帮助中心