alsa pcm函数调用流程

ALSA音频架构 -- snd_pcm_open函数分析 alsa-lib主要是给抽象出来的一套ALSA应用程序的用户空间库,供具体的应用程序调用。alsa-utils 主要是相关的操作APP,可以充当官方demo,供开发人员参考。前文已经给出。本文主要详细分析snd_pcm_open。...... 阅读详情

请添加图片描述

用户的pcm_open()相当于先对ASoC各个驱动模块startup(),再做hw_params()。

 

pcm_open()
    pcm->fd = open("/dev/snd/pcmC0D0c")
        snd_pcm_capture_open()
            snd_pcm_open(SNDRV_PCM_STREAM_CAPTURE)
                snd_pcm_open_file()
                    snd_pcm_open_substream()
                        substream->ops->open()
                            soc_pcm_open()
                                cpu_dai->driver->ops->startup()
                                platform->driver->ops->open()
                                codec_dai->driver->ops->startup()
                                rtd->dai_link->ops->startup()
    ioctl(pcm->fd, SNDRV_PCM_IOCTL_HW_PARAMS, &params)
        snd_pcm_hw_params_user()
            snd_pcm_hw_params()
                substream->ops->hw_params()
                    soc_pcm_hw_params()
                        rtd->dai_link->ops->hw_params()
                        dai->driver->ops->hw_params()
                        platform->driver->ops->hw_params()
    ioctl(pcm->fd, SNDRV_PCM_IOCTL_SW_PARAMS, &sparams)

pcm_read()栈
用户的pcm_read()相当于做从内核缓冲区到用户缓冲区的copy_to_user()。即把硬件写到内核缓冲区的数据拷贝到用户缓冲区。(mmap模式例外,其没有数据拷贝的动作,性能更好)

pcm_read()
    if (!pcm->running)
        pcm_start()
        pcm->running = 1
    ioctl(pcm->fd, SNDRV_PCM_IOCTL_READI_FRAMES, &x)
        snd_pcm_lib_read()
            snd_pcm_lib_read1(transfer)
                transfer(substream, appl_ofs, data, offset, frames)
                    snd_pcm_lib_read_transfer()
                        substream->ops->copy() *or* copy_to_user()

pcm_start()栈
用户的pcm_start()相当于对ASoC的各个驱动模块做prepare()和trigger(START)动作

pcm_start()
    ioctl(pcm->fd, SNDRV_PCM_IOCTL_PREPARE)
        snd_pcm_prepare()
            snd_pcm_do_prepare()
                substream->ops->prepare()
                    soc_pcm_prepare()
                        rtd->dai_link->ops->prepare()
                        platform->driver->ops->prepare()
                        codec_dai->driver->ops->prepare()
                        cpu_dai->driver->ops->prepare()
    ioctl(pcm->fd, SNDRV_PCM_IOCTL_START)
        snd_pcm_action_lock_irq()
            snd_pcm_do_start()
                substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_START)
                    soc_pcm_trigger()
                        codec_dai->driver->ops->trigger()
                        platform->driver->ops->trigger()
                        cpu_dai->driver->ops->trigger()
                        rtd->dai_link->ops->trigger()

pcm_close()栈
用户的pcm_close()相当于对ASoC的各个驱动模块做trigger(STOP), hw_free()和shutdown()动作

pcm_close()
    close(pcm->fd)
        snd_pcm_release()
            snd_pcm_release_substream()
                snd_pcm_drop(substream)
                    snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP)
                        snd_pcm_do_stop()
                            substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_STOP)
                                soc_pcm_trigger()
                                    codec_dai->driver->ops->trigger()
                                    platform->driver->ops->trigger()
                                    cpu_dai->driver->ops->trigger()
                                    rtd->dai_link->ops->trigger()
                if (substream->hw_opened)
                    if (substream->ops->hw_free != NULL)
                        substream->ops->hw_free(substream)
                    substream->ops->close(substream)
                        soc_pcm_close()
                            cpu_dai->driver->ops->shutdown()
                            codec_dai->driver->ops->shutdown()
                            rtd->dai_link->ops->shutdown()
                            platform->driver->ops->close()
                    substream->hw_opened = 0

MTK Audio HAL 录音流程深度解析:从 AudioRecord.read() 到 ALSA pcm_read() 的 12 个关键函数 本文深入解析MTK Audio HAL录音流程,从AudioRecord.read()到ALSA pcm_read()的12个关键函数实现。详细剖析Android音频子系统的分层架构,揭示MTK平台如何通过生产者-消费者模型和观察者模式高效管理多路录音数据流,并针对不同输入源实现策略控制,为开发者提供全面的录音流程优化参考。 阅读详情

相关推荐

Linux ALSA声卡驱动之六:PCM的注册流程

一、PCM设备的基础介绍 PCM是英文Pulse-code modulation的缩写,中文译名是脉冲编码调制。我们知道在现实生活中,人耳听到的声音是模拟信号,PCM就是要把声音从模拟转换成数字信号的一种技术,他的原理简单地说就是利用一个固定的频率对模拟信号进行采样,采样后的信号在波形上看就像一串连续的幅值不一的脉冲,把这些脉冲的幅值按一定的精度进行量化,这些量化后的数值被连续地输出、传输...

肖岩 3967

ALSA driver--pcm_read和pcm_write的阻塞问题

一张图先看下pcm_write的调用流程 做的工作一是将数据送到dma 中,另外就是更新alsa的缓冲区指针 在snd_pcm_lib_write1接口中看到这样一个函数wait_for_avail wait_for_avail函数将会将当前写或读数据的任务通过add_wait_queue加入一个队列中,等待被唤醒,如果有没有收到唤醒,schedule_timeout将会挂起直到设置...

和大伙儿去乘凉 1万+

alsa-lib之snd_pcm_open

目录 版本获取 前言 snd_pcm_open时序图 代码流程 版本获取 使用版本 alsa 1.2.5.1 release | Changes v1.2.5 v1.2.5.1 https://www.alsa-project.org/wiki/Main_Page https://github.com/alsa-project 前言 我们都知道alsa-lib包含开发人员编译 ALSA 应用程序的用户空间库, 提供接口给应用调用的。前面我们了解过ALSA框架 ,本节我们主要介绍一下alsa-lib中sn

Fire的博客 5645

音频数据通路解析

介绍了wav文件的pcm数据从用户层到内核层最后到硬件codec的整个通路

雨天不打滑的博客 2579

alsa音频架构3-pcm

第十四部分 snd_pcm 1.pcm结构体 struct snd_pcm { struct snd_card *card; //声卡 struct list_head list; int device; //设备号 unsigned int info_flags; unsigned short dev_class; unsigned short dev_subclass; ch

paomadi的专栏 7891

Linux驱动学习--USB接口蓝牙芯片驱动补充(urb分析)及pcm_read简要分析

目录 一、引言 二、驱动分析 三、pcm_read简要分析 一、引言 本章是对之前一篇文章 Linux驱动学习–ALSA声卡驱动之PCM设备的参数设置及蓝牙SCO通话的调试的补充,这篇文章介绍了从上层到底层的蓝牙控制,我们今天就来针对底层驱动进行分析 二、驱动分析 USB接口的蓝牙芯片,结合了ALSA音频和USB总线框架,而其实对于驱动来说,也只是个普通的USB外设,只不过最后会将接收到的数据复制到ALSA的缓冲区中,所以,我们先来着重分析一下蓝牙驱动的USB部分 USB部分 首先在dts中定义对应的节点后

文艺小少年的博客 1571

linux_sound_alsa_ALSA体系SOC子系统中hw_params逻辑

linux_sound_alsa_ALSA体系SOC子系统中hw_params逻辑   linux/sound目录下ALSA体系SOC子系统中hw_params逻辑 链接分析:     core/pcm_native.c文件中snd_pcm_hw_params()函数调用err = substream->ops->hw_params(substream, params)。根据s

android 分析 844

Linux mic阵列实时录制 算法处理 UAC播放

本文讲解如何基于Linux系统做一个实时录播的UAC程序。网上大多都是要么pcm_read后直接调用pcm_write,完全没有对声音做处理,实用性不强,而且实时性不好。要么就是read write单开线程,但是没有做同步处理,稳定性不好,很容易产生延时和数据损坏,无法拿来做产品。而且UAC是无法一直向PC写,当PC端不录音的时候,因为会buffer溢出,然后pcm_write就报错的。 那如何做一个真正实现实时录播的程序,可以监听PC等其他上位机端的播放、停止动作,与操作端...

u013463707的专栏 2717

android alsa分析之一

snd_pcm_open 最近闲了,将去年分析的alsa库分析一下,和大家共享一下 ,请多多指点。 里面有一部分链接,图片等有需要可联系我 哈   硬 件: Arm  软件: Android 2.1  无论是在录音还是在放音,都要打开一个PCM流,具体对应的函数原型为:  int snd_pcm_open(snd_pcm_t **pcmp, const char *name,  s

4575

alsa pcm接口之pcm设备的状态STATE

alsa pcm接口之pcm设备的状态STATE

菜鸡搞计算机 2286

如何在离线的电脑上部署一个本地Deepseek(使用ollama)

例如,如果您的显卡显存为 16GB,官方推荐使用 32b 大小的 DeepSeek 模型。请根据您的硬件配置选择适合的模型版本,以获得最佳性能。首先我们需要将ollama和chatbox的安装包,Deepseek模型文件通过U盘或者光盘的形式导入到这台不能联网的电脑上。按照时间排序,找到最大的那个文件,就是gguf格式的模型,复制出来,改名为qwen2.5-coder0.5b.gguf。:基于开源模型(如 QWEN 和 LLAMA)微调,参数量从 1.5B 到 70B 不等,适合本地硬件部署。

qq_41854911的博客 1万+

alsa生成/dev/snd/下设备节点函数调用流程

alsa生成/dev/snd/下设备节点函数调用流程 snd_soc_register_card()->  snd_soc_instantiate_card()->   snd_card_register()->    snd_device_register_all()->     dev->ops->dev_register()->(函数指针)   ...

mandagod的博客 771

前导0预测(Leading-Zero Anticipator,LZA)

前导0预测(Leading-Zero Anticipator,LZA) 浮点加法在完成之后会进行尾数规格化移位,而在进行尾数加法时,可以使用前导0预测(Leading-Zero Anticipator,LZA)同时计算移位,前导0预测只发生在一个正数加上一个负数的情况下,电路图如图1所示。 图1 传统LZD算法和LZA算法 1. 基础算法 算法的目标是计算出加法结果序列左边连续0的数量,下文中对...

crw1111111的博客 7379

alsa lib源码分析

使用ALSA lib进行音频播放器开发的朋友都知道,ALSA的配置文件alsa.conf定义了一些简单的语法,通过这些语法记录了alsa环境变量。该文件在 /usr/share/alsa/alsa.conf.该文件开头处包含了用户可以配置的hook.用户自定义的配置信息可以保存在/etc /asound.conf或~/.asoundrc里,当然也可以自己定义的位置。 我们感兴趣的是,alsa l

martin的专栏 2496

【R语言-生存分析之观察生存率计算】

全人群肿瘤登记资料常用的统计分析指标包括发病率、死亡率、现患率以及生存率等,其中肿瘤生存率是评估肿瘤治疗效果和肿瘤负担的必要指标,其计算涉及肿瘤患者的发病、 死亡和随访三个方面的资料, 数据整理和计算过程均较为复杂, 如何及时、 准确地计算肿瘤生存率, 并使其可以在不同地区、 不同人群、不同时期间被客观公正地比较和评价,仍然是统计学家们一直在研究的主题。

weixin_46579654的博客 5440

AutoCAD 2024 LISP实用技巧:自定义快捷命令与高效绘图工具集

本文详细介绍了如何在AutoCAD 2024中部署和使用LISP脚本,打造高效绘图工具集。通过自定义快捷命令,如WFF(超级文字查找替换)、GQT(图层隔离)和LLTJ(智能长度统计),可大幅简化图层管理、文字编辑和测量统计等重复性操作,显著提升绘图效率。

gan8painter的博客 318

asla-lib库函数snd_pcm_open打开流程

本文转自:http://blog.chinaunix.net/uid-20564848-id-74356.html 《alsa声卡/dev/snd /pcmC0D0p的open打开流程》 杂记asla-lib库函数snd_pcm_open打开流程浅析ac97声卡intel8x0的DMA内存substream->dma_buffer什么时候被赋值浅析ac97声卡intel8x0的runtim...

zgp2917的专栏 2445

别再手动挂载NPU了!手把手教你用Ascend-Docker-Runtime一键启动昇腾AI容器

本文详细介绍了如何使用Ascend-Docker-Runtime一键启动昇腾AI容器,大幅简化NPU设备挂载流程。通过环境变量ASCEND_VISIBLE_DEVICES,开发者可以灵活指定NPU设备,提升开发效率。文章还提供了安装配置指南、高级使用技巧和常见问题排查方法,帮助开发者快速掌握这一高效工具。

weixin_42662605的博客 252

Linux ALSA声卡驱动之三:PCM设备的创建

声明:本博内容均由http://blog.youkuaiyun.com/droidphone原创,转载请注明出处,谢谢! 1. PCM是什么 PCM是英文Pulse-code modulation的缩写,中文译名是脉冲编码调制。我们知道在现实生活中,人耳听到的声音是模拟信号,PCM就是要把声音从模拟转换成数字信号的一种技术,他的原理简单地说就是利用一个固定的频率对模拟信号进行采样,采样后的信号

DroidPhone的专栏 8万+

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

模型实战(31)之 yolo26 实现对手部关键点数据集 的训练与关键点检测

yohnyang的博客 209

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程

本文为三相四线制整流器在中点电位不平衡时的Simulink仿真教程。首先分析中点电位漂移的电荷不平衡机理,提出零序电压注入控制策略。详细演示建模步骤:搭建三相四线制主电路,构建中点平衡控制算法(含MATLAB函数代码),实现控制信号叠加与PWM生成。通过对比仿真验证控制效果,并给出零序电压限幅、中性线电感影响等工程建议。该方案能有效抑制三相不平衡负载下的中点电位波动,保证系统稳定运行。

xiaoheshang_123的博客 50

ALSA声卡之PCM设备

这个结构非常重要,在注册ASoc声卡的时候会调用soc_new_pcm_runtime为每一个音频数据链路(struct snd_soc_dai_link)分配一个snd_soc_pcm_runtime,snd_soc_pcm_runtime是ASoc的桥梁,保存音频数据链路的dai,以及dai所属的component等信息。比较snd_soc_pcm_rutime和snd_soc_dai_link会发现这两个结构都是用来描述音频数据链路的,只不过一个描述静态数据,一个描述动态数据。

Seventeen_years_old的博客 1546

SAP物料主数据归档详解(物理删除)

顾问们的回答肯定的统一的不能,只能打上删除标记。物料设置好需要删除的物料号这里我们需要删除的物料是AG88,其中,若不选“考虑无删除标记的物料”,需要将需要归档的物料MM06打删除标记。平时在操作系统过程中经常会不小心创建出很多无用的物料主数据,但是系统只能通过MM06打上删除标记,但是物料最终在系统中还是可以查询到的。6、执行已设置变式的归档程序,执行完毕,点下图中的“Job”,每次执行完归档程序会产生两条作业。然后设置好开始的参数和假脱机的参数,三个都是绿灯就可以执行归档的操作,物理上删除物料主数据。

我小时候很黑的博客 5525

ALSA学习笔记 (3)PCM

ALSA学习笔记 (3)PCM1. 概述2. 示例代码2.1 创建pcm实例2.2 设置PCM设备的操作函数2.3 定义PCM的操作函数2.4 定义硬件参数3. 创建pcm实例代码分析5 PCM逻辑设备的注册6 PCM信息运行时指针6.1 硬件描述6.2 运行状态6.3 私有数据7 结构图 1. 概述 每个pcm实例对应一个pcm设备文件。一个pcm实例由一个playback stream和一个capture stream组成,而每个 pcm stream由一个或多个pcm子流组成。当一个子流已经存在,并且

小丑王 3098

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 抓取界面(framebuffer)图片方法
下一篇: 结构体,共用体所占字节数 ---- 内存对齐或者字节对齐
~我爱中国~
博客等级 码龄16年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值