ALSA子系统(一)------Frames Periods
你好!这里是风筝的博客,
欢迎和我一起交流。
FramesPeriods
一帧(frame)相当于要播放的一个样本,而与通道数或位数无关。
例如
- 1帧立体声48khz 16位PCM流为4字节.
- 1帧5.1声道 48khz 16位PCM流为12字节.
一个周期(period)是每个硬件中断之间的帧数。 poll()将每个周期返回一次。
缓冲区(buffer)是环形缓冲区。缓冲区大小必须始终大于一个周期大小,通常是2 * 周期的大小,但是某些硬件每个缓冲区可以做到支持8个周期,缓冲区大小也可能不是周期大小的整数倍。
现在,如果硬件已设置为48K Hz,2个周期,每个周期有1024个帧,缓冲区大小为2048帧。硬件将处理每个缓冲区会中断2次。 ALSA将努力保证缓冲区尽可能是满的。一旦播放了第一周期的样本(samples ),则将第三周期的样本数据转移到第一周期样本数据所占用的空间,同时播放第二周期样本。 (正常的环形缓冲区行为)。
Additional example
这是上述讨论的替代示例。
假设我们要处理一个立体声,16位,44.1 KHz的音频流,单向的(即播放或录音)。 然后我们有:
- 立体声(stereo) = 2通道
- 1个模拟样本(analog sample)16位= 2字节
- 1帧代表来自所有通道的1个模拟样本; 这里我们有2个通道,依此类推:
- 1帧=(通道数)(以字节为单位的1个样本大小)=(2个通道)(每个样本2个字节(16位))= 4个字节(32位)
- 要维持2x 44.1 KHz模拟采样率,系统必须能够支持以Bytes / sec为单位的数据传输速率:
- bsp_rate =(通道数)(以字节为单位的1个样本大小)(采样率)=(1帧)(采样率)=(2个通道)(2个字节/样本)*(44100样本/秒)= 2 * 2 * 44100 = 176400字节/秒
- bsp_rate =(通道数)(以字节为单位的1个样本大小)(采样率)=(1帧)(采样率)=(2个通道)(2个字节/样本)*(44100样本/秒)= 2 * 2 * 44100 = 176400字节/秒
现在,如果ALSA每秒中断一次,对于请求的字节大小,我们需要每秒准备好176400字节(在每秒结束时),以便在44.1Khz上维持16位模拟立体声。
- 如果它每半秒钟中断一次,则对于相同的流,对于每个中断我们需要准备176400/2 = 88200字节;
- 如果中断每100毫秒触发一次,则对于每个中断我们需要准备176400 *(0.1 / 1)= 17640字节。
通过设置以帧为单位的周期大小,我们可以控制何时生成此PCM中断。
- 因此,如果我们设置16位双通道44.1k的音频流,并且period_size为4410帧=>(对于16位双通道 44.1Khz,则1帧等于4个字节,因此4410帧等于4410 * 4 = 17640字节)=> 每17640字节(即每100毫秒)将产生一个中断。
- 相应地,buffer_size应该至少为2 * period_size = 2 * 4410 = 8820帧(或8820 * 4 = 35280字节)。
ALSA是运行时来决定实际的buffer_size和period_size,具体取决于:请求的通道数及其各自的属性(速率和采样分辨率) ,以及在snd_pcm_hardware结构中设置的参数(在驱动程序中)。
“帧”(frames)代表单位,1帧=通道 * sample_bytes。
在您的情况下,一帧对应于2个通道x 16位= 4字节。
周期是指环形缓冲区中的周期数。 在OSS中,称为作为“片段”。
所以
- buffer_size = period_size *周期
- period_bytes = period_size * bytes_per_frame
- bytes_per_frame =通道* bytes_per_sample
我还是不明白’period_size’和’period’是什么?
“period”定义了更新状态的频率,通常通过中断的调用。
“ period_size”定义帧大小对应于“period time”。
这个术语对应于OSS上的“片段大小”。 在主要的声音硬件上,环形缓冲区分为几部分,并在每个边界上产生一个irq。
period_size定义此块的大小。
在某些硬件上,irq是根据计时器控制的。 在这种情况下,将周期定义为调用irq的计时器频率。
来自:https://alsa-project.org/main/index.php/FramesPeriods
ALSA子系统(一)------Frames Periods相关推荐
- ALSA子系统(十二)------ALSA Buffer的更新
你好!这里是风筝的博客, 欢迎和我一起交流. PCM 数据管理可以说是 ALSA 系统中最核心的部分. 不管是录音还是播放,都要用到buffer管理数据. 播放:copy_from_user 把用户态 ...
- ALSA子系统(十七)------支持Type-C耳机驱动
你好!这里是风筝的博客, 欢迎和我一起交流. 之前讲解了耳机驱动: ALSA子系统(十六)------虚拟耳机驱动 Android音频子系统(四)------耳机拔插流程 那么必然少不了现在市场上较多 ...
- ALSA子系统(七)------simple_card添加虚拟声卡
你好!这里是风筝的博客, 欢迎和我一起交流. 我们知道,asoc框架里面主要包含machine codec platform 这三大部分, (1)machine:单板相关内容,表明声卡中所用的主芯片( ...
- ALSA子系统(五)------XRUN排查
你好!这里是风筝的博客, 欢迎和我一起交流. 什么是XRUN?相信做音频的童鞋都不陌生. 它是缓冲区不足或溢出,X代表不足或溢出.在这两种情况下,都表明系统速度不够快,未能及时处理来自ALSA音频缓冲 ...
- ALSA子系统(十六)------虚拟耳机驱动
你好!这里是风筝的博客, 欢迎和我一起交流. 在这之前,我们需要知道一些耳机类型的基本知识: 耳机有很多类型,图片左边带麦克的耳机术语叫做headset,右边不带麦克的术语叫做headphone. h ...
- RK3399平台开发系列讲解(ALSA子系统)4.37、ALSA驱动框架
- ALSA子系统(十八)------指纹解锁动画提示声卡顿问题解析
你好!这里是风筝的博客, 欢迎和我一起交流. 很久没写kernel相关的东西了,主要是来到手机厂之后,大部分还是在Android上,Kernel虽然也有涉及,但毕竟只是有所涉及,主要业务逻辑还是在HA ...
- ALSA子系统(六)------POP音排查
你好!这里是风筝的博客, 欢迎和我一起交流. POP音基本原理 这个POP音的产生主要是因为codec开始工作时,耳机等输出或mic输入声道上的直流电平跳变产生的:手机或一般的手持设备上不会有负电压, ...
- ALSA ASOC
1 ALSA 1.1 架构简述 ALSA是Advanced Linux Sound Architecture 的缩写, 官网 : http://www.alsa-project.or ...
最新文章
- leetcode--对称二叉树--python
- 高并发场景下,到底先更新缓存还是先更新数据库?
- 如何在NLP领域应用卷积神经网络CNN
- 为什么说基于比特币现金的0确认是必要的?
- 9种没结果的爱(未婚者必读)!!!
- 基于wifi的单片机无线通信研究_SKYLAB:智能家居无线协议WiFi/BLE/Zigbee介绍与对比...
- 分享一道阿里Java并发面试题 (详细分析篇)
- 单硬盘上mac + win7双系统,GUID-GPT分区
- Oracle推出支援.NET 3.5与Visual Studio 2008的开发工具
- 用MySQL写怎么删除字母_mysql如何替换掉字母
- c语言交换两个变量的值 讲课,用C语言的泛型实现交换两个变量值
- python中syntaxerror_【已解决】Python中两个星号**参数去传递给函数出错:SyntaxError invalid syntax...
- LeetCode#67--Add Binary(用Java实现二进制相加)
- 老计算机教师,老教师能用好信息技术吗?
- matlab模块里有s,求助!!S-Function做通用模块
- 《神经网络与深度学习》- 邱锡鹏(更新)
- Guided Anchoring:在线稀疏anchor生成方案,嵌入即提2AP | CVPR 2019
- 解决File Cache Conflict
- TCP,UDP,IP,数据链路层头部详解
- Redisson(2-3)分布式锁实现对比 VS Java的ReentrantLock的FairLock