跳至內容

ALSA

出自 Arch Linux 中文维基

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

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

高級 Linux 音頻架構(Advanced Linux Sound Architecture, (ALSA))提供由內核驅動的音效卡驅動程序,代替了原來的開放聲音系統 (OSS)。

除了音頻設備驅動程序外,ALSA 還為應用程式開發者捆綁了一個用戶空間驅動的庫。開發者可以使用這些 ALSA 驅動進行高級 API 開發。這使得應用程式能夠通過 ALSA 庫直接與(內核中的)音頻設備進行交互。

提示:有關 ALSA 相關術語的(接口/interface、音效卡/card、設備/device (注意:音效卡不是一個設備)、子設備/subdevice)等的解釋,請參見Wikipedia:Advanced Linux Sound Architecture#Concepts

安裝

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軟體包。另請參見:

部分 Intel 音頻設備需要安裝linux-firmware-intel軟體包。

alsa-firmware軟體包包含了某些音效卡可能需要的固件。

另請參見#音效卡與模塊Linux固件

ALSA 實用程序

安裝alsa-utils軟體包。該包包含了alsamixer(1)amixer(1) 等實用程序。amixer是用於修改音頻設置的命令行工具,而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組會賦予其直接訪問設備的權限。請注意,這會導致應用程式能夠獨占音頻輸出設備。從而可能破壞多席位 (multi-seat) 系統中的軟體或用戶快速切換功能。因此,除非有特殊需求,否則默認「不」建議將用戶添加至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表示其已經靜音,而標有OO表示已經啟用。

使用方向鍵移動到MasterPCM通道,然後按下m鍵解除靜音。

使用方向鍵增加音量,直到增益達到0dB。增益數值可在左上角Item:欄位旁邊找到。

注意:如果增益設置超過0 dB,音頻可能會出現明顯的失真。

解除 5.1/7.1 聲道的靜音

若要獲得完整的 5.17.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)可能還需要對FrontHeadphone通道取消靜音並進行調整。
  • 如果重啟以後聲音調整似乎失效了,嘗試以root權限運行alsamixer。

驅動配置

更多信息,參見高級Linux音頻架構-驅動程序配置指南.

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

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

另請參見:

音效卡和模塊

運行lspci -k -nn -d ::0403可以識別 PCI 設備正在使用的模塊。

提示:

對於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 中的術語index(序號)

以下示例假設無論模塊何時加載(例如音效卡可能在開始時未插上),都希望 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模塊允許通過vidpid選項來指定特定音效卡,從而無需依賴來自udev 的識別順序。

另請參見:

禁用音效卡

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

注意:modprobe.d配置文件中使用blacklist關鍵字進行黑名單攔截是無法生效的。

若要選擇應禁用特定的音效卡,請使用內核模塊的enable選項。例如,禁用某個模塊驅動的第二塊音效卡:

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

有關禁用 HD Audio 音效卡解碼器 (codec) 的方法,另請參見/疑難解答#編解碼器探測

庫配置

系統級配置文件為/etc/asound.conf,用戶級配置文件為~/.asoundrc

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

ALSA 庫配置會在庫的每個實例中加載,因此若要重新加載配置,只需重啟正在使用該庫的程序即可。

有關更多信息,參見:

基本語法

操作模式

解析節點時存在不同的操作模式,默認模式為「合併並創建 (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;

在操作正確的前提下,使用覆蓋操作模式通常是安全的;然而必須注意,節點中可能還包含維持正常功能所必須的其它鍵。

警告:由於覆蓋操作會刪除所有插件定義,導致 ALSA 徹底無法使用因此除非是從零開始構建配置,否則切勿使用!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)。在不含特殊字符的前提下,字符串並不強制使用雙引號(理想狀態下也應避免使用特殊字符)。此規則在其它賦值選項中可能不適用。

注意:從配置角度來看,這些設置並不等同於配置一個複合的 "default" PCM 設備。因為大多數用戶還會在複合設備中指定尋址類型,雖然最終指向可能相同,但賦值本身仍有區別。此外,defaults.pcm.card在 ALSA 配置文件中被多次引用,通常作為各類環境變量優先之後的後備 (fallback) 賦值。

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

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

前述示例中關於defaults.pcm.carddefaults.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 字符串來代替數字編號引用。

注意:如果系統內有多塊具有相同 ID 字符串的音效卡(例如被自動追加了 _1_2……等後綴),此方法可能會產生問題。有關更多信息,請參見 識別兩個完全相同的音頻設備

pcm.dmixerpcm.dsnooper用於為不支持無軟體混音環境的應用程式提供備用通道。

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

原因: 此處應引入通過環境變量等選擇 ALSA 設備的通用方法。(在 Talk:ALSA 中討論)


例如,運行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"
}
注意:這可能還不足以讓聲道摺疊工作,見 [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

相關閱讀