Cambiare ingresso / uscita PulseAudio da Shell?


38

Ho un set di belle cuffie wireless che utilizzo di volta in volta, oltre agli altoparlanti e al microfono normale.

Vorrei scrivere uno script per alternare tra una sorgente di input e output e un'altra, essenzialmente un passaggio tra le mie cuffie e i miei altoparlanti + microfono.

Vorrei cambiare tra questo:

...e questo:

C'è un modo per me di scrivere un trasferimento tra i due input e output? In sostanza sto cercando qualcosa del genere:

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

C'è un modo per scrivere questo?


3
Puoi dare un'occhiata alle man pactlopzioni della riga di comando di PulseAudio.
Teresa e Junior,

Fuori tema: quale applicazione GUI è quella su quegli screenshot?
WhyNotHugo,

Sono le impostazioni di sistema elementari.
Naftuli Kay,

Risposte:


53

Come sottolineato da @ Teresa-e-Junior pactlè lo strumento da utilizzare:

Prima di tutto potremmo voler ottenere gli ID dei nostri lavandini PA. Sul mio sistema questo è quello che ottengo:

$ 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

Il lavandino 1 è attualmente il mio lavandino predefinito.
Ma ora voglio che tutti i miei stream attuali e futuri vengano riprodotti tramite HDMI (ovvero sink 0).

C'è un comando per impostare il sink predefinito per PulseAudio, ma non sembra avere alcun effetto sul mio PC:

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

Invece, nuovi flussi sembrano essere collegati al lavandino a cui è stato spostato un flusso più di recente.

Quindi diciamo a pactl di spostare tutti gli stream attualmente in riproduzione per affondare 0. Dovremo prima elencarli:

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

Ok, abbiamo due flussi (ID 290 e 295) che sono entrambi collegati al sink 1.
Spostiamoli per affondare 0:

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

Quindi, dovrebbe essere quello. Ora non ci resta che realizzare una sceneggiatura che funzioni per noi:

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

Puoi chiamarlo con un ID sink o un nome sink come parametro (cioè uno 0o qualcosa del genere alsa_output.pci-0000_01_00.1.hdmi-surround).

Ora puoi allegare questo script a un evento udev o a una scorciatoia da tastiera.


1
Fantastico, grazie! L'ho trasformato in uno script Python che lo rende facile e facile da usare, è disponibile qui .
Naftuli Kay,


1
@NaftuliTzviKay: il tuo script non è più disponibile. Se hai ancora, considera di pubblicare su [GitHub Gist] (gist.github.com).
Denilson Sá Maia,

E se 0 sink input(s) available.? Ma quel flash player di merda sta ancora riproducendo l'audio? E vedo flash player nella client(s) logged insezione dipacmd list
Zhigalin

1
$ pacmd set-default-sink INDEXè ancora necessario per il mio script, altrimenti i comandi da tastiera per la modifica del volume continuano a utilizzare la vecchia origine sink.
myol

9

I seguenti comandi vengono utilizzati per manipolare il server audio PulseAudio:

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

Ecco alcuni esempi di come funzionano.

pacmd list-sinks:: elenco nome o numero indice di possibili lavandini

pacmd set-default-sink [sinkname]:: imposta il sink di output predefinito

pacmd set-default-source [sourcename]:: imposta l' input predefinito

pacmd set-sink-volume [index] [volume]:: imposta il volume del sink

pacmd set-source-volume index volume:: intervallo di controllo del volume 0 - 65536 (più basso è il numero, più basso è il volume)

Questi sono solo alcuni che ho estratto dalla pagina wiki e man. Fare riferimento a questo per informazioni più dettagliate. Oppure puoi visualizzare i comandi --helpo la manpagina.

Esiste già uno strumento da riga di comando che serve a questo scopo. Si chiama ponymix . È un mixer da riga di comando per PulseAudio. Il link fornito è al github dei progetti. È sviluppato da un amico e collega Arch Linux Trusted User / Developer. Se non stai eseguendo Arch, puoi semplicemente compilarlo dal sorgente 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

Ehi, grazie per questa risposta! Mi ha aiutato moltissimo con un problema relativo a questo .
KlaymenDK,

5

Sul mio laptop con Fedora 20, l'uscita HDMI non è elencata come un sink nel profilo predefinito, ma come un profilo diverso .

Ho solo 1 lavandino come questo, bella musica riprodotta sugli altoparlanti del mio laptop:

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

Se corro, la pactl set-card-profile 0 output:hdmi-stereobuona musica viene riprodotta tramite HDMI. Ottengo:

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

Per tornare alle impostazioni predefinite, corro pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. In entrambi i casi il default è di nuovo lì se riavvio.

L'elenco dei profili per la mia carta è da qualche parte in pactl list cardsuscita.


Questa informazione è stata già fornita dalla risposta accettata. Ti preghiamo di non copiare le risposte degli altri utenti a meno che tu non abbia altro da aggiungere. Questo non fa altro che riformulare l'altra risposta e non ha fornito nulla di nuovo o utile!
slm

5
set-card-profilenon è stato menzionato in precedenza, e questa è l'informazione più importante su questa risposta.
Spidey

0

Estendendo la risposta accettata da @cinelli, ho ideato una sceneggiatura che

  • commuta tra esattamente due lavandini / dispositivi di output che devono essere definiti nello script,
  • attiva / disattiva i flussi E il sink predefinito, in modo che i tasti multimediali sulla tastiera funzionino e
  • lascia intatto il mio modulo di cancellazione dell'eco.

Cambia se necessario!

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.