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:
- Elementariam muzikos klausymui, pokalbiams per Skype ir kt. programas (naudojant laidines ausines arba kompiuterio mikrofoną ir garsiakalbius)
- Muzikos klausymui / filmo žiūrėjimui su Bluetooth ausinėmis
- Kalbėjimui per Viber, Skype, Zoom, Hangouts su Bluetooth ausinėmis
- 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
Parašykite komentarą