Linux ALSA音频驱动之一:框架概述
1、ALSA概述
ALSA表示高级Linux声音体系结构(Advanced Linux Sound Architecture)。它由一系列内核驱动,应用程序编译接口(API)以及支持Linux下声音的实用程序组成。
ALSA项目发起的原由是Linux下的声卡驱动(OSS/Free drivers)没有获得积极的维护。而且落后于新的声卡技术。Jaroslav Kysela早先写了一个声卡驱动,并由此开始了ALSA项目,随后,更多的开发者加入到开发队伍中,更多的声卡获得支持,API的结构也获得了重组。
Linux内核2.5在开发过程当中,ALSA被合并到了官方的源码树中。在发布内核2.6后,ALSA已经内建在稳定的内核版本中并将普遍地使用。
这篇文章里,我将简单介绍 ALSA项目的基本框架以及它的软件组成。主要集中介绍PCM接口编程。更多信息可查看ALSA官网学习http://www.alsa-project.org/。
2、ALSA框架各模块简述
从上图可以看出ALSA分三层,按照调用关系一次是APP、alsa-lib、kernel-driver。
ALSA Library API:
alsa 用户库接口,常见有 tinyalsa、alsa-lib。
ALSA CORE:
Alsa核心层,向上提供逻辑设备(PCM、CTL、MIDI、TIMER…)系统调用,向下驱动硬件设备(Machine、I2S、DMA、CODEC)。
ASoC CORE:
asoc 是建立在标准 alsa core 基础上,为了更好支持嵌入式系统和应用于移动设备的音频 codec 的一套软件体系。
Hardware Driver:
音频硬件设备驱动,由三大部分组成,分别是 Machine、Platform、Codec。
Hardware Driver三者的关系如下图所示:
Platform缓存:
主要作用是完成音频数据的管理,通过CPU的数字音频接口(DAI)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。在具体实现上,ASoC有把Platform驱动分为两个部分:snd_soc_platform_driver和
snd_soc_dai_driver。其中,platform_driver负责管理音频数据,把音频数据通过dma或其他操作传送至cpu dai中,dai_driver则主要完成cpu一侧的dai的参数配置,同时也会通过一定的途径把必要的dma等参数与snd_soc_platform_driver进行交互。
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区分开)。
Codec:
对于回放来讲,userspace送过来的音频数据是通过采样量化的数字信号,在codec通过DAC转换成模拟信号而后输出到外放或耳机,这样我么你就能够听到声音了。codec字面意思是编解码器,但芯片(codec)里面的功能部件不少,常见的有AIF、DAC、ADC、Mixer、PGA、line-in、line-out,有些高端的codec芯片还有EQ、DSP、SRC、DRC、AGC、Echo-Canceller、Noise-Suppression等部件。
Machine:
指某款机器,经过配置dai_link把cpu_dai、codec_dai、modem_dai各个音频接口给链结成一条条音频链路,而后注册snd_soc_card.和上面两个不同,platform和codec驱动通常是能够重用的,而machine有它特定的硬件特性,几乎是不可重用的。所谓的硬件特性指:
1、Soc Platform与Codec的差别。
2、DAIs之间的链结方式;
3、经过某个GPIO打开AMP;
4、经过某个GPIO检测耳机插拔;
5、使用某个时钟如MCLK/External-OSC做为I2S,CODEC的时钟源等等。
从上面的描述来看,对于回放的情形,PCM数据流向大体如下图所示:
3、ALSA设备文件结构
我们可以看到以下设备文件:
contro1C0 ------> 用于声卡的控制,例如通道选择,混音,麦克风的控制等。
pcmC0D0c ------> 用于录音的pcm设备
pcmC0D0p ------> 用于播放的pcm设备
seq ------> 音序器
timer ------> 定时器
其中,C0D0代表的是声卡0中的设备0,pcmC0D0c最后一个c代表capture,pcmC0D0p最后一个p代表playback,这些都是alsa-driver中的命名规则。从上面的列表可以看出,我的声卡下挂了6个设备,根据声卡的实际能力,驱动实际上可以挂上更多种类的设备,在include/sound/core.h中,定义了以下设备类型:
/* type of the object used in snd_device_*()* this also defines the calling order*/
enum snd_device_type {SNDRV_DEV_LOWLEVEL,SNDRV_DEV_INFO,SNDRV_DEV_BUS,SNDRV_DEV_CODEC,SNDRV_DEV_PCM,SNDRV_DEV_COMPRESS,SNDRV_DEV_RAWMIDI,SNDRV_DEV_TIMER,SNDRV_DEV_SEQUENCER,SNDRV_DEV_HWDEP,SNDRV_DEV_JACK,SNDRV_DEV_CONTROL, /* NOTE: this must be the last one */
};
通常,我们更关心的是pcm和control这两种设备。
Linux ALSA音频驱动之一:框架概述相关推荐
- Linux ALSA音频驱动一:音频系统概述
音频系统概述 音频系统通过数据+控制总线与CODEC连接,控制通路用I2C,数据通常为I2S,框图如图1所示. I2C:寄存器读写,用于配置CODEC控制通路. I2S:音频数据传输,通常与platf ...
- linux音频时钟bclk,linux alsa音频中采样率fs、比特率BCLK 、主时钟MCLK关系
转:https://blog.csdn.net/lugandong/article/details/72468831 一. 拿512fs说话: 看图知道采样的位深是32bit(位),左右声道各占了8* ...
- Linux ALSA音频框架分析五:HDA Driver分析
Linux ALSA音频框架分析五:HDA Driver分析 一 概述 HDA(High Definition Audio)是intel设计的用来取代AC97的音频标准,硬件架构上由hda dodec ...
- 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 音频系统:物理链路篇
原址 1. Overview 硬件平台及软件版本: Kernel - 3.4.5 SoC - Samsung exynos CODEC - WM8994 Machine - goni_wm8994 U ...
- (一)Linux ALSA 音频系统:物理链路篇
物理链路篇 转自:https://me.csdn.net/zyuanyun Linux ALSA 音频系统:物理链路篇 Linux ALSA 音频系统:物理链路篇 原创 zyuanyun 最后发布于2 ...
- (二)Linux ALSA 音频系统:逻辑设备篇
逻辑设备篇 转自:https://me.csdn.net/zyuanyun Linux ALSA 音频系统:逻辑设备篇 Linux ALSA 音频系统:逻辑设备篇 原创 zyuanyun 最后发布于2 ...
- Linux ALSA音频系统:platform,machine,codec
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_41965270/arti ...
- Linux/Android 音频驱动从概念到 APP
这里写自定义目录标题 前言 硬件介绍 Codec 通用结构 ADC 框图 DAC 框图 常用数字接口 其他相关术语 Codec 实际结构 硬件原理图 芯片手册框图 软硬件对应示例 Codec 硬件逻辑 ...
最新文章
- 顺序队列的表示和实现
- 极简易版专家聊天程序--JAVA练手
- 字节流--IO学习笔记(二)
- 数据结构--顺序栈和链式栈
- 为什么说“医可救众生?佛可救众生!”
- Java中如何编写一个完美的equals方法
- hbase 协处理器 部署_hbase协处理器概念及知识点总结
- mysql 分组统计 取最大值_(Mysql)sql分组取最大值问题
- 2021芜湖高考成绩查询,2021芜湖市地区高考成绩排名查询,芜湖市高考各高中成绩喜报榜单...
- 3.5 重要的环境变量
- 关于消息推送,你可以知道这个
- dh算法 理论依据_DH算法
- 计算机答辩ppt结论,论文总结与致谢ppt_ppt结束致谢_答辩ppt致谢
- 情人节礼物------用她的照片和我们的聊天记录生成词云~
- Python安装和导入cv库
- Poedu_C语言_20160925_打字母游戏
- Velocity最简易的Servlet加载
- 美育在计算机教育中应用,音乐与信息技术学科整合,把美育融入到学校教育之中...
- 史上最牛的论坛推广方法,论坛推广实战方案!
- c4droid中c语言编译器,c4droid怎么安装 c4droid安装教程及使用说明
热门文章
- aot慈善币跑路了_慈善币AOT:用公益收割“韭菜”
- androID程序!BAT大厂面试基础题集合,附带学习经验
- ERROR: The executable E:\路径名称\Scripts\python2.exe is not functioning
- 史上最全的软件测试面试题
- 【打开方式问题解决】该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置“页面中创建关联。
- html控制checkbox选中状态,怎么设置checkbox 选中状态
- potplay播放器录制音频
- 使用potplayer播放器看直播
- html 用户名限制,js对输入用户名的限制
- Unity3D 2018 3.0新手入门