¿Establecer dispositivo para programa en PulseAudio?

10

En la computadora tengo 2 dispositivos de sonido.

Cuando ejecuto algún programa (digamos Skype) puedo (usando "pavucontrol" -> "PulseAudio Volume Control") configurar para que esta aplicación use un dispositivo determinado para la reproducción o grabación.

Pero, en las pestañas de Reproducción / Grabación, la aplicación solo es visible si está haciendo algo (reproducción o grabación).

¿Cómo puedo configurar el dispositivo por aplicación, pero antes de que la aplicación comience a grabar o reproducir sonidos?


fuente

Respuestas:

8

No sé si hay un archivo de configuración o configuración para esto en alguna parte, pero se puede hacer con variables de entorno. Basé mi respuesta en esta entrada en las Preguntas frecuentes de PulseAudio sobre cómo configurar la fuente de grabación. He intentado esto con salida (un sumidero en PulseAudio) pero debería funcionar tanto para entrada como para salida.

El primer paso es obtener el nombre interno de la fuente y el receptor que desea usar. Para hacer eso necesitas usar el pactl listcomando. Ese comando devolverá una pila de datos, pero a continuación se enumerarán solo los nombres de origen:

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

Esa lista probablemente incluirá los nombres de las fuentes regulares y las fuentes de monitor de PulseAudio (que en mi sistema tienen "monitor" en el nombre). Querrá usar el nombre de origen regular del dispositivo al que desea apuntar.

Puede hacer lo mismo para obtener los nombres de los sumideros:

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

Una vez que tenga los nombres, puede ejecutar algo como lo siguiente desde su terminal:

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

Por supuesto, si desea ejecutar esto desde un menú, probablemente necesite crear un script de shell y usarlo en lugar del comando predeterminado. Algo como esto debería funcionar:

#!/bin/sh
set PULSE_SINK <sink_name>
set PULSE_SOURCE <source_name>
<command_to_run_skype>
moberley
fuente
Encantador conjunto de comandos para encontrar nombres internos, ¡ta!
Vix
2

Necesita EXPORTAR y asignar las variables, así:

#! / bin / sh 
export PULSE_SINK = "nombre_de_sistema" 
export PULSE_SOURCE = "source_name" 
command_to_run_skype
Krish
fuente
0

Escribí un módulo perl que hace esto PulseAudio.pm .

Te permite usar una sintaxis como esta,

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'
});

Por supuesto, puede usar cualquier criterio en get_sink_byy get_source_by. Se lee de pacmd info. Esto funciona con la misma idea de la respuesta de @moberley, excepto que usa una biblioteca perl en lugar de forzarlo a hacer su propio análisis. También proporciona algunas otras características ingeniosas.

Para mi programa de podcast, en realidad también uso esto para iniciar Skype.

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

(los btrlistener*nombres de Skype son para blogtalkradio).

Evan Carroll
fuente