Définir l'appareil pour le programme dans PulseAudio?

10

Dans l'ordinateur, j'ai 2 périphériques audio.

Lorsque j'exécute un programme (disons Skype), je peux (en utilisant "pavucontrol" -> "PulseAudio Volume Control") configurer de sorte que cette application utilise un appareil donné pour la lecture ou l'enregistrement.

Mais - dans les onglets Lecture / Enregistrement, l'application n'est visible que si elle fait actuellement quelque chose (lecture ou enregistrement).

Comment puis-je configurer l'appareil par application, mais avant que l'application ne commence l'enregistrement ou la lecture de sons?


la source

Réponses:

8

Je ne sais pas s'il existe un fichier de paramètres ou de configuration pour cela, mais cela peut être fait avec des variables d'environnement. J'ai basé ma réponse sur cette entrée dans la FAQ PulseAudio sur la configuration de la source d'enregistrement. J'ai essayé cela avec la sortie (un puits dans PulseAudio) mais cela devrait fonctionner à la fois pour l'entrée et la sortie.

La première étape consiste à obtenir le nom interne de la source et du récepteur que vous souhaitez utiliser. Pour ce faire, vous devez utiliser la pactl listcommande. Cette commande renverra une pile de données, mais les éléments suivants répertorieront uniquement les noms des sources:

LANG=C pactl list | grep -A2 'Source #' | grep 'Name: ' | cut -d" " -f2

Cette liste inclura probablement les noms des sources régulières et des sources de contrôle de PulseAudio (qui sur mon système ont "moniteur" dans le nom). Vous voudrez utiliser le nom de source normal de l'appareil que vous souhaitez cibler.

Vous pouvez faire la même chose pour obtenir les noms des récepteurs:

LANG=C pactl list | grep -A2 'Sink #' | grep 'Name: ' | cut -d" " -f2

Une fois que vous avez les noms, vous pouvez exécuter quelque chose comme ceci à partir de votre terminal:

PULSE_SINK=<sink_name> PULSE_SOURCE=<source_name> <command_to_run_skype>

Bien sûr, si vous souhaitez l'exécuter à partir d'un menu, vous devrez probablement créer un script shell et l'utiliser à la place de la commande par défaut. Quelque chose comme ça devrait fonctionner:

#!/bin/sh
set PULSE_SINK <sink_name>
set PULSE_SOURCE <source_name>
<command_to_run_skype>
moberley
la source
Beau petit ensemble de commandes pour trouver des noms internes, ta !!
Vix
2

Vous devez EXPORTER et affecter les variables, comme ceci:

#! / bin / sh 
export PULSE_SINK = "nom_sink" 
export PULSE_SOURCE = "nom_source" 
command_to_run_skype
Krish
la source
0

J'ai écrit un module Perl qui fait ce PulseAudio.pm .

Il vous permet d'utiliser une syntaxe comme celle-ci,

use PulseAudio;
use constant TRACKIN  => 'pci-0000:00:1d.7-usb-0:2.3:1.0'

my $pa = PulseAudio->new;

my $sink   = $pa->get_sink_by([qw/properties device.bus_path/] => TRACKIN );
my $source = $pa->get_source_by(
  [qw/properties device.bus_path/] => TRACKIN
  , [qw/properties device.profile.name/] => 'analog-stereo'
);
$pa->exec({
  sink      => $sink
  , source  => $source
  , prog    => '/usr/bin/audacity'
});

Bien sûr, vous pouvez utiliser n'importe quel critère dans get_sink_byet get_source_by. Il lit à partir de pacmd info. Cela fonctionne sur la même idée de la réponse de @ moberley, sauf qu'elle utilise une bibliothèque Perl plutôt que de vous forcer à faire votre propre analyse. Il fournit également d'autres fonctionnalités intéressantes.

Pour mon émission de podcast, je l'utilise également pour lancer Skype ..

$pa->exec({
  sink      => $sink
  , source  => $source
  , prog    => '/usr/bin/skype'
  , args    => ['--callto','btrlistener021']
});

(les btrlistener*noms Skype sont pour blogtalkradio).

Evan Carroll
la source