Устройство вывода звука, быстрое переключение?

В зависимости от ситуации для вывода звука я использую либо динамики, либо гарнитуру. Учитывая, что моя гарнитура является USB-гарнитурой, она ведет себя как собственное аудиоустройство.

В настоящее время я переключаюсь между устройствами вывода звука, щелкая значок динамика в правом верхнем трее, где я выбираю «Настройки звука», перехожу на вкладку «Вывод» и выбираю нужное устройство.

Что мне интересно, может ли быть какой-нибудь более простой / быстрый способ переключения туда и обратно на мою USB-гарнитуру? Возможно, выделенный значок в трее, отображение клавиш или что-то в этом роде?

Я использую Ubuntu 10.04 с рабочим столом Gnome по умолчанию.

19
задан 21 December 2013 в 22:40

10 ответов

Для изменения устройства аудиовыхода по умолчанию из командной строки можно использовать pacmd Импульсная Аудио утилита командной строки.

Я нашел потребность сделать так же сегодня, желая переключиться между наушниками и динамиками, оба включили отдельные звуковые карты. Вот сценарий оболочки, который я записал, чтобы сделать так:

#!/usr/bin/env bash

sinks=($(pacmd list-sinks | grep index | \
    awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}

pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done

Примечания:

  • Это подкачивает между первыми двумя устройствами аудиовыхода что pacmd служебные списки. Если Вы будете иметь больше чем два аудиоустройства и захотите подкачать к другому, то необходимо будет заменить логику на строке 7 с некоторыми условными выражениями.
  • Просто свопинг устройства приемника по умолчанию ничего не делает для приложений, в настоящее время работающих — они продолжат производить к предыдущему устройству. Этот сценарий также перемещает место назначения приемника для всех существующих исходных данных. Т.е. если Вы запустите этот скрипт с музыкой, играющей на одном устройстве, то это немедленно подкачает к другому. Если Вы хотели бы, чтобы существующие приложения продолжили предыдущее устройство, прокомментировали последнюю строку (и строка 5, если Вы хотели бы).
11
ответ дан 21 December 2013 в 22:40

Ну, вы можете установить pavucontrol, он показывает приложения с выбором звукового устройства на первой вкладке, это сэкономит вам некоторые усилия. Но то, что вы действительно хотите, я думаю, это пометить гарнитуру USB как устройство по умолчанию, тогда каждый раз, когда вы подключите ее, весь звук будет перенаправлен на нее, а когда вы подключите ее - она ​​вернется к динамикам. Легко, правда.

0
ответ дан 21 December 2013 в 22:40

Вопрос довольно старый, но мой ответ все еще может быть полезен для пользователей GNOME 2. Я использовал PulseAudio Mixer Applet для точной задачи, описанной здесь. Вы можете изменить устройства ввода и вывода прямо в меню панели. Это самый удобный способ, который я нашел.

0
ответ дан 21 December 2013 в 22:40

Спасибо за сценарии! Я добавил часть для ввода (микрофон), а также на тот случай, если кто-то захочет его использовать:

while read line ; do
  case $line in 
    *\*\ index*) x=1 ;;
    index*) x=0 ;;
    name*) 
      source=$(echo $line | sed -e "s/.*<//;s/>.*//")
      if [[ $x = "0" ]] ; then
        pacmd set-default-source $source &> /dev/null
      fi ;;
  esac
done < <(pacmd list-sources | grep -e alsa_input -e index)
0
ответ дан 21 December 2013 в 22:40

Чтобы прокрутить список звуковых устройств, используйте следующий скрипт:

#!/bin/bash

declare -i sinks=(`pacmd list-sinks | sed -n -e 's/\**[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`)
declare -i sinks_count=${#sinks[*]}
declare -i active_sink_index=`pacmd list-sinks | sed -n -e 's/\*[[:space:]]index:[[:space:]]\([[:digit:]]\)/\1/p'`
declare -i next_sink_index=${sinks[0]}

#find the next sink (not always the next index number)
declare -i ord=0
while [ $ord -lt $sinks_count ];
do
echo ${sinks[$ord]}
if [ ${sinks[$ord]} -gt $active_sink_index ] ; then
    next_sink_index=${sinks[$ord]}
    break
fi
let ord++
done

#change the default sink
pacmd "set-default-sink ${next_sink_index}"

#move all inputs to the new sink
for app in $(pacmd list-sink-inputs | sed -n -e 's/index:[[:space:]]\([[:digit:]]\)/\1/p');
do
pacmd "move-sink-input $app $next_sink_index"
done

#display notification
declare -i ndx=0
pacmd list-sinks | sed -n -e 's/device.description[[:space:]]=[[:space:]]"\(.*\)"/\1/p' | while read line;
do
if [ $(( $ord % $sinks_count )) -eq $ndx ] ; then
    notify-send -i notification-audio-volume-high --hint=string:x-canonical-private-    synchronous: "Sound output switched to" "$line"
    exit
fi
let ndx++
done;

Все кредиты поступают в цветан с форума Ubuntu .

0
ответ дан 21 December 2013 в 22:40

У меня была такая же проблема, и я написал небольшой апплет для индикатора для рабочего стола Ubuntu Unity:

https://github.com/lkettenb/sound-output-switcher

http://www.capslockblog.com/images/misc/Screenshot.png

0
ответ дан 21 December 2013 в 22:40

Вот небольшой скрипт, который циклически обрабатывает приемники звука для текущего окна: https://gist.github.com/rif/01ffb5e3eb45d2e4e6ebb4652b3b19ce

Требуются pacmd и xdotool

0
ответ дан 21 December 2013 в 22:40

Конечно, переключение устройств с помощью апплета также работает нормально. Но самое классное в написании сценария - это то, что он очень быстрый. Я поставил мой, например, на сочетание клавиш alt + s. таким образом, когда я хочу переключиться с наушников на динамики, мне нужно всего лишь нажать alt + s.

Во всяком случае. Эндрю сказал:

Если у вас более двух аудиоустройств и вы хотите переключиться на другое, вам нужно заменить логику в строке 7 на некоторые условия.

Это то, что я сделал. Я делюсь этим, на случай, если у кого-то с этим возникнут проблемы:

#!/usr/bin/env bash

#sinks=($(pacmd list-sinks | grep index | \
#    awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
sinks=($(pacmd list-sinks | grep index | \
    awk '{ if ($1 == "*") print "1"; else print "0" }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

#find active sink
active=0
for i in ${sinks[*]}
do
    if [ $i -eq 0 ]
        then active=$((active+1))
        else break
    fi
done

#switch to next sink
swap=$(((active+1)%${#sinks[@]}))

pacmd set-default-sink $swap &> /dev/null
for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done

То, что я сделал по-другому, это: а) найти активный приемник в цикле for. И б) переключиться на следующий приемник, увеличив индекс на 1. Затем я делаю результат по количеству приемников. Это гарантирует, что, например, при наличии 3 стоков, (2 + 1)% 3 = 0. Таким образом, с индекса приемника 2 мы бы переключились на индекс приемника 0.

Таким образом, переключатель позволяет перемещаться вверх через доступные раковины.

0
ответ дан 21 December 2013 в 22:40

Я искал способ сделать это для переключения между внутренними динамиками моего ноутбука и базовой станцией Apple Airport , которая подключена к моей стереосистеме. Я решил назначить горячие клавиши для переключения. Я хотел, чтобы окно звуковых настроек всплыло на секунду, чтобы дать визуальное подтверждение переключения, и затем использовал wmctrl, чтобы закрыть окно.

(Я использовал ctrl + F8 и ctrl + F9 в качестве горячих клавиш, поскольку функция Fn этих клавиш на моем ноутбуке предназначена для увеличения и уменьшения громкости, поэтому казалось очевидным, что функции ctrl изменяют аудиовыход. )

Я использовал следующие 2 (почти идентичных) скрипта:

#! /bin/bash
gnome-volume-control -p output &
sleep .7 
pacmd set-default-sink 1
sleep .8 
wmctrl -c "Sound Preferences"
exit

#! /bin/bash
gnome-volume-control -p output &
sleep .7 
pacmd set-default-sink 0
sleep .8 
wmctrl -c "Sound Preferences"
exit

Первые изменения в базовой станции Apple (которую я назначил ctrl + F9), а вторая переключается обратно на внутренние динамики (Ctrl + F8). Это предполагает, что это только 2 установленных устройства вывода.

0
ответ дан 21 December 2013 в 22:40

Я положился на сценарий Andrews для создания, он использовать уведомляет-osd для объявления о том, что он просто сделал. Отредактируйте строки с именами после Ваших потребностей.

#!/usr/bin/env bash

sinks=($(pacmd list-sinks | grep index | \
    awk '{ if ($1 == "*") print "1",$3; else print "0",$2 }'))
inputs=($(pacmd list-sink-inputs | grep index | awk '{print $2}'))

[[ ${sinks[0]} = 0 ]] && swap=${sinks[1]} || swap=${sinks[3]}

pacmd set-default-sink $swap 

for i in ${inputs[*]}; do pacmd move-sink-input $i $swap &> /dev/null; done

if [ "$swap" = "0" ]; then
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Corsair 2.1 Speakers!" 

else
notify-send -u normal -i audio-volume-medium-symbolic "Sound output changed. Now using: Logitech G930 Headset!" 

fi
1
ответ дан 21 December 2013 в 22:40

Другие вопросы по тегам:

Похожие вопросы: