Alsa Use Case Manager(用例管理器)描述如何為某些用例(如 “播放音頻”、“通話”)設置 mixer 混頻器。它還描述如何修改 mixer 混頻器狀態(tài)以將音頻路由到某些輸出和輸入魔策,以及如何控制這些設備薪前。
這基本上涵蓋了 Pulseaudio 中配置 (profile) 所做的相同的事情匾南,除了 UCM 文件更容易編寫猿涨,并且在不運行 Pulseaudio 的情況下也可以工作晃择。如果聲卡的 UCM 配置存在冀值,則 pulseaudio 將忽略內(nèi)置的配置 (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
抵栈。
第一個用例
下一步是創(chuàng)建一個包含 mixer 混合器可用用例列表的文件。該文件將以上面小節(jié)中所述的規(guī)則命名:
/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) 的內(nèi)部名稱缰猴。它必須是來自 alsa 的預定義用例之一产艾。目前定義的有如下這些:
- "Inactive"
- "HiFi"
- "HiFi Low Power"
- "Voice"
- "Voice Low Power"
- "Voice Call"
- "Voice Call IP"
- "FM Analog Radio"
- "FM Digital Radio"
要創(chuàng)建的最重要的配置 (profile) 是 HiFi,它是聲卡的主音頻播放配置 (profile)滑绒。對于其它一些配置 (profile)闷堡,Alsa 并沒有明確定義它們的實際用途。
配置 (profile) 的第一個設置是 File
行疑故。這定義了包含該用例的確切 mixer 混合器配置的文件的文件名杠览。
這個例子中的第二個設置是 Comment
。它用作 alsaucm 工具和 Pulseaudio 中的顯示名稱焰扳。它可以自由定義倦零。
用例定義
最復雜的部分是需要創(chuàng)建的 HiFi
文件的實際內(nèi)容。該文件基本上是啟用/禁用 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 混頻器在啟動時處于已知狀態(tài)育瓜,所以在這里為 mixer 混頻器中的所有 controls 控件設置一個值可能是個好主意葫隙。
本節(jié)中的命令均為 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 控件關(guān)聯(lián)起來。Controls 控件遵循標準的命名方案焰手。alsamixer 的播放頁上設備的音量滑塊稱為 $name Playback Volume
糟描,采集頁上相同的 control 控件稱為 $name Capture Volume
。播放音量滑塊下面的靜音按鈕稱為 $name Playback Switch
书妻,采集頁上的啟用開關(guān)稱為 $name Capture Switch
船响。Controls 控件中沒有音量滑塊但有文本選擇的控件名稱為 $name Playback Route
。
調(diào)試 UCM 配置
重新加載 UCM 配置
alsaucm reload
重新加載配置,但如果你正在使用 PulseAudio见间,你還需要以某種方式重啟 PulseAudio聊闯。要方便地重新加載 alsaucm 和 PulseAudio,你可以運行alsaucm reload && killall -9 pulseaudio
米诉。
監(jiān)視 ALSA 事件
alsactl monitor
允許你監(jiān)視 ALSA 事件菱蔬,特別是插孔檢測。如果你想要在插孔插入或移除時修改 ALSA 設置史侣,則日志中的事件名稱必須與 UCM 配置 JackControl
匹配拴泌。
使用 plain ALSA 來查找控件
使用 ALSA UCM 尋找正確的控件是一件很痛苦的事情,但為了讓你的生活更輕松:
- 禁用 PulseAudio 或 PipeWire抵窒,以便 ALSA UCM 根本不活動弛针。
- 使用
amixer -c $CARD cset iface=MIXER,name='$CONTROL' '$VALUE'
編寫一個簡單的腳本。 - 執(zhí)行腳本來設置混音器李皇。
- 通過
aplay -D plughw:$CARD,$DEVICE /usr/share/sounds/alsa/Front_*.wav
測試你的聲音削茁。
重復此操作,直到找到混音器的工作列表掉房,以將音頻播放到所需的輸出設備茧跋。還要確保混音器列表足以在重新啟動后直接工作卓囚。一旦你弄清楚了它們瘾杭,你就可以轉(zhuǎn)換到 ALSA UCM 配置,這樣你就可以確蹦囊冢混音器至少是正確的粥烁,而不受 ALSA UCM 或 PulseAudio/PipeWire 的影響。
控件列表
amixer
可以為你提供有關(guān)可用控件的大量信息:
amixer -c $CARD scontrols
amixer -c $CARD scontents
TinyALSA 可以為你提供更具可讀性的版本蝇棉。TinyALSA 不在 repos 存儲庫中讨阻,但可以按如下方式編譯:
git clone https://github.com/tinyalsa/tinyalsa
apk add alpine-sdk linux-headers
make
編譯 TinyALSA 之后,該工具在 utils
中篡殷,你可能需要 tinymixer
钝吮。
檢查控件是否被實際調(diào)用
有時你可能想知道你在 ALSA UCM 部分中定義的控件是否被調(diào)用。ALSA UCM 允許使用 shell
和 exec
命令執(zhí)行任意命令板辽。你可以添加
shell "/bin/echo 'My Control was called in X' >> /tmp/alsa-ucm.txt"
來調(diào)試你的序列奇瘦。輸出將出現(xiàn)在 /tmp/alsa-ucm.txt
文件中。
關(guān)鍵字
-
ConflictingDevice
:表示與其它設備沖突劲弦。例如:聽筒和耳機在由相同編解碼器驅(qū)動時可能彼此不兼容耳标。 -
EnableSequence
:指定 amixer 命令以啟用設備或 verb。 -
DisableSequence
:指定 amixer 命令以禁用設備或 verb邑跪。 -
TransitionSection."$SECTIONDEVICE"
:執(zhí)行從一個設備到另一個設備的命令麻捻。 -
BootSequence
:當聲卡配置尚不可用時僅執(zhí)行一次的命令纲仍,對于設置初始音量很有用。 -
FixedBootSequence
:每次啟動時執(zhí)行的命令贸毕,對于取消某些事情的靜音很有用。
大多數(shù)關(guān)鍵字都記錄在官方文檔中: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.