¿Cambiar la entrada / salida de PulseAudio desde Shell?

38

Tengo un conjunto de auriculares inalámbricos agradables que uso de vez en cuando, además de mis altavoces y mi micrófono normal.

Me gustaría escribir un script para cambiar entre una fuente de entrada y salida y otra, esencialmente un cambio entre mis auriculares y mis altavoces + micrófono.

Me gustaría cambiar entre esto:

...y esto:

¿Hay alguna manera para mí de hacer una transferencia entre las dos entradas y salidas? Básicamente estoy buscando algo como esto:

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

¿Hay alguna manera de escribir esto?

Naftuli Kay
fuente
3
Puede echar un vistazo a las man pactlopciones de línea de comandos de PulseAudio.
Teresa e Junior
Fuera de tema: ¿qué aplicación GUI es esa en esas capturas de pantalla?
WhyNotHugo
Es la configuración del sistema de primaria.
Naftuli Kay

Respuestas:

53

Como señaló @ Teresa-e-Junior, pactles la herramienta a utilizar:

En primer lugar, es posible que deseemos obtener las identificaciones de nuestros sumideros PA. En mi sistema esto es lo que obtengo:

$ 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

El sumidero 1 es actualmente mi sumidero predeterminado.
Pero ahora quiero que todas mis transmisiones actuales y futuras se reproduzcan a través de HDMI (es decir, sumidero 0).

Hay un comando para establecer el sumidero predeterminado para PulseAudio, pero no parece tener ningún efecto en mi PC:

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

En cambio, las nuevas transmisiones parecen estar conectadas al sumidero al que se le trasladó una transmisión más recientemente.

Entonces, digamos a pactl que mueva todas las transmisiones actualmente en reproducción para hundirse 0. Primero tendremos que enumerarlos:

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

Ok, tenemos dos transmisiones (ID 290 y 295) que están conectadas al receptor 1.
Vamos a moverlos a hundirse 0:

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

Entonces, eso debería ser. Ahora solo tenemos que hacer un script que haga el trabajo por nosotros:

#!/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

Puede llamarlo con una ID de sumidero o un nombre de sumidero como parámetro (es decir, 0 o algo parecido alsa_output.pci-0000_01_00.1.hdmi-surround).

Ahora puede adjuntar este script a un evento udev o atajo de tecla.

mreithub
fuente
1
¡Genial gracias! He convertido esto en un script de Python que lo hace agradable y fácil de trabajar, está disponible aquí .
Naftuli Kay
1
Relacionado: askubuntu.com/a/14083/6645
Naftuli Kay
1
@NaftuliTzviKay: su script ya no está disponible. Si aún lo tiene, considere publicar en [GitHub Gist] (gist.github.com).
Denilson Sá Maia
¿Y si 0 sink input(s) available.? ¿Pero ese flash player de mierda todavía reproduce audio? Y veo flash player en la client(s) logged insección depacmd list
Zhigalin
1
$ pacmd set-default-sink INDEXtodavía es necesario para mi script; de lo contrario, los comandos del teclado para cambiar el volumen continúan usando la fuente antigua del receptor.
myol
9

Los siguientes comandos se utilizan para manipular el servidor de sonido PulseAudio:

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

Aquí hay algunos ejemplos de cómo funcionan.

pacmd list-sinks:: nombre de la lista o número de índice de posibles sumideros

pacmd set-default-sink [sinkname]:: establecer el sumidero de salida predeterminado

pacmd set-default-source [sourcename]:: establecer la entrada predeterminada

pacmd set-sink-volume [index] [volume]:: establecer el volumen del sumidero

pacmd set-source-volume index volume:: rango de control de volumen 0 - 65536 (cuanto menor es el número, menor es el volumen)

Estos son solo algunos que saqué de la página wiki y man. Consulte esto para obtener información más detallada. O puede ver los comandos --helpo la manpágina.

También hay una herramienta de línea de comandos que sirve para este propósito. Su nombre es ponymix . Es un mezclador de línea de comandos para PulseAudio. El enlace proporcionado es a los proyectos github. Está desarrollado por un amigo y compañero de usuario / desarrollador de confianza de Arch Linux. Si no está ejecutando Arch, puede compilarlo desde la fuente usando makey 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
cinelli
fuente
Hola, gracias por esta respuesta! Me ayudó mucho con un problema relacionado con este .
KlaymenDK
5

En mi computadora portátil con Fedora 20, la salida HDMI no aparece como un receptor en el perfil predeterminado, sino como un perfil diferente .

Solo tengo 1 receptor como este, buena música sonando en los altavoces de mi computadora portátil:

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

Si corro, pactl set-card-profile 0 output:hdmi-stereoentonces se está reproduciendo buena música a través de HDMI. Yo obtengo:

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

Para volver al valor predeterminado, solo ejecuto pactl set-card-profile 0 output:analog-stereo+input:analog-stereo . De cualquier manera, el valor predeterminado está allí nuevamente si reinicio.

La lista de perfiles para mi tarjeta está en algún lugar de la pactl list cardssalida.

RubenCaro
fuente
Esta información ya fue proporcionada por la respuesta aceptada. No copie las respuestas de otros usuarios a menos que tenga algo más que agregar. ¡Esto simplemente reafirma la otra respuesta y no proporciona nada nuevo o útil!
slm
55
set-card-profileno se mencionó anteriormente, y esa es la información más importante sobre esta respuesta.
Spidey
0

Extendiendo la respuesta aceptada por @cinelli, se me ocurrió un script que

  • alterna entre exactamente dos dispositivos de salida / sumideros que deben definirse en el script,
  • alterna las transmisiones Y el sumidero predeterminado, por lo que las teclas multimedia en el teclado funcionan y
  • deja mi módulo de cancelación de eco intacto.

¡Cambie según sea necesario!

#!/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
Thor
fuente