Stranica: 1/1.

Automatsko prebacivanje zvučne karice sa USB slušalica

Postano: 19 tra 2008, 22:03
Postao/la Grof
(ubuntu 7.10)
Automatsko prebacivanje zvuka na USB slušalice i vraćanje na osnovne postavke prilikom uštekavanja/ištekavanja istih.

Napomena: Cijeli primjer pisan je i radi u Ubuntu 7.10 Linux distribuciji, za ostale distribucije trebat će neke preinake, ali ovo i tako pišem kao konceptualno rješenje

Za ovu zgodnu makinaciju u Linuxu potrebno je malo poznavati UDEV mehanizam kontrole uređaja.

UDEV je device manager koji između ostaloga i kontrolira hot-plugging koji nas u ovoj priči i interesira.

Dakle, ideja teče ovako:
Želimo izvršiti jednu skriptu prilikom ukopčavanja USB slušalica u naš PC, odnosno izvršiti drugu skriptu koja će se izvršiti prilikom iskopčavanja istih iz PC-ja.
Prvo moramo monitorirati kako sistem prepoznaje uređaj (pod kojim imenom)
Na terminalu otkucamo ovo:

Kod: Označi sve

udevmonitor --udev –environment > monitor.txt
Te nakon toga uštekamo USB slušalice u PC. Sada prekinemo program sa CTRL-C.
Otvorimo file monitor.txt i u njemu tražimo ovakav string: ID_MODEL.
Npr. dobili smo ovo: ID_MODEL=Logitech_USB_Headset
Sada, kada znamo pod kojim imenom sistem prepoznaje uređaj, možemo napisati udev pravilo (udev rule) što da se desi kada sistem prepozna ovaj uređaj.
Sve radimo kao root, naravno. odemo u direktorij:

Kod: Označi sve

/etc/udev/rules.d
Otvorimo prazan file u editoru i napišemo ovakvu skriptu:

Kod: Označi sve

ENV{ID_MODEL}=="Logitech_USB_Headset", GOTO="usb_headset_start"
GOTO="usb_headset_end"
LABEL="usb_headset_start"
ACTION=="add", RUN+="/usr/bin/sudo -u #1000 /usr/bin/asoundconf set-default-card Headset"
ACTION=="remove", RUN+="/usr/bin/sudo -u #1000 /usr/bin/asoundconf set-default-card CK804"
LABEL="usb_headset_end"
To snimimo kao file sa imenom 10-local.rules.

Na taj način sistem će sam izvršavati naredbe za prebacivanje defaultne audio kartice sa PCI na USB i obrnuto kako mi uštekamo/ištekamo slušalice.
No, ima tu jedna caka. Ako želimo pojačati ili smanjiti glasnoću, to će se i dalje dešavati za prvu karticu, bez obzira na uštekavanje-ištekavanje USB slušalica. Kako bi posao odradili kako treba pomoći će nam malo skriptiranja.
Kao prvo 10-local.rules file napišemo malo drugačije:

Kod: Označi sve

ENV{ID_MODEL}=="Logitech_USB_Headset", GOTO="usb_headset_start"
GOTO="usb_headset_end"
LABEL="usb_headset_start"
ACTION=="add", RUN+="/usr/bin/sudo -u #1000 ~/.gconf/usb-sound.sh"
ACTION=="remove", RUN+="/usr/bin/sudo -u #1000 ~/.gconf/pci-sound.sh"
LABEL="usb_headset_end"
Te, time zadajemo sustavu da izvršava naše skripte u trenutku uštekavanja/ištekavanja. U primjeru smo skripte nazvali usb-sound.sh (izvršava se kada se slušalice uštekaju) i pci-sound.sh (izvršava se kada se slušalice ištekaju).
Kako pišem primjer za GNOME DE, smjestili smo iste u direktorij ~/.gconf (hidden!)

usb-sound.sh skripta izgleda ovako:

Kod: Označi sve

#!/bin/bash
gconftool-2 --type string --set /desktop/gnome/sound/default_mixer_device "alsamixer:hw:2"
gconftool-2 --type list --list-type string --set /desktop/gnome/sound/default_mixer_tracks "[Speaker]"
gconftool-2 --type string --set /apps/gnome-volume-control/active-element "C-Media USB Audio Device    (Alsa mixer)"
amixer -c 2 sset Mic 50% unmute
amixer -c 2 sset Speaker 5% unmute
pci-sound.sh skripta izgleda ovako:

Kod: Označi sve

#!/bin/bash
gconftool-2 --type string --set /desktop/gnome/sound/default_mixer_device "alsamixer:hw:0"
gconftool-2 --type list --list-type string --set /desktop/gnome/sound/default_mixer_tracks "[Master]"
gconftool-2 --type string --set /apps/gnome-volume-control/active-element "SiS SI7012 (Alsa mixer)"
gconftool-2 naredbom preko CLI-ja možemo mijenjati parametre (on-line) u GNOME Gconf-u
U prvoj liniji mijenjamo aktivnu sound karticu (alsamixer:hw:2) pretstavlja USB slušalice.
U drugoj liniji prebacujemo defaultni mixer track na Speaker (kako bi kotačić za jačinu zvuka na slušalicama radio sa zvučnicima, a ne sa mikrofonom)
U trećoj liniji prebacujemo komande mixera u trayu sa PCI-kartice na USB slušalice.
Sa zadnje dvije komande (amixer) podešavamo mikrofon i speaker u slušalicama na 50& snage i isključimo mute.

Kako vidjeti koje točno opcije treba upisati u 1,2 i 3. liniju najjednostavnije ćemo vidjeti tako da otvorimo program
gconf-editor
i pozicioniramo se na /desktop/gnome/sound/, zatim odemo na Menu/System/Preferences/Sound i kada se otvori prozor "Sound Preferences" u pogledamo u listi Default Mixer Tracks – Device koja je kartica prva, a koja druga. prva ima oznaku hw:0, a druga hw:2 (to se odmah pokaže u prozoru gconf-editora dok mijenjate u Sound Preferences listi. Na isti način pogledate nazive za Trackove (2. linija u skripti).
Za 3. liniju treba u gconf-editoru otići na /apps/gnome-volume-control/active-element i od tamo prepisati string za aktivnu karticu. Taj string se automatski mijenja kako u prozoru od Volume control appleta promijenimo aktivnu karticu.

Postoji još jedan sitan problem, a taje da Linux prilikom boota nema pravila koji će modul postaviti kao prvi, akoji kao drugi, tako da se može desiti da, ako su slušalice uštekane u USB port prije bootanja Linuxa fobivaju oznaku hw:0, a pci karica hw:2, odnosno, ako nisu uštekane obrnuto.
Zbog tog problema skripte neće raditi ispravno. Rješenje je da se u fileu alsa-base koji se nalazi u /etc/modprobe.d forsira loadanje modula za PCI karticu prvu, postavljanjem indexa=0 na liniji opcija za modul, modula za USB karticu drugu (index=1). ime modula u primjeru (snd-intel8x0) je samo primjer. Trebate naći koji je modul od vaše PCI kartice.

Kod: Označi sve

options ime_modula_PCI index=0
options ime_modula_USB index=1
Ako linija ne postoji u lasa-base file-u, dodajte je sami.
Eto, ima toga, ali radi!
Sugestije i ostalo dobrodošle...:D