Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti

21.01 | 09:54 | Mirecove dristy | Miroslav Bendík

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



    • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 21.01 | 10:04
      Avatar Pavel Q4OS KDE  Administrátor

      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.

    • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 21.01 | 14:29
      Avatar Livan Manjaro s XFCE  Používateľ

      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.

      • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 21.01 | 21:49
        Avatar bluesundown   Používateľ

        uz len predstava, ze si clovek musi dokodit ovladanie hlasitosti aby vedel pouzivat notebook je perverzna.

      • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 29.01 | 12:57
        Avatar redhawk1975 Windows 11  Používateľ

        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.

        • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 30.01 | 09:12
          Avatar Miroslav Bendík Gentoo  Administrátor

          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.

          • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 30.01 | 11:05
            Avatar Pavel Q4OS KDE  Administrátor

            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.

            • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 30.01 | 11:42
              Avatar Miroslav Bendík Gentoo  Administrátor

              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.

            • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 30.01 | 11:53
              Avatar Miroslav Bendík Gentoo  Administrátor

              Mimochodom AwesomeWM je prostredie, ktoré beží defaultne na čítačkách Amazon Kindle.

          • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 30.01 | 11:35
            Avatar Livan Manjaro s XFCE  Používateľ
            Problém, ktorý mám s ostatnými prostrediami je, že síce vedia kadečo, ale ten základ robia zle.

            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.

            • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 30.01 | 11:48
              Avatar Miroslav Bendík Gentoo  Administrátor

              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ď.

    • RE: Prečo som napísal vlastný konzolový nástroj na ovládanie hlasitosti 29.01 | 12:55
      Avatar redhawk1975 Windows 11  Používateľ

      mno rozmyslam skusit awesomewm.

      Ale v poslednom case na starsich pc antix + iceWM. zacina mi coraz viac sediet.