ALSA
高級 Linux 音頻架構(Advanced Linux Sound Architecture, (ALSA))提供由內核驅動的音效卡驅動程序,代替了原來的開放聲音系統 (OSS)。
除了音頻設備驅動程序外,ALSA 還為應用程式開發者捆綁了一個用戶空間驅動的庫。開發者可以使用這些 ALSA 驅動進行高級 API 開發。這使得應用程式能夠通過 ALSA 庫直接與(內核中的)音頻設備進行交互。
安裝
ALSA 驅動是內核的一部分,ALSA 庫 (alsa-lib包)通常作為依賴安裝,故無需手動安裝。
udev會在系統啟動時自動檢測硬體並選擇所需的驅動,並加載相應的聲音設備驅動模塊。所以你的音效卡應當已經可以工作了。
然而,在初始狀態下聲音可能會被靜音。參見#解除通道靜音。
固件
筆記本電腦通常需要Sound Open Firmware (SOF) (sof-firmware包)——因為這類設備往往採用 Cadence Tensilica Xtensa 架構的數位訊號處理器 (DSP),參見受支持的平台列表。如果缺少固件,日誌中會輸出類似以下的信息:
error: sof firmware file is missing error: failed to load DSP firmware -2 error: sof_probe_work failed err: -2
有關更多 SOF 故障排除信息,參見Intel硬體平台概述.
裝有Cirrus Logic智能放大器的筆記本電腦需要linux-firmware-cirrus包軟體包。另請參見:
- Audio drivers for Cirrus Logic CS35L54/56/57/63 智能增強型放大器的音頻驅動,
- archlinux/packaging/packages/linux-firmware#19。
部分 Intel 音頻設備需要安裝linux-firmware-intel包軟體包。
alsa-firmware包軟體包包含了某些音效卡可能需要的固件。
ALSA 實用程序
安裝alsa-utils包軟體包。該包包含了alsamixer(1)和amixer(1) 等實用程序。amixer是用於修改音頻設置的命令行工具,而alsamixer則為配置音頻設備提供了更直觀的、基於ncurses的文本界面。
ALSA 和 Systemd
alsa-utils包 軟體包默認包含了 systemd 單元配置文件alsa-restore.service和alsa-state.service。
在安裝時它們會自動安裝並激活(通過軟體包提供的指向sound.target的符號連結)。選項如下所述:
-
alsa-restore.service默認在啟動時讀取/var/lib/alsa/asound.state,並在關機時寫入更新值。前提是/etc/alsa/state-daemon.conf文件不存在,除非用戶主動創建。
-
alsa-state.service以守護進程模式(重新)啟動alsactl 以便持續跟蹤並持久化保存音量更改,前提是已主動創建了/etc/alsa/state-daemon.conf文件。
顯然,這兩種方法是互斥的,可以根據需求選擇兩種方法之一。如需編輯這些單元,參考systemd#修改現存單元文件. 您可以用systemctl查看其運行狀態。
有關更多信息,參見alsactl(1)。
用戶權限
本地用戶默認擁有播放音頻和更改混音器音量的權限。若要允許遠程用戶使用 ALSA,需要將這些用戶添加到audio組。
audio組會賦予其直接訪問設備的權限。請注意,這會導致應用程式能夠獨占音頻輸出設備。從而可能破壞多席位 (multi-seat) 系統中的軟體或用戶快速切換功能。因此,除非有特殊需求,否則默認「不」建議將用戶添加至audio組。OSS 模擬
OSS 模擬是指攔截OSS調用並將其重定向至 ALSA 的功能。該模擬層對於打開老舊的遺留應用程式非常有用,例如,某些嘗試直接打開/dev/dsp並向其寫入音頻數據的程序,如果沒有 OSS 或模擬庫,系統中將不存在/dev/dsp設備文件,此類應用程式也就無法發出任何聲音。
如果需要讓 OSS 應用程式與dmix(軟體混音插件)協同工作,還請安裝alsa-oss包軟體包。
加載 snd_pcm_oss和snd_seq_oss內核模塊。並將其配置為在啟動時加載。
解除通道靜音
ALSA 默認靜音所有通道,必須手動解除。
使用amixer解除靜音
可以使用amixer解除音效卡的主音量靜音狀態:
$ amixer sset Master unmute $ amixer sset Speaker unmute $ amixer sset Headphone unmute
使用alsamixer解除靜音
使用alsamixer可以解除音效卡的靜音:
$ alsamixer
通道下方標有MM表示其已經靜音,而標有OO表示已經啟用。
使用←和→方向鍵移動到Master和PCM通道,然後按下m鍵解除靜音。
使用↑方向鍵增加音量,直到增益達到0dB。增益數值可在左上角Item:欄位旁邊找到。
解除 5.1/7.1 聲道的靜音
若要獲得完整的 5.1 或7.1 環繞聲,可能還需要解除其它通道的靜音,例如Front(前置)、Surround(環繞)、Center(中置)、LFE(低音炮)以及Side(側置)等。(這些是Intel HD Audio的通道名稱;不同的硬體可能有所差異)。
啟用麥克風
若要啟用麥克風,請按下F4鍵切換至 Capture(錄音)選項卡,然後按下Space鍵啟用對應的通道即可。如果麥克風無法正常工作,參見Advanced Linux Sound Architecture/Troubleshooting#沒有麥克風輸入。
按下Esc鍵退出 alsamixer。
測試配置更改
接下來,測試音頻是否正常工作:
$ speaker-test -c 2
根據揚聲器布局修改-c參數。例如,對於 7.1 聲道,使用-c 8:
$ speaker-test -c 8
如果音頻輸出到了錯誤的設備,嘗試使用-D參數手動指定設備。
$ speaker-test -D default:PCH -c 8
-D參數接受 PCM 通道名稱作為值,可以通過運行以下命令獲取該名稱:
$ aplay -L | grep :CARD
default:CARD=PCH # 'default:PCH' 是傳遞給 -D 的 PCM 通道名稱 sysdefault:CARD=PCH front:CARD=PCH,DEV=0 surround21:CARD=PCH,DEV=0 surround40:CARD=PCH,DEV=0 surround41:CARD=PCH,DEV=0 surround50:CARD=PCH,DEV=0 surround51:CARD=PCH,DEV=0 surround71:CARD=PCH,DEV=0
補充說明
- 如果系統中有多個音效卡,可以按下
F6鍵進行切換。
- 某些音效卡需要將數字輸出靜音或禁用才能聽到模擬音頻,反之亦然。
- 某些機器,如(Thinkpad T61)擁有
Speaker聲道,該通道同樣需要解除靜音並進行調整。
- 某些機器(如Dell E6400)可能還需要對
Front和Headphone通道取消靜音並進行調整。
- 如果重啟以後聲音調整似乎失效了,嘗試以root權限運行alsamixer。
驅動配置
更多信息,參見高級Linux音頻架構-驅動程序配置指南.
若要重新加載 ALSA 驅動程序配置,必須重新加載相應的模塊。在此之前,必須停止所有正在使用該 ALSA 驅動的進程(例如PipeWire)。請使用fuser(1)要使用聲音設備文件:
# fuser --all --verbose /dev/snd/*
另請參見:
音效卡和模塊
運行lspci -k -nn -d ::0403可以識別 PCI 設備正在使用的模塊。
-
::0403表示多媒體音頻控制器 (Multimedia audio controller),是 多媒體控制器 (Multimedia controller) PCI 設備類下的子類。 -
::0403表示 音頻設備 (Audio device) 子類 - lspci 輸出中的 Kernel driver in use(正在使用的內核驅動)即為已加載的模塊。
對於USB設備,運行lsusb --verbose --tree | grep --after-context=1 'Class=Audio'進行查看。
運行lsmod | grep '^snd'可以獲取已加載聲音模塊的完整列表。
運行cat /proc/asound/cards可以獲取音效卡列表及其相應的序號 (音效卡編號 )。
- 有關
/proc/asound/cards的格式,請參見 ALSA 庫 API 控制接口 (Control Interface)中的概述 (General Overview) 章節。 - 有關
/proc/asoundprocfs 樹的通用信息,參見ALSA 驅動程序的 Proc 文件。
運行cat /proc/asound/modules可以獲取音效卡序號及其相應的模塊名稱。
音效卡序號
如果要更改音效卡順序(或者你的音效卡順序在啟動時發生變動,想要將其固定),可以使用snd模塊的slots選項來預留指定驅動的序號,參見內核模塊#S配置模塊參數。
以下示例假設無論模塊何時加載(例如音效卡可能在開始時未插上),都希望 USB音效卡始終作為第一塊音效卡(即序號為0):
/etc/modprobe.d/alsa-base.conf
options snd slots=snd_usb_audio
當模塊名稱前面帶有感嘆號(!)時,對應的序號將分配給除該模塊以外的任何模塊。例如,將第一個序號(0)分配給除snd_usb_audio之外的任何模塊,以防止 USB 音效卡占用該序號:
options snd slots=!snd_usb_audio
還可以指定序號為-2,以指示 ALSA 絕不要將某塊音效卡用作主音效卡:負值會被解析為允許使用序號的位掩碼。針對特定模塊使用index選項來替代前述示例的寫法如下:
options snd_usb_audio index=-2
如果多塊音效卡使用相同的模塊,且它們的順序始終固定,則只需使用index選項即可改變順序。以下示例假設有兩個使用 HD Audio 模塊的音效卡(例如,板載音效卡和獨立顯卡的 HDMI 輸出),並且想要對調它們的序號:
options snd_hda_intel index=1,0
- 上述示例應理解為「使用
snd_hda_intel的第一塊音效卡分配序號1,第二個分配序號0」。哪塊音效卡排在第一或第二由udev決定。
- ALSA 模塊選項通常不僅接受單個值,還接受一個值數組每個值分別用於設置該模塊所管理的其中一塊音效卡的選項。可以通過檢查以下命令的輸出來確認是否存在值數組(array of) 概念:
$ modinfo --field=parm module_name | column --separator=':' --table --table-columns-limit=2
只要不發生衝突,slots選項可以與index選項結合使用:
options snd slots=,snd_hda_intel,snd_hda_intel,snd_usb_audio,snd_usb_audio,snd_usb_audio options snd_hda_intel index=2,1 options snd_usb_audio index=3,4,5 vid=0xVID_3,0xVID_4,0xVID_5 pid=0xPID_3,0xPID_4,0xPID_5
-
slots=,表示「不預留序號0」,這樣在系統啟動後插入的、未在snd_usb_audio選項中列出的某些 USB 音效卡就可以成為第一塊音效卡。 -
snd_usb_audio模塊允許通過vid和pid選項來指定特定音效卡,從而無需依賴來自udev 的識別順序。
另請參見:
禁用音效卡
若要禁用由指定內核模塊控制的所有音效卡,使用安裝或模塊黑名單方法來阻止模塊加載。
若要選擇應禁用特定的音效卡,請使用內核模塊的enable選項。例如,禁用某個模塊驅動的第二塊音效卡:
/etc/modprobe.d/alsa-base.conf
options module_name enable=1,0
有關禁用 HD Audio 音效卡解碼器 (codec) 的方法,另請參見/疑難解答#編解碼器探測。
庫配置
系統級配置文件為/etc/asound.conf,用戶級配置文件為~/.asoundrc。
配置文件中解釋了庫配置的語法,例如空格、行延續、注釋,包括配置文件、標點符號(分隔符)、賦值、複合賦值、操作模式等。
ALSA 庫配置會在庫的每個實例中加載,因此若要重新加載配置,只需重啟正在使用該庫的程序即可。
有關更多信息,參見:
- ALSA 非官方wiki上的.asoundrc 文章。
- ALSA項目wiki上的.asoundrc文章。
基本語法
操作模式
解析節點時存在不同的操作模式,默認模式為「合併並創建 (merge and create)」。若操作模式為「合併/創建」或「合併」,系統將進行類型檢查。由於只有相同類型的賦值才能合併,因此字符串不能與整形數合併。在默認操作模式下,嘗試簡單賦值定義為複合賦值(或反之)同樣無法奏效。
操作模式前綴:
-
+-- 合併並創建 -
--- 合併 -
?-- 不覆蓋 (do not override) -
!-- 覆蓋 (override)
操作模式
# 合併/創建 - 若節點不存在節點則創建。若節點已存在且類型匹配,則將 subkeyN 合併到鍵值中。 key.subkeyN valueN; # 合併/創建 - 與上述寫法等價 key.+subkeyN valueN; # 合併 - 節點 key.subkeyN 必須已經存在,且必須具有相同的物理數據類型 key.-subkeyN valueN; # 不覆蓋 - 若 key.subkeyN 節點已存在,則忽略新賦值 key.?subkeyN valueN; # 覆蓋 - 刪除 subkeyN 及其下方的所有鍵, 然後創建節點 key.subkeyN key.!subkeyN valueN;
在操作正確的前提下,使用覆蓋操作模式通常是安全的;然而必須注意,節點中可能還包含維持正常功能所必須的其它鍵。
!pcm.key來覆蓋pcm節點本身。嵌套
在配置文件中使用嵌套結構,有時不僅非常實用,且更易於閱讀。
嵌套 PCM 插件
pcm.azalia { type hw; card 0 }
pcm.!default { type plug; slave.pcm "azalia" }
# 等價於
pcm.!default { type plug; slave.pcm { type hw; card 0; } }
# 同樣等價於
pcm.!default.type plug;
pcm.default.slave.pcm.type hw;
pcm.default.slave.pcm.card 0;
設置默認音效卡
使用"defaults"節點設置默認設備的示例
假設/usr/share/alsa/alsa.conf中已配置"defaults"節點,且"defaults.pcm.card"及其對應的"ctl"項賦值均為零(整數類型)。若需要將默認的 PCM 和控制設備設置為(第三塊)音效卡"2",或設置為 Azalia 音效卡對應的"SB":
Defaults 節點
defaults.ctl.card 2; # 將默認設備與控制端設值為第三塊音效卡(計數從0開始)。 defaults.pcm.card 2; # 此操作不會改變數據類型 defaults.ctl.+card 2; # 與上述寫法等價。 defaults.pcm.+card 2; defaults.ctl.-card 2; # 在默認配置下效果相同。但如果 defaults 節點已被刪除或 defaults.pcm.-card 2; # 數據類型已改變,合併 (merge) 操作模式將會報錯。 defaults.pcm.?card 2; # 由於該賦值已存在,此操作不執行任何更改。 defaults.ctl.?card 2; defaults.pcm.!card "SB" # 由於數據類型不同,此處必須使用覆蓋(override)操作模式。 defaults.ctl.!card "SB";
由於使用雙引號會自動將值的數據類型設置為字符串,因此在上述示例中,若設置defaults.pcm.!card "2,將導致系統保留上一次的默認設備即音效卡0)。在不含特殊字符的前提下,字符串並不強制使用雙引號(理想狀態下也應避免使用特殊字符)。此規則在其它賦值選項中可能不適用。
defaults.pcm.card在 ALSA 配置文件中被多次引用,通常作為各類環境變量優先之後的後備 (fallback) 賦值。通過默認節點設置默認音效卡
通過 defaults 節點設置默認音效卡
將前述示例中關於defaults.pcm.card和defaults.pcm.device的方法投入實際應用:假設系統中存在序號分別為 0 和 1 的兩塊音效卡,若僅需將默認音效卡切換為序號 1,可在/etc/asound.conf或用戶級的~/.asoundrc中加入以下配置,以同時修改播放和混音器控制音效卡。
defaults.pcm.card 1 defaults.ctl.card 1
通過環境變量選擇默認 PCM
通常情況下,只需將ALSA_CARD設置為設備名稱即可。首先通過aplay -l獲取名稱,然後將ALSA_CARD設置為冒號之後、括號之前的名稱;例如:
card 1: HDMI [HDA ATI HDMI], device 3: HDMI 0 [HDMI 0]
此時應設置ALSA_CARD=HDMI。
默認的全局配置文件/usr/share/alsa/alsa.conf同樣會檢查其他變量。通過查找該文件中類似vars [ ... ]的結構,可歸納出如下映射表:
| 變量名 | 使用方法 | |
|---|---|---|
| 1 | ALSA_CARD | pcm.default , pcm.hw , pcm.plughw , ctl.sysdefault , ctl.hw , rawmidi.default , rawmidi.hw , hwdep.hw |
| 2 | ALSA_CTL_CARD | ctl.sysdefault , ctl.hw |
| 3 | ALSA_HWDEP_CARD | hwdep.default , hwdep.hw |
| 4 | ALSA_HWDEP_DEVICE | hwdep.default , hwdep.hw |
| 5 | ALSA_PCM_CARD | pcm.default , pcm.hw , pcm.plughw |
| 6 | ALSA_PCM_DEVICE | pcm.hw , pcm.plughw |
| 7 | ALSA_RAWMIDI_CARD | rawmidi.default , rawmidi.hw |
| 8 | ALSA_RAWMIDI_DEVICE | rawmidi.default , rawmidi.hw |
或者,也可以在自己的配置文件中覆蓋此行為,建議在全局文件(/etc/asound.conf)中操作。添加以下內容:
pcm.!default {
type plug
slave.pcm {
@func getenv
vars [ ALSAPCM ]
default "hw:Audigy2"
}
}
在此配置中,同樣需要將Audigy2替換為實際的設備名稱。名稱可以通過aplay -l獲取,也可以使用諸如 surround51 的 PCM。不過在需要使用麥克風的前提下,建議選擇全雙工(full-duplex)PCM 作為默認值。
配置完成後,只需在啟動程序時更改環境變量ALSAPCM,即可選擇音效卡。此方法適用於所有無法在程序內選擇音效卡的程序;對於其他程序,請確保保留默認音效卡。
例如,假設編寫了一個名為mix51to20的聲道摺疊 (downmix) PCM,則可以通過以下命令行在mplayer包中調用它:ALSAPCM=mix51to20 mplayer example_6_channel.wav mplayer example_6_channel.wav}}
直接尋址硬體
~/.asoundrc配置時,或者明確需要直接尋址音效卡(例如通過IEC958進行數字輸出,或配置專用的音樂伺服器)的前提下,才推薦使用此方法。在沒有聲音伺服器或軟體混音支持的前提下,諸如 Chromium 等部分應用程式將無法支持此設置。首先,必須找出需要設為默認的音效卡和設備 ID:
$ aplay -l
**** List of PLAYBACK Hardware Devices **** card 0: Intel [HDA Intel], device 0: CONEXANT Analog [CONEXANT Analog] Subdevices: 1/1 Subdevice #0: subdevice #0 card 0: Intel [HDA Intel], device 1: Conexant Digital [Conexant Digital] Subdevices: 1/1 Subdevice #0: subdevice #0 card 1: JamLab [JamLab], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 card 2: Audio [Altec Lansing XT1 - USB Audio], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0
例如,該列表中的最後一項對應的音效卡序號(音效卡編號)為2,音效卡 ID 字符串為 Audio,設備 ID 為0。若要將該音效卡設為默認值,可以使用系統級文件/etc/asound.conf或用戶級文件~/.asoundrc。如果文件不存在,則需要手動創建。隨後插入對應音效卡的以下選項:
pcm.!default {
type hw
card Audio #or card 2
hint {
show on # for some applications
}
}
ctl.!default {
type hw
card Audio
}
pcm.dmixer {
type dmix
ipc_key 2048
slave {
pcm "hw:Audio" #or "hw:2"
}
}
pcm.dsnooper {
type dsnoop
ipc_key 2048
slave {
pcm "hw:Audio"
}
}
為了解決開機加載順序不固定的問題,建議使用音效卡 ID 字符串來代替數字編號引用。
pcm.dmixer和pcm.dsnooper用於為不支持無軟體混音環境的應用程式提供備用通道。
例如,運行chromium -alsa-output-device=pcm.dmixer -alsa-input-device=pcm.dsnooper可以臨時為 Chromium 啟用混音功能。
pcm選項決定了音頻播放使用哪塊音效卡及設備,而ctl選項則決定了諸如alsamixer等控制工具使用哪塊音效卡。
在(重新)啟動應用程式(如 MPlayer)後,配置更改應立即生效。也可以使用 aplay 等命令進行測試:
$ aplay -D default:PCH your_favourite_sound.wav
如果收到有關 asound 配置的錯誤提示,請檢查上游官方文檔以獲取配置文件格式可能發生的變化。
插件
如果需要啟用#聲道擴充,#聲道摺疊,#高質量重採樣和其它高級功能,請安裝插件alsa-plugins包,
有關更多信息,請參閱PCM(數字音頻)插件。
軟體混音
混音使多個應用程式能夠同時輸出聲音。大多數獨立音效卡都支持硬體混合,如果可用,默認情況下會啟用。集成主板音效卡(如英特爾高清音頻),通常不支持硬體混音。在此類卡上,軟體混音由名為dmix的 ALSA 插件完成。如果硬體混音不可用,則會自動啟用此功能。
dmix未為數字輸出 (S/PDIF) 啟用,需要以下配置片段啟用。要手動啟用dmix,請將以下內容添加到 ALSA 配置文件中:
/etc/asound.conf
pcm.dsp {
type plug
slave.pcm "dmix"
}
聲道擴充
播放雙聲道立體聲音源(如音樂)時,需要利用聲道擴充才能充分利用 5.1 或 7.1 環繞立體聲系統。以前,聲道擴充很麻煩,還經常出錯;但如今有了插件可以輕鬆地打理好這一任務。我們使用由 alsa-plugins包 軟體包提供的 upmix 插件。
然後在ALSA配置文件(/etc/asound.conf 或 ~/.asoundrc)中添加如下內容:
pcm.upmix71 {
type upmix
slave.pcm "surround71"
delay 15
channels 8
}
該範例適用於7.1聲道的聲道擴充。類比該範例,同樣能設置5.1或4.0聲道聲道擴充。
該設置添加了一個新的用於聲道擴充的pcm通道。如果希望所有音頻源都通過該 pcm 輸出,在上述設置後添加如下配置即可:
pcm.!default "plug:upmix71"
插件自動允許多個音頻源同時通過它輸出,所以將其設為默認實際上是個安全的選擇。如果不行,就得像下面這樣為聲道擴充配置 dmixer:
pcm.dmix6 {
type asym
playback.pcm {
type dmix
ipc_key 567829
slave {
pcm "hw:0,0"
channels 6
}
}
}
並使用 dmix6 而非 surround71。如果遇到聲音卡頓或混亂,考慮增加 buffer_size(比如增加到 32768),或使用高質量重採樣。
聲道摺疊
如果您想將源聲道摺疊為立體聲,比如您想在立體聲系統上觀看具有 5.1 聲音的電影,請使用 alsa-plugins包中包含的 vdownmix 插件。
在配置文件中添加如下內容:
pcm.!surround51 {
type vdownmix
slave.pcm "default"
}
pcm.!surround40 {
type vdownmix
slave.pcm "default"
}
pcm.!default "plug:surround51" 或 pcm.!default "plug:surround40"。只能使用一個 vdownmix 插件;如果你有7.1聲道音響,需要使用 surround71 來代替上面所述的配置文件。一個讓 vdownmix 和 dmix 同時工作的配置文件的示例見 [2] 。多段均衡器
多段均衡器 (mbeq) 是一個相當典型的多頻段圖形均衡器。它是使用快速傅立葉變換(FFT)實現的,因此它需要相當多的 CPU 功率,但相位效應應該比等效濾波器實現更少。如果輸入信號的採樣率太低,則頂部頻段將被忽略 - 最高有用頻段將始終是高架。
mbeq是 Steve Harris 的LADSPA 插件套件的一部分。
如果還沒有的話,安裝 alsa-plugins包、ladspa包 和 swh-plugins包 軟體包。
- 在
~/.asoundrc或/etc/asound.conf中添加如下內容:
/etc/asound.conf
pcm.eq {
type ladspa
# The output from the EQ can either go direct to a hardware device
# (if you have a hardware mixer, e.g. SBLive/Audigy) or it can go
# to the software mixer shown here.
#slave.pcm "plughw:0,0"
slave.pcm "plug:dmix"
# Sometimes you may need to specify the path to the plugins,
# especially if you have just installed them. Once you have logged
# out/restarted this should not be necessary, but if you get errors
# about being unable to find plugins, try uncommenting this.
#path "/usr/lib/ladspa"
plugins [
{
label mbeq
id 1197
input {
#this setting is here by example, edit to your own taste
#bands:
50hz, 100hz, 156hz, 220hz, 311hz, 440hz, 622hz, 880hz, 1250hz, 1750hz, 25000hz, #50000hz, 10000hz, 20000hz
controls [ -5 -5 -5 -5 -5 -10 -20 -15 -10 -10 -10 -10 -10 -3 -2 ]
}
}
]
}
# Redirect the default device to go via the EQ - you may want to do
# this last, once you are sure everything is working. Otherwise all
# your audio programs will break/crash if something has gone wrong.
pcm.!default {
type plug
slave.pcm "eq"
}
# Redirect the OSS emulation through the EQ too (when programs are running through "aoss")
pcm.dsp0 {
type plug
slave.pcm "eq"
}
ALSAEqual
System-wide
安裝 alsaequalAUR包。
安裝包後,將以下內容添加到 ALSA 配置文件中:
/etc/asound.conf
ctl.equal {
type equal;
}
pcm.plugequal {
type equal;
# Normally, the equalizer feeds into dmix so that audio
# from multiple applications can be played simultaneously:
slave.pcm "plug:dmix";
# If you want to feed directly into a device, specify it instead of dmix:
#slave.pcm "plughw:0,0";
}
# Configuring pcm.!default will make the equalizer your default sink
pcm.!default {
# If you do not want the equalizer to be your default,
# give it a different name, like pcm.equal commented below
# Then you can choose it as the output device by addressing
# it in individual apps, for example mpg123 -a equal 06.Back_In_Black.mp3
# pcm.equal {
type plug;
slave.pcm plugequal;
}
要更改均衡器設置,請運行
$ alsamixer -D equal
請注意,每個用戶的均衡器配置都不同(除非未指定其它內容)。 保存在 ~/.alsaequal.bin中。
因此,如果您想將ALSAEqual與mpd 或在不同用戶下運行的其它軟體一起使用,您可以使用以下命令進行配置。
$ su mpd -c 'alsamixer -D equal'
或者,例如,您可以在他們的主目錄中創建指向您的.alsaequal.bin的符號連結。
僅特定輸出
如果您只想將均衡器應用於特定的輸出設備(例如,您的揚聲器連接到 S/PDIF 輸出,而不是耳機連接到耳機插孔),但又希望能夠從多個應用程式和同時輸出到兩個輸出設備,您需要創建兩個直接饋送到各自設備(slave.pcm)的 {ic|dmix}} 設備。以下內容適用於立體聲輸出,並保持常規立體聲輸入,僅將均衡器應用於 S/PDIF 輸出。
/etc/asound.conf
#
# (capture.pcm) <-- dnsoop
# |
# !default --> dmixa
# | |
# (playback.pcm) --> stereo2quad ==> quad
# |
# --> softvol --> plugequal --> dmixd
#
# dmix for analog output
pcm.dmixa {
type dmix
ipc_key 1024
ipc_perm 0666
slave.pcm "hw:PCH,0"
slave {
period_time 0
period_size 1024
buffer_size 4096
channels 2
}
bindings {
0 0
1 1
}
}
# dmix for digital output
pcm.dmixd {
type dmix
ipc_key 2048
ipc_perm 0666
slave.pcm "hw:PCH,1"
slave {
period_time 0
period_size 1024
buffer_size 4096
channels 2
}
bindings {
0 0
1 1
}
}
# equalizer with controls
pcm.plugequal {
type equal
slave {
pcm "plug:dmixd"
}
}
ctl.equal {
type equal
}
# Volume control for S/PDIF
pcm.softvol {
type softvol
slave.pcm "plug:plugequal"
control {
name "S/PDIF"
}
}
# multi:
# "a" (analog) -> dmix,
# "d" (digital) -> softvol -> plugequal -> dmix
pcm.quad {
type multi
slaves {
a.pcm "dmixa"
a.channels 2
d.pcm "plug:softvol" # detour via softvol and equalizer
d.channels 2
}
bindings {
0 { slave a; channel 0; }
1 { slave a; channel 1; }
2 { slave d; channel 0; }
3 { slave d; channel 1; }
}
}
# stereo to quad
pcm.stereo2quad {
type route
slave.pcm "quad"
ttable [
[ 1 0 1 0 ]
[ 0 1 0 1 ]
]
}
# playback to stereo to quad, capture as usual
pcm.!default {
type asym
playback.pcm "plug:stereo2quad"
capture.pcm "plug:dnsoop"
}
狀態管理
安裝alsaequal-mgrAUR 包。
像往常一樣配置均衡器
$ alsamixer -D equal
當您對狀態感到滿意時,您可以給它起一個名字(在本例中為 foo)並保存它:
$ alsaequal-mgr save foo
狀態 "foo"可以在以後用一下方式恢復
$ alsaequal-mgr load foo
但是,這只能恢復~/.alsaequal.bin然後,您必須通過 alsamixer -D equal更新均衡器。
因此,您可以為遊戲、電影、音樂流派、VoIP 應用程式等創建不同的均衡器狀態,並根據需要重新加載它們。
有關更多選項,請參閱項目頁面和幫助消息。
提示和技巧
高質量重採樣
啟用#軟體混音混音後,ALSA 會強制將所有內容重新採樣到相同的頻率(支持時默認為 48 kHz)。默認情況下,它將嘗試使用speexrate轉換器來執行此作,如果不可用,則回退到低質量的線性插值。因此,如果您由於重採樣不良而獲得較差的音質,只需安裝alsa-plugins包包即可解決問題。
要獲得更高質量的重採樣,您可以將默認速率轉換器更改為 speexrate_medium或speexrate_best。兩者都表現得足夠好,在實踐中您選擇哪一個並不重要,因此使用最好的轉換器通常不值得它所需的額外 CPU 周期。
要更改默認轉換器,請將以下內容放在 ~/.asoundrc或 /etc/asound.conf中:
defaults.pcm.rate_converter "speexrate_medium"
- 也可以使用 libsamplerate包包轉換器,其速度僅為 speexrate轉換器的一半左右,但質量不會提高多少。
- 也可以使用 Rate 使用 libavresample 的轉換器插件 ,此插件使用FFmpeg。
lavcrate_high和lavcrate_higher分別等於 Kodi低質量和中質量重採樣器。
- 某些應用程式(如 MPlayer 及其分支)默認執行自己的重採樣,因為某些 ALSA 驅動程序在啟用重採樣時具有不正確的延遲報告(因此導致 AV 不同步),因此更改此設置不會產生任何影響,除非您將它們配置為使用 ALSA 重採樣。
在啟動時禁用自動靜音
自動靜音模式可以在使用amixer啟動時配置。例如,要禁用它:
# amixer -c 0 sset "Auto-Mute Mode" Disabled
或者,可以通過alsamixer使用基於 ncurses 的接口。為了保存任何修改,請使用:
# alsactl store
或
# alsactl daemon
參考 #ALSA和systemd.
熱插拔 USB 音效卡
同時輸出
您可能希望通過通過迷你插孔連接的外部揚聲器和內部揚聲器同時播放音樂。這可以通過使用alsamixer或{ic|amixer}}取消靜音自動靜音項目來完成:
$ amixer sset "Auto-Mute" unmute
然後取消靜音其它必需項目,例如耳機、揚聲器、低音揚聲器......
鍵盤控制音量
將以下命令映射到音量鍵: XF86AudioRaiseVolume, XF86AudioLowerVolume, XF86AudioMute.
提高音量:
amixer set Master 5%+
降低音量:
amixer set Master 5%-
切換音量的靜音/取消靜音:
amixer set Master toggle
使用snd_aloop的虛擬聲音設備
您可能需要一個插孔替代方案來創建虛擬錄音或播放設備,以便使用{{ic|snd_aloop}模塊混合不同的源:
modprobe snd_aloop
使用以下方法列出您的新虛擬設備
aplay -l
現在你可以使用 ffmpeg:
ffmpeg -f alsa -i hw:1,1,0 -f alsa -i hw:1,1,1 -filter_complex amerge output.mp3
在 hw:R,W,N 短語中,R 是您的虛擬卡設備號。錄製設備應將 W 設置為 1,播放設備應設置為 0。N 是您的子設備。您可以使用所有可用的虛擬設備並使用 mplayer 等應用程式播放/停止:
mplayer -ao alsa:device=hw=1,0,0 fileA mplayer -ao alsa:device=hw=1,0,1 fileB
您還可以用這種方法,就是使用下面的腳本來使用festival將語音生成到錄音流中。
#!/bin/sh echo "$1" | iconv -f utf-8 -t iso-8859-1 | text2wave > "_tmp_.wav" mplayer -ao alsa:device=hw=2,0,0 "_tmp.wav" rm "_tmp.wav"
重新配置輸入/輸出埠
alsa-tools包包含hdajackretask工具,該工具可用於(在Intel HDA卡上)重新配置音效卡輸入/輸出埠;例如,將麥克風插孔變成耳機插孔。
apulse
apulseAUR 提供了PulseAudio API 的替代部分實現。它允許您將 ALSA 用於僅支持 PulseAudio 聲音的應用程式。用法很簡單:
$ apulse application