跳至內容

ALSA

出自 Arch Linux 中文维基

這篇文章或章節的翻譯質量不佳。

原因:本文疑似機翻,許多用詞不自然、不準確。(在 Talk:ALSA# 中討論)

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

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

提示:ALSA 相關術語的解釋—interface, card, device (一個card 不是一個 device), subdevice, 以及更多 - 可以在 Wikipedia:Advanced Linux Sound Architecture#Concepts找到

安裝

[編輯 | 編輯原始碼]

ALSA 驅動是內核的一部分,ALSA 庫(alsa-lib)通常作為依賴安裝,故無需手動安裝。

udev會在系統啟動時自動檢測硬體並選擇所需的驅動,並加載相應的聲音設備驅動模塊。所以你的音效卡應當已經可以工作了.

然而在一開始聲音可能被靜音了。這種情況下見#解除頻道靜音

固件

[編輯 | 編輯原始碼]

筆記本電腦通常需要Sound Open Firmware (SOF) (sof-firmware) —他們傾向於使用 Cadence Tensilica Xtensa 架構DSPs,請參閱支持的平台列表。如果固件丟失,日誌將提供以下消息:

error: sof firmware file is missing
error: failed to load DSP firmware -2
error: sof_probe_work failed err: -2


有關更多 SOF 故障排除信息,請參閱英特爾硬體平台概述.

裝有Cirrus Logic智能放大器的筆記本電腦需要linux-firmware-cirrus包。參考:


某些英特爾音頻設備需要linux-firmware-intel包。


alsa-firmware包含一些音效卡可能需要的固件。


See also #Cards and modules and Linux firmware.

ALSA 實用程序

[編輯 | 編輯原始碼]

安裝軟體包 alsa-utils。其包含 alsamixeramixer 等實用程序。amixer是一個用於更改音頻設置的shell命令,而alsamixer則提供了一個較為直觀的,基於ncurses的界面,用於配置聲音設備。



ALSA 和 Systemd

[編輯 | 編輯原始碼]

alsa-utils 軟體包默認包含了 systemd 單元配置文件 alsa-restore.servicealsa-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組允許直接訪問設備。請記住,這允許應用程式專門保留輸出設備。這可能會破壞多座系統上的軟體混合或快速用戶切換。因此,默認情況下不建議將用戶添加到audio組,除非您有特殊需求

OSS 模擬

[編輯 | 編輯原始碼]

OSS 模擬 有攔截OSS呼叫並通過 ALSA 重新路由它們的能力。此模擬層非常有用,例如,對於嘗試打開/dev/dsp 並直接向它們寫入聲音數據的老舊應用程式,如果沒有 OSS 或模擬庫,將會缺少/dev/dsp,應用程式將不會產生任何聲音。

如果您希望 OSS 應用程式與dmix一起使用,請同時安裝alsa-oss包。

加載 snd_pcm_osssnd_seq_oss內核模塊。將它們配置為在 啟動時加載

解除頻道靜音

[編輯 | 編輯原始碼]

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.17.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


附加注釋

[編輯 | 編輯原始碼]
  • 如果你的系統有多個音效卡,則可以按F6切換音效卡。
  • 有些音效卡需要靜音或禁用數字輸出,才能聽到模擬聲音。反之亦然
  • 有些機器,如Thinkpad T61,有Speaker聲道,也需要解除靜音並調整。
  • 有些機器,如Dell E6400,可能也需要解除FrontHeadphone 通道的靜音並調整它們。
  • 如果重啟以後,你的聲音調整似乎丟失了,嘗試以root運行alsamixer。

驅動配置

[編輯 | 編輯原始碼]

更多信息,參考驅動程序配置指南.

要重新加載 ALSA 驅動程序配置,您必須重新加載相應的模塊。在執行此作之前,使用相應 ALSA 驅動程序的所有進程(如PipeWire)必須停止。要使用聲音設備文件識別進程,請使用fuser(1)

# fuser --all --verbose /dev/snd/*

參考:

卡和模塊

[編輯 | 編輯原始碼]

運行 lspci -k -nn -d ::0403確定PCI設備的模塊。

提示:
  • ::0403這裡表示多媒體控制器PCI 設備類的音頻設備 子類。
  • lspci 輸出中的 Kernel driver in use是加載的模塊。 Kernel modules能夠處理設備,參考lspci(8) § k

USB設備運行lsusb --verbose --tree | grep --after-context=1 'Class=Audio'

運行lsmod | grep '^snd' 以獲取已加載聲音模塊的完整列表。

運行 cat /proc/asound/cards 以獲取音效卡列表及其相應的索引卡號)。

提示:

運行cat /proc/asound/modules獲取卡片索引及其相應的模塊名稱。

音效卡索引

[編輯 | 編輯原始碼]

如果要更改音效卡順序(或你的音效卡順序在啟動時發生更改,你想要讓它保持不變),使用snd 模塊的slots選項為給定驅動程序保留索引,參考內核模塊#S配置模塊參數

提示:slot 名稱源自OSS,相當於ALSA中的術語索引

以下示例假設你希望 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 音頻模塊的音頻卡(例如,集成音頻卡和非集成視頻卡的 HDMI 輸出),並且你想交換它們的索引:

options snd_hda_intel index=1,0
提示:
  • 上面的示例解讀為「使用snd_hda_intel的第一張音效卡給出索引 1,第二個給出索引0」。哪張卡是第一張,哪張卡是第二張由udev決定的。
  • ALSA 模塊選項通常不會採用單個值,而是採用一個值數組,選項設置的每個值,僅適用於給定模塊正在處理的音效卡之一。在以下輸出中查找概念數組的存在:
$ 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=,意思是「不保留索引零」,因此例如,一些 USB 卡(在snd-usb-audio選項中未提及)在啟動後插入,可能是第一個。
  • snd_usb_audio模塊允許使用vidpid選項來指定卡,因此您不依賴於 udev 的順序。

參考:

禁用卡

[編輯 | 編輯原始碼]

要禁用由給定內核模塊控制的所有卡,使用安裝模塊黑名單方法阻止模塊加載


注意:modprobe.d配置文件中使用blacklist關鍵字將不起作用。

要選擇應禁用的卡,請使用內核模塊的enable選項 。例如,禁用一個模塊所操作的第二張卡:

/etc/modprobe.d/alsa-base.conf
options module_name enable=1,0


另請參閱/疑難解答#編解碼器探測 以禁用 HD Audio 卡編解碼器。


庫配置

[編輯 | 編輯原始碼]

系統配置文件是/etc/asound.conf,每個用戶配置文件是 ~/.asoundrc


配置文件中解釋了庫配置的語法,例如空格、行延續、注釋,包括配置文件、標點符號(分隔符)、賦值、複合賦值、操作模式等。


ALSA 庫配置是為庫的每個實例加載的,因此要重新加載它,您所要做的就是重新啟動正在使用它的程序。


更多信息,參考:




基本語法

[編輯 | 編輯原始碼]

操作模式

[編輯 | 編輯原始碼]

解析節點有不同的操作模式,默認模式為「合併/創建」(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

嵌套

[編輯 | 編輯原始碼]

有時,在配置中使用嵌套可能很有用,甚至更容易閱讀。

Nesting PCM plugins
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」節點設置默認設備的示例

[編輯 | 編輯原始碼]

假設「默認」(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。只要不使用特殊字符(理想狀態下也不應該會使用),雙引號就不是強制性的。這可能與其他作業無關。


注意:從配置的角度來看,這些並不等同於設置複合的「default」PCM 設備,因為大多數用戶也在其中指定尋址類型,這實際上可能是相同的,但分配本身仍然不同。 此外,defaults.pcm.card在 ALSA 配置文件中被多次引用,通常作為回退分配,其中不同的環境變量優先。


通過默認節點設置默認音效卡

[編輯 | 編輯原始碼]

關於 defaults.pcm.carddefaults.pcm.device,要實際運用上面的例子,假定有2塊音效卡分別編號為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 [ ... ] 的構造,出現了下表:

Variable name Used by
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。不過,如果你需要使用麥克風的話,選擇全雙工PCM音效卡為默認設備是個不錯的選擇。

現在只需改變環境變量 ALSAPCM,就可以在啟動程序時選擇音效卡。對於所有不允許選擇音效卡的程序此法效果良好,而對於其他的程序請確保保持默認音效卡選擇。

舉例來說,假設你寫了一個縮混PCM命名為 mix51to20 ,用以下命令即可將之用於mplayerALSAPCM=mix51to20 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 字符串而代替數字引用來克服啟動順序問題。

注意:T這種方法可能會有問題 ,如果您的系統有多個相同 ID 字符串的卡(追加 _1, _2, … 後綴).有關詳細信息,請參閱 識別兩個相同的音頻設備

pcm.dmixerpcm.dsnooper 是不支持不混音的應用程式的備用。

本文或本章節的事實準確性存在爭議。

原因: 應引入選擇ALSA設備的一般方法,例如環境值。(在 Talk:ALSA 中討論)


例如,chromium -alsa-output-device=pcm.dmixer -alsa-input-device=pcm.dsnooper 使得Chromium臨時混音。

pcm選項會影響將用於音頻播放的卡和設備,而 ctl選項會影響 alsamixer 等控制實用程序使用哪張卡。

更改應在您(重新)啟動應用程式後立即生效(例如,Player)。您還可以使用類似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"
}
注意:這可能還不足以讓縮混工作,見 [1] 。因此可能需要添加 pcm.!default "plug:surround51"pcm.!default "plug:surround40"。只能使用一個 vdownmix 插件;如果你有7.1聲道音響,需要使用 surround71 來代替上面所述的配置文件。一個讓 vdownmixdmix 同時工作的配置文件的示例見 [2]


多頻段均衡器

[編輯 | 編輯原始碼]

多頻段均衡器 (mbeq) 是一個相當典型的多頻段圖形均衡器。它是使用快速傅立葉變換(FFT)實現的,因此它需要相當多的 CPU 功率,但相位效應應該比等效濾波器實現更少。如果輸入信號的採樣率太低,則頂部頻段將被忽略 - 最高有用頻段將始終是高架。

mbeq是 Steve Harris 的LADSPA 插件套件的一部分。

如果還沒有的話,安裝 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"
 }


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_mediumspeexrate_best。兩者都表現得足夠好,在實踐中您選擇哪一個並不重要,因此使用最好的轉換器通常不值得它所需的額外 CPU 周期。


要更改默認轉換器,請將以下內容放在 ~/.asoundrc/etc/asound.conf中:

defaults.pcm.rate_converter "speexrate_medium"


注意:
  • 也可以使用 libsamplerate包轉換器,其速度僅為 speexrate轉換器的一半左右,但質量不會提高多少。
  • 某些應用程式(如 MPlayer 及其分支)默認執行自己的重採樣,因為某些 ALSA 驅動程序在啟用重採樣時具有不正確的延遲報告(因此導致 AV 不同步),因此更改此設置不會產生任何影響,除非您將它們配置為使用 ALSA 重採樣。


在啟動時禁用自動靜音

[編輯 | 編輯原始碼]

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

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


或者,可以通過alsamixer使用基於 ncurses 的接口。為了保存任何修改,請使用:


 # alsactl store



 # alsactl daemon


參考 #ALSA和systemd.


熱插拔 USB 音效卡

[編輯 | 編輯原始碼]

請看為 ALSA 編寫 Udev 規則.

同時輸出

[編輯 | 編輯原始碼]

您可能希望通過通過迷你插孔連接的外部揚聲器和內部揚聲器同時播放音樂。這可以通過使用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




相關閱讀

[編輯 | 編輯原始碼]