ALSA

出自 Arch Linux 中文维基

高級 Linux 聲音體系(Advanced Linux Sound Architecture,ALSA)提供聲卡的內核驅動,代替了原來的開放聲音系統(Open Sound System,OSS)。

除了聲音設備驅動,ALSA還捆綁了一個用戶空間驅動的庫用於應用開發。開發者可以使用這些 ALSA 驅動進行高級 API 開發,可以通過 ALSA 庫達成與聲音設備的內核(直接)交互。

安裝[編輯 | 編輯原始碼]

ALSA是一組內置的Linux內核模塊,故無需手動安裝。

udev會在系統啟動時自動檢測硬件並選擇所需的驅動,並加載相應的聲音設備驅動模塊。所以你的聲卡應當已經可以工作了,然而在一開始聲音可能被靜音了。這種情況下見#解除各聲道的靜音

用戶權限[編輯 | 編輯原始碼]

一般情況下,本地用戶有權播放音頻和改變混音器音量。

要讓遠程用戶擁有這些權限,需要把這些用戶加入 audio 用戶組,但默認情況下不推薦這樣做(見下方注意)。

注意: 添加用戶到 audio 組允許其直接訪問設備。記住,這樣會允許應用獨佔輸出設備。在多用戶系統中,這會破壞軟件混音或快速用戶切換。因此,默認情況下不建議把用戶加入 audio 用戶組,除非有特別需要[1]

ALSA 實用程序[編輯 | 編輯原始碼]

安裝軟件包 alsa-utils。其包含 alsamixeramixer 等實用程序。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-osssnd-pcm-osssnd-mixer-oss 內核模塊來激活OSS模擬。

PulseAudio 兼容性[編輯 | 編輯原始碼]

apulseAUR 可以為只提供PulseAudio聲音支持的應用使用 ALSA。用法為 $ apulse 你的應用

ALSA 和 Systemd[編輯 | 編輯原始碼]

alsa-utils 軟件包默認包含了 systemd 單元配置文件 alsa-restore.servicealsa-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-firmwarealsa-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 表示已經啟用。

使用 鍵滾動到 MasterPCM 聲道,按下 m 鍵解除靜音。

使用 鍵增加音量,獲得0dB的增益。增益值可在左上方 Item: 字段旁邊看到。

注意: 若增益高於0 dB,可能會聽到失真。

解除5.1/7.1聲音的靜音[編輯 | 編輯原始碼]

要想得到完整的 5.1 或 7.1 環繞聲,可能需要解除 FrontSurroundCenterLFE (低音炮)以及 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)可能也需要解除FrontHeadphone 通道的靜音並調整它們。
  • 如果重啟以後,你的聲音調整似乎丟失了,嘗試以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;

在操作正確的情況下,使用覆蓋操作模式通常來說是安全的。但是切記,在一個節點中可能會有其他對於正確動作來說必要的鍵值。

警告: 覆蓋 pcm 節點大致必然會使 alsa 無法使用,因為所有插件定義都會被刪除。 因此除非要從頭開始創建配置,否則 不要使用 !pcm.key
使用「默認」節點的默認設備設定示例[編輯 | 編輯原始碼]

假設「默認」(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.

注意: From a configuration point of view those are not equivalent to setting a compound "default" pcm device, since most users specify addressing type in there also, which actually may be the same, but the assignment itself still differs. Also defaults.pcm.card is referred to multiple times in alsa configuration files, usually as a fallback assignment, where different environment variables take precedence.

嵌套[編輯 | 編輯原始碼]

有時在配置中使用嵌套有用而且更易讀。

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> # 对全局配置目录的引用

設置默認聲卡[編輯 | 編輯原始碼]

提示:對於ALSA相關術語「card」(聲卡)、「device」(設備)(「card」並非等同於「device」)、「subdevice」(子設備)等的解釋見Wikipedia:Advanced Linux Sound Architecture#Concepts。維基百科上也有關於很多相關術語的文章,如PCM以及S/PDIF

通過默認節點設置默認聲卡[編輯 | 編輯原始碼]

關於 defaults.pcm.carddefaults.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)使用的模塊時,推薦您加入供應商和設備認證信息到選項中。為了獲得 vidpid 信息,使用以下命令:

$ 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
注意: 請注意默認尋址類型。

替代方式[編輯 | 編輯原始碼]

提示:使用asoundconfAUR可部分地自動化該過程。

首先確認你想設為默認的聲卡和設備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
}
注意: 對於華碩U32U系列,似乎應當將pcm與ctl的聲卡都設為1。

多數情況下建議使用聲卡名代替數字引用。聲卡名稱容易理解,同時克服了啟動順序問題。因此以下配置對於上面的示例應當是正確的。

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
注意: 這種方法在有多個相同(ALSA)名字的聲卡的時候可能會造成問題。

「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

如果你的輸出和上面類似,那就說明聲卡已經被正確識別。

注意:udev的171版本開始,默認情況下 OSS 仿真模塊(snd_seq_osssnd_pcm_osssnd_mixer_oss)不再自動加載。如有需要,請手動加載

還可以檢查一下 /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
注意: 在 IRC 或論壇尋求這方面幫助時,如果有需要,請貼出上面幾個命令的輸出。

如果你的輸出跟上面類似,或至少有 controlC0pcmC0D0p,那麼聲卡模塊就已經正常檢測並加載了。

如果不是,則聲卡模塊沒有被正確檢測。要解決問題,可以嘗試手動加載模塊:

  • 確定聲卡對應的驅動模塊:ALSA Soundcard Matrix。這些模塊都會有一個「snd-」前綴(例如:snd-via82xx)。
  • 加載模塊
  • 檢查 /dev/snd 目錄中的設備文件(參見上文);或者,檢查 alsamixeramixer 的輸出是否正確。
  • 修改配置,使 snd-<模塊名>snd-pcm-oss 模塊開機自動加載

啟用 SPDIF 輸出[編輯 | 編輯原始碼]

S/PDIF 是一種數字音頻介面,常用來連接電腦與數字功放(如有5.1/7.1環繞聲的家庭影院)。

注意: 在某些聲卡(如Audigy2)上這會禁用模擬聲音輸出。
  • ~/.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[編輯 | 編輯原始碼]

注意: 該方法用到了一個 LADSPA 插件,可能導致播放音頻時 CPU 佔用率偏高。另外該方法主要考慮的是雙聲道立體聲(如耳機)的需要。

如果還沒有的話,安裝 alsa-pluginsladspaswh-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_mediumspeexrate_best。二者的效果都足夠好,實際上選哪個並不重要,所以一般來說不值得花費更多CPU資源去使用「best」轉換器。

要更改默認轉換器,將以下內容加入你的~/.asoundrc/etc/asound.conf

/etc/asound.conf
defaults.pcm.rate_converter "speexrate_medium"
注意: 也可以使用libsamplerate轉換器,其速度大約只有speexrate轉換器的一半,而質量則並沒有高到哪裏去。見Talk:Advanced Linux Sound Architecture#On high quality resampling
注意: 也可以使用lavcrate重採樣器,其使用ffmpeg,可選的filter sizes 有 lavcrate_faster:4 lavcrate_fast:8 lavcrate:16 lavcrate_high:32 lavcrate_higher:64 最後兩個選項分別等同於 Kodi 低/中等質量重採樣器
注意: 有些應用(如MPlayer及其分支)默認自己進行重採樣,因為一些ALSA驅動在啟用重採樣時會報告不正確的延遲(這樣會導致音畫不同步)。所以除非設置它們使用ALSA重採樣,否則改變此設置不會有任何效果。

上混和縮混[編輯 | 編輯原始碼]

注意: 由於未找到 upmix 和 downmix 的常用翻譯,譯者暫時採用字面翻譯(上混、縮混)。所謂「上混」,即將聲道較少的立體聲(如常見的雙聲道立體聲)信號,通過軟件或硬件處理,模擬為聲道較多的立體聲(如5.1環繞立體聲)信號。反之即為「縮混」。

上混(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"
}
注意: 這可能還不足以讓縮混工作,見 [7] 。因此可能需要添加 pcm.!default "plug:surround51"pcm.!default "plug:surround40"。只能使用一個 vdownmix 插件;如果你有7.1聲道音響,需要使用 surround71 來代替上面所述的配置文件。一個讓 vdownmixdmix 同時工作的配置文件的示例見 [8]

Dmix[編輯 | 編輯原始碼]

混音使得多個應用可以同時發出聲音。多數獨立聲卡支持硬件混音,在允許的情況下會默認啟用。板載集成聲卡(如Intel HD Audio)通常不支持硬件混音。在這種聲卡上,軟件混音由一個稱作dmix的ALSA插件完成。若硬件混音不可用,將自動啟用該功能。

注意: 對於不支持硬件混音的聲卡,會默認啟用dmix。對於數字輸出(S/PDIF),不會默認啟用dmix,需要下面的配置。

要手動啟用dmix,可以將以下內容加入你的ALSA配置文件:

pcm.dsp {
    type plug
    slave.pcm "dmix"
}

提示和技巧[編輯 | 編輯原始碼]

禁止啟動時自動靜音[編輯 | 編輯原始碼]

啟動時自動靜音模式可以通過amixer配置。例如,要禁用它:

# amixer -c 0 sset "Auto-Mute Mode" Disabled

或者可以通過alsamixer使用圖形界面。要保存更改,請使用:

# alsactl store

# alsactl daemon

參考 #ALSA 和 Systemd

USB聲卡熱插拔[編輯 | 編輯原始碼]

參見 Writing Udev rules for ALSA

同時輸出[編輯 | 編輯原始碼]

你可能會希望使用一個用小型插頭連接的外置揚聲器與內置揚聲器同時播放音樂。使用alsamixeramixer解除靜音Auto-Mute即可實現:

$ amixer sset "Auto-Mute" unmute

然後解除靜音其他需要的項目, 比如 Headphones, Speaker, Bass Speaker...

注意: 如果之後你在耳機連接器(mini-jack)中聽到劈啪聲,參見 這裏.

鍵盤控制音量[編輯 | 編輯原始碼]

將下列命令映射到你的音量鍵: XF86AudioRaiseVolumeXF86AudioLowerVolumeXF86AudioMute

增加音量:

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驅動程序的進程(如PulseaudioJACK)。

正確檢測插入四極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

相關閱讀[編輯 | 編輯原始碼]