在计算机中,我有2个声音设备。
当我运行某些程序(例如Skype)时,我可以(使用“ pavucontrol”->“ PulseAudio音量控制”)进行设置,以便该应用程序将使用给定的设备进行播放或录制。
但是-仅在“播放/录制”选项卡中当前正在执行某项操作(播放或录制)时,该应用程序才可见。
如何为每个应用程序设置设备,但是在应用程序开始录制或播放声音之前呢?
在计算机中,我有2个声音设备。
当我运行某些程序(例如Skype)时,我可以(使用“ pavucontrol”->“ PulseAudio音量控制”)进行设置,以便该应用程序将使用给定的设备进行播放或录制。
但是-仅在“播放/录制”选项卡中当前正在执行某项操作(播放或录制)时,该应用程序才可见。
如何为每个应用程序设置设备,但是在应用程序开始录制或播放声音之前呢?
Answers:
我不知道是否在任何地方都有此设置或配置文件,但是可以使用环境变量来完成。我的答案基于PulseAudio常见问题解答中有关设置录制源的条目。我已经尝试过使用输出(PulseAudio中的接收器)进行此操作,但是它应该同时适用于输入和输出。
第一步是获取要使用的源和接收器的内部名称。为此,您需要使用pactl list
命令。该命令将返回一堆数据,但是以下将仅列出源名称:
LANG=C pactl list | grep -A2 'Source #' | grep 'Name: ' | cut -d" " -f2
该列表可能会包括常规源和PulseAudio的监视源的名称(在我的系统上,其名称中包含“ monitor”)。您将要使用要定位的设备的常规源名称。
您可以执行相同的操作来获取接收器名称:
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>
我编写了一个执行此PulseAudio.pm的perl模块。
它允许您使用这样的语法,
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
。除了使用perl库而不是强迫您自己进行解析之外,这与@moberley答案的相同思想起作用。它还提供了其他一些漂亮的功能。
对于我的播客节目,我实际上也使用它来启动Skype。
$pa->exec({
sink => $sink
, source => $source
, prog => '/usr/bin/skype'
, args => ['--callto','btrlistener021']
});
(btrlistener*
Skype名称用于blogtalkradio)。