Como configuro o PulseAudio para 7.1 Surround Sound através de HDMI?

10

Eu tenho minha máquina conectada via HDMI a um receptor. Mas quando tento usar mais de dois canais com o PulseAudio, só recebo dois. pacmd list cards mostra o cartão, mas não mostra um perfil HDMI com mais de dois canais.

Confirmei que o som 7.1 funciona via ALSA:

pasuspender -- speaker-test -D hdmi -c 8 -m FL,FC,FR,RR,RRC,RLC,RL,LFE

Produz estática que circula pela sala.

    
por derobert 29.01.2014 / 07:48

1 resposta

20

No PulseAudio, cada placa de som tem um conjunto de perfis associado a ela. Um conjunto de perfis contém vários perfis, e esses são os perfis que você vê ao listar os cartões (ou ao procurar nas várias GUIs do PulseAudio).

Existe um perfil default , que contém principalmente coisas úteis para saída de som analógico. Há também um perfil extra-hdmi que é aplicado automaticamente a algumas saídas HDMI e fornece opções de até 5.1. Infelizmente, esses dois perfis estão em /usr/share/pulseaudio/alsa-mixer/profile-sets e, portanto, você não pode realmente editá-los (eu arquivei Erro de depuração 736708 sobre isso.) De acordo com a documentação, você pode desabilitar a descoberta automática com base no udev e configurar tudo manualmente - isso permite especificar o caminho completo para um perfil. Mas acontece que, embora não esteja documentado, o udev também pode especificar um caminho completo.

Configure uma regra do udev para atribuir um conjunto de perfis

Você atribui um conjunto de perfis em uma regra do udev definindo a variável de ambiente PULSE_PROFILE_SET udev. Está documentado para obter apenas um arquivo no subdiretório /usr mencionado acima, mas um caminho completo também funciona. No meu caso, criei esta regra:

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

Você precisará usar os números apropriados de fornecedores e dispositivos PCI, que você pode obter facilmente em lspci -nn .

Depois de criar a regra do udev, você pode aplicá-la imediatamente com udevadm trigger -ssound . Você provavelmente vai querer reconstruir seu initramfs também ( update-initramfs -u )

Confirme se a regra do udev entrou em vigor com udevadm info --query=all --path /sys/class/sound/card0 (use o número do cartão apropriado, é claro). Você deve ver E: PULSE_PROFILE_SET=/etc/pulse/my-hdmi.conf na saída. Caso contrário, não continue. Não vai funcionar. Algo está errado com suas regras do udev (ou talvez você não as tenha ativado - você sempre pode tentar reinicializar).

Crie o arquivo /etc/pulse/my-hdmi.conf

Nota: o mapa do canal é aparentemente específico do sistema. Você precisará experimentar para acertar o seu sistema. Tive sorte, meu layout 7.1 apenas envolve a queda dos itens finais para criar 5.1, 4.0, etc. As instruções estão abaixo.

Isso é um monte de cópia & cole, principalmente. Cada seção difere em (a) nome, (b) descrição, (c) mapa de canal, (d) prioridade [opcional].

[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

Agora, para testar isso:

  1. Reinicie o PulseAudio: pulseaudio -k , como seu usuário normal, supondo que você esteja usando daemons por usuário (o padrão). Inicie novamente, até mesmo um simples aplay -l funcionará.
  2. Alterne para o perfil 7.1. Pessoalmente, usei pactl set-card-profile 0 "output:hdmi-surround-71" para fazer isso, mas uma GUI funcionará perfeitamente também.
  3. Executar speaker-test -c 8 -t w . Ele deve começar a anunciar os nomes dos palestrantes, esperançosamente o nome correto de cada palestrante. Se os nomes não vêm do orador correto, você terá que mudar o mapa do canal para acertar. Depois que cada mapa de canal mudar, você deverá reiniciar o PulseAudio novamente.

Bônus! Configurações mais úteis

Em /etc/pulse/daemon.conf , existem algumas configurações que você pode alterar:

enable-remixing - Se estiver ativado, um sinal estéreo terá seu canal esquerdo reproduzido de todos os três alto-falantes esquerdos e o canal direito dos alto-falantes direitos. Se fora, só sairá os dois da frente. Note que você também pode alterar o perfil para estéreo (para enviar apenas som estéreo para fora da porta HDMI e deixar que o seu receptor decida como mapeá-lo para os alto-falantes).

enable-lfe-remixing - Similar, mas para remixagem para o canal LFE (subwoofer).

default-sample-format - Se a sua configuração HDMI suporta áudio de mais de 16 bits, você pode querer aumentar isso para s32le (do padrão s16le ).

default-sample-rate , alternate-sample-rate - Você pode querer trocar estes (e talvez até desabilitar 44.1KHz por completo) se você usa principalmente material de fonte de DVD que normalmente é de 48KHz. Ou, se o seu receptor HDMI suportar, você pode ir até 192KHz. Note que 176KHz tem a boa propriedade de ser um múltiplo par de 44.1 e 48KHz. Veja abaixo como determinar o que seu receptor suporta

default-sample-channels - realmente não parece importar. O perfil provavelmente substitui isso ...

Naturalmente, você terá que reiniciar o PulseAudio depois de alterar este arquivo.

Bônus novamente! Vendo o que seu receptor suporta

Existem eld.* arquivos em /proc/asound que informam o que a outra extremidade de um link HDMI afirma suportar. Por exemplo:

# 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

Para que você possa ver meu receptor suporta LPCM (PCM Linear, ou seja, áudio não-comprimido) em até 8 canais, 192KHz, som de 24 bits. Ele também suporta AC3, DTS, DSD, DD +, DTS-HD e Dolby TrueHD. Então, se eu tiver arquivos codificados neles, posso passar esses formatos (se o meu media player suportar isso, é claro. mpv provavelmente faz).

    
por 29.01.2014 / 07:48