如何通过 HDMI 为 7.1 环绕声配置 PulseAudio?

der*_*ert 10 audio pulseaudio hdmi

我的机器通过 HDMI 连接到接收器。但是当我尝试在 PulseAudio 中使用两个以上的通道时,我只能得到两个。pacmd list cards显示卡,但不显示具有两个以上通道的 HDMI 配置文件。

我已经确认 7.1 声音通过 ALSA 工作:

pasuspender -- speaker-test -D hdmi -c 8 -m FL,FC,FR,RR,RRC,RLC,RL,LFE
Run Code Online (Sandbox Code Playgroud)

产生环绕房间的静电。

der*_*ert 20

在 PulseAudio 中,每个声卡都有一个与之关联的配置文件集。配置文件集包含多个配置文件,这些配置文件是您在列出卡时(或在查看各种 PulseAudio GUI 时)看到的配置文件。

有一个default配置文件,主要包含对模拟声音输出有用的东西。还有一个extra-hdmi配置文件会自动应用于某些 HDMI 输出,并提供高达 5.1 的选项。这两个配置文件是不幸的/usr/share/pulseaudio/alsa-mixer/profile-sets,因此你不能真正对其进行编辑(我提起调试错误736708关于这一点)。根据该文件,您可以禁用的udev基于自动发现,并手动配置一切,它可以让您指定配置文件的完整路径。但事实证明,虽然没有记录,但 udev 也可以指定完整路径。

设置 udev 规则以分配配置文件集

您可以通过设置PULSE_PROFILE_SETudev 环境变量来分配在 udev 规则中设置的配置文件。它的文档记录仅包含上述/usr子目录中的文件,但完整路径也可以使用。就我而言,我创建了以下规则:

# cat /etc/udev/rules.d/95-local-pulseaudio.rules 
ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1c20", ENV{PULSE_PROFILE_SET}="/etc/pulse/my-hdmi.conf"
Run Code Online (Sandbox Code Playgroud)

您将需要使用适当的 PCI 供应商和设备编号,您可以从lspci -nn.

创建 udev 规则后,您可以立即使用udevadm trigger -ssound. 您可能还想重建您的 initramfs ( update-initramfs -u)

确认 udev 规则生效udevadm info --query=all --path /sys/class/sound/card0(当然,使用适当的卡号)。您应该E: PULSE_PROFILE_SET=/etc/pulse/my-hdmi.conf在输出中看到。如果没有,请不要继续。它不会工作。您的 udev 规则有问题(或者您可能没有触发它们——您可以随时尝试重新启动)。

创建 /etc/pulse/my-hdmi.conf 文件

注意:频道地图显然是特定于系统的。您需要进行试验以使其适合您的系统。我很幸运,我的 7.1 布局只涉及删除最终项目以构建 5.1、4.0 等。说明如下。

这是很多复制和粘贴,主要是。每个部分在 (a) 名称、(b) 描述、(c) 频道映射、(d) [可选] 优先级方面有所不同。

[General]
auto-profiles = yes

[Mapping hdmi-stereo]
device-strings = hdmi:%f
channel-map = front-left,front-right
description = Digital Stereo (HDMI)
priority = 4
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-40]
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right
description = Digital Quadrophonic (HDMI)
priority = 1
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-51]
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
description = Digital Surround 5.1 (HDMI)
priority = 2
direction = output
paths-output = hdmi-output-0

[Mapping hdmi-surround-71]
description = Digital Surround 7.1 (HDMI)
device-strings = hdmi:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
priority = 3
direction = output
paths-output = hdmi-output-0
Run Code Online (Sandbox Code Playgroud)

现在,要测试这个:

  1. 重新启动 PulseAudio: pulseaudio -k,作为您的普通用户,假设您使用的是每用户守护进程(默认)。再次启动它,即使是一个简单的aplay -l工作。
  2. 切换到 7.1 配置文件。就我个人而言,我曾经pactl set-card-profile 0 "output:hdmi-surround-71"这样做过,但 GUI 也能很好地工作。
  3. 运行speaker-test -c 8 -t w。它应该开始宣布演讲者的名字,希望每个演讲者的名字都是正确的。如果名称不是来自正确的扬声器,则必须更改通道映射以使其正确。每次更改频道映射后,您必须再次重新启动 PulseAudio。

奖金!更实用的设置

在 中/etc/pulse/daemon.conf,您可能需要更改一些设置:

enable-remixing— 如果此选项打开,立体声信号的左声道将从您的所有三个左扬声器中播放,其右声道将从您的右扬声器中播放。如果关闭,它只会出现前两个。请注意,您还可以将配置文件更改为立体声(仅从 HDMI 端口发送立体声,并让您的接收器决定如何将其映射到扬声器)。

enable-lfe-remixing — 类似,但用于重新混音到 LFE(低音炮)通道。

default-sample-format— 如果您的 HDMI 设置支持大于 16 位的音频,您可能需要将其增加到s32le(从默认值s16le)。

default-sample-rate, alternate-sample-rate— 如果您主要使用通常为 48KHz 的 DVD 源材料,您可能想要交换这些(甚至可能完全禁用 44.1KHz)。或者,如果您的 HDMI 接收器支持它,您可以一直达到 192KHz。请注意,176KHz 具有作为 44.1 和 48KHz 的偶数倍的良好特性。有关如何确定接收器支持的内容,请参见下文

default-sample-channels——似乎真的无所谓。个人资料可能会覆盖它...

当然,您必须在更改此文件后重新启动 PulseAudio。

再次红利!查看您的接收器支持什么

有一些eld.*文件/proc/asound告诉您 HDMI 链接的另一端声称支持什么。例如:

# cat /proc/asound/card0/eld#3.0 
monitor_present         1
eld_valid               1
monitor_name            TX-SR606
connection_type         HDMI
eld_version             [0x2] CEA-861D or below
edid_version            [0x3] CEA-861-B, C or D
manufacture_id          0xcb3d
product_id              0x863
port_id                 0x0
support_hdcp            0
support_ai              1
audio_sync_delay        0
speakers                [0x4f] FL/FR LFE FC RL/RR RLC/RRC
sad_count               8
sad0_coding_type        [0x1] LPCM
sad0_channels           2
sad0_rates              [0x1ee0] 32000 44100 48000 88200 96000 176400 192000
sad0_bits               [0xe0000] 16 20 24
sad1_coding_type        [0x1] LPCM
sad1_channels           8
sad1_rates              [0x1ee0] 32000 44100 48000 88200 96000 176400 192000
sad1_bits               [0xe0000] 16 20 24
sad2_coding_type        [0x2] AC-3
sad2_channels           8
sad2_rates              [0xe0] 32000 44100 48000
sad2_max_bitrate        640000
sad3_coding_type        [0x7] DTS
sad3_channels           8
sad3_rates              [0xc0] 44100 48000
sad3_max_bitrate        1536000
sad4_coding_type        [0x9] DSD (One Bit Audio)
sad4_channels           6
sad4_rates              [0x40] 44100
sad5_coding_type        [0xa] E-AC-3/DD+ (Dolby Digital Plus)
sad5_channels           8
sad5_rates              [0xc0] 44100 48000
sad6_coding_type        [0xb] DTS-HD
sad6_channels           8
sad6_rates              [0x1ec0] 44100 48000 88200 96000 176400 192000
sad7_coding_type        [0xc] MLP (Dolby TrueHD)
sad7_channels           8
sad7_rates              [0x1480] 48000 96000 192000
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我的接收器支持 LPCM(线性 PCM,即未压缩音频),最多 8 个通道,192KHz,24 位声音。它还支持 AC3、DTS、DSD、DD+、DTS-HD 和 Dolby TrueHD。因此,如果我将文件编码为这些格式,我可以通过这些格式(当然,如果我的媒体播放器支持它。mpv可能会)。