一、整体架构

    +--------+  +--------+  +--------+|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调用关系(应用层到内核驱动)相关推荐

  1. 嵌入式Linux——oops:根据oops信息,找到错误的产生位置以及函数的调用关系

    简介: 本文主要介绍通过oops信息找到程序中出错位置的方法.并结合自己代码中的错误来讲解如何找到出错位置.同时还会介绍使用栈信息来推到函数间的调用关系.  Linux内核:linux-2.6.22. ...

  2. 记一次libusb库函数“libusb_bulk_transfer”的调用关系追踪

    记一次libusb库函数"libusb_bulk_transfer"的调用关系追踪 libusb库内部调用关系 USB设备文件节点 usb驱动层调用关系 usb core HCD ...

  3. 音频ALSA架构简介

    一.ALSA架构 ALSA(Advanced Linux Sound Architecture)即高级 Linux 声音架构. 嵌入式移动设备的音频子系统目前主要是ALSA 驱动 asoc 框架,其中 ...

  4. Linux ALSA 之一:ALSA 架构简介

    一.概述 ALSA是 Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构. 在 Linux 内核设备驱动层,ALSA 提供了 als ...

  5. Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介

    ALSA声卡驱动: 1.Linux ALSA声卡驱动之一:ALSA架构简介和ASOC架构简介 2.Linux ALSA声卡驱动之二:Platform 3. Linux ALSA声卡驱动之三:Platf ...

  6. tensorflow http调用_《TensorFlow 内核剖析》笔记——系统架构

    3 系统架构 系统整体组成:Tensorflow的系统结构以C API为界,将整个系统分为前端和后端两个子系统: 前端构造计算图 后端执行计算图,可再细分为: 运行时:提供本地模式和分布式模式 计算层 ...

  7. .NET平台C/S架构应用程序开发核心技术总结(MyKTV点歌系统案例分析)

    .NET平台C/S架构应用程序开发核心技术总结(MyKTV点歌系统案例分析) 总结日期:2019年10月10日                                             ...

  8. java sleep不能使用_java无主窗口GUI程序主线程不能调用sleep(long)方法,会产生异常...

    java无主窗口GUI程序主线程不能调用sleep(long)方法,会产生异常. public class fxframe{ public static void main(String[] args ...

  9. [转]微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列

    本文转自:http://www.codeusing.com/hi/uephee.wen/resource/view/170.aspx 资源分类:微软代码示例               更新日期:20 ...

  10. Python程序中各函数间调用关系分析与可视化

    中国大学MOOC"Python程序设计基础"免费学习地址 2020年秋季学期Python教材推荐与选用参考 推荐图书: <Python程序设计(第3版)>,(ISBN: ...

最新文章

  1. nginx 源码学习笔记(十)——基本容器——ngx_hash
  2. 连接mysql数据库时提示2003-can t connect to MySQL server on ip(10060)的解决办法
  3. UI设计干货素材|教你正确使用浮动按钮
  4. 树状数组 Binary Indexed Tree/Fenwick Tree
  5. LeetCode每日一题: 搜索插入位置(No.35)
  6. 在Fedora 25中更换openjdk为oracle jdk
  7. Sqoop 是什么?(二)
  8. attachEvent
  9. MacOS 64位GaussView5的破解
  10. 为什么标签天线振子长度小于半个波长?
  11. 彩票,双色球,模拟开奖小项目
  12. 小秘谈币:谈谈炒币的几点感悟
  13. openFeign夺命连环9问
  14. 2021消防设施操作员(初级)岗位考试模拟题库应急疏散逃生知识部分
  15. 【STM32H7教程】第87章 STM32H7的SDMMC总线基础知识和HAL库API
  16. 有声小说php采集站源码下载,PTCMS小说站源码 可听书 可下载 带自动采集和搭建视频教程...
  17. 【金猿投融展】Kyligence——改变人类使用数据的习惯
  18. “物联网开发实战”学习笔记-(二)手机控制智能电灯
  19. 信息学奥赛/CSP/NOIP是什么?怎么规划?
  20. K8s PV和PVC(动态)

热门文章

  1. 修改Android模拟器的IMEI号
  2. Python pyserial 串口工具
  3. dorado java_[Java教程]dorado 7 使用总结
  4. 验证OpenCV安装是否成功工程测试模板
  5. 一张图看懂“火星坐标系”
  6. pr获取无字幕视频素材和常用素材的网站
  7. 微信导航——引入百度地图api
  8. 概率论基础-严士健 第二版 习题与补充2.1答案
  9. 苹果手机连电脑只显示充电怎么办
  10. 【Linux】Debian 连接惠普打印机并共享