ALSA
高級 Linux 聲音體系(Advanced Linux Sound Architecture,ALSA)提供聲卡的內核驅動,代替了原來的開放聲音系統(Open Sound System,OSS)。
除了聲音設備驅動,ALSA還捆綁了一個用戶空間驅動的庫用於應用開發。開發者可以使用這些 ALSA 驅動進行高級 API 開發,可以通過 ALSA 庫達成與聲音設備的內核(直接)交互。
安裝[編輯 | 編輯原始碼]
ALSA是一組內置的Linux內核模塊,故無需手動安裝。
udev會在系統啟動時自動檢測硬件並選擇所需的驅動,並加載相應的聲音設備驅動模塊。所以你的聲卡應當已經可以工作了,然而在一開始聲音可能被靜音了。這種情況下見#解除各聲道的靜音。
用戶權限[編輯 | 編輯原始碼]
一般情況下,本地用戶有權播放音頻和改變混音器音量。
要讓遠程用戶擁有這些權限,需要把這些用戶加入 audio
用戶組,但默認情況下不推薦這樣做(見下方注意)。
audio
組允許其直接訪問設備。記住,這樣會允許應用獨佔輸出設備。在多用戶系統中,這會破壞軟件混音或快速用戶切換。因此,默認情況下不建議把用戶加入 audio
用戶組,除非有特別需要[1]。ALSA 實用程序[編輯 | 編輯原始碼]
安裝軟件包 alsa-utils包。其包含 alsamixer
、 amixer
等實用程序。amixer是一個用於更改音頻設置的shell命令,而alsamixer則提供了一個較為直觀的,基於ncurses的界面,用於配置聲音設備。
如果需要高質量重採樣,請安裝 alsa-plugins包 軟件包,即可啟用#上混和縮混和其他高級特性。
OSS 兼容性[編輯 | 編輯原始碼]
/dev/dsp
或者/dev/snd/seq
,這一部分很重要OSS 是一個可選的聲音架構。
ALSA有能力截獲Open Sound System調用,並轉而將之發往ALSA。例如,對於試圖打開/dev/dsp
並向裏面直接寫入聲音數據的傳統應用,這個模擬層很有用。沒有OSS或者該模擬庫,就會缺少/dev/dsp
,應用就不會產生任何聲音。
如果希望Open Sound System應用和dmix共同工作,請一併安裝alsa-oss包。然後加載snd-seq-oss
、 snd-pcm-oss
和 snd-mixer-oss
內核模塊來激活OSS模擬。
PulseAudio 兼容性[編輯 | 編輯原始碼]
apulseAUR 可以為只提供PulseAudio聲音支持的應用使用 ALSA。用法為 $ apulse 你的應用
。
ALSA 和 Systemd[編輯 | 編輯原始碼]
alsa-utils包 軟件包默認包含了 systemd 單元配置文件 alsa-restore.service
和 alsa-state.service
。
在安裝時它們會自動安裝並激活(通過軟件包提供的指向sound.target的符號連結)。二者都不會默認運行,因為要確定該使用哪種方法需要由用戶專門決定。兩個選項如下所述:
alsa-restore.service
在引導時讀取/var/lib/alsa/asound.state
,並在關機時寫入更新後的值,前提是已經運行alsactl store
生成了配置文件;alsa-state.service
以守護進程方式(重新)啟動alsactl,以持續跟蹤並保持音量變化。同樣,前提是用戶已經專門啟動過了alsactl daemon
。
兩種方法是互斥的,根據需要可以選擇其中一種。更多信息請查看 alsactl(1) 。
可以通過 systemctl
檢查其狀態。
ALSA 固件[編輯 | 編輯原始碼]
alsa-firmware包 軟件包包含了某些聲卡(如創新SB0400 Audigy2)可能需要的固件。
一些較新型號的筆記本電腦(2019年底/2021)需要sof-firmware包 和 alsa-ucm-conf包,它們使用 Sound Open Firmware 提供的固件實現驅動程序。
解除各聲道的靜音[編輯 | 編輯原始碼]
ALSA 默認靜音所有聲道,必須手動解除。
使用amixer解除靜音[編輯 | 編輯原始碼]
可以使用 amixer
解除聲卡的主音量靜音:
$ amixer sset Master unmute $ amixer sset Speaker unmute $ amixer sset Headphone unmute
使用alsamixer解除靜音[編輯 | 編輯原始碼]
使用 alsamixer
可以解除聲卡的靜音:
$ alsamixer
聲道下方標有 MM
表示其已經靜音,而標有 00
表示已經啟用。
使用 ←
和 →
鍵滾動到 Master
和 PCM
聲道,按下 m
鍵解除靜音。
使用 ↑
鍵增加音量,獲得0
dB的增益。增益值可在左上方 Item:
字段旁邊看到。
解除5.1/7.1聲音的靜音[編輯 | 編輯原始碼]
要想得到完整的 5.1 或 7.1 環繞聲,可能需要解除 Front
、 Surround
、 Center
、 LFE
(低音炮)以及 Side
等其他聲道的靜音(這些聲道名稱是 Intel HD Audio 聲卡使用的,可能因設備不同而有所差異)。
啟用麥克風[編輯 | 編輯原始碼]
要啟用麥克風,按 F4
切換至 Capture (捕獲)選項卡,然後按 空格
啟用一個聲道即可。如果麥克風不工作,參考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' is the PCM channel name for -D 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
若聲音工作異常,而通過參數指定獲得了正確的聲音輸出,嘗試#設置默認聲卡。
如果沒有正常工作,請繼續閱讀 #配置部分和 Advanced Linux Sound Architecture/Troubleshooting 頁面。
附加註釋[編輯 | 編輯原始碼]
- 如果你的系統有多個聲卡,則可以按
F6
切換聲卡。
- 有些聲卡需要靜音或禁用數字輸出,才能聽到模擬聲音。Soundblaster Audigy LS應當靜音標有
IEC958
的聲道。
- 有些機器(如Thinkpad T61)有
Speaker
聲道,也需要解除靜音並調整。
- 有些機器(如Dell E6400)可能也需要解除
Front
和Headphone
通道的靜音並調整它們。
- 如果重啟以後,你的聲音調整似乎丟失了,嘗試以root運行alsamixer。
配置[編輯 | 編輯原始碼]
系統配置文件是 /etc/asound.conf
, 分用戶配置文件是 ~/.asoundrc
.
基本語法[編輯 | 編輯原始碼]
Alsa 設置文件遵循一個簡單語法,由分層次的參數(鍵值)賦值組成。語法在[2]中也有說明。
賦值與分隔符[編輯 | 編輯原始碼]
賦值能夠定義一個鍵值的具體值,可以使用不同的賦值類型和風格。
# 使用 # 符号来注释文字,该符号后所有到行尾的符号能够被注释掉。 key = value # 句中等号通常可以省略,因为空格也能够被用作分隔符。 key value # 此句意义与上句 key = value 等同
分隔符被用作指示賦值的開始和結束,不過逗號或是空白字符也是可以使用的。
key value0; key valueN; key value0, key valueN, # 所有赋值操作都是等同意义的 key value0 key valueN key value0 key valueN
複合賦值使用大括號作為分隔符。
key { subkey0 value0; subkeyN valueN; } key.subkey0 value0; # 与上述语句意义相同 key.subkeyN valueN;
出於可讀性考慮,在定義三種以上的參數時,推薦使用第一種方式。
序列定義使用中括號當作分隔符。
key [ "value0"; "valueN"; ] key.0 "value0"; # 与上述语句意义相同 key.N "valueN";
不同的配置風格都取決於使用者的偏好,但是需要避免混用不同風格。關於基礎配置的更多信息見 [3] 。
數據類型[編輯 | 編輯原始碼]
對於參數值 Alsa 使用不同的數據類型,必須在用戶對應的配置文件中設置。一些鍵值接受多種數據類型,但大部分則並非如此。一個配置選項列表及其相應的PCM插件類型要求見[4]。
操作模式[編輯 | 編輯原始碼]
解析節點有不同的操作模式,默認模式為「合併/創建」(merge/create)。如果操作模式為「合併/創建」或「合併」(merge),會進行類型檢查。只有同樣類型的賦值能夠被合併,因此字符串不能與整形數合併。在默認操作模式中嘗試對複合鍵值定義一個簡單賦值是沒有作用的,反之亦然。
操作模式前綴符號:
- "+" -- 合併/創建
- "-" -- 合併
- "?" -- 不覆蓋(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;
在操作正確的情況下,使用覆蓋操作模式通常來說是安全的。但是切記,在一個節點中可能會有其他對於正確動作來說必要的鍵值。
使用「默認」節點的默認設備設定示例[編輯 | 編輯原始碼]
假設「默認」(default)節點在 /usr/share/alsa/alsa.conf
設定,其中「defaults.pcm.card」及其對應的「ctl」(控制)項都賦值為整型數「0」, 而用戶想要將默認PCM與控制設備設定為聲卡「2」(第三個聲卡),或對於Azalia聲卡設定為「SB」。
defaults.ctl.card 2; # 将默认设备与控制设定为第三个声卡(计数从0开始)。 defaults.pcm.card 2; # 寻址类型不会更改。 defaults.ctl.+card 2; # 与上面相同。 defaults.pcm.+card 2; defaults.ctl.-card 2; # 对于默认设置来说效果相同,但如果默认节点被去除 defaults.pcm.-card 2; # 或类型被更改,则合并操作不会带来更改。 defaults.pcm.?card 2; # 没有效果,因为该赋值已经存在。 defaults.ctl.?card 2; defaults.pcm.!card "SB"; # 此处有必要使用覆盖操作模式, defaults.ctl.!card "SB"; # 因为数值类型有所不同。
這裏使用雙引號會自動將值的數據類型設為字符串,因此在上例中設置 defaults.pcm.!card "2"
的結果就是保持之前的默認設備不變,此例中為聲卡0。只要不使用特殊字符(理想狀態下也不應該會使用),雙引號就不是強制性的。This may be irrelevant in other assignments.
嵌套[編輯 | 編輯原始碼]
有時在配置中使用嵌套有用而且更易讀。
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;
包含配置文件[編輯 | 編輯原始碼]
</path/to/configuration-file> # 包含一个配置文件 <confdir:/path/to/configuration-file> # 对全局配置目录的引用
設置默認聲卡[編輯 | 編輯原始碼]
通過默認節點設置默認聲卡[編輯 | 編輯原始碼]
關於 defaults.pcm.card
和 defaults.pcm.device
,要實際運用上面的例子,假定有2塊聲卡分別編號為0和1,想要默認使用編號1的聲卡,在 /etc/asound.conf
或用戶對應的 ~/.asoundrc
使用以下配置即可更改回放與混音控制聲卡。
defaults.pcm.card 1 defaults.ctl.card 1
通過內核模塊選項配置編號[編輯 | 編輯原始碼]
如果發現開機時聲卡次序會發生變化,可以在 /etc/modprobe.d
中的任何名字以 .conf
結尾的文件(以下假設為 /etc/modprobe.d/alsa-base.conf
)中指定次序。
比如,要讓 mia 聲卡成為 #0:
/etc/modprobe.d/alsa-base.conf
options snd_mia index=0 options snd_hda_intel index=1
使用 $ cat /proc/asound/modules
來獲得當前已經載入的聲音模塊及其次序。這個列表通常對於載入次序來說就是全部所需的了。使用 $ lsmod | grep snd
來獲得設備和模塊的列表。這個配置假設你有一個使用 snd_mia
的mia聲卡和一個使用 snd_hda_intel
的(板載)聲卡。
也可以指定index為 -2
,讓ALSA不要將對應的設備作為主聲卡。Linux Mint 和 Ubuntu 等發行版使用了以下配置,避免 USB 聲卡和其他「非正常」設備獲得序號 0
:
/etc/modprobe.d/alsa-base.conf
options bt87x index=-2 options cx88_alsa index=-2 options saa7134-alsa index=-2 options snd-atiixp-modem index=-2 options snd-intel8x0m index=-2 options snd-via82xx-modem index=-2 options snd-usb-audio index=-2 options snd-usb-caiaq index=-2 options snd-usb-ua101 index=-2 options snd-usb-us122l index=-2 options snd-usb-usx2y index=-2 options snd-pcsp index=-2 options snd-usb-audio index=-2
以上配置會在系統重啟後生效。
參閱[5]
當載入被多個卡(比如,snd-hda-intel)使用的模塊時,推薦您加入供應商和設備認證信息到選項中。為了獲得 vid
和 pid
信息,使用以下命令:
$ lspci -nn | grep -i audio
00:14.2 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 Azalia (Intel HDA) [1002:4383] (rev 40) 01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] RV770 HDMI Audio [Radeon HD 4850/4870] [1002:aa30] 07:05.0 Multimedia audio controller [0401]: VIA Technologies Inc. VT1720/24 [Envy24PT/HT] PCI Multi-Channel Audio Controller [1412:1724] (rev 01)
Last numbers in square brackets are [vid:pid]
, so for the above example, for setting Azalia as default card following is correct:
/etc/modprobe.d/alsa-base.conf
# SB [HDA ATI SB] options snd-hda-intel index=0 model=auto vid=1002 pid=4383 # HDMI [HDA ATI HDMI] options snd-hda-intel index=1 model=auto vid=1002 pid=aa30 # HiFi [Audiotrak Prodigy 7.1 HiFi] options snd-ice1724 index=2 model=prodigy71hifi vid=1412 pid=1724
使用環境變量選擇默認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
Variable name # Definition ALSA_CARD # pcm.default pcm.hw pcm.plughw ctl.sysdefault ctl.hw rawmidi.default rawmidi.hw hwdep.hw ALSA_CTL_CARD # ctl.sysdefault ctl.hw ALSA_HWDEP_CARD # hwdep.default hwdep.hw ALSA_HWDEP_DEVICE # hwdep.default hwdep.hw ALSA_PCM_CARD # pcm.default pcm.hw pcm.plughw ALSA_PCM_DEVICE # pcm.hw pcm.plughw ALSA_RAWMIDI_CARD # rawmidi.default rawmidi.hw 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。不過,如果你需要使用麥克風的話,選擇全雙工PCM聲卡為默認設備是個不錯的選擇。
現在只需改變環境變量 ALSAPCM
,就可以在啟動程序時選擇聲卡。對於所有不允許選擇聲卡的程序此法效果良好,而對於其他的程序請確保保持默認聲卡選擇。
舉例來說,假設你寫了一個縮混PCM命名為 mix51to20
,用以下命令即可將之用於mplayer包:
ALSAPCM=mix51to20 mplayer example_6_channel.wav
替代方式[編輯 | 編輯原始碼]
首先確認你想設為默認的聲卡和設備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
type hw
設為默認聲卡等同於直接指定硬件,使得其他應用無法使用該設備。僅當作為更複雜設置的一部分(~/.asoundrc
)或者用戶有意地想要直接指定聲卡(如通過eic958
的數字輸出或專門的音樂伺服器)才推薦這種做法。例如,該列表中的最後一項的聲卡ID為2,設備ID為0。要把這塊聲卡設為默認,可以使用系統級的 /etc/asound.conf
或用戶級的 ~/.asoundrc
文件。如果文件不存在,需要手動創建。然後針對相應的聲卡加入以下內容:
pcm.!default { type hw card 2 } ctl.!default { type hw card 2 }
多數情況下建議使用聲卡名代替數字引用。聲卡名稱容易理解,同時克服了啟動順序問題。因此以下配置對於上面的示例應當是正確的。
pcm.!default { type hw card Audio } ctl.!default { type hw card Audio }
使用aplay獲取有效的ALSA聲卡名稱:
$ aplay -l | awk -F \: '/,/{print $2}' | awk '{print $1}' | uniq
PCH
或者用cat,但可能會返回沒用的設備:
$ cat /proc/asound/card*/id
PCH ThinkPadEC
「pcm」選項影響哪個聲卡和設備用於音頻回放,「ctl」選項則影響alsamixer等控制工具使用哪個聲卡。
一旦(重新)啟動MPlayer等應用程式,更改應當就會生效。也可以用aplay等命令進行測試。
$ aplay -D default:PCH your_favourite_sound.wav
如果你收到關於asound配置的報錯,閱讀上游文檔查看對於配置文件格式的可能更改。
確認已經加載正確的聲音模塊[編輯 | 編輯原始碼]
可以假定 udev 會正確地自動探測出聲卡。使用以下命令確認:
$ lsmod | grep '^snd' | column -t
snd_hda_codec_hdmi 22378 4 snd_hda_codec_realtek 294191 1 snd_hda_intel 21738 1 snd_hda_codec 73739 3 snd_hda_codec_hdmi,snd_hda_codec_realtek,snd_hda_intel snd_hwdep 6134 1 snd_hda_codec snd_pcm 71032 3 snd_hda_codec_hdmi,snd_hda_intel,snd_hda_codec snd_timer 18992 1 snd_pcm snd 55132 9 snd_hda_codec_hdmi,snd_hda_codec_realtek,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_pcm,snd_timer snd_page_alloc 7017 2 snd_hda_intel,snd_pcm
如果你的輸出和上面類似,那就說明聲卡已經被正確識別。
還可以檢查一下 /dev/snd/
目錄,看看是否有正確的設備文件:
$ ls -l /dev/snd
total 0 crw-rw---- 1 root audio 116, 0 Apr 8 14:17 controlC0 crw-rw---- 1 root audio 116, 32 Apr 8 14:17 controlC1 crw-rw---- 1 root audio 116, 24 Apr 8 14:17 pcmC0D0c crw-rw---- 1 root audio 116, 16 Apr 8 14:17 pcmC0D0p crw-rw---- 1 root audio 116, 25 Apr 8 14:17 pcmC0D1c crw-rw---- 1 root audio 116, 56 Apr 8 14:17 pcmC1D0c crw-rw---- 1 root audio 116, 48 Apr 8 14:17 pcmC1D0p crw-rw---- 1 root audio 116, 1 Apr 8 14:17 seq crw-rw---- 1 root audio 116, 33 Apr 8 14:17 timer
如果你的輸出跟上面類似,或至少有 controlC0 和 pcmC0D0p,那麼聲卡模塊就已經正常檢測並加載了。
如果不是,則聲卡模塊沒有被正確檢測。要解決問題,可以嘗試手動加載模塊:
- 確定聲卡對應的驅動模塊:ALSA Soundcard Matrix。這些模塊都會有一個「snd-」前綴(例如:
snd-via82xx
)。 - 加載模塊。
- 檢查
/dev/snd
目錄中的設備文件(參見上文);或者,檢查alsamixer
或amixer
的輸出是否正確。 - 修改配置,使
snd-<模塊名>
和snd-pcm-oss
模塊開機自動加載。
啟用 SPDIF 輸出[編輯 | 編輯原始碼]
S/PDIF 是一種數字音頻介面,常用來連接電腦與數字功放(如有5.1/7.1環繞聲的家庭影院)。
- 在
~/.xinitrc
或shell的配置文件中加入下面一行:
amixer -c 0 cset name='IEC958 Playback Switch' on
使用以下命令,獲取你的聲卡的數字輸出的名稱:
$ amixer scontrols
系統級均衡器[編輯 | 編輯原始碼]
使用 AlsaEqual(包含界面)[編輯 | 編輯原始碼]
安裝 alsaequalAUR。同時安裝 lib32-alsaequalAUR[損壞的連結:package not found] 以支持32位應用。
安裝後,把下列內容添加到 ALSA 配置文件(/etc/asound.conf
):
ctl.equal { type equal; } pcm.plugequal { type equal; # Modify the line below if you do not #slave.pcm "plughw:0,0"; #by default we want to play from more sources at time: slave.pcm "plug:dmix"; } #pcm.equal { # If you do not want the equalizer to be your # default soundcard comment the following # line and uncomment the above line. (You can # choose it as the output device by addressing # it with specific apps,eg mpg123 -a equal 06.Back_In_Black.mp3) pcm.!default { type plug; slave.pcm plugequal; }
之後就可以用該命令調整均衡器了:
$ alsamixer -D equal
需要注意,每個用戶的 alsaequal 配置文件都是不同的,位於 ~/.alsaequal.bin
。因此,如果想在 mpd 之類的以獨立用戶身份運行的程序中使用 AlsaEqual,就得像下面這樣:
# su mpd -c 'alsamixer -D equal'
或者,在那個用戶的主目錄下創建符號連結,指向你的 .alsaequal.bin
。
管理 AlsaEqual 配置[編輯 | 編輯原始碼]
從 Xyne 的軟件倉庫或 alsaequal-mgrAUR 安裝 alsaequal-mgr。
同上,配置均衡器:
$alsamixer -D equal
如果對效果感到滿意,將其命名(如「foo」)並保存該配置:
$alsaequal-mgr save foo
之後可以重新加載「foo」中的配置:
$alsaequal-mgr load foo
不過這樣只會恢復~/.alsaequal.bin
。之後還需要用alsamixer -D equal
更新均衡器設置。
這樣,就可以為遊戲、電影、不同音樂流派、網絡電話等等創建不同的均衡器配置,以便按需切換。
參見項目主頁和程序的幫助信息,了解更多設置。
使用 mbeq[編輯 | 編輯原始碼]
如果還沒有的話,安裝 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" }
高質量重採樣[編輯 | 編輯原始碼]
啟用軟件混音時,ALSA 會強制把所有音頻重採樣到相同的頻率(如果系統支持,默認是 48000)。默認會嘗試使用speexrate轉換器進行,如果它不可用的話就會回退到低質量的線性插值[6]。
因此如果由於糟糕的重採樣導致音質差,只需安裝 alsa-plugins包 就可能解決問題。
如果想要更高質量的重採樣,可將默認採樣率轉換器改為 speexrate_medium
或 speexrate_best
。二者的效果都足夠好,實際上選哪個並不重要,所以一般來說不值得花費更多CPU資源去使用「best」轉換器。
要更改默認轉換器,將以下內容加入你的~/.asoundrc
或 /etc/asound.conf
:
/etc/asound.conf
defaults.pcm.rate_converter "speexrate_medium"
上混和縮混[編輯 | 編輯原始碼]
上混(upmixing)[編輯 | 編輯原始碼]
播放雙聲道立體聲音源(如音樂)時,需要利用上混才能充分利用 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),或使用高質量重採樣。
縮混(downmixing)[編輯 | 編輯原始碼]
有時也會用到縮混,比如在只支持雙聲道立體聲的電腦上觀看5.1聲道的電影時。這一功能由 ALSA 插件 vdownmix 實現(同樣在 alsa-plugins包 軟件包裡)。
在配置文件中添加如下內容:
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
同時工作的配置文件的示例見 [8] 。Dmix[編輯 | 編輯原始碼]
混音使得多個應用可以同時發出聲音。多數獨立聲卡支持硬件混音,在允許的情況下會默認啟用。板載集成聲卡(如Intel HD Audio)通常不支持硬件混音。在這種聲卡上,軟件混音由一個稱作dmix的ALSA插件完成。若硬件混音不可用,將自動啟用該功能。
要手動啟用dmix,可以將以下內容加入你的ALSA配置文件:
pcm.dsp { type plug slave.pcm "dmix" }
提示和技巧[編輯 | 編輯原始碼]
禁止啟動時自動靜音[編輯 | 編輯原始碼]
啟動時自動靜音模式可以通過amixer
配置。例如,要禁用它:
# amixer -c 0 sset "Auto-Mute Mode" Disabled
或者可以通過alsamixer
使用圖形界面。要保存更改,請使用:
# alsactl store
或
# alsactl daemon
USB聲卡熱插拔[編輯 | 編輯原始碼]
參見 Writing Udev rules for ALSA
同時輸出[編輯 | 編輯原始碼]
你可能會希望使用一個用小型插頭連接的外置揚聲器與內置揚聲器同時播放音樂。使用alsamixer
或 amixer
解除靜音Auto-Mute即可實現:
$ amixer sset "Auto-Mute" unmute
然後解除靜音其他需要的項目, 比如 Headphones, Speaker, Bass Speaker...
鍵盤控制音量[編輯 | 編輯原始碼]
將下列命令映射到你的音量鍵: XF86AudioRaiseVolume
、XF86AudioLowerVolume
、XF86AudioMute
增加音量:
amixer set Master 5%+
減小音量:
amixer set Master 5%-
靜音/解靜音:
amixer set Master toggle
使用snd-aloop的虛擬聲音設備[編輯 | 編輯原始碼]
You might want a jack alternative to create a virtual recording or play device in order to mix different sources, using the snd-aloop module:
modprobe snd-aloop
List your new virtual devices using:
aplay -l
now you can for example using ffmpeg:
ffmpeg -f alsa -i hw:1,1,0 -f alsa -i hw:1,1,1 -filter_complex amerge output.mp3
In the hw:R,W,N format R is your virtual card device number, W 1 recording devices 0 for writing, R is your sub device you can use all the virtual devices available and play/stop using applications like mplayer:
mplayer -ao alsa:device=hw=1,0,0 fileA mplayer -ao alsa:device=hw=1,0,1 fileB
Another thing you could do with this approach, is using festival to generate a voice into a recording stream using an script like this:
#!/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故障[編輯 | 編輯原始碼]
獲取驅動程序狀態[編輯 | 編輯原始碼]
alsa-utils包軟件包也包含了alsa-info.sh
命令,可用於收集關於ALSA驅動程序與用戶空間狀態的詳細信息。
更多信息見ALSA bug tracking。
重新配置輸入輸出端口[編輯 | 編輯原始碼]
alsa-tools包軟件包包含有hdajackretask
工具,(在英特爾HDA聲卡上)可用於重新配置聲卡輸入輸出端口;例如,將麥克風插孔轉為耳機插孔。
復位編解碼器[編輯 | 編輯原始碼]
ALSA驅動程序能夠完全重新配置所連接的編解碼器(聲音系統中實際處理音頻流的組件),用法如下:
# echo 1 > /sys/class/sound/card/reconfig
在此之前,必須停止所有使用ALSA驅動程序的進程(如Pulseaudio 或 JACK)。
正確檢測插入四極3.5毫米(TRRS)插孔的麥克風[編輯 | 編輯原始碼]
在一些現代筆記本上,可能會有一個3.5毫米組合耳機插孔,而不是兩個分開的插孔,在默認情況下可能不能被正確檢測到。要想讓ALSA正確檢測到你的3.5毫米插孔的插入狀態,可以在/etc/modprobe.d/alsa-base.conf
中加入下面一行:
options snd_hda_intel index=0 model=your_model_setting
對於寫在your_model_setting
處的完整選項列表,見HD-Audio Codec-Specific Models或其位於/usr/lib/modules/$(uname -r)/build/Documentation/sound/hd-audio/models.rst
(由linux-docs包軟件包提供)的源。
在搭載有ALC255的技嘉Aero15 2017 (P65 Model)上經過測試,model設為dell-headset-multi
。