Pulseaudio com adaptador de som externo: contorne som quebrado

2

Estou usando um adaptador de som USB externo em um laptop que possui uma placa de som interna. Existem alguns problemas:

  • Os aplicativos, por padrão, continuam a usar a placa de som interna. Eu posso contornar isso manualmente abrindo pavucontrol : indo para "dispositivos de saída", encontrando a saída do adaptador e clicando em "set as fallback", e algumas vezes encontrando um aplicativo que já está sendo reproduzido na aba "Playback" e alterando seu sink. / p>

  • Os botões de volume do teclado ainda funcionam na placa de som interna, não no adaptador externo.

  • O adaptador possui botões físicos para aumentar, diminuir e desativar o som. Quando pressionado, o sistema executa as ações esperadas, mas na placa de som interna, não no adaptador externo. Além disso, um botão de microfone mudo, não testado.
  • Definir o volume do adaptador externo usando pavucontrol funciona, mas se estiver abaixo de 35%, não haverá som algum. Como o volume é muito alto, 35% é aceitável para fontes de som silenciosas, inaceitável para fontes ruidosas. Eu posso contornar isso manualmente definindo o limite de volume por aplicativo (clicando em pavucontrol window), mas é entediante e precisa ser refeito sempre que um aplicativo iniciar um novo fluxo.

Como ter:

  • (1) aplicativos são reproduzidos nesse adaptador por padrão
  • (2) os botões de volume do teclado funcionam em uma placa de som escolhida (aqui, o adaptador)
  • (3) os botões do adaptador físico funcionam em uma placa de som escolhida (aqui, o adaptador)
  • (4) configuração de volume para o adaptador que pode ir abaixo de 35% sem ir direto ao silêncio

O sistema é o Ubuntu 14.10 rodando o XFCE 4.10. Adaptador é "ID 0d8c: adaptador de áudio 000c C-Media Electronics, Inc."

    
por Stéphane Gourichon 21.05.2015 / 11:30

2 respostas

4

Eu tenho uma solução experimental.

Primeiro, obtenha o nome do coletor do adaptador

Primeiro tem que descobrir o nome do coletor para o adaptador. Abra um shell. Assumiremos bash e evitaremos qualquer problema de localização alternando para a localidade padrão:

export LC_ALL=C 

Para obter uma lista de sumidouros:

pacmd list-sinks | grep name:

Você pode ler a saída e copiar e colar manualmente o nome em uma linha de comando: ADAPTER_SINK_NAME=name_in_your_setup

Mais automaticamente, a linha abaixo encontra o nome do primeiro adaptador não-pci, que funcionará para mim e deverá funcionar em muitos casos.

ADAPTER_SINK_NAME=$( pacmd list-sinks | sed -n 's/^.*name: <\([^>]*\.usb[^>]*\)>$//p' | head -n 1 )
echo $ADAPTER_SINK_NAME

Alternativa usando pactl (mas execute a linha export acima ou não encontrará nada em localidades não padrão):

ADAPTER_SINK_NAME=$( pactl list sinks | sed -n 's/^.*Name: \(.*\.usb.*\)$//p' | head -n 1 ) 
echo $ADAPTER_SINK_NAME

Obter correção parcial (1) (2) (3)

Agora, isso fornecerá os pontos (1) (2) (3) da pergunta:

pactl set-default-sink $ADAPTER_SINK_NAME

Curiosamente, usei pela primeira vez pacmd set-default-sink ... ( pacmd em vez de pactl ) que forneceu (2) e (3) mas nem sempre (1).

Obter correção completa (1) a (4)

É baseado em Posso usar o PulseAudio para reproduzir música em duas placas de som simultaneamente? embora o princípio seja, antes, jogar em "uma placa de som simultaneamente". ; -)

pacmd load-module module-combine sink_name=adapter-soft-volume slaves=$ADAPTER_SINK_NAME
pactl set-default-sink adapter-soft-volume

Agora tudo funciona conforme solicitado na pergunta.

Limpeza.

Se você executar os comandos acima várias vezes, haverá vários coletores de combinação e o primeiro será usado, não o último. Se por algum motivo você quiser começar de novo, primeiro execute isso para limpar o dissipador combinado:

pacmd unload-module module-combine

Não use a limpeza agora se quiser continuar

Bônus: mova os fluxos atualmente em reprodução para o adaptador

Comando acima do trabalho para novos fluxos, não aqueles que já estão sendo reproduzidos. Isso ajustará o que é necessário:

for SINK_ID in $(pactl list sink-inputs | sed -n 's/^Sink Input #\([0-9]*\)$//p')
do
    echo Sink $SINK_ID
    pactl move-sink-input $SINK_ID $ADAPTER_SINK_NAME
    pactl move-sink-input $SINK_ID adapter-soft-volume
done

Ele tentará mover todas as entradas do coletor, incluindo a combinada, o que causaria um caminho circular. Felizmente, pulseaudio fará a coisa certa e imprimirá Failure: Invalid argument uma vez para indicar isso.

Automatize a coisa

Aqui está o script que fornece os benefícios (1) a (4). Você pode querer adicionar o move-sink-input acima. Pode ser interessante que seja executado sempre que o adaptador estiver conectado.

#!/bin/bash

export LC_ALL=C

ADAPTER_SINK_NAME=$( pacmd list-sinks | sed -n 's/^.*name: <\([^>]*\.usb[^>]*\)>$//p' | head -n 1 )

if [[ -z "${ADAPTER_SINK_NAME:-}" ]]
then
    ADAPTER_SINK_NAME=$( pactl list sinks | sed -n 's/^.*Name: \(.*\.usb.*\)$//p' | head -n 1 ) 
fi

echo will plug on $ADAPTER_SINK_NAME

# partial fix, can be run anyway to provide partial benefit if later steps fail
pactl set-default-sink $ADAPTER_SINK_NAME

pacmd unload-module module-combine # not useful first, used to clean things up if run several times

pacmd load-module module-combine sink_name=adapter-soft-volume slaves=$ADAPTER_SINK_NAME
pactl set-default-sink adapter-soft-volume
    
por 21.05.2015 / 11:30
1

Em resposta ao ponto 4, nenhum som abaixo de 35% do volume.

Mesmo problema, distribuição diferente (Fedora, não Ubuntu). Os comandos explicados na resposta existente ( set-default-sink ...) infelizmente não ajudam neste caso.

No Fedora 22, a modificação de um arquivo de configuração fez o trabalho:

Arquivo de configuração: /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common

Procure a seção [Elemento PCM]:

[Element PCM]
switch = mute
volume = merge
override-map.1 = all 
override-map.2 = all-left,all-right

Substitua a linha "volume = mesclagem" por estas duas linhas:

volume = ignore
volume-limit = 0.01

Recarregar pulseaudio:

$ pulseaudio -k

Reinicie o seu reprodutor de áudio e tente novamente.

De: link

(veja bug 1248649 .)

No entanto, esta solução parece não ajudar mais com o Fedora 23 (pulseaudio 7.1) - ou talvez valores diferentes tenham que ser usados.

Espero que isso seja útil para alguém.

    
por 23.12.2015 / 11:31