pulseaudio: coletor do interruptor automático quando os fones de ouvido conectados

2

Estou executando o XUbuntu 16.04. Anteriormente eu tinha alto-falantes conectados ao line-out analógico, e o som mudava automaticamente para fones de ouvido quando eles estavam conectados. Tudo isso estava acontecendo em um dispositivo de saída (áudio da placa-mãe).

Agora tenho um novo monitor com alto-falantes integrados, mas sem conexão analógica, por isso estou recebendo áudio sobre DisplayPort da minha Radeon R9 270. Gostaria de pulseaudio para alternar fluxos existentes e novos fluxos para o porta de fone de ouvido no áudio da placa-mãe quando eu conecto os fones de ouvido, e de volta para a porta de áudio DP no dispositivo GPU quando eu os desconecto novamente.

Eu tentei usar pactl load-module module-switch-on-connect , mas parece não ter nenhum efeito, presumivelmente porque a conexão dos fones de ouvido não cria um novo coletor, apenas uma nova porta.

Eu sei de ler outras perguntas que eu posso fazer isso manualmente com pactl / pacmd invocação e eu vou fazer isso se eu tiver que, mas eu prefiro muito mais que isso aconteça automaticamente. Eu não me importo se eu tenho que fazer alguns scripts para fazer isso, mas existe um gancho que eu possa interceptar para receber uma chamada quando os fones de ouvido estão conectados ou desconectados?

    
por Bruce Merry 04.02.2017 / 22:11

1 resposta

0

Eu descobri uma solução graças a discussão e paswitch . Em resumo, o acpid pode ser usado para ligar os eventos de ligar / desligar os auscultadores.

Eu criei os seguintes arquivos:

/ etc / acpi / events / headphone-jack:

event=jack/headphone
action=/etc/acpi/headphone-jack.sh %e

/etc/acpi/headphone-jack.sh (lembre-se de torná-lo executável):

#!/bin/bash
set -e -u

if [ "$1" = "jack/headphone" -a "$2" = "HEADPHONE" ]; then
    case "$3" in
        plug)
            sink=alsa_output.pci-0000_00_1b.0.analog-stereo
            ;;
        *)
            sink=alsa_output.pci-0000_01_00.1.hdmi-stereo
            ;;
    esac
    for userdir in /run/user/*; do
        uid="$(basename $userdir)"
        user="$(id -un $uid)"
        if [ -f "$userdir/pulse/pid" ]; then
            PULSE_RUNTIME_PATH="$userdir/pulse" su "$user" -c "paswitch $sink"
        fi
    done
fi

Os dissipadores naturalmente precisam ser atualizados, dependendo do seu sistema.

Não tenho certeza de quão robusto o script é para um sistema multiusuário real, mas funciona para mim.

    
por 04.02.2017 / 22:52

Tags