为 PulseAudio 中的程序设置设备?

为 PulseAudio 中的程序设置设备?

在计算机中我有 2 个声音设备。

当我运行某些程序(比如说 Skype)时,我可以(使用“pavucontrol”->“PulseAudio Volume Control”)进行设置,以便该应用程序使用给定的设备进行播放或录制。

但是 - 播放/录制选项卡中的应用程序仅在当前正在执行某项操作(播放或录制)时才可见。

如何在应用程序开始录制或播放声音之前设置每个应用程序的设备?

答案1

我不知道是否有任何设置或配置文件可以做到这一点,但可以使用环境变量来完成。我的回答基于此PulseAudio FAQ 中的条目关于设置录音源。我已尝试使用输出(PulseAudio 中的接收器),但它应该适用于输入和输出。

第一步是获取要使用的源和接收器的内部名称。为此,您需要使用命令pactl list。该命令将返回一堆数据,但以下内容将仅列出源名称:

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

该列表可能包括常规源和 PulseAudio 的监视器源(在我的系统中,其名称中包含“监视器”)。您需要使用要定位的设备的常规源名称。

您可以做同样的事情来获取接收器名称:

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

获得名称后,您可以从终端运行以下命令:

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

当然,如果您想从菜单运行它,您可能需要创建一个 shell 脚本并使用它来代替默认命令。类似这样的操作应该可以工作:

#!/bin/sh
set PULSE_SINK <sink_name>
set PULSE_SOURCE <source_name>
<command_to_run_skype>

答案2

您需要导出并分配变量,如下所示:

/bin/sh #!/bin/sh 复制代码
导出PULSE_SINK="sink_name"
导出PULSE_SOURCE="源名称"
运行_skype 的命令

答案3

我编写了一个 perl 模块来执行此操作PulseAudio.pm

它允许你使用这样的语法,

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

当然,您可以在get_sink_by和中使用任何条件get_source_by。它从 读取pacmd info。这与 @moberley 的答案的想法相同,只是它使用 perl 库而不是强迫您自己进行解析。它还提供了一些其他漂亮的功能。

对于我的播客节目,我实际上也使用它来启动 Skype。

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

btrlistener*Skype 名称来自 blogtalkradio)。

相关内容