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.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容