ALSA - Arch Linux 中文维基

跳至內容

# ALSA

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Advanced_Linux_Sound_Architecture，最近一次同步於 2025-07-28，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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

原因：本文疑似機翻，許多用詞不自然、不準確。（在 Talk:ALSA# 中討論）

相關文章

- /配置範例
- /疑難解答
- PC 揚聲器
- PipeWire
- PulseAudio
- 音頻系統
- 應用程式列表/多媒體#音量控制

高級 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包包。參考：

- Audio drivers for Cirrus Logic CS35L54/56/57/63 Boosted Smart Amplifiers,

- archlinux/packaging/packages/linux-firmware#19.

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

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

See also #Cards and modules and Linux firmware.

### ALSA 實用程序

安裝軟體包 alsa-utils包。其包含 `alsamixer` 、 `amixer` 等實用程序。amixer是一個用於更改音頻設置的shell命令，而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`組允許直接訪問設備。請記住，這允許應用程式專門保留輸出設備。這可能會破壞多座系統上的軟體混合或快速用戶切換。因此，默認情況下不建議將用戶添加到`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` 表示其已經靜音，而標有 `00` 表示已經啟用。

使用 `←` 和 `→` 鍵滾動到 `Master` 和 `PCM` 聲道，按下 `m` 鍵解除靜音。

使用 `↑` 鍵增加音量，獲得`0`dB的增益。增益值可在左上方 `Item:` 欄位旁邊看到。

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

### 解除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

### 附加注釋

- 如果你的系統有多個音效卡，則可以按`F6`切換音效卡。

- 有些音效卡需要靜音或禁用數字輸出，才能聽到模擬聲音。反之亦然

- 有些機器，如Thinkpad T61，有`Speaker`聲道，也需要解除靜音並調整。

- 有些機器，如Dell E6400，可能也需要解除`Front` 和 `Headphone` 通道的靜音並調整它們。

- 如果重啟以後，你的聲音調整似乎丟失了，嘗試以root運行alsamixer。

## 驅動配置

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

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

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

參考：

- ALSA SoundCard Matrix

- alsactl(1)

- Kernel modules#Manual module handling

### 卡和模塊

運行 `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` 以獲取音效卡列表及其相應的索引（卡號）。

提示：

- 有關`/proc/asound/cards`的格式，請參閱 ALSA 庫 API 控制接口的常規概述部分。
- 有關 `/proc/asound` procfs 樹的一般信息，請參閱ALSA 驅動程序的 Proc 文件.

運行`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`模塊允許使用`vid`和`pid`選項來指定卡，因此您不依賴於 udev 的順序。

參考：

- MultipleCards

- MultipleUSBAudioDevices

### 禁用卡

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

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

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

    /etc/modprobe.d/alsa-base.conf

    options module_name enable=1,0

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

## 庫配置

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

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

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

更多信息，參考:

- Configuring ALSA

- ALSA非官方wiki上的.asoundrc 文章。

- ALSA項目wiki上的.asoundrc文章。

### 基本語法

#### 操作模式

解析節點有不同的操作模式，默認模式為「合併/創建」（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.card` 和 `defaults.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` ，用以下命令即可將之用於mplayer包： `ALSAPCM=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.dmixer`和`pcm.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` 來代替上面所述的配置文件。一個讓 `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 音效卡

請看為 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

## 相關閱讀

- ALSA 項目維基

- ALSA 非官方 wiki

- ALSA 的近距離觀察

- Linux ALSA聲音筆記

- Pulse-code 調製(PCM)

分類：​

- 聲音

隱藏分類：​

- 使用「模板:糟糕的翻譯」標記的頁面或章節
- 使用「模板:準確性」標記的頁面或章節

ALSA
新增話題