在计算机中我有 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)。