ALSA 配置文件简介

article/2025/10/3 2:50:32

参考自:asoundrc文件
    asoundrc配置文件简单介绍
    asound.conf 插件讲解

文章目录

  • 1、Asoundrc
    • 1.1、什么是asoundrc文件?
    • 1.2、为什么需要asoundrc文件?
    • 1.3、asoundrc文件什么时候被加载的?
  • 2、Plugin(插件)
    • 2.1、Plugin: hw
    • 2.2、Slave 定义
    • 2.3、Plugin: Rate
    • 2.4、Plugin: Route & Volume
    • 2.5、Automatic conversion plugin
    • 2.6、Plugin: dmix
    • 2.7、Plugin: dsnoop
    • 2.8、实现虚拟多通道设备
  • 3、附录

做alsa的基本都能体会到alsa-lib的复杂与强大,而alsa-lib的强大正是从asound.conf与.asoundrc等配置文件体现出来的。alsa驱动开发只是一个方面,而真正想随心所欲的配置音频设备,asound.conf与.asoundrc的掌握是必不可少的。所幸,这方面的资料还是比较丰富,所需了解的知识点基本都能从官网上找到文档甚至example。

Alsa-lib层,为不同的驱动提供统一的接口alsa API,简化了开发人员对于驱动层的调用开发。接口定义地址:

https://www.alsa-project.org/alsa-doc/alsa-lib/

关于asound.conf的配置,可以参考官网解释:

https://www.alsa-project.org/main/index.php/Asoundrc

详细的插件讲解,官网网址:

https://www.alsa-project.org/alsa-doc/alsa-lib/pcm_plugins.html

1、Asoundrc


1.1、什么是asoundrc文件?

这里asoundrc文件实际上包含两个文件: “.asoundrc”“asound.conf”

.asoundrc 是一个隐藏文件,是针对个人用户的配置文件,存在于用户主目录下。asound.conf 则是全局的配置文件。

1.2、为什么需要asoundrc文件?

事实上,asoundrc(.asoundrcasound.conf)文件对ALSA来说,不是必须的配置文件,也就是说,无论它存不存在,都不影响ALSA的正常工作。那么既然这样,它存在的意义是什么呢?使用asoundrc文件可以实现更多对card/device的高级控制。例如在alsa-lib层进行通道路由和采样率转换,把多块声卡合为一块或者访问多通道卡的多个I/O。然而通过ALSA-lib库这两个文件能够为应用程序提供额外的功能,如通道路由,样本rate转换。

1.3、asoundrc文件什么时候被加载的?

alsa-lib 库将 /usr/share/alsa/alsa.conf 配置文件作为主要的入口点。其他文件在哪是否需要都由这个文件决定。 alsa.conf中自动加载系统全局自定义设置文件 /etc/asound.conf 和用户自定义配置文件 ~/.asoundrc

在这里插入图片描述
这个文件在调用 snd_pcm_open 这个api函数时,会被加载同时解析。

2、Plugin(插件)


在ALSA中,PCM插件扩展了PCM设备的功能和特性。插件可以自动处理诸如:命名设备、采样率转换、通道间的采样复制、写入文件、为多个输入/输出连接声卡/设备(不同步采样)、使用多通道声卡/设备以及其他可能留给你的开发任务。

2.1、Plugin: hw

此插件直接与ALSA内核驱动程序通信,它是一种没有任何转换的原始通信。

pcm.name {type hw         # Kernel PCMcard INT/STR        # Card name (string) or number (integer)[device INT]        # Device number (default 0)[subdevice INT]     # Subdevice number (default -1: first available)[sync_ptr_ioctl BOOL]   # Use SYNC_PTR ioctl rather than the direct mmap access for control structures[nonblock BOOL]     # Force non-blocking open mode[format STR]        # Restrict only to the given format[channels INT]      # Restrict only to the given channels[rate INT]      # Restrict only to the given rate[chmap MAP]     # Override channel maps; MAP is a string array
}

nonblock选项指定设备是否以非阻塞方式打开。注意此选项并不会更改读/写访问的阻塞行为。只影响打开设备时的阻塞行为。如果想保持与旧ALSA版本的兼容性,请关闭此选项。

下面是一个例子:

用vi命令在你的home目录或root目录下创建一个asoundrc配置文件:vi /home/xxx/.asoundrc (或者在打开 /etc/asound.conf 文件)

将下面的代码拷贝到该文件中并保存:

pcm.!default {type hwcard 0
}ctl.!default {type hw           card 0
}

名字为default的声卡,指向card0,也就是hw:0,0,测试命令:aplay -D default test.wav

注意:ALSA库定义的default 设备是 hw:0,0。 由 !default 指定的内容将替换ALSA lib API定义的。

hw后面跟的数字是声卡号和设备号,可以用如下命令查看硬件支持声卡数:

cat /proc/asound/cards 或者 ls /dev/snd (注:pcm0c (capture), pcm0p (playback))
在这里插入图片描述

2.2、Slave 定义

在ALSA中,PCM插件扩展了PCM设备的功能和特性。插件可以自动处理诸如:命名设备、采样率转换、通道间的采样复制、写入文件、为多个输入/输出连接声卡/设备(不同步采样)、使用多通道声卡/设备等工作。要使用它们,开发者需要创建一个虚拟从属设备(slave device)。

pcm_slave.NAME {pcm STR     # PCM name# orpcm { }     # PCM definitionformat STR  # Format or "unchanged"channels INT    # Count of channels or "unchanged" stringrate INT    # Rate in Hz or "unchanged" stringperiod_time INT # Period time in us or "unchanged" stringbuffer_time INT # Buffer time in us or "unchanged" string
}

一个最简单的slave用例:

pcm_slave.sltest {pcm "hw:1,0"
}

上面的实例定义了一个没有任何参数的slave,实际上也就仅仅是给声卡设备定义了一别名而已。对于需要参数的情况,需要注意一点 “PCM types”的参数必须定义在 slave-definition-block ,例如下面这两种方式定义是一致的:

pcm_slave.sl2 {pcm "hw:1,0"rate 48000
}pcm.rate_convert {type rateslave sl2
}

或者

pcm.rate_convert {type rateslave {pcm "hw:1,0"rate 48000}
}

在slave设备配置中加入采样率转换。注意,这两种方式中参数定义的位置。

调用这个设备播放音频的例子: aplay -D rate_convert test.wav ,此时是以48kHz的采样率对test.wav进行播放。

上面的用例用到了 Plugin: Rate

2.3、Plugin: Rate

这个插件可以转换采样率,但是输入输出格式必须为线型。

pcm.name {type rate               # Rate PCMslave STR               # Slave name# or

http://chatgpt.dhexx.cn/article/IsEAqnOP.shtml

相关文章

Linux ALSA 之五:ALSA Proc Info

ALSA Proc Info 一、概述二、Proc Files of Alsa Driver1、/proc/asound/xxx 简述2、创建 /proc/asound 目录树2.1 /proc/asound/version 文件2.2 /proc/asound/devices 文件2.3 /proc/asound/cards 文件2.4 /proc/asound/cardx 目录2.5 /proc/asound/pcm 文件 一、概述 Linux…

Linux ALSA 之二:ALSA 声卡与设备

ALSA 声卡与设备 一、ALSA Sound 初始化1、alsa_sound_init() 入口函数2、init_soundcore() 入口函数 二、声卡结构体与创建、注册1、struct snd_card2、声卡创建流程3、声卡创建过程使用举例 三、声卡之 Pcm 设备1、Pcm 设备简介2、ALSA Driver 的 Pcm 中间层3、Pcm 设备创建 …

ALSA音频编程

一、前序 这里了解一下各个参数的含义以及一些基本概念。 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语。 样本长度(sample):样本是记录音频数据最基本的单位,计算机对每个通道采样量化时数字比特…

alsa 驱动介绍

Machine 以装配有CS4270的一款android 智能电视的为例 /sound/soc/samsung/exynos.c Platform 以Samsung cpu exynos4412为例 /sound/soc/samsung/ Codec 以wolfson的Codec芯片cs4270为例 /sound/soc/codecs/cs4270.c ALSA 框架介绍 Alsa 太多太杂,很难整理的规整&a…

ALSA Configure

0. 前言 本文主要介绍alsa-lib配置文件相关代码的分析内容。 1. 配置文件的路径 在alsa-lib中,函数 snd_config_topdir 用于获取配置文件的路径,有两个方法可以进行配置: 使用环境变量 ALSA_CONFIG_DIR 进行配置。在生成configure时&…

ALSA应用层编程播放音乐

关于ALSA,网上也有介绍,但是我在看的时候看的也是一脸懵逼,不是介绍的不好,是因为我之前对于嵌入式软件这一块实在没什么了解,之前一直学的JAVA,整个体系跟JAVA还是有很大的区别,要学的也完全是…

ALSA系统简析

一 音频架构 如图所示 是 嵌入式系统的音频连接 音频编解码器将数字音频信号 转换成 扬声器播放所需要的模拟声音信号。而通过麦克风时,则执行相反的过程。 数字音频信号通过 PCM技术对模拟信号以某个比特率采样得到的,编解码器的任务就是以支持的PCM…

ALSA编程精华

https://www.cnblogs.com/cslunatic/p/3677729.html 一、前序 这里了解一下各个参数的含义以及一些基本概念。 声音是连续模拟量,计算机将它离散化之后用数字表示,就有了以下几个名词术语。 样本长度(sample):样本是记录音频数据最基本的…

ALSA学习笔记

文章目录 一、概述二、系统架构三、常用操作命令1、安装ALSA2、查看音频设备3、列出音频设备4、音量控制器 四、常见问题1、cannot open mixer: 没有那个文件或目录 一、概述 ALSA(Advanced Linux Sound Architecture),高级Linux声音架构的简…

音频ALSA架构简介

一、ALSA架构 ALSA(Advanced Linux Sound Architecture)即高级 Linux 声音架构。 嵌入式移动设备的音频子系统目前主要是ALSA 驱动 asoc 框架,其中包括 codec driver、 platform driver、 machine driver 等。 codec driver只关心 codec 本身…

Linux ALSA 之一:ALSA 架构简介

一、概述 ALSA是 Advanced Linux Sound Architecture 的缩写,目前已经成为了linux的主流音频体系结构。 在 Linux 内核设备驱动层,ALSA 提供了 alsa-driver,在应用层,ALSA 为我们提供了 alsa-lib,故在其支持下&#…

ALSA (高级Linux声音架构)、ASOC基础知识

目录 第一节:什么是ALSA和ASOC 第二节:ALSA框架 第三节:ALSA的使用 第四节:ASOC的硬件框架 第四节:ASOC的软件框架 第一节:什么是ALSA和ASOC ALSA是Advanced Linux Sound Architecture,高级…

动态链接库dlopen的函数的使用

转自&#xff1a;http://blog.const.net.cn/a/17154.htm 编译时候要加入 -ldl (指定dl库) dlopen 基本定义 功能&#xff1a;打开一个动态链接库 [喝小酒的网摘]http://blog.const.net.cn/a/17154.htm 包含头文件&#xff1a; #include <dlfcn.h> 函数定义&#xff…

dlopen的用法

1、前言 为了使程序方便扩展&#xff0c;具备通用性&#xff0c;可以采用插件形式。采用异步事件驱动模型&#xff0c;保证主程序逻辑不变&#xff0c;将各个业务已动态链接库的形式加载进来&#xff0c;这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用&#xff…

织梦上一篇下一篇没有了改为英文

织梦上一篇下一篇没有了改为英文 网站根目录找到 include/arc.archives.class.php 文件 打开找到 上一篇改为 Previous上一篇后面的“没有了” 改为 No Previous原图修改后 接着放下翻&#xff0c;紧贴着下面的“下一篇&#xff0c;没有了” 找到 下一篇改为 在这里插入…

在wordpress文章页中显示上一篇和下一篇文章

查看原文&#xff1a;http://www.hellonet8.com/1162.html 今天博主在看别人博客的时候发现他们的文章末尾会有显示上一篇和下一篇的文章链接&#xff0c;所以也想在自己的博客中添加这个功能。这么做顺便可以增加文章之间的相关性&#xff0c;对搜索引擎的蜘蛛也会友好些。废话…

js 实现 点击上一篇、下一篇功能

列表界面&#xff1a; 详细界面&#xff1a; 思路&#xff1a; 1. 首先目录列表渲染的数据是通过接口调用取到的值&#xff0c;然后点击具体某一条数据的时候&#xff0c;获取到他的 ID&#xff0c;然后通过路由跳转的时候带到详细信息页面。 2. 在详细页面中&#xff0c;先再…

Vue中 实现上一篇下一篇的功能

效果&#xff1a; 看下html页面 <div class"NewsDetails_cont_footer"><!-- 使用三目运算符判断 按钮是否可以点击 --><div click"last" :class"lastNoShow ? noClick : btn"><img src"../assets/img/newsDetail/公共…

java实现上一篇下一篇功能

根据文章类型查询&#xff0c;实现上一篇、下一篇的效果 自定义实体Dto(这里只放出扩展字段) Getter Setter public class OsArticleDto extends BaseDto {/** */private static final long serialVersionUID 1L;/** 上一篇文章id*/private String beforeId;/*** 上一篇文章…

vue实现上一篇下一篇

先来看一下效果图 请求回来所有文章&#xff0c;根据索引进行上一篇下一篇的判断 首先为两个按钮绑定点击事件 <buttonclick"last(lastId, columnId)":disabled"isLast":class"{ disClick: isLast true }">上一篇:{{ lastTitle }}</b…