ALSA架构应用程序aplay及amixer调用关系(应用层到内核驱动)
一、整体架构
+--------+ +--------+ +--------+|apaly | |arecord | |amixer |+--------+ +--------+ +--------+| ^ ^V | V+--------------------------------+| ALSA Library API || (tinyalsa, alsa-lib) |+--------------------------------+user space ^
----------------------|---------------------kernel space V+--------------------------------+| ALSA CORE || +-------+ +-------+ +------+ || | PCM | |CONTROL| | MIDI |...|| +-------+ +-------+ +------+ |+--------------------------------+|+--------------------------------+| ASoC CORE |+--------------------------------+|+--------------------------------+| hardware driver || +-------+ +--------+ +-----+ || |Machine| |Platform| |Codec| || +-------+ +--------+ +-----+ |+--------------------------------+
+------------------------------------------+
| Machine |
| +--------------+ +--------------+ |
| | Platform | | Codec | |
| | | I2S | | |
| | cpu_dai|<---->|codec_dai | |
| | | | | |
| +--------------+ +--------------+ |
+------------------------------------------+ copy_from_user DMA I2S DAC^ ^ ^ ^
+---------+ | +----------+ | +-----------+ | +-----+ | +------+
|userspace+-------->DMA Buffer+------->I2S TX FIFO+------->CODEC+------->SPK/HP|
+---------+ +----------+ +-----------+ +-----+ +------+
aplay.c涉及alsa-lib及alsa-utils源码下载地址:
alsa-lib 1.2.6源码
alsa-utils 1.2.6源码
二、使用aplay指令调用关系
strace分析: aplay Windows.wav
1. /dev/snd/controlC0 对应的file_operations是snd_ctl_f_ops
open : snd_ctl_open
SNDRV_CTL_IOCTL_PVERSION : snd_ctl_ioctl -> put_user(SNDRV_CTL_VERSION, ip)
SNDRV_CTL_IOCTL_CARD_INFO : snd_ctl_ioctl -> snd_ctl_card_info(card, ctl, cmd, argp);copy_to_userSNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE : snd_ctl_ioctl -> snd_pcm_control_ioctl -> control->prefer_pcm_subdevice = val;
close
上述三个ioctl不涉及硬件操作2. /dev/snd/pcmC0D0p 对应的file_operations是snd_pcm_f_ops[0]
open : snd_pcm_playback_opensnd_pcm_opensnd_pcm_open_filestruct snd_pcm_substream *substream;snd_pcm_open_substreamerr = snd_pcm_hw_constraints_init(substream);snd_mask_anysnd_interval_any......err = substream->ops->open(substream) // substream->ops : snd_pcm_ops结构体soc_pcm_open依次调用cpu_dai, dma, codec_dai, machine的open或startup函数uda134x_startup 里:snd_pcm_hw_constraint_minmax(SNDRV_PCM_HW_PARAM_RATE),snd_pcm_hw_constraint_minmax(SNDRV_PCM_HW_PARAM_SAMPLE_BITS)dma_open里: snd_pcm_hw_constraint_integer,snd_soc_set_runtime_hwparamsruntime->hw.info = hw->info; = SNDRV_PCM_INFO_INTERLEAVED |SNDRV_PCM_INFO_BLOCK_TRANSFER |SNDRV_PCM_INFO_MMAP |SNDRV_PCM_INFO_MMAP_VALID |SNDRV_PCM_INFO_PAUSE |SNDRV_PCM_INFO_RESUME,snd_pcm_hw_constraints_completepcm_file->substream = substream;file->private_data = pcm_file;注意:substream->ops = soc_new_pcm函数里的soc_pcm_ops以下的ioctl入口都是:snd_pcm_playback_ioctl
SNDRV_PCM_IOCTL_INFO : snd_pcm_info_user(substream, arg);substream->ops->ioctl(substream, SNDRV_PCM_IOCTL1_INFO, info);snd_pcm_lib_ioctlSNDRV_PCM_IOCTL_PVERSION : put_user(SNDRV_PCM_VERSION, (int __user *)arg)
SNDRV_PCM_IOCTL_TTSTAMP : snd_pcm_tstamp(substream, arg);SNDRV_PCM_IOCTL_SYNC_PTR : snd_pcm_sync_ptr(substream, arg); 先不管SNDRV_PCM_IOCTL_HW_REFINE .... : snd_pcm_hw_refine_user(substream, arg);memdup_usersnd_pcm_hw_refine(substream, params); 先不管copy_to_user
SNDRV_PCM_IOCTL_HW_PARAMS : snd_pcm_hw_params_user(substream, arg);snd_pcm_hw_paramssubstream->ops->hw_params(substream, params);soc_pcm_hw_params依次调用machine,codec_dai,cpu_dai,platform(dma)的hw_params函数
SNDRV_PCM_IOCTL_SYNC_PTR
SNDRV_PCM_IOCTL_SW_PARAMS : snd_pcm_sw_params_user(substream, arg);snd_pcm_sw_params 不涉及硬件操作SNDRV_PCM_IOCTL_SYNC_PTR
SNDRV_PCM_IOCTL_PREPARE : snd_pcm_prepare(substream, file);snd_power_wait // 电源管理相关,先不管.... 调用到platform里的prepareSNDRV_PCM_IOCTL_SYNC_PTR
SNDRV_PCM_IOCTL_SW_PARAMS循环:
SNDRV_PCM_IOCTL_WRITEI_FRAMES : copy_from_usersnd_pcm_lib_writesnd_pcm_lib_write1(substream, (unsigned long)buf, size, nonblock, snd_pcm_lib_write_transfer)snd_pcm_lib_write_transfercopy_from_usersnd_pcm_start(substream); // 启动传输SNDRV_PCM_IOCTL_SYNC_PTRSNDRV_PCM_IOCTL_DRAIN
SNDRV_PCM_IOCTL_DROP
SNDRV_PCM_IOCTL_HW_FREE
close
三、strace分析: amixer cset numid=1 30 (设置音量)
/dev/snd/controlC0
open
SNDRV_CTL_IOCTL_CARD_INFO
SNDRV_CTL_IOCTL_PVERSION
SNDRV_CTL_IOCTL_ELEM_INFO
SNDRV_CTL_IOCTL_ELEM_READ
SNDRV_CTL_IOCTL_ELEM_WRITE : snd_ctl_elem_write_usersnd_ctl_elem_write// 找到一个snd_kcontrolkctl = snd_ctl_find_id(card, &control->id);// 调用它的putresult = kctl->put(kctl, control);
上面是从其他地方找的一份关于aplay和amixer调用后使用strace记录整个过程后分析的,目前我们还没有时间去分析梳理,这里仅仅先记录起来。
ALSA架构应用程序aplay及amixer调用关系(应用层到内核驱动)相关推荐
- 嵌入式Linux——oops:根据oops信息,找到错误的产生位置以及函数的调用关系
简介: 本文主要介绍通过oops信息找到程序中出错位置的方法.并结合自己代码中的错误来讲解如何找到出错位置.同时还会介绍使用栈信息来推到函数间的调用关系. Linux内核:linux-2.6.22. ...
- 记一次libusb库函数“libusb_bulk_transfer”的调用关系追踪
记一次libusb库函数"libusb_bulk_transfer"的调用关系追踪 libusb库内部调用关系 USB设备文件节点 usb驱动层调用关系 usb core HCD ...
- 音频ALSA架构简介
一.ALSA架构 ALSA(Advanced Linux Sound Architecture)即高级 Linux 声音架构. 嵌入式移动设备的音频子系统目前主要是ALSA 驱动 asoc 框架,其中 ...
- Linux ALSA 之一:ALSA 架构简介
一.概述 ALSA是 Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构. 在 Linux 内核设备驱动层,ALSA 提供了 als ...
- Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介
ALSA声卡驱动: 1.Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介 2.Linux ALSA声卡驱动之二:Platform 3. Linux ALSA声卡驱动之三:Platf ...
- tensorflow http调用_《TensorFlow 内核剖析》笔记——系统架构
3 系统架构 系统整体组成:Tensorflow的系统结构以C API为界,将整个系统分为前端和后端两个子系统: 前端构造计算图 后端执行计算图,可再细分为: 运行时:提供本地模式和分布式模式 计算层 ...
- .NET平台C/S架构应用程序开发核心技术总结(MyKTV点歌系统案例分析)
.NET平台C/S架构应用程序开发核心技术总结(MyKTV点歌系统案例分析) 总结日期:2019年10月10日 ...
- java sleep不能使用_java无主窗口GUI程序主线程不能调用sleep(long)方法,会产生异常...
java无主窗口GUI程序主线程不能调用sleep(long)方法,会产生异常. public class fxframe{ public static void main(String[] args ...
- [转]微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列
本文转自:http://www.codeusing.com/hi/uephee.wen/resource/view/170.aspx 资源分类:微软代码示例 更新日期:20 ...
- Python程序中各函数间调用关系分析与可视化
中国大学MOOC"Python程序设计基础"免费学习地址 2020年秋季学期Python教材推荐与选用参考 推荐图书: <Python程序设计(第3版)>,(ISBN: ...
最新文章
- nginx 源码学习笔记(十)——基本容器——ngx_hash
- 连接mysql数据库时提示2003-can t connect to MySQL server on ip(10060)的解决办法
- UI设计干货素材|教你正确使用浮动按钮
- 树状数组 Binary Indexed Tree/Fenwick Tree
- LeetCode每日一题: 搜索插入位置(No.35)
- 在Fedora 25中更换openjdk为oracle jdk
- Sqoop 是什么?(二)
- attachEvent
- MacOS 64位GaussView5的破解
- 为什么标签天线振子长度小于半个波长?
- 彩票,双色球,模拟开奖小项目
- 小秘谈币:谈谈炒币的几点感悟
- openFeign夺命连环9问
- 2021消防设施操作员(初级)岗位考试模拟题库应急疏散逃生知识部分
- 【STM32H7教程】第87章 STM32H7的SDMMC总线基础知识和HAL库API
- 有声小说php采集站源码下载,PTCMS小说站源码 可听书 可下载 带自动采集和搭建视频教程...
- 【金猿投融展】Kyligence——改变人类使用数据的习惯
- “物联网开发实战”学习笔记-(二)手机控制智能电灯
- 信息学奥赛/CSP/NOIP是什么?怎么规划?
- K8s PV和PVC(动态)