Como enviar áudio exclusivo para várias portas / perfis de um cartão PulseAudio?

3

Digamos que eu tenha um cartão com estas propriedades:

index: 1
name: <alsa_card.pci-0000_00_1f.3>
driver: <module-alsa-card.c>
owner module: 7
properties:
    alsa.card = "0"
    alsa.card_name = "HDA Intel PCH"
    alsa.long_card_name = "HDA Intel PCH at 0xf7240000 irq 129"
    alsa.driver_name = "snd_hda_intel"
    device.bus_path = "pci-0000:00:1f.3"
    sysfs.path = "/devices/pci0000:00/0000:00:1f.3/sound/card0"
    device.bus = "pci"
    device.vendor.id = "8086"
    device.vendor.name = "Intel Corporation"
    device.product.id = "a170"
    device.form_factor = "internal"
    device.string = "0"
    device.description = "Built-in Audio"
    module-udev-detect.discovered = "1"
    device.icon_name = "audio-card-pci"
profiles:
    input:analog-stereo: Analog Stereo Input (priority 60, available: unknown)
    output:analog-stereo: Analog Stereo Output (priority 6000, available: unknown)
    output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (priority 6060, available: unknown)
    output:hdmi-stereo: Digital Stereo (HDMI) Output (priority 5400, available: unknown)
    output:hdmi-stereo+input:analog-stereo: Digital Stereo (HDMI) Output + Analog Stereo Input (priority 5460, available: unknown)
    output:hdmi-surround: Digital Surround 5.1 (HDMI) Output (priority 300, available: unknown)
    output:hdmi-surround+input:analog-stereo: Digital Surround 5.1 (HDMI) Output + Analog Stereo Input (priority 360, available: unknown)
    output:hdmi-surround71: Digital Surround 7.1 (HDMI) Output (priority 300, available: unknown)
    output:hdmi-surround71+input:analog-stereo: Digital Surround 7.1 (HDMI) Output + Analog Stereo Input (priority 360, available: unknown)
    output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (priority 5200, available: unknown)
    output:hdmi-stereo-extra1+input:analog-stereo: Digital Stereo (HDMI 2) Output + Analog Stereo Input (priority 5260, available: unknown)
    output:hdmi-stereo-extra2: Digital Stereo (HDMI 3) Output (priority 5200, available: unknown)
    output:hdmi-stereo-extra2+input:analog-stereo: Digital Stereo (HDMI 3) Output + Analog Stereo Input (priority 5260, available: unknown)
    output:hdmi-surround-extra2: Digital Surround 5.1 (HDMI 3) Output (priority 100, available: unknown)
    output:hdmi-surround-extra2+input:analog-stereo: Digital Surround 5.1 (HDMI 3) Output + Analog Stereo Input (priority 160, available: unknown)
    output:hdmi-surround71-extra2: Digital Surround 7.1 (HDMI 3) Output (priority 100, available: unknown)
    output:hdmi-surround71-extra2+input:analog-stereo: Digital Surround 7.1 (HDMI 3) Output + Analog Stereo Input (priority 160, available: unknown)
    off: Off (priority 0, available: unknown)
active profile: <output:hdmi-stereo-extra1+input:analog-stereo>
sinks:
    alsa_output.pci-0000_00_1f.3.hdmi-stereo-extra1/#1: Built-in Audio Digital Stereo (HDMI 2)
sources:
    alsa_output.pci-0000_00_1f.3.hdmi-stereo-extra1.monitor/#1: Monitor of Built-in Audio Digital Stereo (HDMI 2)
    alsa_input.pci-0000_00_1f.3.analog-stereo/#2: Built-in Audio Analog Stereo
ports:
    analog-input-headphone-mic: Microphone (priority 8700, latency offset 0 usec, available: unknown)
        properties:
            device.icon_name = "audio-input-microphone"
    analog-input-headset-mic: Headset Microphone (priority 8700, latency offset 0 usec, available: unknown)
        properties:
            device.icon_name = "audio-input-microphone"
    analog-output-lineout: Line Out (priority 9900, latency offset 0 usec, available: no)
        properties:

    analog-output-speaker: Speakers (priority 10000, latency offset 0 usec, available: unknown)
        properties:
            device.icon_name = "audio-speakers"
    analog-output-headphones: Headphones (priority 9000, latency offset 0 usec, available: yes)
        properties:
            device.icon_name = "audio-headphones"
    hdmi-output-0: HDMI / DisplayPort (priority 5900, latency offset 0 usec, available: no)
        properties:
            device.icon_name = "video-display"
    hdmi-output-1: HDMI / DisplayPort 2 (priority 5800, latency offset 0 usec, available: yes)
        properties:
            device.icon_name = "video-display"
            device.product.name = "Inspiron 7459"
    hdmi-output-2: HDMI / DisplayPort 3 (priority 5700, latency offset 0 usec, available: no)
        properties:
            device.icon_name = "video-display"

Eu gostaria de produzir fluxos de áudio exclusivos para o lineout de saída analógica e potencialmente todos (portas de saída-hdmi-saída-0, saída-hdmi-1, hdmi-saída2). Existe um meio de fazer isso simultaneamente no PulseAudio? Eu sei na ALSA eu posso fazer algo como:

gst-launch-1.0 audiotestsrc ! alsasink device="hw:0,0" gst-launch-1.0 audiotestsrc ! alsasink device="hw:0,3"

Mas o que estou vendo no Pulse indica que preciso definir um único "perfil" para a "placa", e todos os perfis parecem vinculados a uma única porta de saída.

Existe algum meio de fazer isso ou o Pulse é fundamentalmente limitado a esse respeito?

    
por mpr 30.10.2017 / 23:05

1 resposta

4

Você deve escrever um perfil personalizado que expõe todas as saídas HDMI necessárias como coletores separados.

Dê uma olhada nos perfis nos documentos do Pulseaudio, nos arquivos em /usr/share/pulseaudio/alsa-mixer/paths/ , esp. os comentários em analog-output.conf.common .

Tudo isso é insuficientemente documentado.

Uma tentativa de fazer isso funcionar:

Modifique /usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf e anexe algo como o seguinte:

[Profile output:analog-stereo+output:hdmi-stereo+output:hdmi-stereo+output:hdmi-stereo]
description = Foobar
output-mappings = analog-stereo hdmi-stereo hdmi-stereo-extra1 hdmi-stereo-extra2
input-mappings = 

Em seguida, reinicie o pulso como o usuário comum da área de trabalho:

pulseaudio --kill; sleep 1; pulseaudio --start

Defina o cartão para usar o novo perfil:

pacmd set-card-profile 0 output:analog-stereo+output:hdmi-stereo+output:hdmi-stereo+output:hdmi-stereo

Agora, pacmd list-sinks mostra um coletor distinto para cada porta identificada no novo perfil.

A última coisa que precisa ser feita é descobrir como não mexer com o arquivo do sistema. Seria bom fazer isso através de um arquivo em ~/.config/pulse , se possível.

Editar

Aqui é uma descrição como configurar um novo perfil para um dispositivo USB M-Audio .. Eu também desenterrei o que eu fiz, isso é uma pequena variação disso (eu não gosto de modificar arquivos existentes, eles tendem a ser sobrescritos por atualizações de pacotes):

Eu adiciono um novo arquivo /etc/udev/rules.d/91-pulseaudio.rules com o seguinte conteúdo:

# Custom Profile for onboard Intel 8086:12c0

SUBSYSTEM!="sound", GOTO="xpulseaudio_end"
ACTION!="change", GOTO="xpulseaudio_end"
KERNEL!="card*", GOTO="xpulseaudio_end"

SUBSYSTEMS=="pci", ATTRS{vendor}=="0x8086", ATTRS{device}=="0x1c20", ENV{PULSE_PROFILE_SET}="my-personal.conf"

LABEL="xpulseaudio_end"

Isso é principalmente uma cópia de /lib/udev/rules.d/90-pulseaudio.rules .

Como essa é uma placa de som onboard, essas regras devem ser executadas na inicialização, portanto, elas devem estar no initrd que seu kernel usa. Eu compilo meu próprio kernel, e make-kpkg copia essas regras, então isso não foi um problema para mim.

Em seguida, adicione um novo arquivo /usr/share/pulseaudio/alsa-mixer/profile-sets/my-personal.conf , onde você poderá listar a configuração desejada (copiar e modificar a partir dos outros arquivos de configuração).

    
por 31.10.2017 / 09:24

Tags