Змінити PulseAudio вхід / вихід з оболонки?


38

У мене є набір хороших бездротових навушників, якими я час від часу користуюся, окрім своїх динаміків та звичайного мікрофона.

Я хотів би написати сценарій для переключення між одним вхідним та вихідним джерелом та іншим, по суті, перемиканням між навушниками та моїми динаміками + мікрофоном.

Я хотів би змінити між цим:

...і це:

Чи існує спосіб для сценарію передачі між двома входами та виходами? По суті, я шукаю щось подібне:

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

Чи є спосіб це скриптувати?


3
Ви можете ознайомитися з man pactlпараметрами командного рядка PulseAudio.
Teresa e Junior

Поза темою: що це за програма GUI на цих скріншотах?
WhyNotHugo

Це елементарні налаштування системи.
Naftuli Kay

Відповіді:


53

Як зазначав @ Teresa-e-Junior, pactlце інструмент для використання:

Перш за все, ми можемо захотіти отримати ідентифікатори наших мийок ПА. У моїй системі це те, що я отримую:

$ 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

Раковина 1 - це моя раковина за замовчуванням.
Але тепер я хочу, щоб усі мої поточні та майбутні потоки відтворювалися через HDMI (тобто раковина 0).

Є команда встановити мийку за замовчуванням для PulseAudio, але, схоже, це не вплине на мій ПК:

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

Натомість нові потоки, здається, підключені до раковини, яка останнім часом перемістилася до неї.

Тож давайте скажемо Pactl, щоб перемістити всі поточні потокові потоки, щоб потонути 0. Спочатку нам потрібно перерахувати їх:

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

Гаразд, у нас є два потоки (ідентифікатори 290 і 295), які приєднані до мийки 1.
Давайте перенесемо їх на раковину 0:

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

Отже, так і повинно бути. Тепер нам залишається лише скласти сценарій, який виконує нашу роботу:

#!/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

Ви можете викликати його як ідентифікатором мийки, або ім'ям раковини як параметру (тобто, 0або чимось подібним alsa_output.pci-0000_01_00.1.hdmi-surround).

Тепер ви можете приєднати цей скрипт до події udev або ярлика клавіш.


1
Дивовижне, дякую! Я перетворив це на сценарій Python, що робить його приємним та простим у роботі, він доступний тут .
Naftuli Kay

1
Пов’язано: askubuntu.com/a/14083/6645
Naftuli Kay

1
@NaftuliTzviKay: ваш сценарій більше не доступний. Якщо у вас все ще є, подумайте про публікацію в [GitHub Gist] (gist.github.com).
Denilson Sá Maia

А що якщо 0 sink input(s) available.? Але той лайно-флеш плеєр все ще відтворює аудіо? І я бачу флеш плеєр у client(s) logged inрозділіpacmd list
Жигалін

1
$ pacmd set-default-sink INDEXвсе ще потрібен для мого сценарію, інакше команди клавіатури для зміни гучності продовжують використовувати старе джерело раковини.
myol

9

Наступні команди використовуються для управління звуковим сервером PulseAudio:

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

Ось кілька прикладів того, як вони функціонують.

pacmd list-sinks:: назва списку або номер індексу можливих раковин

pacmd set-default-sink [sinkname]:: встановити мийку виходу за замовчуванням

pacmd set-default-source [sourcename]:: встановлення вводу за замовчуванням

pacmd set-sink-volume [index] [volume]:: встановити гучність мийки

pacmd set-source-volume index volume:: діапазон регулювання гучності 0 - 65536 (чим менше число, тим менше гучність)

Це лише декілька речей, які я витягнув зі сторінки wiki & man. Посилання на це для отримання більш детальної інформації. Або ви можете переглянути або команди, --helpабо manсторінку.

Тут також є інструмент командного рядка, який служить цій цілі. Це ім'я понімікс . Це міксер командного рядка для PulseAudio. Надається посилання на проекти github. Він розроблений другом та колегою Arch Linux Trusted User / Developer. Якщо у вас не працює Arch, ви можете просто скласти його з джерела за допомогою makeта sudo 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

Гей, дякую за цю відповідь! Це допомогло мені тонну проблему, пов’язану з цим .
KlaymenDK

5

На моєму ноутбуці, на якому працює Fedora 20, вихід HDMI не вказаний як раковина у профілі за замовчуванням, а як інший профіль .

У мене є лише 1 раковина, приємна музика, що грає на динаміках мого ноутбука:

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

Якщо я запускаю, pactl set-card-profile 0 output:hdmi-stereoто приємна музика грає через HDMI. Я отримав:

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

Щоб повернутися до замовчування, я просто запускаю pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. У будь-якому випадку за замовчуванням знову з’явиться, якщо я перезавантажуюсь.

Список профілів для моєї картки десь на pactl list cardsвиході.


Ця інформація вже була надана прийнятою відповіддю. Будь ласка, не копіюйте відповіді інших користувачів, якщо у вас є ще щось додати. Це просто переосмислює іншу відповідь і не надає нічого нового чи корисного!
slm

5
set-card-profileраніше не згадувалося, і це найважливіша інформація у цій відповіді.
Spidey

0

Розширюючи прийняту відповідь від @cinelli, я придумав сценарій, який

  • перемикання між рівно двома пристроями мийки / виводу, які необхідно визначити у сценарії,
  • перемикає потоки І раковина за замовчуванням, тому медіа-клавіші на клавіатурі працюють і
  • не залишає недоторканим мій модуль скасування ехо.

Змінюйте за потребою!

#!/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.