Alterar entrada / saída PulseAudio do Shell?


38

Eu tenho um bom conjunto de fones de ouvido sem fio que uso periodicamente, além dos alto-falantes e do microfone normal.

Eu gostaria de escrever um script para alternar entre uma fonte de entrada e saída e outra, essencialmente uma alternância entre meus fones de ouvido e meus alto-falantes + microfone.

Eu gostaria de mudar entre isso:

...e isto:

Existe uma maneira de escrever uma transferência entre as duas entradas e saídas? Basicamente, estou procurando algo parecido com isto:

CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"

if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
    set-current-input "HD Pro Webcam C920"
else 
    set-current-input "Vengeance 2000"
fi

if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
    set-current-output "Built-in Audio"
else
    set-current-output "Vengeance 2000"
fi

Existe uma maneira de escrever isso?


3
Você pode dar uma olhada nas man pactlopções de linha de comando do PulseAudio.
Teresa e Junior

Fora do tópico: que aplicativo GUI é esse nessas capturas de tela?
WhyNotHugo

É configurações do sistema do elementar.
Naftuli Kay

Respostas:


53

Como @ Teresa-e-Junior apontou, pactlé a ferramenta a ser usada:

Antes de tudo, podemos querer obter os IDs de nossos coletores de PA. No meu sistema, é isso que recebo:

$ pactl list short sinks
0       alsa_output.pci-0000_01_00.1.hdmi-surround      module-alsa-card.c      s16le 6ch 44100Hz  SUSPENDED
1       alsa_output.pci-0000_00_1b.0.analog-stereo      module-alsa-card.c      s16le 2ch 44100Hz  RUNNING

O coletor 1 é atualmente o meu coletor padrão.
Mas agora eu quero que todos os meus fluxos atuais e futuros sejam reproduzidos via HDMI (ou seja, coletor 0).

Existe um comando para definir o coletor padrão do PulseAudio, mas parece não ter nenhum efeito no meu PC:

$ pacmd set-default-sink 0 #doesn't work on my PC :(

Em vez disso, novos fluxos parecem estar conectados ao coletor que teve um fluxo movido para ele mais recentemente.

Então, digamos ao pactl para mover todos os fluxos atualmente em execução para afundar 0. Primeiro, precisamos listá-los:

$ pactl list short sink-inputs
290     1       176     protocol-native.c       float32le 2ch 44100Hz
295     1       195     protocol-native.c       float32le 2ch 44100Hz

Ok, temos dois fluxos (IDs 290 e 295) que estão anexados ao coletor 1.
Vamos movê-los para afundar 0:

$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0

Então, deve ser isso. Agora só precisamos fazer um script que faça o trabalho para nós:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$1"

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input "$streamId" "$newSink"
done

Você pode chamá-lo com um ID de coletor ou um nome de coletor como parâmetro (por exemplo, um 0ou algo parecido alsa_output.pci-0000_01_00.1.hdmi-surround).

Agora você pode anexar esse script a um evento udev ou atalho de tecla.


1
Incrível, obrigado! Transformei isso em um script Python, o que o torna agradável e fácil de trabalhar, está disponível aqui .
Naftuli Kay


1
@NaftuliTzviKay: seu script não está mais disponível. Se você ainda o possui, considere postar no [GitHub Gist] (gist.github.com).
Denilson Sá Maia

E se 0 sink input(s) available.? Mas esse flash player de merda ainda está reproduzindo áudio? E eu vejo o flash player na client(s) logged inseção depacmd list
Zhigalin 29/09

1
$ pacmd set-default-sink INDEXainda é necessário para o meu script, caso contrário, os comandos do teclado para alterar o volume continuam a usar a fonte antiga do coletor.
myol

9

Os seguintes comandos são usados ​​para manipular o servidor de som PulseAudio:

pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.

Aqui estão alguns exemplos de como eles funcionam.

pacmd list-sinks:: nome da lista ou número de índice de possíveis sumidouros

pacmd set-default-sink [sinkname]:: defina o coletor de saída padrão

pacmd set-default-source [sourcename]:: defina a entrada padrão

pacmd set-sink-volume [index] [volume]:: ajuste o volume do coletor

pacmd set-source-volume index volume:: faixa de controle de volume 0 - 65536 (quanto menor o número, menor o volume)

Estes são apenas alguns exemplos que tirei da página wiki & man. Consulte isso para obter informações mais detalhadas. Ou você pode visualizar comandos --helpou manpágina.

Já existe uma ferramenta de linha de comando que serve a esse propósito. Seu nome é ponymix . É um misturador de linha de comando para o PulseAudio. O link fornecido é para o github de projetos. Ele foi desenvolvido por um amigo e colega Usuário / Desenvolvedor do Arch Linux. Se você não está executando o Arch, basta compilá-lo da fonte usando makee sudo make install.

$ ponymix --help
    usage: ponymix [options] <command>... 
Options:
 -h, --help              display this help and exit    
 -c, --card CARD         target card (index or name)
 -d, --device DEVICE     target device (index or name)
 -t, --devtype TYPE      device type
 -N, --notify            use libnotify to announce volume changes
     --source            alias to -t source
     --input             alais to -t source
     --sink              alias to -t sink
     --output            alias to -t sink
     --sink-input        alias to -t sink-input
     --source-output     alias to -t source-output
Device Commands:
  help                   display this message
  defaults               list default devices (default command)
  set-default            set default device by ID
  list                   list available devices
  list-short             list available devices (short form)
  list-cards             list available cards
  list-cards-short       list available cards (short form)
  get-volume             get volume for device
  set-volume VALUE       set volume for device
  get-balance            get balance for device
  set-balance VALUE      set balance for device
  adj-balance VALUE      increase or decrease balance for device
  increase VALUE         increase volume
  decrease VALUE         decrease volume
  mute                   mute device
  unmute                 unmute device
  toggle                 toggle mute
  is-muted               check if muted
Application Commands:
  move DEVICE            move target device to DEVICE
  kill DEVICE            kill target DEVICE
Card Commands:
  list-profiles          list available profiles for a card
  list-profiles-short    list available profiles for a card(short form)
  get-profile            get active profile for card
  set-profile PROFILE    set profile for a card

Ei, obrigado por esta resposta! Isso me ajudou muito com um problema relacionado a esse .
KlaymenDK

5

No meu laptop executando o Fedora 20, a saída HDMI não é listada como um coletor no perfil padrão, mas como um perfil diferente .

Eu tenho apenas 1 coletor como este, boa música tocando nos alto-falantes do meu laptop:

$ pactl list short sinks
8   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Se eu correr pactl set-card-profile 0 output:hdmi-stereo, uma música legal será reproduzida através do HDMI. Eu recebo:

$ pactl list short sinks
14  alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Para voltar ao padrão, eu apenas corro pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. De qualquer maneira, o padrão estará lá novamente se eu reiniciar.

A lista de perfis para o meu cartão está em algum lugar na pactl list cardssaída.


Esta informação já foi fornecida pela resposta aceita. Não copie as respostas de outros usuários, a menos que você tenha algo a acrescentar. Isso apenas refaz a outra resposta e não forneceu nada de novo ou útil!
slm

5
set-card-profilenão foi mencionado anteriormente e essa é a informação mais importante sobre esta resposta.
Spidey

0

Estendendo a resposta aceita por @cinelli, criei um script que

  • alterna entre exatamente dois coletores / dispositivos de saída que precisam ser definidos no script,
  • alterna os fluxos E o coletor padrão, para que as teclas de mídia do teclado funcionem e
  • deixa meu módulo de cancelamento de eco intocado.

Mude conforme necessário!

#!/bin/bash

# Small script to switch between two hardcoded sound output devices

# Set patterns for devices to be toggled. Have to match to second column
# in output of "pactl list short sinks".
# (Could also hardcode the full names, but this might be a little more robust)
TOGGLE1="Jabra_EVOLVE"
TOGGLE2="Generic_ThinkPad_Dock_USB"

# Discover which sink (output device) is active, and set up toggles
while read -r stream; do
  echo "$stream"
  if echo "$stream" | grep -q "RUNNING"; then
    currentSink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE1"; then
    toggle1Sink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE2"; then
    toggle2Sink=$(echo "$stream" | cut -f2)
  fi
done < <(pactl list short sinks)

# Set up where to switch to
if [ "$currentSink" = "$toggle1Sink" ]; then
  newSink=$toggle2Sink
else
  newSink=$toggle1Sink
fi

# Switch streams AND default sink
pactl list short sink-inputs|while read -r stream; do
    streamId=$(echo "$stream"|cut '-d ' -f1)
    # exclude echo cancellation module, but switch all other streams
    # You can, but don't have to remove if condition if no such module present
    if [ "$streamId" != "0" ]; then
      echo "moving stream $streamId"
      pactl move-sink-input "$streamId" "$newSink"
    fi;
    # Also switch default sink, so media control keys work correctly
    pactl set-default-sink "$newSink"
done
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.