Como posso obter os perfis Pulseaudio corretos para aparecer sem reiniciar o Pulseaudio?

6

Algumas vezes, o microfone do meu fone de ouvido USB desaparece da minha lista de dispositivos de entrada. Reconectar o fone de ouvido não funciona, mas matar o Pulseaudio faz:

pulseaudio -k

Quando o Pulseaudio inicia o backup, meu fone de ouvido USB é exibido em dispositivos de entrada e saída e funciona bem.

O problema é que matar o Pulseaudio também trava todos os aplicativos que o usam ou os deixa sem som. Isso significa que tenho que reiniciar o Skype, o Steam, o XChat, qualquer player de vídeo em execução (travamentos do SMPlayer), qualquer jogo em execução, etc.

Existe uma maneira de forçar o recarregamento de todos os dispositivos sem matar a instância em execução do Pulseaudio?

Curiosamente, quando eu uso meu fone de ouvido USB para funcionar reiniciando o Pulseaudio, reconectar o fone de ouvido fará com que apenas o dispositivo de saída apareça. Tenho que reiniciar o Pulseaudio novamente com o fone de ouvido conectado para que o dispositivo de entrada seja exibido.

Editar: verificado pavuvontrol em "Configuração":

Após reiniciar o Pulseaudio, um perfil adicional que termina com "+ Digital Stereo Input" (ou algo parecido) está disponível na lista e selecionado por padrão.

    
por Hubro 29.08.2014 / 18:20

1 resposta

4

Eu tenho sofrido com o mesmo problema por um tempo, e finalmente tive a chance de olhar para ele. Acontece que descarregar e recarregar o módulo Pulseaudio responsável pelo dispositivo de áudio funciona para mim.

Descarregando e recarregando o módulo manualmente

Na janela do terminal, digite o comando

pacmd list-cards

e a partir da saída, localize o dispositivo de áudio que está faltando perfis. Você provavelmente obterá vários cartões e precisará localizar o cartão certo. O meu parece assim:

[...]
index: 8
    name: <alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset>
    driver: <module-alsa-card.c>
    owner module: 27
    properties:
            alsa.card = "1"
            alsa.card_name = "Logitech USB Headset"
            [... more output ...]
[...]

Da sua saída, procure a linha " módulo proprietário ". Esse é o módulo que você precisa descarregar, mas será necessário verificar primeiro os parâmetros, para poder recarregá-lo. Digite o comando

pacmd list-modules

e localize o módulo que está dirigindo seu cartão. Novamente, a parte relevante da saída no meu caso se parece com isso ( index corresponde ao módulo proprietário da saída de pacmd list-cards ):

[...]
index: 27
    name: <module-alsa-card>
    argument: <device_id="1" name="usb-Logitech_Logitech_USB_Headset-00-Headset" card_name="alsa_card.usb-Logitech_Logitech_USB_Headset-00-Headset" namereg_fail=false tsched=yes fixed_latency_range=no ignore_dB=no deferred_volume=yes use_ucm=yes card_properties="module-udev-detect.discovered=1">
    used: 2
    load once: no
    properties:
    [... more output ...]
[...]

Você precisará do nome e dos argumentos do módulo para recarregá-lo.

Para descarregar o módulo, digite o comando (substitua module-index pelo valor apropriado da sua saída)

pacmd unload-module module-index

Para recarregar o módulo depois de descarregado, digite o comando

pacmd load-module module-name module-arguments

Substitua module-name e module-arguments pelos valores da saída de pacmd list-modules . Deixe de fora os colchetes angulares.

Agora o módulo deve ser recarregado e, com alguma sorte, seus perfis de fone de ouvido estão de volta.

Aplicando automação

As etapas acima são trabalhosas se você precisar redefinir seu dispositivo com frequência, pois o índice do módulo continua mudando e você precisa pesquisá-lo sempre. Eu escrevi um script de shell para mim mesmo para automatizar o pior:

#!/bin/bash

if [ -z "" ]; then
  echo "Pulseaudio has these cards:"
  pacmd list-cards | grep 'name: '
  exit 0
fi

MODULE_INDEX='pacmd list-modules | tac | grep -A 10 -e "argument: .*" | grep 'index:' | head -n 1 | cut -d ':' -f 2 | tr -d ' ''
MODULE_NAME='pacmd list-modules | tac | grep -A 10 -e "argument: .*" | grep 'name:' | head -n 1 | cut -d ':' -f 2 | tr -d '<>''
MODULE_ARGUMENTS='pacmd list-modules | tac | grep -e "argument: .*" | head -n 1 | cut -d ':' -f 2 | tr -d '<>''
echo "Module index is $MODULE_INDEX"
echo "Module name: $MODULE_NAME"
echo "Module args: $MODULE_ARGUMENTS"

if [ -z "$MODULE_INDEX" ]; then echo "Could not find module index"; exit 0; fi
if [ -z "$MODULE_NAME" ]; then echo "Could not find module name"; exit 0; fi
if [ -z "$MODULE_ARGUMENTS" ]; then echo "Could not find module arguments"; exit 0; fi

echo "Unloading module"
pacmd unload-module $MODULE_INDEX
echo ""
echo "Reloading module"
pacmd load-module $MODULE_NAME $MODULE_ARGUMENTS
echo ""

Quando executado sem argumentos, o script lista as cartas que o Pulseaudio conhece. Quando uma parte do nome de uma carta é fornecida como argumento, o script tenta descarregar e recarregar o módulo Pulseaudio relevante.

    
por juise 17.09.2014 / 02:10