Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti
Niekedy jednoduchá chyba vo zvukovom serveri vedie ľudí k divným činom. Napríklad napísanie vlastného nástroja pre ovládanie hlasitosti. Práve o tom bude dnešný blog.
Dlhodobo používam ľahké grafické prostredie awesomeWM. Vlastne ani neviem, či to nazvať prostredím, alebo skôr frameworkom na napísanie vlastného prostredia. V každom prípade awesome samo o sebe neobsahuje ovládanie hlasitosti.
Neznamená to, že by neexistoval spôsob, ako ovládať hlasitosť. Ako som už spomenul, awesomeWM
je skôr framework než hotové prostredie a preto nie je problém čokoľvek vlastné doprogramovať. Ako programovací jazyk autori zvolili Lua, čo je myslím celkom dobrá voľba v tomto prípade.
Doteraz som ovládal hlasitosť cez malý lua kód, ktorý spúšťal konzolové nástroje alsactl
pre zmenu hlasitosti a alsactl monitor
pre monitorovanie aktuálnej úrovne, aby prostredie reagovalo na zmenu hlasitosti externým nástrojom. Tento prístup fungoval so zvukovým systémom alsa. On dokonca fungoval aj po prechode na pulseaudio, pretože to si registruje vlastný alsa mixér a samotné aplikácie sa naďalej môžu tváriť, že komunikujú s alsou. Fungovalo to dokonca aj po prechode na zvukový server pipewire, ktorý tiež emuluje alsu. Fungovalo …
Prvé problémy začali po určitej aktualizácii, kedy sa spomalil štart pipewire čo viedlo k tomu, že alsactl monitor
začal monitorovať nesprávnu zvukovku. Zatiaľ som to riešil reštartom awesomeWM hneď po štarte, aby nabehol s monitoringom správnej zvukovky. Nepríjemné, ale nechcelo sa mi to opravovať. Ďalšou aktualizáciou sa objavil ďalší problém a totiž alsactl
dokázal nastaviť iba 3 úrovne hlasitosti. Úroveň 0 znamenal stíšený zvuk. Úroveň 1% pipewire zvukovky znamenal vyše 30% reálnej, 2% boli zhuba 70% reálnej a všetko od 3% vyššie znamenalo 100% hlasitosti. To už akceptovateľné nebolo.
Nie som človek, ktorý by donekonečna na niečo nadával, takže keď niečo nefunguje skôr si vyhrniem rukávy a idem to opraviť. Tak to bolo aj v tomto prípade.
Aké sú možnosti
Po aktualizácii zostalo ovládanie cez alsa nepoužiteľné. Ovládanie cez pulseaudio API a pipewire funguje super. Problém je, že ani v jednom prípade som nenašiel vhodný konzolový nástroj pre monitoring zmeny hlasitosti.
Rozhodol som sa preto napísať vlastné CLI vhodné pre zapracovanie do awesomeWM. Mojim cieľom bolo napísať nástroj dostatočne robustný na to, aby mu nevadilo, že naštartuje skôr než zvukový server. Nástroj, ktorý by vedel reagovať na pripojenie / odpojenie nových vstupov / výstupov. Nástroj, ktorý by v sebe kombinoval možnosť ovládania cez štandardný vstup a monitoring cez štandardný výstup. Tak sa zrodil pulsectrl.
Ovládanie
Nástroj pulsectrl
po spustení vypisuje na štandardný výstup správy o zmene hlasitosti a zmene predvoleného vstupu a výstupu. Príklad výstupu:
default sink alsa_output.pci-0000_07_00.6.HiFi__hw_Generic_1__sink volume sink *M 0.27586 alsa_output.pci-0000_07_00.6.HiFi__hw_Generic_1__sink default source alsa_input.pci-0000_07_00.6.HiFi__hw_acp__source volume source *M 1.00000 alsa_input.pci-0000_07_00.6.HiFi__hw_acp__source
Riadky default sink
a default source
znamenajú zmenu predvoleného zvukového výstup a vstupu.
Riadok volume (tabulátor) [sink|source] (tabulátor) príznaky (tabulátor) zariadenie
sa vypíše pri zmene hlasitosti. Všetky polia sú oddelené tabulátormi. Príznaky je pole o dĺžke 2 znakov, kde prvý je buď hviezdička pre predvolený vstup / výstup, alebo prázdny znak. Druhý príznak je 'M'
pre stíšený stav (mute). Hlasitosť je vypísaná ako desatinné číslo v rozsahu 0 - 1.
Okrem monitoringu nástroj umožňuje aj ovládať hlasitosť. Príkazy musia byť zadané presne a operandy sú oddelené vždy 1 medzerou. Holt ide o nástroj, ktorý má byť ovládaný programovo, takže si z neintuitívneho ovládania nerobím ťažkú hlavu. Podporované sú nasledujúce príkazy:
Príkaz | Hodnota | Popis |
---|---|---|
sink mute_toggle |
prepnutie stíšenia reporduktoru | |
sink mute_set |
stíšiť reproduktor | |
sink mute_clear |
zrušiť stíšenie reproduktor | |
sink set |
0 - 1 | nastavenie hlasitosti reporduktoru napr: sink set 0.5 - 50% hlasitosť |
sink change |
-1 - 1 | relatívna zmena hasitosti reproduktoru napr: sink change -0.1 - stíšenie o 10% |
source [príkaz] |
[hodnota] | ovládanie mikrofónu, príkazy sú totožné s reproduktorom |
Integrácia do awesomeWM
Paradoxne aj keď som svoj program navhol pre awesomeWM, nebolo to tak jednoduché integrovať ho. Nie je síce problém zavolať jednorázovú utilitku s parametrami, alebo čakať na to, kým niečo vypíše na stdout, ale skutočný problém je, že že awesomeWM okamžite zatvára stdin aplikácie spustenej cez with_line_callback. Teoreticky som to mohol riešiť iba v lue, ale asynchrónne spracovanie, ktoré má awesomeWM my vyhovuje viac, takže som si mierne upravil túto funkciu a hodil do vlastného rc.lua.
Aj otvorenie stdin je pomerne veľký hack - volume_monitor_ctl = io.open('/proc/' .. pid .. '/fd/0', 'w')
. Nechcel som používať ďalšiu dodatočnú knižnicu, ktorá by mi obalila číslo deskriptoru do file IO objektu, preto tento hack. Samotné ovládanie hlasitosti po počiatočných problémoch vyzerá pomerne jednoducho:
local function volume(mode) if volume_monitor_ctl == nil then return end if mode == "up" then volume_monitor_ctl:write('sink change 0.01\n') volume_monitor_ctl:flush() elseif mode == "down" then volume_monitor_ctl:write('sink change -0.01\n') volume_monitor_ctl:flush() elseif mode == "mute" then volume_monitor_ctl:write('sink mute_toggle\n') volume_monitor_ctl:flush() elseif mode == "micmute" then volume_monitor_ctl:write('source mute_toggle\n') volume_monitor_ctl:flush() end end local volumekeys = awful.util.table.join( awful.button({ }, 4, function () volume("up") end), awful.button({ }, 5, function () volume("down") end), awful.button({ }, 1, function () volume("mute") end) )
Ovládanie hlasitosti funguje opäť spoľahlivo a presne ako za čias keď som používal čistú alsu.
Prílohy
Pre pridávanie komentárov sa musíte prihlásiť.
Pekne si to vykoumal. Čo sa týka klávesových skratiek mne najviac vyhovuje kombinácia Alt+Q na zníženie hlasitosti, Alt+W na zvýšenie a stlmenie zvuku mám na Alt+E. Vysoko návyková vec hlavne pri počúvaní hudby cez slúchadlá, kde si niekedy mením hlasitosť podľa pesničky. Inak hľadal som soft aj pre Windows 11ku aby som to mal rovnako nastavené a odporúčam šikovný program 3RVX, funguje dobre.
Tak toto je presne dôvod, prečo nepoužívam Windows managery ale rovno DE. Nemám rád to DoDo. Rád všetko používam ihneď po nainštalovaní bez dodatočných dorábok. Nie je každý programátor.
uz len predstava, ze si clovek musi dokodit ovladanie hlasitosti aby vedel pouzivat notebook je perverzna.
jaj kedysi aj v DE (KDE / Gnome) to bolo bezne, alebo dorobenie nejaky veci.
Az neskor pri pouzivani Xubuntu (cca 2015) som prisiel na chut xfce a to mam vsade (Devuan, antix, MX) a je to pohodlne nainstalovat system a vsetko ide. popripade nemusiet si robit vlastne distro.
Ja som KDE používal ešte v dobe KDE 3, pretože sa tam dali nastaviť klávesové skratky. GNOME / XFCE / IceWM ... niektoré z klávesových skratiek na správu okien nepodporovali.
Od KDE som odišiel s príchodom KDE 4, pretože bolo zabugované a menej nastaviteľné.
Z dostupných prostredí som vyberal medzi xmonadom a awesome wm. Keďže sa viacej vyznám v lue, vybral som Awesome WM. Nabindovať tých pár klávesových skratiek, ktoré skutočne chcem je hračka, doprograamovať pár drobností tiež nie je zložité, takže som zostal už pri AwesomeWM, pretože mi sprístupňuje neobmedzenú flexibilitu s jednoduchosťou doprogramovania nových vecí.
Len tak mimochodom Awesome nepoužívam ako tiling wm, ale ako štandardný floatin wm. Tak 90% času mám aplikácie vo fullscreene a využívam rýchlu možnosť prepínať medzi aplikáciami (skupinami aplikácií) klávesovými skratkami a skratkami skratiek. Jednoducho mám tak malý 3-úrovňový systém skratiek, s ktorým dokážem extrémne rýchlo a spoľahlivo prepínať medzi tým, čo potrebujem a to je to, čo od WM vyžadujem v prvom rade. Okrem toho ešte požadujem efektívne spúšťanie aplikácií (skratka pre run, dopĺňanie príkazov) a managovanie okien. Všetko nad tento rámec je príjemným bonusom. Problém, ktorý mám s ostatnými prostrediami je, že síce vedia kadečo, ale ten základ robia zle.
Nechcel by si o tomto desktope urobiť nejakú obrázkovú recenziu keď budeš mať čas? Veľa ľudí včetne mňa ho nepoznáme a rád by som si pozrel ako sa používa v praxi :-) Plus nejaké tipy aj na spomínané skratky by neboli na škodu.
Ono je to ale len framework. Sám o sebe nevie prakticky nič a celý vzhľad a správanie si užívateľ vybuduje vlastným kódom. Ak by som niečo písal tak by som písal o mojich klávesových skratkách a mojom vzhľade, čo ale s prostredím nemá nič spoločné.
Nie sú tú prakticky žiadne hranice a dá sa všetko od úplných šialeností cez pekný minimalizmus až po plnohodnotné desktopové prostredie.
Pekná zbierka screenshotov je napríklad tu.
Mimochodom AwesomeWM je prostredie, ktoré beží defaultne na čítačkách Amazon Kindle.
Mohol by si presnejšie špecifikovať, čo presne tie DE robia zle a naopak WM dobre? Mne sa zdá, že všetko, čo majú robiť robia dobre ale možno sa mýlim.
Prepínanie histórie desktopov (u okien to vie každé prostredie, desktoppy nie), vertikálne titlebary (u niektorých okien sa hodia) keďže tie horizontálne zaberajú na širokouhlých displayoch už aj tak vzácny priestor, možnosť modifikovať masku okna za jazdy, možnosť filtrovať okná a za jazdy im upravovač filtre tak, aby som omylom nemohol aktivovať okno, ktoré nechcem aktivovať atď.
mno rozmyslam skusit awesomewm.
Ale v poslednom case na starsich pc antix + iceWM. zacina mi coraz viac sediet.