分类: LINUX

1) PCM设备的句柄.
2) 指定同时可供回放或截获的PCM流的方向
3) 提供一些关于我们想要使用的设置选项的信息,比如缓冲区大小,采样率,PCM数据格式等
4) 检查硬件是否支持设置选项.
   4.1) 初始化PCM变量
   4.2) 分配hwparams结构
   4.3) 打开PCM设备
   4.4) 以声卡的全部设置选项空间来初始化hwparams结构
   4.5) 指定访问类型,采样格式,采样率,声道号码,周期数目以及周期大小
        a) 访问类型 :指定了哪一个多声道数据储存在缓冲区的方法.
             *对于交错访问,缓冲区里的每一个帧为声道容纳连续的采样数据.
             *对于非交错访问,每一个周期为第一个声道容纳所有采样数据接着是第二个声道的采样数据
        b) 缓冲区尺寸的单元依赖于函数.一些时候是字节,一些时候是必须指定的帧的数目.
           一个帧是对所有声道的采样数据数组.对于16位立体声数据,一个帧的长度是4个字节.
           如果你的硬件不支持2的N次方的缓冲区大小,你可以使用snd_pcm_hw_params_set_buffer_size_near函数.这个函数工作起来与snd_pcm_hw_params_set_rate_near相似.
5) 为PCM设备申请由pcm_handle指向的设置选项

备注资料:

设备命名
API 库使用逻辑设备名而不是设备文件。设备名字可以是真实的硬件名字也可以是插件名字。硬件名字使用hw:i,j这样的格式。其中i是卡号,j是这块声卡上的设备号。第一个声音设备是hw:0,0.这个别名默认引用第一块声音设备并且在本文示例中一真会被用到。插件使用另外的唯一名字。比如 plughw:,表示一个插件,这个插件不提供对硬件设备的访问,而是提供像采样率转换这样的软件特性,硬件本身并不支持这样的特性。

声音缓存和数据传输
每个声卡都有一个硬件缓存区来保存记录下来的样本。当缓存区足够满时,声卡将产生一个中断。内核声卡驱动然后使用直接内存(DMA)访问通道将样本传送到内存中的应用程序缓存区。类似地,对于回放,任何应用程序使用DMA将自己的缓存区数据传送到声卡的硬件缓存区中。
这样硬件缓存区是环缓存。也就是说当数据到达缓存区末尾时将重新回到缓存区的起始位置。ALSA维护一个指针来指向硬件缓存以及应用程序缓存区中数据操作的当前位置。从内核外部看,我们只对应用程序的缓存区感兴趣,所以本文只讨论应用程序缓存区。

应用程序缓存区的大小可以通过ALSA库函数调用来控制。缓存区可以很大,一次传输操作可能会导致不可接受的延迟,我们把它称为延时(latency)。为了解决这个问题,ALSA将缓存区拆分成一系列周期(period)(OSS/Free中叫片断fragments).ALSA以period为单元来传送数据。
一个周期(period)存储一些帧(frames)。每一帧包含时间上一个点所抓取的样本。对于立体声设备,一个帧会包含两个信道上的样本。

图1展示了分解过程:一个缓存区分解成周期,然后是帧,然后是样本。图中包含一些假定的数值。图中左右信道信息被交替地存储在一个帧内。这称为交错 (interleaved)模式。在非交错模式中,一个信道的所有样本数据存储在另外一个信道的数据之后。

period(周期):硬件中中断间的间隔时间。它表示输入延时。
声卡接口中有一个指针来指示声卡硬件缓存区中当前的读写位置。只要接口在运行,这个指针将循环地指向缓存区中的某个位置。
frame size = sizeof(one sample) * nChannels
alsa中配置的缓存(buffer)和周期(size)大小在runtime中是以帧(frames)形式存储的。
period_bytes = frames_to_bytes(runtime, runtime->period_size);
bytes_to_frames()

The period and buffer sizes are not dependent on the sample format because they are measured in frames; you do not need to change them.

Over and Under Run
当一个声卡活动时,数据总是连续地在硬件缓存区和应用程序缓存区间传输。但是也有例外。在录音例子中,如果应用程序读取数据不够快,循环缓存区将会被新的数据覆盖。这种数据的丢失被称为overrun.在回放例子中,如果应用程序写入数据到缓存区中的速度不够快,缓存区将会"饿死"。这样的错误被称为"underrun"。在ALSA文档中,有时将这两种情形统称为"XRUN"。适当地设计应用程序可以最小化XRUN并且可以从中恢复过来。

Alsa中PCM参数设置相关推荐

  1. Hibernate的HQL中in参数设置和JdbcTemplete中的in参数

    写代码的时候突然忘记了,在此记录一下: Hibernate的HQL中in参数设置 public void updateDeviceByIDS(Long[] devicepkarr, DeviceINF ...

  2. libvlc_media_add_option 函数中的参数设置

    libvlc_media_add_option   函数中的参数设置 Usage: vlc [options] [stream] ... You can specify multiple stream ...

  3. 对等网络限制计算机数量吗,Windows对等网中网络参数设置和资源共享.doc

    学生实验报告 实验课名称: 计算机网络教程 实验项目名称:Windows对等网中网络参数设置和资源共享实验 Windows对等网中网络参数设置和资源共享 一.实验目的 1. 学习Windows支持的网 ...

  4. ALSA中PCM的使用

    一.预备知识 1.声音分分类 (0)极低频: 20-40Hz (1)低频: 40-80Hz (2)中低频: 80-160Hz(3)中频: 160Hz-1280Hz这个频段之间横跨的幅度是最宽的,几乎把 ...

  5. Oracle数据库中processes参数设置

    PROCESSES 为连接Oracle数据库的最大进程数,该值包括了所有后台进程和并发进程.processes参数不建议设置特别大,因为当数据库实例启动时,会预先为每个process分配内存和信号量, ...

  6. vlc 详细使用方法:libvlc_media_add_option 函数中的参数设置

    [转载自]tinyle的专栏 [原文链接地址]http://blog.csdn.net/myaccella/article/details/7027962 [手记] 下面列出的参数可以在命令行中执行, ...

  7. unittest---unittest中verbosity参数设置

    我们在做自动化测试的时候,有时候想要很清楚的看到每条用例执行的详细信息,我们可以通过unittest中verbosity参数进行设置 verbosity参数设置 verbosity表示在只执行用例的过 ...

  8. QT样式表中 透明度 参数设置

    透明度设置 在样式表中,WindowOpacity 可以设置透明度.但是仅能设置 QMainWindow,若想设置 其它部件(button,label,widget等)的透明度,可以采用rgba的颜色 ...

  9. 贪婪投影三角化算法中的参数设置

    无序点云的快速三角化 本小节描述了怎样使用贪婪投影三角化算法对有向点云进行三角化,具体方法是先将有向点云投影到某一局部二维坐标平面内,再在坐标平面内进行平面内的三角化,再根据平面内三位点的拓扑连接关系 ...

最新文章

  1. mysql数据库备份方案_MySQL平台数据库备份方案详细说明
  2. Android 中文API (94) —— MediaController
  3. 除了海思麒麟 华为在ARM芯片上还有哪些成就?
  4. python爬虫流程-Python爬虫入门
  5. mysql中的存储过程和函数
  6. eclipse配置Struts2、Hibernate3、Spring2.5范例
  7. threejs向量夹角和夹角方向
  8. 懂技术对产品有哪些帮助?
  9. 将request.getParameterMap()转换成可操作的普通Map
  10. 详解OpenCV中的cvCreateMat()函数
  11. 使用sersync实现多台服务器实时同步文件
  12. 05Oracle P6培训系列:05创建项目
  13. Javascript回显图片
  14. Linux下安装及配置Discuz论坛
  15. 香港理工大学计算机系 主任,我校与香港理工大学合作MScIS项目第七期开学
  16. 工业机器人九龙坡区职教中心_重庆市九龙坡职业教育中心(职教中心)简介简介...
  17. 实战:浪潮服务器安装凝思 6.0.8 版本操作系统
  18. 使用JSONObject 读取 jason对象中的key
  19. Python: 用于计算txt文档的字数的小脚本
  20. Python商品数据预处理与K-Means聚类可视化分析

热门文章

  1. 面向对象重写(override)与重载(overload)区别
  2. TOMCAT启动到一半停止如何解决
  3. Android开发——RecyclerView特性以及基本使用方法(二)
  4. Linux 系统常用命令汇总(二) vi 文本编辑
  5. 用boost库实现traceroute小工具
  6. Vue — 第三天(计算属性和json-server)
  7. Python学习(二)语言基础
  8. 2018-2019-2 网络对抗技术 20165305 Exp6 信息搜集与漏洞扫描
  9. java/android 做题中整理的碎片小贴士(12)
  10. js 对已知数组数据的导出EXCEL