Changer de sortie 'pulseaudio' en ligne de commande mais facilement

 · 1 min read
 · Jean Schurger
Table of contents

Problématique

J'ai souvent besoin de changer sur quel matériel je veux que le son de mon ordinateur soit joué. En général, j'ai le choix entre la carte son intégrée à mon laptop, la carte son USB de meilleur qualité, et des enceintes branchées sur un ordinateur distant configuré pour accepter les connections 'pulseaudio'

Pulseaudio fournit un outil en ligne de commande: 'pacmd' mais il n'est pas pratique à utiliser. Voila un petit script qui se charge de lister les sorties audio disponibles et de choisir celle à utiliser par défaut. En bonus, il indique aussi à 'pulseaudio' de changer la sortie des applications en cours de lecture.

Script

#!/usr/bin/env python

import sys
import subprocess

default_index = None
current_sink = None
outputs = {}
sinks, _ = subprocess.Popen('pacmd list-sinks', shell=True,
                            stdout=subprocess.PIPE).communicate()
for line in sinks.split('\n'):
    if line.startswith('    index'):
        index = line.split(':')[1].strip()
        current_index = index
    if line.startswith('  * index'):
        index = line.split(':')[1].strip()
        default_index = index
        current_index = index
    if line.startswith("\tname:"):
        name = line.split(':')[1].strip()
        if current_index:
            outputs[current_index] = name

to_move = set()
inputs, _ = subprocess.Popen('pacmd list-sink-inputs', shell=True,
                            stdout=subprocess.PIPE).communicate()
for line in inputs.split('\n'):
    if line.startswith('    index'):
        index = line.split(':')[1].strip()
        to_move.add(index)

if len(sys.argv) > 1:
    selected = sys.argv[1].lower()
    if selected not in outputs.keys():
        for index, output in outputs.items():
            if selected in output.lower():
               selected = index
               break
    subprocess.call(["pacmd", "set-default-sink", selected])
    for input in to_move:
        subprocess.call(["pacmd", "move-sink-input", input, selected])
else:
    for index, output in outputs.items():
        print "%s %s %s" % (index, output,
            "SELECTED" if index == default_index else "")

Utilisation

Lister les sorties

jeansch@blackpage:~/tmp (0) % sso
1 <alsa_output.pci-0000_00_1b.0.analog-stereo>
32 <tunnel.hop.local.alsa_output.pci-0000_00_1b.0.analog-stereo>
33 <alsa_output.usb-Focusrite_Scarlett_2i2_USB-00-USB.analog-stereo> SELECTED

Choisir une sortie par son numéro

jeansch@blackpage:~/tmp (0) % sso 33

Choisir une sortie par son nom

jeansch@blackpage:~/tmp (0) % sso focus