Đặt thiết bị cho chương trình trong PulseAudio?


10

Trong máy tính tôi có 2 thiết bị âm thanh.

Khi tôi chạy một số chương trình (giả sử Skype), tôi có thể (sử dụng "pavucontrol" -> "PulseAudio Volume Control") để ứng dụng này sẽ sử dụng thiết bị đã cho để phát lại hoặc ghi.

Nhưng - trong ứng dụng tab Phát lại / Ghi chỉ hiển thị nếu hiện tại nó đang làm gì đó (phát lại hoặc ghi).

Làm cách nào tôi có thể đặt thiết bị cho mỗi ứng dụng, nhưng trước khi ứng dụng bắt đầu ghi hoặc phát âm thanh?

Câu trả lời:


8

Tôi không biết nếu có một cài đặt hoặc tệp cấu hình cho bất cứ nơi nào nhưng nó có thể được thực hiện với các biến môi trường. Tôi đã dựa trên câu trả lời của mình cho mục này trong Câu hỏi thường gặp về PulseAudio về việc đặt nguồn ghi âm. Tôi đã thử điều này với đầu ra (một phần chìm trong PulseAudio) nhưng nó sẽ hoạt động cho cả đầu vào và đầu ra.

Bước đầu tiên là lấy tên nội bộ của nguồn và phần chìm mà bạn muốn sử dụng. Để làm điều đó bạn cần sử dụng pactl listlệnh. Lệnh đó sẽ trả về một đống dữ liệu, nhưng sau đây sẽ chỉ liệt kê các tên nguồn:

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

Danh sách đó có thể sẽ bao gồm tên cho cả nguồn thông thường và nguồn màn hình của PulseAudio (trong hệ thống của tôi có "màn hình" trong tên). Bạn sẽ muốn sử dụng tên nguồn thông thường của thiết bị bạn muốn nhắm mục tiêu.

Bạn có thể làm điều tương tự để có được tên chìm:

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

Khi bạn đã có tên, bạn có thể chạy một cái gì đó như sau từ thiết bị đầu cuối của bạn:

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

Tất nhiên, nếu bạn muốn chạy cái này từ menu, có lẽ bạn sẽ cần phải tạo một tập lệnh shell và sử dụng nó thay vì lệnh mặc định. Một cái gì đó như thế này sẽ hoạt động:

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

Bộ lệnh nhỏ đáng yêu để tìm tên nội bộ, ta !!
Vix

2

Bạn cần phải XUẤT và gán các biến, như thế này:

#! / thùng / sh 
xuất PULSE_SINK = "chìm_name" 
xuất PULSE_SOURCE = "source_name" 
lệnh_to_run_skype

0

Tôi đã viết một mô-đun perl thực hiện PulseAudio.pm này .

Nó cho phép bạn sử dụng một cú pháp như thế này,

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

Tất nhiên, bạn có thể sử dụng bất kỳ tiêu chí trong get_sink_byget_source_by. Nó đọc từ pacmd info. Điều này hoạt động trên cùng một ý tưởng về câu trả lời của @ moberley ngoại trừ nó sử dụng thư viện perl thay vì buộc bạn phải tự phân tích cú pháp. Nó cũng cung cấp một số tính năng tiện lợi khác.

Đối với chương trình podcast của tôi, tôi thực sự sử dụng điều này để khởi chạy Skype ..

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

( btrlistener*tên Skype là dành cho blogtalkradio).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.