Изменить 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.
Тереза ​​и Джуниор,
Не по теме: какое приложение с графическим интерфейсом на этих скриншотах?
WhyNotHugo
Это элементарные настройки системы.
Нафтули Кей

Ответы:

53

Как отметил @ Teresa-e-Junior, pactlэто инструмент для использования:

Прежде всего мы могли бы хотеть получить идентификаторы наших раковин PA. В моей системе это то, что я получаю:

$ 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 или сочетанию клавиш.

mreithub
источник
1
Круто, спасибо! Я превратил это в скрипт Python, с которым легко и удобно работать, он доступен здесь .
Нафтули Кей
1
Связанный: askubuntu.com/a/14083/6645
Нафтули Кей
1
@NaftuliTzviKay: ваш скрипт больше не доступен. Если у вас все еще есть, рассмотрите возможность публикации в [GitHub Gist] (gist.github.com).
Денилсон Са Майя
А что если 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 (чем меньше цифра, тем меньше громкость)

Это лишь некоторые из тех, которые я вытащил со страницы вики и руководства. Ссылка это для более подробной информации. Или вы можете просматривать либо команды --helpили manстраницы.

Уже есть инструмент командной строки, который служит этой цели. Это имя Ponymix . Это микшер командной строки для 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
Cinelli
источник
Эй, спасибо за этот ответ! Это помогло мне с проблемой, связанной с этим .
KlaymenDK
5

На моем ноутбуке с Fedora 20 выход HDMI не указан как приемник в профиле по умолчанию, а как сам другой профиль .

У меня есть только одна раковина, на динамиках моего ноутбука играет приятная музыка:

$ 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выходе.

RubenCaro
источник
Эта информация уже была предоставлена ​​принятым ответом. Пожалуйста, не копируйте ответы других пользователей, если у вас есть что добавить. Это просто перефразирует другой ответ и не дает ничего нового или полезного!
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
Тор
источник