Audio profiliai - greitam audio nustatymų keitimui

Linux audio: individualizuotas sprendimas

Facebooktwitterpinterestlinkedintumblrmail

Su garso problemomis nuolat tenka susidurti savo prižiūrimuose Linux kompiuteriuose. Pirmą kartą čia apie tai rašiau dar 2010 metais Tai garso nėra, tai jis siunčiamas ne į tą įrenginį, į kurį norėčiau, tai nustatomas ne tas audio profilis… Šių problemų esmė – labai bendro pobūdžio, konkrečiai aparatinei įrangai nepritaikyti Linux garso posistemės Pulse Audio sprendimai. (Tiesa, ir prie Windows garso galima gerokai pavargti, tačiau šį kartą kalba ne apie Windows).

Linux, ir konkrečiau – mano naudojama darbastalio aplinka KDE, turi gerus audio tvarkymo įrankius, tačiau juose susigaudyti ne specialistui – ne taip paprasta. Štai, pvz., pasirinkite – kuris audio profilis jums reikalingas šiame paveikslėlyje?

Iš viso didžiulio sąrašo man tenka naudoti viso labo du profilius (dažniausiai – „Analoginė dvipusė stereo“, o prijungus išorinį televizorių – „Digital Stereo (HDMI) išvestis + Analoginė stereo įsvestis), tačiau tai teko išmokti ilgu bandymų ir klaidų keliu.

Taigi, nusprendžiau vieną kartą visiems laikams 🙂 sutvarkyti garso problemą savo prižiūrimuose kompiuteriuose – sprendimą pritaikant kiekvienam jų individualiai. Sprendimas turėjo būti paprastas: atsidarai programėlę kompiuteryje, pažymi, ką ketini daryti su kompiuteriu, kiek tai liečia audio posistemę, ir pritaikęs pakeitimus turi garsą ten, kur norėjai.

Pvz., mano nešiojamame kompiuteryje reikėjo sukurti keturis skirtingus audio profilius:

  1. Elementariam muzikos klausymui, pokalbiams per Skype ir kt. programas (naudojant laidines ausines arba kompiuterio mikrofoną ir garsiakalbius)
  2. Muzikos klausymui / filmo žiūrėjimui su Bluetooth ausinėmis
  3. Kalbėjimui per Viber, Skype, Zoom, Hangouts su Bluetooth ausinėmis
  4. Filmo žiūrėjimui, kai vaizdas ir garsas perduodamas kitam įrenginiui (pvz., televizoriui) per DisplayPort (arba HDMI) sąsają

Kiekvienu iš šių atvejų, paprastumo dėlei, visi nenaudojami įrenginiai turėjo būti išjungiami. Taigi, nenumatytiems atvejams reikėjo sukurti dar vieną, penktąjį, profilį, kurį pasirinkus būtų įjungiami visi prieinami įrenginiai.

Tam panaudojau Bash scenarijų kalbą, Pulse Audio komandų eilutės įrankį pacmd ir Plasma grafinės sąsajos KDE Dialogs įrankį.

Visų pirma reikėjo išsiaiškinti, kokius įrenginius turiu (arba galiu turėti) savo kompiuteryje. Į šį klausimą atsakymą gavau prijungęs savo bluetooth ausines, televizorių per HDMI kabelį, tada atsidaręs konsolę ir įvykdęs komandą pacmd list-cards, aiškumo dėlei iškart išvestyje ieškant įrenginio pavadinimo:

$ pacmd list-cards | grep  "name:"

Kitos dvi komandos:

$ pacmd list-sinks | grep  "name:"

ir

$ pacmd list-sources | grep  "name:"

padėjo išsiaiškinti atitinkamai garso plokščių galimas išvestis (kur garsas siunčimas) ir įvestis (iš kur, iš kokių mikrofonų kompiuteris gali gauti garsą).

Linux įrankis xrandr padeda aptikti prijungtą HMDI kabelį, įrankis hcitool – prijungtas Bluetooth ausines.

Taigi, išsiaiškinęs savo kompiuterio sistemos konfigūraciją, taip pat naudodamasis KDE Sistemos nustatymų audio moduliais nustatęs, kokia garso nustatymų konfigūracija veikia tais keturiais aukščiau nurodytais atvejais, sukurpiau žemiau nurodytą Bash scenarijų. Tada pasidariau nuorodą į tą scenarijų iš KDE sistemos meniu, ir štai, turiu lengvą ir greitą būdą pakeisti garso nustatymus (ar pataisyti neveikiančią konfigūraciją).

Deja, tai nėra sprendimas, kurį galėtumėte naudoti iškart. Jį reikės pritaikyti savo kompiuteriui, ir tai nėra visiškai trivialu, reikia šiek tiek raukti apie programavimą. Bet kaip ten bebūtų, dalinuosi, ir tikiuosi, kad kam nors bus naudinga.

Jei kas neaišku, rašykite klausimus komentaruose.

#!/bin/bash
 
## variables
## native audio card
acard="alsa_card.pci-0000_00_1b.0"
aprof_a="output:analog-stereo+input:analog-stereo"
aprof_d="output:hdmi-stereo+input:analog-stereo"
asink="alsa_output.pci-0000_00_1b.0.analog-stereo"
asource="alsa_input.pci-0000_00_1b.0.analog-stereo"
 
## my bluetooth headphones
mac="E0:9D:FA:0A:77:DB"
bcard="bluez_card.E0_9D_FA_0A_77_DB" #bluetooth headset card
bprof_m="a2dp_sink" # Music profile
bprof_h="headset_head_unit" # Headset profile
bsink_m="bluez_sink.E0_9D_FA_0A_77_DB.a2dp_sink"
bsink_h="bluez_sink.E0_9D_FA_0A_77_DB.headset_head_unit"
bsource="bluez_source.E0_9D_FA_0A_77_DB.headset_head_unit"
 
## default kdialog selection statuses
no1="off"
no2="off"
no3="off"
no4="off"
no5="off"
 
##count active profiles
count=`pacmd list-cards|grep "active profile" \
|grep -v "<off>" |awk -F"<" '{ print $2 }' \
| awk -F">" '{ print $1 }'|wc -l`
echo $count
 
if [ $count -gt 1 ]; then
   no5="on"
   #echo "test"
else
   ## find the one active profile
   active_profile=`pacmd list-cards \
   |grep "active profile" |grep -v "<off>" \
   |awk -F"<" '{ print $2 }' \
   | awk -F">" '{ print $1 }'`
 
   case $active_profile in
   "$aprof_a" )
      no1="on"
      ;;
   "$bprof_m" )
      no2="on"
      ;;
   "$bprof_h" )
      no3="on"
      ;;
   "$aprof_d" )
      no4="on"
      ;;
   *)
      kdialog --title "Nepavyko nuskaityti profilio" \
      --passivepopup "Netipinis profilis arba \
      scenarijaus klaida" 5
      ;;
   esac
fi
 
profile=`kdialog --title "Audio profiliai" --radiolist \
"Pasirinkite audio profilį:" \
1 "Įprastas (muzika/pokalbiai)" $no1 \
2 "Muzika (bluetooth)" $no2 \
3 "Pokalbiai (bluetooth)" $no3 \
4 "Filmas per teliką" $no4 \
5 "Visi galimi įrenginiai" $no5 512`
 
## nutraukiam scenarijų, jei vartotojas pasirinko „Atšaukti“
if [ $? != 0 ]; then
   exit
fi
 
case "$profile" in
1 )
   pacmd set-card-profile $acard $aprof_a
   pacmd set-card-profile $bcard off
   pacmd set-default-sink $asink
   pacmd set-default-source $asource
   ;;
2 )
   device=`hcitool con|grep $mac|wc -l`
   if [ $device -eq 1 ]; then
      pacmd set-card-profile $bcard $bprof_m
      pacmd set-card-profile $acard off
      pacmd set-default-sink $bsink_m
   else
      kdialog --error \
      "Jūsų ausinės neprijungtos. Visų pirma \njas prijunkite per Bluetooth."
   fi
   ;;
3 )
   device=`hcitool con|grep $mac|wc -l`
   if [ $device -eq 1 ]; then
      pacmd set-card-profile $bcard $bprof_h
      pacmd set-card-profile $acard off
      pacmd set-default-sink $bsink_h
      pacmd set-default-source $bsource
   else
      kdialog --error \
      "Jūsų ausinės neprijungtos. Visų pirma \njas prijunkite per Bluetooth."
   fi
   ;;
4 )
   hdmi=`xrandr|grep "HDMI-. connected"|wc -l`
   if [ $hdmi -lt 0 ]; then
      pacmd set-card-profile $acard $aprof_d
      pacmd set-card-profile $bcard off
      pacmd set-default-source $asource
   else
      kdialog --sorry \
      "Neatrodo, kad išorinis ekranas būtų \nprijungtas per HDMI. Prijunkite jį ir bandykite\n iš naujo."
   fi
   ;;
5 )
   pacmd set-card-profile $acard $aprof_a
   ## first check, if my bluetooth headset is connected
   device=`hcitool con|grep $mac|wc -l`
   if [ $device -eq 1 ]; then
   pacmd set-card-profile $bcard $bprof_m
   else
      kdialog --sorry \
      "Jūsų ausinės neprijungtos prie kompiuterio. \nTik įprastas profilis bus įjungtas."
   fi
   pacmd set-default-sink $asink
   pacmd set-default-source $asource
   ;;
## kiti variantai - kažkas ne taip...
*) 
   kdialog --error \
   "Tokio varianto nėra, \nprogramėlę reikia taisyti."
   ;;
esac
Facebooktwitterpinterestlinkedintumblrmail