Linux音频子系统(2) - ALSA ASoC
1. linux音频子系统介绍
Linux音频系统比较复杂,各层间有很多交叉,可能是最无序的子系统。
1.1 ALSA
ALSA 是 Advanced Linux Sound Architecture 的缩写,即高级Linux声音架构,在 Linux 操作系统上提供了对音频和 MIDI(Musical InstrumentDigital Interface,音乐设备数字化接口)的支持。在Linux2.6 版本内核以后,ALSA 已经成为默认的声音子系统,用来替换 2.4 版本内核中的OSS(Open Sound System,开放声音系统)。
ALSA 是一个完全开放源码的音频驱动程序集,是由志愿者维护的开源项目,而 OSS 则是由公司提供的商业产品。ALSA 系统包括驱动包alsa-driver(集成在内核源码),开发包 alsa-libs,开发包插件 alsalibplugins,设置管理工具包 alsa-utils,其他声音相关处理小程序包alsa-tools,特殊音频固件支持包 alsa-firmware。
1.2 ASoC
ASoC 是Alsa System on Chip的缩写,用于实现那些集成声音控制器的CPU,它的设计目标如下:
解耦codec,codec的驱动不依赖具体的平台;
简单易用的I2S/PCM配置接口,让soc和codec的配置相匹配;
动态的电源管理DAPM,实现对用户空间透明的电源管理,各个widget按需供电,实现功耗最小化;
消除pop音,控制各个widget上下电的顺序消除pop音;
添加平台相关的控制,如earphone, speaker。
1.3 总结
在嵌入式开发中,SoC一般都会集成音频相关的控制器,所以嵌入式开发中基本上就是使用ASoC架构,后面也是以ASoC 架构来分析。
2. ASoC架构
为了解决复用性问题, 内核才引入了ASoC架构,在底层ASoC抽象了如下三个模块:Platform、Codec 和 Machine。
2.1 Platform
指某款soc平台的音频模块,该模块负责DMA的控制和I2S的控制, 由CPU厂商负责编写此部分代码。platform又可细分为二个部分:
cpu dai:在嵌入式系统里面通常指soc的i2s,pcm总线控制器,负责把音频数据从I2S tx FIFO搬运到codec(playback,capture则相反)。cpu_dai通过 snd_soc_register_dai()来注册。注:DAI是Digital Audio Interface的简称,分为cpu_dai和codec_dai,这两者通过i2s/pcm总线连接;AIF是Audio Interface母的简称,嵌入式系统中一般是I2S和PCM接口。
PCM dma:负责把dma buffer中的音频数据搬运到i2s tx fifo。值得留意的是:某些情形下是不需要dma操作的,比如modem和codec直连,因为modem本身已经把数据送到fifo了,这时只需要启动codec_dai接收数据即可;该情形下,machine驱动dai_link中需要设定.platform_name = “snd_soc_dummy”,这是虚拟dma驱动,实现见sound/soc/soc-utils.c。音频dma驱动通过 snd_soc_register_platform()来注册,故也常用platform来指代音频dma驱动(这里的platform需要与soc platfrom区分开)。
2.2 Codec
该模块负责AFIx的控制和DAC部分的控制(也可以说是芯片自身的功能的控制), 由Codec厂商负责编写此部分代码。codec部分主要就是codec dai。
对于回放来说,userspace送过来的音频数据是经过采样量化的数字信号,在codec经过DAC转换成模拟信号然后输出到外放或耳机,这样你就可以听到声音了,codec字面意思是编解码器,但芯片(codec)里面的功能部件很多,常见的有AIF,DAC,ADC,Mixer,PGA,line-in,line-out,有些高端的codec芯片还有EQ,DSP,SRC,DRC,AGC,Echo-Canceller,Noise-Suppression等部件。
2.3 Machine
用于描述一块电路板, 它指明此块电路板上用的是哪个Platform和哪个Codec, 由电路板商负责编写此部分代码。
通过配置dai_link把cpu_dai,codec_dai,modem_dai各个音频接口给链结成一条条音频链路,然后注册snd_soc_card.和上面两个不一样,platform和codec驱动一般是可以重用的,而machine有它特定的硬件特性,几乎是不可重用的。所谓的硬件特性指:Soc Platform与Codec的差异;DAIs之间的链结方式;通过某个GPIO打开Amplifier;通过某个GPIO检测耳机插拔;使用某个时钟如MCLK/External-OSC作为i2s,CODEC的时钟源等等。
2.4 举例
以播放为例, 流程如下:
DMA : 负责把用户空间的音频数据从系统内存搬移至I2S的FIFO.
I2S : 负责以某个采样频率、采样深度、通道数发送音频数据, 也叫dai (Digital Audio Interface).
AFIx : 负责以某个采样频率、采样深度、通道数接收音频数据, 也称作dai.
DAC : 并把数据通过DAC转换后送给耳机等播放.
3. 用户接口
3.1 dev/snd
controlC0 :用于声卡的控制,例如通道选择,混音,麦克风的控制等
midiC0D0: 用于播放midi音频,C0D0代表的是声卡0中的设备0
pcmC0D0c: 用于录音的pcm设备,c表示capture
pcmC0D0p: 用于播放的pcm设备,p表示playback
seq : 音序器
timer : 定时器
3.2 proc/asound
cards : 可显示系统中存在多少个声卡
card0 : 代表某个声卡
devices : 可显示系统中存在多少个逻辑设备
4. PCM中间层
PCM中间层(pcm.c)主要完成一些公共性的事情, 这些事情一般与具体的硬件无关(例如存储音频数据时, 肯定需要一个Buffer, 这个Buffer很显然用环形缓冲区描述比较好, 怎么管理这个环形缓冲区的读写指针?
另外, 用户空间设置的音频参数要检查其合法性. 还有, 用户空间可能启停音频播放/录制, 这意味着我们最好实现一个状态机, 来管理用户空间的切换操作. 等等). 对于与具体硬件相关的操作,PCM中间层会pass给底层驱动去处理(这就意味着PCM中间层要定义interface, 让底层驱动去实现这些interface);
底层驱动(具体的platform或codec)则处理与具体硬件相关的事情, 例如I2S控制器的配置, Codec芯片的配置, 时钟的初始化等等。
Linux音频子系统(2) - ALSA ASoC相关推荐
- Linux 音频驱动(五) ALSA音频驱动之PCM逻辑设备
目录 1. 前言 2. PCM逻辑设备 2.1. 创建 PCM逻辑设备: 2.2. PCM逻辑设备文件操作函数集:snd_pcm_f_ops[] 2.3. Open PCM逻辑设备 2.4. Writ ...
- linux音频框架分析,Alsa音频子系统Codec---al5623.c内核代码框架分析
驱动代码位于: sound/soc/codec/alc5623.c 随便找个Linux内核都会有. 1.首先进行i2c总线驱动加载在: static int __init alc5623_modini ...
- linux音频子系统 - DAPM
Dynamic Audio Power Management for Portable Devices 移动设备的动态电源管理(DAPM) 1. Description DAPM使得使用音频子系统的移 ...
- Linux音频软件:Alsa、OSS和Pulseaudio、ESD、
Linux 音频系统简析 https://blog.csdn.net/meizum10/article/details/17437959 PulseAudio,ESD和ALSA,OSS的关系 http ...
- linux音频子系统 - pcm设备
1.pcm设备 脉冲编码调制(Pulse Code Modulation,PCM),就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输,这是基本原理. 根据此原理, ...
- linux音频驱动之ALSA框架
- linux4.9下alsa架构,[Alsa]4, wm8524 Kernel音频子系统入口
上篇说到音频子系统的环境搭建和ASoC,我们会发现这样一个问题,对于已有的,已驱动的音频Codec,我们可以很方便地用aplayer.arecorder来录放音频,但是这表象背后到底隐藏了什么不为人知 ...
- Linux音频驱动开发概括
原址 1.嵌入式音频系统硬件连接 下图所示的嵌入式设备使用IIS将音频数据发送给编解码器.对编解码器的I/O寄存器的编程通过IIC总线进行. 2.音频体系结构-ALSA ALSA是Advanced L ...
- 嵌入式Linux音频驱动开发
1.嵌入式音频系统硬件连接 下图所示的嵌入式设备使用IIS将音频数据发送给编解码器.对编解码器的I/O寄存器的编程通过IIC总线进行. 2.音频体系结构-ALSA ALSA是Advanced Linu ...
最新文章
- 航天器的“回家路线”有几种
- amqp协议 面试_2020最新分布式消息中间件-RabbitMQ面试题(必问)
- Taro+react开发(63) 修改蓝湖的样式
- RSA 前段加密 java 后台解密 已调试通过
- 【BZOJ3997】组合数学,总之是DP就对了
- 使用VSTS为ASP.NET Core构建DevOps CI/CD管道
- api es7 删除所有数据_【Elasticsearch7.0】文档接口之查询delete接口
- 用户访一个APP或者网页流程示意图
- Cyborg Genes UVA - 10723
- Geoserver使用CSS插件编辑Style样式
- 为什么不使用ipv6计算机网络,ipv6无网络访问权限解决教程
- 转载:用图片搜索图片的几个好网站
- Vscode新建vue模板
- 计算机游戏act指的是什么游戏,忍龙2领衔!5款史上最佳的ACT游戏推荐,值得一玩!...
- [原创] PowerPC 汇编入门与优化
- 对实际电流源中内阻变化的简单分析
- 生鲜配送企业如何高效管理订单,为企业降本增效?
- 什么是DBMS以及DBMS的分类
- StarUML3.0的破解方法
- Python中的时间戳具体是什么
热门文章
- 时隔一年半,我,一个卑微的前端菜鸡,又来写面经了
- yyf学习JavaScriptTypeScript
- PIE SDK辐射定标
- Android支持多个应用同时录音
- Vue—keepAlive 动态管理页面缓存
- 【历史上的今天】8 月 31 日:人工智能起源;GPU 诞生;Windows 98 中文版来了
- http协议状态码3xx系列(301,302,303,304,305,306,307),小白易通
- 2019第十届蓝桥杯大赛青少年创意编程省赛C++组试题解析
- 基于可视化的导航书签
- 《嵌入式实时操作系统 uc/OS-II 原理及应用》【任哲 主编】随书例程以及使用方法