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