Thay đổi đầu vào / đầu ra PulseAudio từ Shell?


38

Thỉnh thoảng tôi có một bộ tai nghe không dây đẹp mà tôi sử dụng, ngoài loa và micrô thông thường.

Tôi muốn viết một tập lệnh để chuyển đổi giữa một nguồn đầu vào và đầu ra và một tập lệnh khác, về cơ bản là một công tắc giữa tai nghe và loa + micrô của tôi.

Tôi muốn thay đổi giữa điều này:

...và cái này:

Có cách nào để kịch bản chuyển đổi giữa hai đầu vào và đầu ra không? Về cơ bản tôi đang tìm kiếm một cái gì đó như thế này:

CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"

if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
    set-current-input "HD Pro Webcam C920"
else 
    set-current-input "Vengeance 2000"
fi

if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
    set-current-output "Built-in Audio"
else
    set-current-output "Vengeance 2000"
fi

Có cách nào để kịch bản này?


3
Bạn có thể xem xét man pactlcác tùy chọn dòng lệnh PulseAudio.
Teresa e Junior

Off-topic: ứng dụng GUI nào trên các ảnh chụp màn hình đó?
WhyNotHugo

Đó là Cài đặt hệ thống cơ bản.
Naftuli Kay

Câu trả lời:


53

Như @ Teresa-e-Junior đã chỉ ra pactllà công cụ để sử dụng:

Trước hết, chúng tôi có thể muốn lấy ID của các bồn PA của chúng tôi. Trên hệ thống của tôi đây là những gì tôi nhận được:

$ pactl list short sinks
0       alsa_output.pci-0000_01_00.1.hdmi-surround      module-alsa-card.c      s16le 6ch 44100Hz  SUSPENDED
1       alsa_output.pci-0000_00_1b.0.analog-stereo      module-alsa-card.c      s16le 2ch 44100Hz  RUNNING

Chìm 1 hiện là bồn rửa mặc định của tôi.
Nhưng bây giờ tôi muốn tất cả các luồng hiện tại và tương lai của mình sẽ được phát qua HDMI (tức là chìm 0).

Có một lệnh để đặt mức chìm mặc định cho PulseAudio, nhưng dường như nó không có bất kỳ ảnh hưởng nào đến PC của tôi:

$ pacmd set-default-sink 0 #doesn't work on my PC :(

Thay vào đó, các luồng mới dường như được kết nối với bồn rửa có luồng được chuyển đến gần đây nhất.

Vì vậy, hãy nói với pactl để di chuyển tất cả các luồng đang phát đang chìm xuống 0. Trước tiên chúng ta cần liệt kê chúng:

$ pactl list short sink-inputs
290     1       176     protocol-native.c       float32le 2ch 44100Hz
295     1       195     protocol-native.c       float32le 2ch 44100Hz

Ok, chúng tôi đã có hai luồng (ID 290 và 295) đều được gắn vào chìm 1.
Hãy di chuyển chúng để chìm 0:

$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0

Vì vậy, đó nên là nó. Bây giờ chúng ta chỉ cần tạo một kịch bản phù hợp với chúng ta:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$1"

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input "$streamId" "$newSink"
done

Bạn có thể gọi nó bằng ID chìm hoặc tên chìm là tham số (nghĩa là 0hoặc một cái gì đó giống như alsa_output.pci-0000_01_00.1.hdmi-surround).

Bây giờ bạn có thể đính kèm tập lệnh này vào một sự kiện udev hoặc phím tắt.


1
Thật sự cảm ơn! Tôi đã biến tập lệnh này thành tập lệnh Python giúp nó hoạt động tốt và dễ sử dụng, nó có sẵn ở đây .
Naftuli Kay


1
@NaftuliTzviKay: tập lệnh của bạn không còn nữa. Nếu bạn vẫn có nó, hãy xem xét việc đăng lên [GitHub Gist] (gist.github.com).
Denilson Sá Maia

Và nếu như 0 sink input(s) available.? Nhưng flash player shitty đó vẫn đang phát âm thanh? Và tôi thấy người chơi flash trong client(s) logged inphần củapacmd list
Zhigalin

1
$ pacmd set-default-sink INDEXvẫn cần thiết cho tập lệnh của tôi nếu không các lệnh bàn phím để thay đổi âm lượng tiếp tục sử dụng nguồn chìm cũ.
myol

9

Các lệnh sau được sử dụng để thao tác máy chủ âm thanh PulseAudio:

pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.

Dưới đây là một số ví dụ về cách chúng hoạt động.

pacmd list-sinks:: danh sách tên hoặc số chỉ mục của các bồn có thể

pacmd set-default-sink [sinkname]:: đặt mức chìm đầu ra mặc định

pacmd set-default-source [sourcename]:: đặt đầu vào mặc định

pacmd set-sink-volume [index] [volume]:: đặt âm lượng chìm

pacmd set-source-volume index volume:: phạm vi điều khiển âm lượng 0 - 65536 (số càng thấp âm lượng càng thấp)

Đây chỉ là một số ít mà tôi đã rút ra khỏi trang wiki & man. Tham khảo điều này để biết thêm thông tin chi tiết. Hoặc bạn có thể xem các lệnh --helphoặc mantrang.

Ngoài ra còn có một công cụ dòng lệnh đã được phục vụ cho mục đích này. Tên của nó là ponymousix . Đây là một bộ trộn dòng lệnh cho PulseAudio. Các liên kết được cung cấp là github dự án. Nó được phát triển bởi một người bạn và đồng nghiệp Arch Linux Người dùng / Nhà phát triển đáng tin cậy. Nếu bạn không chạy Arch, bạn có thể biên dịch nó từ nguồn bằng cách sử dụng makesudo make install.

$ ponymix --help
    usage: ponymix [options] <command>... 
Options:
 -h, --help              display this help and exit    
 -c, --card CARD         target card (index or name)
 -d, --device DEVICE     target device (index or name)
 -t, --devtype TYPE      device type
 -N, --notify            use libnotify to announce volume changes
     --source            alias to -t source
     --input             alais to -t source
     --sink              alias to -t sink
     --output            alias to -t sink
     --sink-input        alias to -t sink-input
     --source-output     alias to -t source-output
Device Commands:
  help                   display this message
  defaults               list default devices (default command)
  set-default            set default device by ID
  list                   list available devices
  list-short             list available devices (short form)
  list-cards             list available cards
  list-cards-short       list available cards (short form)
  get-volume             get volume for device
  set-volume VALUE       set volume for device
  get-balance            get balance for device
  set-balance VALUE      set balance for device
  adj-balance VALUE      increase or decrease balance for device
  increase VALUE         increase volume
  decrease VALUE         decrease volume
  mute                   mute device
  unmute                 unmute device
  toggle                 toggle mute
  is-muted               check if muted
Application Commands:
  move DEVICE            move target device to DEVICE
  kill DEVICE            kill target DEVICE
Card Commands:
  list-profiles          list available profiles for a card
  list-profiles-short    list available profiles for a card(short form)
  get-profile            get active profile for card
  set-profile PROFILE    set profile for a card

Hey cảm ơn bạn cho câu trả lời này! Nó giúp tôi rất nhiều với một vấn đề liên quan đến vấn đề này .
KlaymenDK

5

Trên máy tính xách tay của tôi chạy Fedora 20, đầu ra HDMI không được liệt kê dưới dạng chìm trong cấu hình mặc định, mà là một cấu hình khác .

Tôi chỉ có 1 bồn rửa như thế này, chơi nhạc hay trên loa laptop:

$ pactl list short sinks
8   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Nếu tôi chạy pactl set-card-profile 0 output:hdmi-stereothì nhạc hay đang phát qua HDMI. Tôi có:

$ pactl list short sinks
14  alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Để trở về mặc định tôi chỉ cần chạy pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. Dù bằng cách nào thì mặc định sẽ có lại nếu tôi khởi động lại.

Danh sách các hồ sơ cho thẻ của tôi ở đâu đó trên pactl list cardsđầu ra.


Thông tin này đã được cung cấp bởi câu trả lời được chấp nhận. Vui lòng không sao chép câu trả lời của người dùng khác trừ khi bạn có thêm điều gì đó để thêm. Điều này chỉ cần kiểm tra lại câu trả lời khác và không cung cấp gì mới hoặc hữu ích!
slm

5
set-card-profileđã không được đề cập trước đây và đó là thông tin quan trọng nhất về câu trả lời này.
Spidey

0

Mở rộng câu trả lời được chấp nhận bởi @cinelli, tôi đã đưa ra một kịch bản

  • chuyển đổi giữa chính xác hai thiết bị chìm / đầu ra phải được xác định trong tập lệnh,
  • bật tắt các luồng VÀ chìm mặc định, để các phím phương tiện trên bàn phím hoạt động và
  • để mô-đun khử tiếng vang của tôi không bị ảnh hưởng.

Thay đổi khi cần thiết!

#!/bin/bash

# Small script to switch between two hardcoded sound output devices

# Set patterns for devices to be toggled. Have to match to second column
# in output of "pactl list short sinks".
# (Could also hardcode the full names, but this might be a little more robust)
TOGGLE1="Jabra_EVOLVE"
TOGGLE2="Generic_ThinkPad_Dock_USB"

# Discover which sink (output device) is active, and set up toggles
while read -r stream; do
  echo "$stream"
  if echo "$stream" | grep -q "RUNNING"; then
    currentSink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE1"; then
    toggle1Sink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE2"; then
    toggle2Sink=$(echo "$stream" | cut -f2)
  fi
done < <(pactl list short sinks)

# Set up where to switch to
if [ "$currentSink" = "$toggle1Sink" ]; then
  newSink=$toggle2Sink
else
  newSink=$toggle1Sink
fi

# Switch streams AND default sink
pactl list short sink-inputs|while read -r stream; do
    streamId=$(echo "$stream"|cut '-d ' -f1)
    # exclude echo cancellation module, but switch all other streams
    # You can, but don't have to remove if condition if no such module present
    if [ "$streamId" != "0" ]; then
      echo "moving stream $streamId"
      pactl move-sink-input "$streamId" "$newSink"
    fi;
    # Also switch default sink, so media control keys work correctly
    pactl set-default-sink "$newSink"
done
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.