理解ALSA

最近处理音频的问题,所以看了一些不错的文章,整理一些有用的资料出来,有需要的可以收藏。

ALSA的框架图:

这个图可以说是我目前看到最不错的,我发现很多应用开发的,一出现解决不了的问题,或者奇怪的问题,就会怀疑内核,所以对alsa架构的理解一定会对你有帮助的。

20ec072898c090ed26022c953942a718.jpeg

内核有一个ringbuffer来存储应用的数据,然后再通过DMA和ADC或者DAC通信,我们在内核基础上开发ALSA应用,是有很多接口来读取、控制ALSA的接口。

ringbuff的大小,以及ringbuff的读写指针位置,以及ringbuff剩余空间大小,有对应的设备节点来读取。

2b3769df629c1737b23061b3f7287417.png

除了上面的STATUS还有两个可以查看的参数

88a10d99bbd52b38653f194fec72064d.png

rc =snd_pcm_hw_params(handle, hw_params);


snd_pcm_sw_params(handle, sw_params)

这些参数的解释

period_size:每次传输的音频数据大小,字节数,如果是非阻塞播放的话,这个值越小,那每次给内核ringbuff传数据就越小,那CPU占用率就越大,当然,系统的音频延时也就越小了。 

period_count:缓之冲区period的个数。

start_threshold:从应用传输数据到内核后,缓冲区的数据超过这个值时DMA开始启动传输。如果设置的值太大,那数据量很小的时候,DMA就不启动发送数据给Codec导致音频数据播放不出来,这个值建议是越小越好。 

stop_threshold:缓冲区空闲区大于该值时,硬件停止传输。默认情况下,这个数 为整个缓冲区的大小,即整个缓冲区空了,就停止传输。但偶尔的原因导致缓冲区空, 如CPU忙,增大该值,继续播放缓冲区的历史数据,而不关闭再启动硬件传输(一般此时有明显的声音卡顿),可以达到更好的体验。  

silence_threshold:这个值还不是很清楚他的用途,有知道的可以留言解释下。

avail_min:缓冲区空闲区大于该值时,pcm_mmap_write()才往缓冲写数据。这个 值越大,往缓冲区写入数据的次数就越少,面临XRUN的机会就越大。


获取ringbuff中的缓存值

这是最近遇到的一个问题,这持续播放的时候,我使用snd_pcm_avail函数读取内核缓存的值,发现随着系统的运行,这个值就越来越小,那就说明我们系统在运行中的时候有累积的一些数据没有得到播放。

关于这个函数的解释

https://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m.html#ga577b4d51e08d94930a05bbe73291ed2a

e6c3a2a45812f93cfcf33c8604586499.png

中文意思:

对于录音是当前可以读取的音频字节数。

对于播放是当前可以写的音频字节数,如果内核的缓存越来越小,这个值也会越来越小。

搞音频的可以看看这几个博客:

https://zhuanlan.zhihu.com/p/537562136

https://www.cnblogs.com/cslunatic/p/3677729.html

6216dc53c932cacba015d1c09d69933a.jpeg

0dba8db92bfba5fbcc16a3947ff799cd.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Xshell 6如何设置多个session显示在同一个窗口

刚才安装了Xshell 6之后,发现在同一个窗口只能显示4个session,网上查找了一些资料但是都不是想要的结果,经过几分钟的查找,终于找到了设置在同一个窗口session的个数,因此记录下来,或者给与他人帮助。以下以…

appium+java(五)微信小程序自动化测试实践

前言: 上一篇《appiumjava(四)微信公众号自动化测试实践》中,尝试使用appium实现微信公众号自动化测试,接着尝试小程序自动化,以学院小程序为例 准备工作 1、java-client 3.4.16依赖包 2、微信应用版本7.0.…

blockUI应用到Asp.Net页面时服务器控件(Button等)失效的问题

问题:在Asp.Net页面中用blockUI这个控件实现弹出窗口的效果,弹出页面内容为页面中某个Panel中的内容,包含TextBox、Button等服务器控件。使用时就简单的设置message属性。问题出来了,当显示这个弹出页面后,所有Button等…

android DatePicker

为什么80%的码农都做不了架构师?>>> public class DatePicker extends FrameLayout java.lang.Object android.view.View android.view.ViewGroup android.widget.FrameLayout android.widget.DatePicker DatePicker 一个选择年月日的日历布局视图 公…

一次限制进程的 CPU 用量的实操过程

大家好,我是飞哥!给大家分享一个事情。背景是这样的,我们要测试某个第三方 SDK 运行性能,这是个 CPU 密集型的服务。我想评估一下它运行一遍到底有多吃 CPU,以便评估上线后我们需要部署多少台服务器。我们是在一台 16 …

map与unordered_map的区别

set/map底层实现的机制是红黑树。红黑树是一种近似于平衡的二叉查找树,默认是按升序排序的。在红黑树上做查找、插入、删除操作的时间复杂度为O(logN)。 红黑树的缺点:空间占用率高,每一个节点都需要额外保存父节点、孩子节点和红/黑性质&am…

navicat不同数据库数据传输

复制fo的t_fo_account表结构和数据到base库 结果 转载于:https://www.cnblogs.com/feifeicui/p/10307646.html

Win2003 IIS下,ASP.NET无法访问数据库和网页

1.Win2003 IIS下,ASP.NET无法访问网页 将IIS的 允许ASP 设置为允许. 2.Win2003 IIS下,ASP.NET无法访问数据库(这里我用的是Oracle9i) 1)将网站的虚拟目录 添加 ASP.NET 和 NETWORK_SERVICE用户. 2)oracle目录下ora92目录的Authenticateduser用户 去掉勾中的权限 再勾上权限. 最…

FTP自动上传日期命名文件

说明:此文章是从http://177048.blog.51cto.com/167048/919374转载过来的,若有侵权之处,请联系本人,及时删除,谢谢! 需求:将每天备份的数据以当天日期命名,并定时上传到FTP服务器上。…

收藏了两年的嵌入式AI资源学习笔记,今天全分享给大家(附代码/资料/视频/学习规划)...

当前乃至未来5-10年,嵌入式开发者还有哪些风口?”画外音:风口的本质,其实就是一段时间的人才供需不平衡。说白了就是由于行业突变,敏锐的资本快速进入,导致短时间内行业大量扩张,需要大量开发者…

gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

今天看到了一篇文章,写的挺好就将其转载, https://blog.csdn.net/zhangzq86/article/details/80840927 Gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对{编译时间,目标文…

Vmware由于centos升级内核不可运行(C header files matching your running kernel were not found)的解决方案...

C header files matching your running kernel were not found. Refer to your distributions documentation for installation instructions - NoH4cker - 博客园 http://www.cnblogs.com/NoH4cker/p/4840571.html centos6 安装wmwaretools找不到kernel header - jiejnan - 博…

分享一个消息组件

前段时间在收集项目素材时发现一个很好用的消息组件ymPrompt,顺便收集了圈子里关于这个组件的文章,感觉介绍不是很完善。 废话少说先看一下演示效果: 演示Demo: http://www.ajaxbbs.net/test/ymPrompt4.0/demo.html 截取的图片: Vista样式 简短的实现脚本: Code--导…

用C语言搞机器学习,来个最基础的Knn入门

本来是准备周末加班两天的,然后,临时突然其他事情又取消了。顺便看了下csdn,看到一篇介绍KNN的,因为我现在做的也是属于机器学习方向,那自然也要了解一些这部分。KNN是什么?KNN可以说是最简单的分类算法之一…

如何解决padding标记在ie7、ie6以及firefox中的兼容问题

*html 与 *html 是IE特有的标签, firefox 暂不支持.而*html 又为 IE7特有标签。所以要解决padding的兼容问题就要靠前面提到的标签。 以sccas-site为例,左侧导航栏在padding上产生了ie6、ie7以及ff浏览器不兼容,修改代码如下: #menu7 li a {h…

linux编译动态库之fPIC

转载:https://blog.csdn.net/sinc00/article/details/44833839 今天在用g编译代码时,提示说.rdata错误,然后网上找了一堆资料,最后明白了一个要重新编译对应的链接库。 在生成动态库时,常常习惯性的加上fPIC选项&…

每周一题 扫雷问题

扫雷问题 #include<iostream> #include<vector> #include<iostream> using namespace std; int direct[8][2]{ {1,0}, {1,1}, {1,-1}, {0,1}, {0,-1}, {-1,0}, {-1,1}, {-1,-1} }; int main(){int m, n, t0;while(1){cin>>m>>n;if(m0&&n…

Oracle学习笔记:通过种子数据库设置dbid为指定值

简介&#xff1a;dbms_backup_restore包真是太强大了。和设置dbid有关的存储过程如下&#xff1a; PROCEDURE nidbegin  (newdbname IN varchar2,       olddbname IN varchar2,       newdbid IN number, …

最简单的断线断点检测器电路

要在长长的电线中找到究竟是哪里断开了&#xff0c;可以做一个断线断点检测器。而且几个元器件就可以实现&#xff0c;非常简单。这个断线断点检测器不仅可以识别火线、零线&#xff0c;还可以检测电线是哪里断开了。实际是检测哪里的磁场强&#xff0c;哪里的电磁辐射大。来看…

gcc/g++ 编译时报错原因分析之expected type-specifier before

因为没有引入相应的头文件&#xff0c;找到对应的头文件&#xff0c;加入相应的cpp中即可解决。