Alterar Entrada / Saída de PulseAudio da Shell?

29

Eu tenho um conjunto de fones de ouvido sem fio que eu uso de vez em quando, 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 mudança entre meus fones de ouvido e meus alto-falantes + microfone.

Gostaria de mudar entre isto:

... e isso:

Existe uma maneira de eu escrever uma transferência entre as duas entradas e saídas? Essencialmente, estou procurando algo como 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 roteirizar isso?

    
por Naftuli Kay 18.02.2013 / 23:23

3 respostas

37

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

Antes de mais nada, podemos querer obter os IDs de nossos sumidouros de PA. No meu sistema, é isso que eu 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 dissipador 1 é atualmente meu coletor padrão.
Mas agora eu quero que todos os meus fluxos atuais e futuros sejam reproduzidos via HDMI (ou seja, sink 0).

Existe um comando para definir o coletor padrão para o 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, vamos dizer ao pactl para mover todos os fluxos atualmente em reproduçã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 grupo 1 .
Vamos movê-los para afundar 0 :

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

Então, deveria ser isso. Agora só precisamos criar 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, 0 ou algo como alsa_output.pci-0000_01_00.1.hdmi-surround ).

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

    
por 09.03.2013 / 14:15
8

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 do índice dos possíveis dissipadores

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

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

pacmd set-sink-volume [index] [volume] :: define o volume do depósito

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

Estes são apenas alguns dos que eu tirei do wiki & página man. Referência this para informações mais detalhadas. Ou você pode ver os comandos --help ou man page.

Também existe uma ferramenta de linha de comando que serve a esse propósito. Seu nome é ponymix . É um mixer de linha de comando para o PulseAudio. O link fornecido é para o projeto github. Ele é desenvolvido por um amigo e colega do Arch Linux Trusted User / Developer. Se você não estiver executando o Arch, poderá compilá-lo a partir da origem usando make e 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
    
por 11.03.2013 / 06:24
5

No meu laptop rodando o Fedora 20, a saída HDMI não está listada como um sumidouro no perfil padrão, mas como um perfil diferente .

Eu tenho apenas 1 pia como essa, música legal 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 executar pactl set-card-profile 0 output:hdmi-stereo , a música legal será reproduzida pelo 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, apenas corro pactl set-card-profile 0 output:analog-stereo+input:analog-stereo . De qualquer forma, o padrão está lá novamente se eu reiniciar.

A lista de perfis do meu cartão está em algum lugar em pactl list cards output.

    
por 27.12.2013 / 20:44