74 votes

Comment changer le puits de pulseaudio avec "pacmd set-default-sink" pendant la lecture ?

Je dois changer le serveur pulseaudio d'un flux audio en cours de lecture.

Le serveur Pulseaudio est configuré avec l'adresse IP 192.168.1.105.

$>cat /etc/pulse/default.pa
...
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-native-protocol-tcp auth-anonymous=1
load-module module-zeroconf-publish
...

Du côté de la source, le lecteur multimédia VLC joue une chanson.

J'ai créé un nouveau tunnel sink avec pulseaudio du côté source.

pacmd load-module module-tunnel-sink server=192.168.1.105
pacmd set-default-sink 1

Mais pendant la lecture de l'audio, le serveur ne pouvait pas être changé immédiatement. Ce n'est qu'après avoir arrêté le lecteur et l'avoir rejoué qu'il peut être modifié.

Depuis "gnome-volume-control" ou "gnome-control-center sound", la commutation des périphériques de sortie est appliquée immédiatement.

Comment puis-je appliquer la commutation du puits de sortie immédiatement à partir de la ligne de commande pendant la lecture d'un fichier son ?

111voto

Takkat Points 135194

PulseAudio pacmd n'est pas capable de commuter les puits par défaut lorsqu'un flux est en cours de lecture sur l'entrée du puits. Il existe cependant un moyen d'y parvenir.

Modification de l'évier par défaut à partir de la ligne de commande

Tout d'abord, nous devons déterminer le numéro d'index des éviers que nous voulons changer. Ceci peut être fait en appelant :

pacmd list-sinks

En fonction de notre système, vous obtiendrez une liste plus ou moins longue des éviers et des propriétés qui sont actuellement accessibles :

 >>> 2 sink(s) available.
      * index: 0
            name: <alsa_output.pci-0000_01_00.1.hdmi-stereo-extra1>
            driver: <module-alsa-card.c>
    :
    :
        index: 1
            name: <alsa_output.pci-0000_00_14.2.analog-stereo>
            driver: <module-alsa-card.c>

El index ou le name donné ici est ce dont nous avons besoin pour adresser l'évier par ligne de commande. Le puits actuel par défaut est marqué d'un astérisque (ici 0 ).

Pour être en mesure de changer les puits par défaut à partir de la ligne de commande, nous pouvons avoir besoin de désactiver la restauration du dispositif cible de flux en modifiant la ligne correspondante dans /etc/pulse/default.pa à :

load-module module-stream-restore restore_device=false

Pour changer la sortie par défaut de puits à puits 1 nous exécutons ensuite

pacmd set-default-sink 1

Le succès peut être visualisé en ouvrant le Réglages du son menu.

Déplacer un flux vers un autre évier

Changer le puits par défaut alors que nous avons un flux d'entrée actif qui joue vers un puits donné. n'a aucun effet . Cela devrait plutôt être fait en déplaçant cette entrée vers un autre puits.

pacmd list-sink-inputs

nous indiquera l'index du flux d'entrée

>>> 1 sink input(s) available.
    index: 5
    driver: <protocol-native.c>

On sait maintenant qu'on veut déplacer le flux d'entrée 5 de couler 1 en appelant

pacmd move-sink-input 5 1

ou retour à la case départ 0 si nous aimons. Cela se fera immédiatement sans qu'il soit nécessaire d'arrêter la lecture.

Changement de l'évier par défaut en cours de lecture

Bien sûr, nous pouvons combiner ces deux commandes pour changer immédiatement les puits par défaut pendant la lecture, par exemple avec

pacmd set-default-sink 1 & pacmd move-sink-input 5 1

L'inconvénient de cette méthode est que le modifications de l'index du flux d'entrée à chaque fois qu'on arrête et redémarre le lecteur de musique. Nous devons donc toujours trouver l'index du flux actuel avant de pouvoir changer de flux à l'aide de la ligne de commande.

34voto

Gaco Points 341

J'ai écrit un simple script pour déplacer automatiquement toutes les entrées de puits.

Uso: ./movesinks.sh <sink number>

#!/bin/bash 
echo "Setting default sink to: $1";
pacmd set-default-sink $1
pacmd list-sink-inputs | grep index | while read line
do
echo "Moving input: ";
echo $line | cut -f2 -d' ';
echo "to sink: $1";
pacmd move-sink-input `echo $line | cut -f2 -d' '` $1

done

9voto

mpapis Points 310

Version améliorée de @Gaco script

#!/usr/bin/env bash

case "${1:-}" in
  (""|list)
    pacmd list-sinks |
      grep -E 'index:|name:'
    ;;
  ([0-9]*)
    echo switching default
    pacmd set-default-sink $1 ||
      echo failed
    echo switching applications
    pacmd list-sink-inputs |
      awk '/index:/{print $2}' |
      xargs -r -I{} pacmd move-sink-input {} $1 ||
        echo failed
    ;;
  (*)
    echo "Usage: $0 [|list|<sink name to switch to>]"
    ;;
esac

ma copie d'exécution est sur github et il comprend également la commutation automatique de Canal principal pour kmix

5voto

olealgo Points 151

Sur la base de la réponse de Gaco, je l'ai réécrit un peu pour mon usage personnel. Peut-être que quelqu'un le trouve utile. C'est pour basculer mes haut-parleurs USB et mon casque de jeu USB.

#!/bin/bash

# get list of sinks/cards (for settings CARD1/CARD2)
# pacmd list-sinks | awk '/name:/ {print $0};' | awk '{ print $2}' | sed 's/<//g; s/>//g'

CARD1="alsa_output.usb-C-Media_INC._C-Media_USB_Audio-00"
CARD2="alsa_output.usb-Kingston_HyperX_Virtual_Surround_Sound_00000000-00"

CURRENT_SINK=$(pacmd stat | awk -F": " '/^Default sink name: /{print $2}' | awk 'BEGIN{FS=OFS="."} NF--' | sed 's/alsa_output/alsa_output/g')

function setCard() {

  if [ "$CURRENT_SINK" == "$1" ]
   then
     echo "Already using this Sink"
     exit 1
  fi

  NEW_SINK=$(pacmd list-sinks | awk '/index:/ {print $1 $2 $3} /name:/ {print $0};' | grep -m1 -B1 $1 | grep index | awk '{print $1}' | cut -d ":" -f2)
  SINK=$(pacmd set-default-sink $NEW_SINK)
  INPUT=$(pacmd list-sink-inputs | grep index | awk '{print $2}')

  pacmd move-sink-input $INPUT $NEW_SINK
  echo "Moving input: $INPUT to sink: $NEW_SINK";
  echo "Setting default sink to: $NEW_SINK";

  notify-send --urgency=low "Audio Switching" "SINK: $NEW_SINK"
}

function toggleSinks() {
  if [ "$CURRENT_SINK" == "$CARD1" ]
    then
      setCard $CARD2
    else
      setCard $CARD1
    fi
}

function showHelp() {
  echo "------------------------------------"
  echo "AUDIO SINK SWITCHER"
  echo " "
  echo "$0 [options]"
  echo " "
  echo "options:"
  echo "-h  --help        What you are looking at.."
  echo "-g, --gaming      Sets Gaming headset as output device"
  echo "-s, --speakers    Sets Speakers as output device"
  echo "-t, --toggle      Toggles the different output devices"
  echo " "
  echo "------------------------------------"
}

# check args length
if [ $# -eq 0 ]
  then
    echo "Toggling output devices (Speakers/Headset)"
    toggleSinks
fi

# arg options
while test $# -gt 0; do
    case "$1" in

                -h|--help)
                        showHelp
                        exit 1
                        ;;

                -g|--gaming)
                        setCard $CARD2
                        exit 1
                        ;;

                -s|--speakers)
                        setCard $CARD1
                        exit 1
                        ;;

                -t|--toggle)
                        toggleSinks
                        echo "Toggling output devices (Speakers/Headset)"
                        exit 1
                        ;;
                 *)
                        showHelp
                        exit 1
                        ;;
    esac
done

3voto

Ray M Points 31

J'ai bricolé des trucs à différents endroits et j'ai trouvé ce script pour configurer une JAMBOX bluetooth une fois qu'elle a été appairée. Votre MAC sera différent bien sûr. Comme je contrôle le volume de la JAMBOX via l'application Clementine, un volume de 130% fonctionne mieux dans mon cas. Vous pourriez vouloir changer cela, ainsi que le fichier rhythmbox.png (c'était la seule image de haut-parleur que j'ai pu trouver sur mon ordinateur). La vérification des erreurs est rudimentaire, mais fonctionne de manière assez fiable. Je l'ai mis dans un lanceur de bureau pour plus de commodité sur un netbook ASUS.

#!/bin/bash
# setjambox connection setup
# Find the particulars of your environment with 'pactl list sinks'
# This script uses the sink name instead of the index number
# You also need libnotify-bin to run this script

# Enter the bluetooth MAC address of your device here
MAC=00:21:3C:9F:19:AD

# Make ready
# Convert device address per pulseaudio standards
DEV=$(echo $MAC|tr ':' '_')
TITLE="JAMBOX $MAC"
CONNECTED="Audio connection updated."
PROBLEM="Unable to update settings."
JBLOGO=/usr/share/icons/hicolor/48x48/apps/rhythmbox.png

# And go

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

pactl set-default-sink bluez_sink.$DEV
pactl set-card-profile bluez_card.$DEV a2dp
pactl set-sink-volume  bluez_sink.$DEV 130%

if [ $? -eq 0 ]
then
   notify-send -i $JBLOGO -t 3000 "$TITLE" "$CONNECTED" 
else
   notify-send -i gtk-dialog-warning -t 3000 "$TITLE" "$PROBLEM"
fi

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X