1 P
CM
接口
针对不同的数字
音频
子系统,出现了几种微处理器或
DSP
与
音频
器件间用于
数字转换的接口
。
最简单的
音频
接口是
PCM
(脉冲编码调制)接口,该接口由
时钟脉冲(
BCLK
)、帧同步信号(
FS
)及接收数据(
DR
)和发送数据(
DX
)
组成。在
FS
信号的上升沿,数据传输从
MSB
(
Most Significant Bit
)字开始,
FS
频率等于采样率。
FS
信号之后开始数据字的传输,单个的数据位按顺序进行传输,
1
个时钟周期传输
1
个数据字。发送
MSB
时,信号的等级首先降到最低,以避免在不同终端的接口使用不同的数据方案时造成
MSB
的丢失。
PCM
接口很容易实现,原则上能够支持任何数据方案和任何采样率,但需要
每个
音频
通道获得一个独立的数据队列
。
2 IIS
接口(即I2S接口)
IIS
接口(
Inter-IC Sound
)在
20
世纪
80
年代首先被飞利浦用于消费
音频
,并在一个称为
LRCLK
(
Left/Right CLOCK
)的信号机制中经过多路转换,将两路
音频
信号变成单一的数据队列。当
LRCLK
为高时,左声道数据被传输;
LRCLK
为低时,右声道数据被传输。与
PCM
相比,
IIS
更适合于立体声系统。对于多通道系统,在同样的
BCLK
和
LRCLK
条件下,并行执行几个数据队列也是可能的。
3 AC
97
接口
AC’97
(
Audio Codec 1997
)是以
Intel
为首的五个
PC
厂商
Intel
、
Creative Labs
、
NS
、
Analog Device
与
Yamaha
共同提出的规格标准。与
PCM
和
IIS
不同,
AC’97
不只是一种数据格式,用于
音频
编码的内部架构规格,它还具有控制功能
。
AC’97
采用
AC-Link
与外部的编解码器相连,
AC-Link
接口包括
位时钟(
BITCLK
)、同步信号校正(
SYNC
)和从编码到处理器及从处理器中解码(
SDATDIN
与
SDATAOUT
)
的数据队列。
AC’97
数据帧以
SYNC
脉冲开始,包括
12
个
20
位时间段(时间段为标准中定义的不同的目的服务)及
16
位
“tag”
段,共计
256
个数据序列。例如,时间段
“1”
和
“2”
用于访问编码的控制寄存器,而时间段
“3”
和
“4”
分别负载左、右两个
音频
通道。
“tag”
段表示其他段中哪一个包含有效数据。把帧分成时间段使传输控制信号和
音频
数据仅通过
4
根线到达
9
个
音频
通道或转换成其他数据流成为可能。与具有分离控制接口的
IIS
方案相比,
AC’97
明显
减少了整体管脚数
。一般来说,
AC’97
编解码器采用
TQFP48
封装。
PCM also supports Time Division Multiplexing (TDM) in that several devices can use the bus simultaneously (this is sometimes referred to as network mode).
ASLA – Advanced Sound Linux Architecture
OSS – 以前的Linux音频体系结构,被ASLA取代并兼容
Codec – Coder/Decoder
I2S/PCM/AC97 – Codec与CPU间音频的通信协议/接口/总线
DAI – Digital Audio Interface 其实就是I2S/PCM/AC97
DAC – Digit to Analog Conversion
ADC – Analog to Digit Conversion
DSP – Digital Signal Processor
Mixer – 混音器,将来自不同通道的几种音频模拟信号混合成一种模拟信号
Mute – 消音,屏蔽信号通道
PCM – Pulse Code Modulation 一种从音频模拟信号转换成数字信号的技术,区别于PCM音频通信协议
采样频率 – ADC的频率,每秒采样的次数,典型值如44.1KHZ
量化精度 – 比如24bit,就是将音频模拟信号按照2的24次方进行等分
SSI – Serial Sound Interface
DAPM – Dynamic Audio Power Management
音频编解码器Codec负责处理音频信息,包括ADC,DAC,Mixer,DSP,输入输出以及音量控制等所有与音频相关的功能。
Codec与处理器之间通过I2C总线和数字音频接口DAI进行通信。
I2C总线 – 实现对Codec寄存器数据的读写。
DAI – 实现音频数据在CPU和Codec间的通信。
以Codec作为研究对象,它的输入有Mic(Microphone),PhoneIn电话信号等,输出有耳机HP(HeadPhone),扬声器Speaker和PhoneOut电话信号。另外需要注意在Codec与CPU端间也有音频数字信号的输入输出。
1) 播放音乐
2) 录音
3) 电话
— 打电话 — — 接听—
4) 通过蓝牙打电话
— 打电话 — — 接听—
2. 系统架构
Android的音频系统拥有一个比较标准和健全的架构,从上层应用,java framework服务AudioMananger,本地服务AudioFlinger,抽象层AlsaHAL,本地库,再调用external的Alsa-lib外部支持库,最后到底层驱动的codec,可谓”五脏俱全”。
以系统启动AuidoFlinger为例,简要窥探Alsa Sound的组织架构。
Java服务AudioManager作为服务端,本地服务AudioFlinger作为客户端,两者通过Binder机制交互。AudioFlinger对硬件功能的具体实现(比如setMode设置电话/蓝牙/录音等模式)交给硬件抽象层AlsaHAL完成。抽象层可以调用本地标准接口,比如mASLADevice->route,或者直接调用Alsa-lib库去操作底层驱动。
Linux的音频驱动结构相对复杂,源码位于内核目录下的/sound/soc/,其中/codec文件夹下存放与平台无关的编解码器驱动,/imx文件夹下存放于freescale imx平台相关的音频驱动,主要可分为SSI驱动和DAI驱动。
以声卡驱动的数据结构为切入点分析,
1) struct snd_soc_codec – 由与平台无关的codec驱动实现。
2) struct snd_soc_platform – 由与imx平台相关的DAI驱动实现,主要实现了音频数据的DMA传输功能。
3) struct snd_soc_dai_link – 将平台相关的DAI与平台无关的codec联系起来。