DSP

Android音频驱动简析

2019-07-13 19:23发布

基本了解Android音频驱动的人都应该知道,Android音频驱动的基础是基于linux ALSA音频架构而开发出来的,并针对了移动设备优化,使其可以更好的在移动设备中对音频进行处理,那还是先看看ALSA的相关介绍吧! ALSA具有更加友好的编程接口,并且完全兼容于OSS,对应用程序员来讲无疑是一个更佳的选择。ALSA系统包括驱动包alsa-driver、开发包 alsa-libs、开发包插件alsa-libplugins、设置管理工具包alsa-utils、其他声音相关处理小程序包alsa-tools、特殊音频固件支持包alsa- firmwareOSS接口兼容模拟层工具alsa-oss7个子项目,其中只有驱动包是必需的。 ALSA是Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构在内核设备驱动层,ALSA提供了alsa-driver,同时在应用层,ALSA为我们提供了alsa-lib,应用程序只要调用alsa-lib提供的API,即可以完成对底层音频硬件的控制。
 
    由图可以看出,用户空间的alsa-lib对应用程序提供统一的API接口,这样可以隐藏了驱动层的实现细节,简化了应用程序的实现难度。内核空间中,alsa-soc其实是对alsa-driver的进一步封装,他针对嵌入式设备提供了一些列增强的功能。
     alsa- driver
指内核驱动程序,包括硬件相关的代码和一些公共代码,非常庞大,代码总量达数十万行;alsa-libs指用户空间的函数库,提供给应用程序使用,应用程序应包含头文件asoundlib.h,并使用共享库libasound.soalsa-utils包含一些基于ALSA的用于控制声卡的应用程序,如alsaconf(侦测系统中声卡并写一个适合的ALSA配置文件)、alsactl(控制ALSA声卡驱动的高级设置)、 alsamixer(基于ncurses的混音器程序)、amidi(用于读写ALSA RawMIDI)、amixerALSA声卡混音器的命令行控制)、aplay(基于命令行的声音文件播放)、arecord(基于命令行的声音文件录制)等。
目前ALSA内核提供给用户空间的接口有:
  
信息接口(Information Interface/proc/asound
  
控制接口(Control Interface/dev/snd/controlCX
  
混音器接口(Mixer Interface/dev/snd/mixerCXDX
  PCM
接口(PCM Interface/dev/snd/pcmCXDX
  Raw
迷笛接口(Raw MIDI Interface/dev/snd/midiCXDX
  
音序器接口(Sequencer Interface/dev/snd/seq
  
定时器接口(Timer Interface/dev/snd/timer
OSS类似,上述接口也以文件的方式被提供,不同的是这些接口被提供给alsa-lib使用,而不是直接给应用程序使用的。应用程序最好使用alsa-lib,或者更高级的接口,比如jack提供的接口。
Android增加了一个AudioFinger,这个可以简单的理解为AndroidALSA音频子系统的标准化的插件模块,它包含了AudioMixer[混音器]AudioResampler[重采样]等子模块,AudioResampler即我们理解的SRCAndroid换了一个新名称而已。针对SRCAndroid做了改进,但改进并不是以去除SRC为目的,而是修改了默认的输出频率,AndroidSRC目标采样率44.1kHz,非该值的采样率都将SRC处理。例如播放48kHz采样率的信号,输出的最终是44.1kHz,这对音质将产生负面影响。这个可以通过测试证明。 ALSA是一个针对Linux桌面版本设计的音频架构,它实际上是不适合智能终端设备的,起码里面大量的开源驱动代码是可以去除的,对与Android来说,这些都是废代码。从Android2.3起,启用了一个新的音频架构。它放弃了一直使用的ALSA架构,因此系统文件夹中,也不再有LibAudioALSA.so这个文件。 Android2.3起,架构已经做了修改,在针对内部代码进行了优化,去除了冗余代码,理论上让系统能变得更加高效,可以将新架构理解为一个精简的或者为智能终端设备定制的ALSA架构。遗憾的是,它同样存在SRC严重劣化的问题,通过测试可以证明。