Urządzenie wyjściowe audio, szybki przełącznik?

19

W zależności od sytuacji do wyjścia audio używam głośników lub zestawu słuchawkowego. Ponieważ mój zestaw słuchawkowy jest zestawem USB, zachowuje się jak własne urządzenie audio.

Obecnie przełączam się między wyjściowymi urządzeniami audio, klikając ikonę głośnika w prawym górnym rogu, gdzie wybieram Ustawienia dźwięku, przechodzę do zakładki Wyjście i tam wybieram urządzenie, które chcę.

Zastanawiam się, czy istnieje jakiś łatwiejszy / szybszy sposób przełączania się między zestawem słuchawkowym USB? Może ikona dedykowanego zasobnika, mapowanie klawiszy, czy coś takiego?

Używam Ubuntu 10.04 z domyślnym pulpitem Gnome.

andol
źródło

Odpowiedzi:

11

Aby zmienić domyślne urządzenie wyjściowe audio z wiersza poleceń, możesz użyć pacmdnarzędzia wiersza polecenia Pulse Audio.

Uznałem dziś, że muszę zrobić podobnie, chcąc przełączać się między słuchawkami i głośnikami, oba podłączone do osobnych kart audio. Oto skrypt powłoki, który napisałem, aby to zrobić:

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

Uwagi:

  • Przełącza się to między dwoma pierwszymi urządzeniami wyjściowymi audio wymienionymi przez pacmdnarzędzie. Jeśli masz więcej niż dwa urządzenia audio i chcesz zamienić je na inne, musisz wymienić logikę w linii 7 na niektóre warunki warunkowe.
  • Po prostu zamiana domyślnego urządzenia zlewu nic nie robi dla aktualnie uruchomionych aplikacji - będą one nadal wyświetlać dane na poprzednim urządzeniu. Ten skrypt przenosi także miejsce docelowe ujścia dla wszystkich istniejących danych wejściowych. To znaczy, jeśli uruchomisz ten skrypt z muzyką odtwarzaną na jednym urządzeniu, natychmiast zmieni się na inne. Jeśli chcesz, aby istniejące aplikacje działały na poprzednim urządzeniu, skomentuj ostatni wiersz (i wiersz 5, jeśli chcesz).
Andrzej
źródło
7

Cóż, możesz zainstalować pavucontrol, pokazuje aplikacje z wyborem urządzenia dźwiękowego na pierwszej karcie, pozwoli ci to zaoszczędzić trochę wysiłku. Myślę jednak, że naprawdę chcesz, aby oznaczyć Cię jako zestaw domyślny, a następnie za każdym razem, gdy go podłączysz, cały dźwięk zostanie przekierowany na niego, a gdy go podłączysz - powróci do głośników. Naprawdę bez wysiłku.

vava
źródło
2
Jak ustawić domyślne urządzenie w Ubuntu Precise?
blueyed
3

Pytanie jest dość stare, ale moja odpowiedź może być nadal przydatna dla użytkowników GNOME 2. Użyłem apletu miksera PulseAudio do dokładnie opisanego tutaj problemu. Możesz zmienić urządzenia wejściowe i wyjściowe bezpośrednio w menu panelu. To najwygodniejszy sposób, jaki znalazłem.

dAnjou
źródło
3

Oczywiście przełączanie urządzeń za pomocą apletu również działa dobrze. Ale fajną rzeczą w pisaniu scenariusza jest to, że jest super szybki. Mój przykładowo umieściłem na skrócie klawiaturowym alt + s. dlatego gdy chcę przełączyć się ze słuchawek na głośniki, wystarczy nacisnąć klawisze alt + s.

Tak czy siak. Andrew powiedział:

Jeśli masz więcej niż dwa urządzenia audio i chcesz zamienić je na inne, musisz wymienić logikę w linii 7 na niektóre warunki warunkowe.

To jest to co zrobiłem. Dzielę się nim, na wypadek, gdyby ktoś miał z tym problemy:

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

Zrobiłem inaczej: a) znajdź aktywny zlew w pętli for. I b) przejdź do następnego zlewu, zwiększając indeks o 1. Następnie moduluję wynik według liczby zlewów. To zapewnia, że ​​np. Przy 3 zlewach, (2 + 1)% 3 = 0. Tak więc z indeksu sink 2 zmienilibyśmy indeks zlewu 0.

W ten sposób przełącznik pozwala poruszać się w górę przez dostępne zlewy.

traumtaenzer
źródło
2

Dzięki za skrypty! Dodałem także część wejściową (mikrofon) na wypadek, gdyby ktoś chciał z niej skorzystać:

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)
Subbeh
źródło
2

Aby przewijać listę urządzeń dźwiękowych, użyj następującego skryptu:

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

Wszystkie podziękowania należą się tsvetan z forum Ubuntu .

guttermonk
źródło
1

Szukałem sposobu, aby to zrobić, aby przełączyć między głośnikami wewnętrznymi laptopa i stacją bazową Apple Airport, która jest podłączona do mojego stereo. Postanowiłem przypisać skróty do zmiany. Chciałem, aby okno preferencji audio wyskoczyło na sekundę, aby dać wizualne potwierdzenie przełączenia, i użyłem wmctrl, aby później zamknąć okno.

(Użyłem klawiszy Ctrl + F8 i Ctrl + F9 jako skrótów, ponieważ funkcja Fn tych klawiszy na moim laptopie polega na zwiększaniu i zmniejszaniu głośności, więc wydawało się oczywiste, że funkcje ctrl zmieniają wyjście audio.)

Użyłem następujących 2 (prawie identycznych) skryptów:

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

Pierwsze zmiany w stacji bazowej Apple (którą przypisałem do ctrl + F9), a druga przełącza się z powrotem na głośniki wewnętrzne (ctrl + F8). Zakłada się, że są to tylko 2 zainstalowane urządzenia wyjściowe.


źródło
1

Zbudowałem na podstawie skryptu Andrews, aby używał powiadomienia-osd do ogłaszania, co właśnie zrobił. Edytuj wiersze z nazwami według swoich potrzeb.

#!/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
Kveras
źródło