接下来计划针对音频做一个较为详细的总结:
计划分成下面8章来详细展开,后面再根据实际情况做调整。
- 2.ALSA/ASOC框架
- 3.codec 驱动dapm 相关(kcontrol、widget、route),以及hal层设置通路
- 4.android 音频框架( 重点在AudioFlinger 和 AudioPolicyService服务 )
- 5.音频通路的选择(AudioTrack播放选择设备的过程,已经设备切换过程)
- 6.播放 录音音频流的传输过程
- 7.audio hal介绍
- 8.一些常见问题解决思路
以上内容基于tinyalsa展开,尽量剔除厂商的差异性。
音频基础知识
一.概念
采集声音实际就是将模型信号转化成数字信号,类似ADC的原理,有着几个步骤:模拟信号->抽样->量化->编码->数字信号
涉及到几个关键的参数:
采样率
:抽样环节的频率, 一秒采样多少次,采样频率必须至少是信号中最大频率分量频率的两倍,否则就不能从信号采样中恢复原始信号。android 一般使用44.1k 48k等。
位数(采样精度)
:量化环节用到的精度,采样的精度,即采集到一个数据有多少位可以保存,这个一般要根据codec 芯片支持哪个精度来配置。一般是16位或32位。
声道
:采样多少个通道,android 底层支持单声道和双声道
一.硬件相关
硬件相关 主要介绍 IIS接口
IIS( I2S ) 全称Integrated Interchip Sound
,是飞利浦在1986年定义(1996年修订)的数字音频传输标准,用于数字音频数据在系统内器件之间传输,例如codec 芯片,数字麦克风,数字输入输出接口等。
如上图to cpu的芯片。我们可以得出IIS 有这些接口:
引脚 | 作用 |
---|---|
LRCK | 帧时钟,传输一帧(左右声道)数据的采样率,通过高低电平选择是左声道数据还是右声道数据,也就是采样率 |
SCLK | LRCK*两个通道的位数和 |
SDO /SDI | 数据输入和输出 |
MCLK | 不是IIS必须的,有时外部芯片需要系统时钟才需要接,一般是 LRCK采样率的256 倍或者384倍 |
时钟计算的例子:
假设声音数据有左右声道,每个声道占用32位数据位,左右两个声道一共占了64个数据位。如果
LRCK 44.1K 那SCLK 就是44.1K* 64 =2822.4k =2.822m
LRCK 48K 那SCLK 就是48K* 64 =3072k =3.072m
IIS通信总线有主从之分:
在总线上只能存在一个主设备,可有多个从设备。主设备提供时钟,不一定是数据的发送方,也可以是接受方或者其他协调两者的控制设备。
二.其他概念
- 传输延迟(latency):
传输延迟表示一个周期的音频数据的传输时间。可能有些读者一脸懵逼,一个周期的音频数据,这又是啥?我们再引入周期(period)的概念:Linux ALSA 把数据缓冲区划分为若干个块,dma 每传输完一个块上的数据即发出一个硬件中断,cpu 收到中断信号后,再配置 dma 去传输下一个块上的数据;一个块即是一个周期,周期大小(periodSize)即是一个数据块的帧数。再回到传输延迟(latency),传输延迟等于周期大小除以采样率,即 latency = periodSize / sampleRate。
- 16LE
上文描述的位数,一般会使用16LE ,这里的LE指的是Little Endian 小端存储 就是0x2345 在实际中是先存储 45 再存储23
- 蓝牙相关
A2DP
:是一种单向的高品质音频数据传输链路,通常用于播放立体声音乐;
SCO
: 则是一种双向的音频数据的传输链路,用于语音通话,音频的采样率较低,一般是8K、16K单声道的音频数据,所以如果用于播放音乐,体验会很差。
两者的主要区别是:A2DP
只能播放,默认是打开的,而SCO
既能录音也能播放,默认是关闭的。
- android 声卡节点
控制节点为必须节点,其他不一定有
pcmC0D0c card 0 device 0 capture
pcmC0D0p card 0 device 0 playback
表示一个声卡可以有多个设置,一个设备有多个节点
C 表示声卡
D 表示设备
P/C 表示play和capture
后续有其他音频相关的概念会在这里增加。