Alsa UCM

Alsa Use Case Manager(用例管理器)描述如何为某些用例(如 “播放音频”、“通话”)设置 mixer 混频器。它还描述如何修改 mixer 混频器状态以将音频路由到某些输出和输入,以及如何控制这些设备。

这基本上涵盖了 Pulseaudio 中配置 (profile) 所做的相同的事情,除了 UCM 文件更容易编写,并且在不运行 Pulseaudio 的情况下也可以工作。如果声卡的 UCM 配置存在,则 pulseaudio 将忽略内置的配置 (profile),并基于 UCM 文件生成一个配置 (profile)。

官方文档:https://www.alsa-project.org/alsa-doc/alsa-lib/group__ucm__conf.html。

声卡名称

你需要做的第一件事是确定声卡名称,它被用作 UCM 主文件的目录和文件名。你可以使用 alsa-utils 包中的 aplay 命令来确定它:

$ apk add alsa-utils
$ aplay -l
card 0: sun50ia64audio [sun50i-a64-audio], device 0: 1c22c00.dai-sun8i-codec-aif1 sun8i-codec-aif1-0 [1c22c00.dai-sun8i-codec-aif1 sun8i-codec-aif1-0]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

在这个例子中你需要的名称是方括号中的第一个名称:sun50i-a64-audio

第一个用例

下一步是创建一个包含 mixer 混合器可用用例列表的文件。该文件将以上面小节中所述的规则命名:

/usr/share/alsa/ucm2/sun50i-a64-audio/sun50i-a64-audio.conf

Syntax 2

SectionUseCase."HiFi" {
	File "HiFi"
	Comment "Play high quality music"
}

对于每个用例,都将有一个 SectionUseCase 块。后面直接用引号括起来的名称是 “verb”,它是配置 (profile) 的内部名称。它必须是来自 alsa 的预定义用例之一。目前定义的有如下这些:

  • “Inactive”
  • “HiFi”
  • “HiFi Low Power”
  • “Voice”
  • “Voice Low Power”
  • “Voice Call”
  • “Voice Call IP”
  • “FM Analog Radio”
  • “FM Digital Radio”

要创建的最重要的配置 (profile) 是 HiFi,它是声卡的主音频播放配置 (profile)。对于其它一些配置 (profile),Alsa 并没有明确定义它们的实际用途。

配置 (profile) 的第一个设置是 File 行。这定义了包含该用例的确切 mixer 混合器配置的文件的文件名。

这个例子中的第二个设置是 Comment。它用作 alsaucm 工具和 Pulseaudio 中的显示名称。它可以自由定义。

用例定义

最复杂的部分是需要创建的 HiFi 文件的实际内容。该文件基本上是启用/禁用 mixer 混频器的脚本和从一个输入/输出移动到另一个输入/输出的命令的集合。

这是一个用例文件的最小示例。

/usr/share/alsa/ucm2/sun50i-a64-audio/HiFi

SectionVerb {
	EnableSequence [
		cset "name='Headphone Playback Switch' off"
		cset "name='Headphone Source Playback Route' DAC"
		cset "name='Headphone Playback Volume' 50%"
	]
	DisableSequence [
	]

	Value {
		PlaybackPCM "hw:${CardId},0"
		CapturePCM "hw:${CardId},0"
	}
}

SectionVerb 块定义了启用/禁用这个用例需要运行的命令。这主要是用来使整个 mixer 混频器在启动时处于已知状态,所以在这里为 mixer 混频器中的所有 controls 控件设置一个值可能是个好主意。

本节中的命令均为 cset 命令。这些命令对应于你常常通过 alsa-utils 包中的 amixer 工具使用的命令。第一个命令当直接通过 amixer 运行时做这些事情:

$ amixer cset name='Headphone Playback Switch' off
numid=36,iface=MIXER,name='Headphone Playback Switch'
  ; type=BOOLEAN,access=rw------,values=2
  ; values=on,on

要获得你可以设置的所有 controls 控件的列表,你也可以使用如下的 amixer 命令:

$ amixer controls
numid=35,iface=MIXER,name='Headphone Source Playback Route'
numid=36,iface=MIXER,name='Headphone Playback Switch'
numid=17,iface=MIXER,name='Headphone Playback Volume'
... a lot more lines here ...

这些应该很容易就可以与你在 alsamixer 中看到的 controls 控件关联起来。Controls 控件遵循标准的命名方案。alsamixer 的播放页上设备的音量滑块称为 $name Playback Volume,采集页上相同的 control 控件称为 $name Capture Volume。播放音量滑块下面的静音按钮称为 $name Playback Switch,采集页上的启用开关称为 $name Capture Switch。Controls 控件中没有音量滑块但有文本选择的控件名称为 $name Playback Route

800px-Alsa_mixer_mapping.png

调试 UCM 配置

重新加载 UCM 配置

alsaucm reload 重新加载配置,但如果你正在使用 PulseAudio,你还需要以某种方式重启 PulseAudio。要方便地重新加载 alsaucm 和 PulseAudio,你可以运行alsaucm reload && killall -9 pulseaudio

监视 ALSA 事件

alsactl monitor 允许你监视 ALSA 事件,特别是插孔检测。如果你想要在插孔插入或移除时修改 ALSA 设置,则日志中的事件名称必须与 UCM 配置 JackControl 匹配。

使用 plain ALSA 来查找控件

使用 ALSA UCM 寻找正确的控件是一件很痛苦的事情,但为了让你的生活更轻松:

  1. 禁用 PulseAudio 或 PipeWire,以便 ALSA UCM 根本不活动。
  2. 使用 amixer -c $CARD cset iface=MIXER,name='$CONTROL' '$VALUE' 编写一个简单的脚本。
  3. 执行脚本来设置混音器。
  4. 通过 aplay -D plughw:$CARD,$DEVICE /usr/share/sounds/alsa/Front_*.wav 测试你的声音。

重复此操作,直到找到混音器的工作列表,以将音频播放到所需的输出设备。还要确保混音器列表足以在重新启动后直接工作。一旦你弄清楚了它们,你就可以转换到 ALSA UCM 配置,这样你就可以确保混音器至少是正确的,而不受 ALSA UCM 或 PulseAudio/PipeWire 的影响。

控件列表

amixer 可以为你提供有关可用控件的大量信息:

  • amixer -c $CARD scontrols
  • amixer -c $CARD scontents

TinyALSA 可以为你提供更具可读性的版本。TinyALSA 不在 repos 存储库中,但可以按如下方式编译:

  1. git clone https://github.com/tinyalsa/tinyalsa
  2. apk add alpine-sdk linux-headers
  3. make

编译 TinyALSA 之后,该工具在 utils 中,你可能需要 tinymixer

检查控件是否被实际调用

有时你可能想知道你在 ALSA UCM 部分中定义的控件是否被调用。ALSA UCM 允许使用 shellexec 命令执行任意命令。你可以添加

 shell "/bin/echo 'My Control was called in X' >> /tmp/alsa-ucm.txt"

来调试你的序列。输出将出现在 /tmp/alsa-ucm.txt 文件中。

关键字

  • ConflictingDevice:表示与其它设备冲突。例如:听筒和耳机在由相同编解码器驱动时可能彼此不兼容。
  • EnableSequence:指定 amixer 命令以启用设备或 verb。
  • DisableSequence:指定 amixer 命令以禁用设备或 verb。
  • TransitionSection."$SECTIONDEVICE":执行从一个设备到另一个设备的命令。
  • BootSequence:当声卡配置尚不可用时仅执行一次的命令,对于设置初始音量很有用。
  • FixedBootSequence:每次启动时执行的命令,对于取消某些事情的静音很有用。

大多数关键字都记录在官方文档中:https://www.alsa-project.org/alsa-doc/alsa-lib/group__ucm__conf.html。

声卡的配置:

 SectionVerb {
   Value {
     // Values to config this card, example for HiFi profile:
     TQ "HiFi"
   }
   EnableSequence [
     // mixer control to be set when the card is initialized
   ]
   DisableSequence [
     // mixer control to be set when the card is destroyed
   ]
 }

设备的配置:

 SectionDevice."Speaker" { // The node name.
   Value {
     // Values to config this node
   }
   EnableSequence [
     // mixer control to be set when this node is selected
   ]
   DisableSequence [
     // mixer control to be set when this node is unselected
   ]
 }

原文。

Done.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b

chatglm2构建时使用了RUST,所以在安装chatglm2之前,先安装RUST。 此系列文章列表: 【AI基础】第一步:安装python开发环境-windows篇_下载安装ai环境python-CSDN博客 【AI基础】第一步:安装python开发环境-conda篇_mini…

uniapp余额银行卡支付密码界面实现(直接复制)

示例: 插件地址:自定义数字/身份证/密码输入框,键盘密码框可分离使 - DCloud 插件市场 1.下载插件并导入HBuilderX,找到文件夹,copy number-keyboard.vue一份为number-keyboard2.vue(number-keyboard.vue是…

木质家具板材甲醛释放量检测 木制家具含水率检测

木质家具板材甲醛释放量检测 木制家具含水率检测 甲醛是一种无色,有强烈刺激型气味的气体。对人体健康有负面影响,长期接触低剂量的甲醛会引起慢性呼吸道疾病、女性月经紊乱、妊娠综合征,引起新生儿体质降低、染色体异常、甚至鼻咽癌,甲醛的危害还表现在它能凝固蛋白质,可使人…

MySQ中CONCAT函数使用

在MySQL数据库管理系统中,处理和连接字符串是一项常见的操作。本文将介绍几个常用的字符串连接函数,包括CONCAT(), CONCAT_WS(), GROUP_CONCAT()以及其他相关函数,这些功能可以极大地简化数据库查询中的字符串操作。 1. CONCAT() 函数 CONC…

【Git】如何不管本地文件,强制git pull

要在 Git 中强制执行 git pull 操作,忽略本地文件的更改,可以按照以下步骤操作: 保存当前工作状态:如果你有未提交的更改,可以使用 git stash 将这些更改存储起来。 git stash强制拉取最新代码:使用 git re…

企业公户验证API在Java、Python、PHP中的使用教程

在金融和商业领域,企业公户验证API是一种用于验证企业对公账户的真实性和合法性的技术解决方案。这种API通常由金融机构或第三方服务提供商提供,旨在帮助企业加快账户认证流程,提高效率,降低审核成本,并确保符合法规要…

别人状告你怎么办?你知道还可反告吗?

别人状告你怎么办?你知道还可反告吗? --李秘书讲写作:关于反诉状的写作技巧与策略 反诉状是民事诉讼中的一种重要法律文书,它允许被告在原告提起诉讼后,对原告提起反诉,以抵消原告的诉讼请求。李秘书这节…

Android中打印某应用的堆栈信息

先更具报名获取pid adb shell "ps|grep 包名" zygote的堆栈dump 实际上这个可以同时dump java线程及native线程的堆栈&#xff0c;对于java线程&#xff0c;java堆栈和native堆栈都可以得到。 kill -3 <pid> debuggerd的堆栈dump debuggerd是android的一个…

python中关于函数的两种链式调用

函数之间的嵌套调用之函数的返回值就是另一个函数的参数 用一个函数的返回值作为另一个函数的参数。 如上图所示&#xff0c;将is0dd&#xff08;10&#xff09;的结果交给print函数来执行。 如上图所示&#xff0c;也是一个链式调用的案例&#xff0c;先将add&#xff08;x&a…

QT之可拖动布局研究

1. 背景 最开始只用到了最基本的水平布局 、垂直布局。它的好处就是窗口整体缩放后&#xff0c;控件也自动等比例缩放。 但是比如水平布局之中的控件宽度比例、垂直布局之中的控件高度比例都是固定的。 平时也不怎么开发界面&#xff0c;最近有个需求&#xff0c;想界面上的…

使用 ISIC 快速申请 JetBrain 学生免费产品

此篇文章适合急需通过学生优惠使用 JetBrain 产品并且愿意花费 50 &#xff08;申请国际电子学生证 ISIC 需要 50&#xff09;的学生。需要等待时间1-3天&#xff0c;主要是等待 ISIC 的时间&#xff0c;只要 ISIC 发放 ISIC name 和 ISIC ID&#xff0c;将其填写到 JetBrain 的…

代码随想录算法训练营第31天(py)| 贪心 | 455.分发饼干、376. 摆动序列、53. 最大子序和

455.分发饼干 力扣链接 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#…

Java 初识

Java 的发展历程 Sun 公司。 Oracle 公司。 普通版本&#xff0c;也叫过渡版本。 正式版本&#xff0c;也叫长期支持版本&#xff08;LTS&#xff09;。 Java SE&#xff0c;Java EE&#xff0c;Java ME Java 技术体系分为三个平台&#xff1a;Java SE&#xff0c;Java EE&a…

DOS 操作系统

DOS 介绍 DOS&#xff1a;disk operating system&#xff0c;磁盘操作系统。 中国DOS联盟下载 MS-DOS 7.10完整安装版&#xff08;含图形安装程序&#xff09; DOS 环境下的操作 输入部分内容后按下 Tab 可以快速自动补全。 按住 Ctrl 键可以用鼠标滚轮改变字号大小。 DO…

转速传感器介绍

一、概述 RPM&#xff08;Revolutions Per Minute&#xff09;转速传感器是一种用于测量旋转机械设备转速的传感器。它可以检测旋转部件上的特定位置标记&#xff08;如齿轮、凸起或磁铁&#xff09;&#xff0c;并根据这些标记的通过频率来计算转速。发电额定频率是50hz和60z…

力扣303. 区域和检索 - 数组不可变

Problem: 303. 区域和检索 - 数组不可变 文章目录 题目描述思路复杂度Code 题目描述 思路 创建前缀和数组preSum&#xff0c;其中preSum[i]处元素值为nums[0] - nums[i - 1]处元素值得和&#xff0c;当调用sumRange函数时直接返回preSum[right 1] - preSum[left] 复杂度 函数…

Redisson分布式锁原理解析

前言 首先Redis执行命令是单线程的&#xff0c;所以可以利用Redis实现分布式锁&#xff0c;而对于Redis单线程的问题&#xff0c;是其线程模型的问题&#xff0c;本篇重点是对目前流行的工具Redisson怎么去实现的分布式锁进行深入理解&#xff1b;开始之前&#xff0c;我们可以…

【西瓜书】3.线性模型

目录 1.基本概述 2.线性模型——线性回归 2.1.离散变量 2.2.最小二乘法 3.线性模型——多元线性回归 4.广义线性模型——对数线性回归 5.广义线性模型——对数几率回归 5.1.定义 5.2.参数估计——极大似然法 6.线性模型——线性判别分析LDA 7.多分类学习 8.类别不平衡问题 大纲…

DDK电动紧固装置SAN3-40控制器维修

DDK伺服拧紧轴控制器是工业自动化设备中的重要组成部分&#xff0c;其稳定运行对于生产线的顺畅至关重要。然而&#xff0c;由于长时间使用或其他原因&#xff0c;可能会出现DDK拧紧扳手控制器故障。【寻求专业维修服务商】 子锐机器拥有多种品牌机械设备维修经验&#xff0c;有…

【Python机器学习】将PCA用于cancer数据集并可视化

PCA最常见的应用之一就是将高维数据集可视化。一般对于有两个以上特征的数据&#xff0c;很难绘制散点图&#xff0c;。对于Iris&#xff08;鸢尾花&#xff09;数据集&#xff0c;我们可以创建散点矩阵图&#xff0c;通过展示特征所有可能的两两组合来展示数据的局部图像。 不…