Alsa UCM

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

800px-Alsa_mixer_mapping.png

調(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 尋找正確的控件是一件很痛苦的事情,但為了讓你的生活更輕松:

  1. 禁用 PulseAudio 或 PipeWire抵窒,以便 ALSA UCM 根本不活動弛针。
  2. 使用 amixer -c $CARD cset iface=MIXER,name='$CONTROL' '$VALUE' 編寫一個簡單的腳本。
  3. 執(zhí)行腳本來設置混音器李皇。
  4. 通過 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 存儲庫中讨阻,但可以按如下方式編譯:

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

編譯 TinyALSA 之后,該工具在 utils 中篡殷,你可能需要 tinymixer钝吮。

檢查控件是否被實際調(diào)用

有時你可能想知道你在 ALSA UCM 部分中定義的控件是否被調(diào)用。ALSA UCM 允許使用 shellexec 命令執(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.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寇僧,隨后出現(xiàn)的幾起案子摊腋,更是在濱河造成了極大的恐慌,老刑警劉巖嘁傀,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件兴蒸,死亡現(xiàn)場離奇詭異,居然都是意外死亡细办,警方通過查閱死者的電腦和手機橙凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笑撞,“玉大人岛啸,你說我怎么就攤上這事≤罘剩” “怎么了坚踩?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瓤狐。 經(jīng)常有香客問我瞬铸,道長,這世上最難降的妖魔是什么础锐? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任嗓节,我火速辦了婚禮,結(jié)果婚禮上郁稍,老公的妹妹穿的比我還像新娘赦政。我一直安慰自己,他們只是感情好耀怜,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布恢着。 她就那樣靜靜地躺著,像睡著了一般财破。 火紅的嫁衣襯著肌膚如雪掰派。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天左痢,我揣著相機與錄音靡羡,去河邊找鬼系洛。 笑死,一個胖子當著我的面吹牛略步,可吹牛的內(nèi)容都是我干的描扯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼趟薄,長吁一口氣:“原來是場噩夢啊……” “哼绽诚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杭煎,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恩够,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后羡铲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜂桶,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年也切,在試婚紗的時候發(fā)現(xiàn)自己被綠了扑媚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡贾费,死狀恐怖钦购,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褂萧,我是刑警寧澤押桃,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站导犹,受9級特大地震影響唱凯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谎痢,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一磕昼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧节猿,春花似錦票从、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至太雨,卻和暖如春吟榴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背囊扳。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工吩翻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兜看,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓狭瞎,卻偏偏與公主長得像细移,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子脚作,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容