uinput_beeper, czyli jak zrobiłem sobie biperka w nowym laptopie

Podczas mojego pobytu w Reptach mój stary laptop umarł. Do zacinającej się klawiatury dołączyła wysiadająca grafika i w końcu zupełnie nie dało się z niego korzystać. No cóż, przeżył swoje. Tak więc w zeszłym tygodniu kupiłem sobie na allegro nowego, ślicznego i fajniusiego Della D620, a od poniedziałku już się nim bawię.

W laptopie właściwie wszystko działało od razu bez zarzutu. No, mały hack był potrzebny, żeby framebuffer działał w natywnej rozdzielczości. Niestety jeden feler wydał mi się poważniejszy: głośności pc-speakera nie da się kontrolować. Gdy nie załadowałem modułu pcspkr nie brzęczał w ogóle, gdy załadowałem – odzywał się na cały głos, co było nie do przyjęcia. Musiał zostać niezaładowany, ale bez biperka jest ciężko. Dla mnie konsola tekstowa to wciąż podstawowe narzędzie i mam tam np. odpalonego klienta Jabbera. I gdy przychodzi wiadomość, to klient pika… a mnie nie pikał. I było mi smutno. ;-)

Z wcześniejszego goolania wynikło, że to ograniczenie sterowników ALSA do tej wypasionej karty muzycznej HD, którą mam w laptopie i że właściwie powinienem się cieszyć, że mnie gra za głośno, albo wcale, bo innym tylko wcale.

Dzisiaj postanowiłem poszukać jakiejś alternatywy dla standardowego dźwięku, którego nie da się zciszyć. Uznałem, że powinno się dać podpiąć jakąś własną akcję w miejsce tego co robi moduł pcspkr. Okazało się, że mam rację. Jednak, o dziwo, wygodnego gotowca nie znalazłem. Znalazłem tylko dodatkowy moduł do kernela beeper, który współpracował z odpowiednimi demonami w userspace, ale z kompilacją dodatkowych modułów zawsze jest problem. A przecież dowiedziałem się też, że standardowy kernel ma już funkcjonalność potrzebną do obsługi bipania w userspace, bez potrzeby dodawania niestandardowych modułów. Można to zrobić przez interfejs uinput. Nawet znalazłem jakiś przykładowy kod.

Przykładowy kod okazał się być chyba pisanym z pamięci – brakowało includów itp. i się nawet nie kompilował. Do tego używał API esd, a to przecież bez sensu. Na szczęście przykładowy kod zawierał co najważniejsze i po przejrzeniu go i zerknięciu do źródeł kernela byłem w stanie napisać coś użytecznego.

Tak więc powstał uinput_beeper – prosty programik mojego autorstwa, który uruchamia zewnętrzny program za każdym razem, gdy terminal ma zabibczeć. Domyślnie jest to aplay beep.wav. I działa to świetnie, a przy okazji, z przygotowanym przeze mnie na szybko plikiem beep.wav, jest nawet zabawne (ale pewnie nie długo). :-) Kod oczywiście dostępny na GPL, może jeszcze komuś się przyda.

7 uwag do wpisu “uinput_beeper, czyli jak zrobiłem sobie biperka w nowym laptopie

  1. flegmatyk: Nie znalazłem, więc nie próbowałem. No i sądzę, że jednak moje obecne rozwiązanie jest dużo bardziej eleganckie. Nic dziwnego, w 2008 roku dostępne są mechanizmy, których w 2002 nie było.

    Polubienie

  2. flegmatyk: A co będzie robił Compiz na linuksowej konsoli tekstowej? Czy może po każdym bipnięciu będziesz się do Xów przełączał, żeby jakiś śliczny efekt wizualny zobaczyć? 😉
    Obsługa sygnałów dźwiękowych w środowisku graficznym, to zadanie dla tego środowiska i tamtejszego emulatora terminala, a nie dla kernela i jego wbudowanego terminala.

    Polubienie

  3. No jeśli ktoś siedzi w środowisku graficznym, a programy konsolowe ma otwarte na wirtualnych terminalach, no to takie małe plum czy coś w ten deseń bajerem jest 😉 Choć fakt, jeśli Ty w tekstowej siedzisz, to piknięcie styknie.

    Polubienie

Co o tym sądzisz?