コンピューターには2つのサウンドデバイスがあります。
プログラム(Skypeなど)を実行すると、(「pavucontrol」->「PulseAudioボリュームコントロール」を使用して)このアプリケーションが特定のデバイスを再生または録音に使用するように設定できます。
ただし、[再生/記録]タブでは、アプリケーションは現在何か(再生または記録)を実行している場合にのみ表示されます。
アプリケーションごとにデバイスを設定するにはどうすればよいですか?ただし、アプリケーションがサウンドの録音または再生を開始する前に?
このための設定ファイルまたは構成ファイルがどこかにあるかどうかはわかりませんが、環境変数を使用して実行できます。私はこれに基づいて答えました 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>
もちろん、これをメニューから実行する場合は、シェルスクリプトを作成し、デフォルトのコマンドの代わりにそれを使用する必要があります。このようなものが機能するはずです:
#!/bin/sh
set Pulse_SINK <sink_name>
set Pulse_SOURCE <source_name>
<command_to_run_skype>
次のように、変数をエクスポートして割り当てる必要があります。
#!/ bin/sh export Pulse_SINK = "sink_name" export Pulse_SOURCE = "source_name" command_to_run_skype
これを行う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用です)。