2008 11 Radio w GNOME [Programowanie]


Programowanie
Programowanie/GNOME
Radio w GNOME
Marek Sawerwain
Jądro systemu Linux już od dawna oferuje wsparcie dla multimediów, począwszy od kart graficznych,
poprzez muzyczne, a także różnego rodzaju tunery telewizyjne i radiowe. Innym problemem jest
wsparcie producentów, przede wszystkim poprzez dostarczanie sterowników bądz dokumentacji do
swoich kart, szczególnie tunerów FM/TV  z tym niestety bywa różnie.
ednak gdy karta jest obsługiwana, można zapytać, cujemy go jak zazwyczaj za pomocą języka C, ale przy uży-
czy trudnym zadaniem jest opracowanie nieskom- ciu nowego języka programowania, jakim jest VALA. Jest to
plikowanego programu do obsługi np. tunera radio- dość młody projekt, ale rozwija się dość dynamicznie.
Jwego. Jak to często bywa, nie jest to trudne zadanie, Język VALA jest podobny do języka C#, ale w prze-
ponieważ podstawowy zestaw do obsługi tunera to zaledwie ciwieństwie do niego jest to język kompilowany, choć nie
kilka funkcji. wprost do assemblera, lecz do języka C. Mimo tego dodatko-
wego etapu programy napisane w języku VALA niemal za-
Krok pierwszy  planowanie wsze są bardziej wydajne od C#.
Program, który opracujemy nie jest zbyt wielki, ale mi- Zastosowanie języka VALA zamiast C spowoduje, że
mo to warto zastanowić się, jakie problemy możemy na- kod zródłowy naszego programu niewątpliwie będzie bar-
potkać, dlatego wykonanie schematu naszego programu dziej obiektowy niż siermiężne C, które nie oferuje przecież
z pewnością się przyda. Pierwszy problem to naturalnie zbyt dużej czytelności w przypadku programowania obiek-
obsługa tunera, gdzie podstawową funkcją jest zmiana towego.
częstotliwości, na której słuchamy określonej stacji. Nasz Użycie innego języka w miejsce C naturalnie nie zwala-
program będzie obsługiwał częstotliwość w zakresie od 87 nia nas z obowiązku utworzenia interfejsu graficznego. Inter-
do 108 Mhz. fejs ten utworzymy w programie GLADE. Może to być wer-
Uzupełnieniem tej niewątpliwie podstawowej własności sja zarówno 2.X bądz nowsza 3.x, gdyż będziemy interfejs
jest badanie siły sygnału oraz sprawdzenie, czy odbierany sy- wczytywać dynamicznie. VALA zapewnia łatwy dostęp do
gnał jest stereofoniczny. Dokładniejsze informacje związane funkcji obsługujących pliki w formacie glade.
z obsługą tunera przedstawimy już w następnym punkcie. Zestawianie wszystkich najważniejszych zdarzeń poka-
Nasz program ma być też wygodny w użyciu, więc zo- zuje schemat na Rysunku 1. Pierwsza czynność w naszym
stanie napisany dla środowiska GNOME. Jednakże nie opra- programie to budowa interfejsu użytkownika, kolejny krok
44 listopad 2008
linux@software.com.pl
Programowanie
Programowanie/GNOME
to uzyskanie dostępu do tunera. Po tym eta- diowym. Druga część kodu zródłowego to wła- diowy nie oferuje dużej liczby funkcji oraz roz-
pie wchodzimy w pętlę, w której reagujemy ściwy kod aplikacji napisany w języku VALA wiązania zastosowane w API dodatkowo uła-
na czynności podejmowane przez użytkowni-  jest to plik o nazwie minituner.vala. twiają sterowanie tego typu urządzeniem.
ka, do których należą m. in. kliknięcie na przy- Wprowadzimy też dwie klasy. Pierwsza Wszystkie podstawowe funkcje do obsłu-
cisk kończący pracę naszej aplikacji albo zmia- z nich, RadioTuner, zgodnie ze swoją nazwą gi tunera zostały zgromadzone w plikach tu-
na częstotliwości. Ważną akcją jest też samo- będzie odpowiedzialna za dostęp do tunera ra- nerfm.c oraz tunerfm.h. Należy też dołączyć
dzielnie szukanie następnej bądz poprzedniej diowego poprzez funkcje opracowane w języ- odpowiednie pliki nagłówkowe = najważniej-
stacji. Program zawiera także funkcję skano- ku C. Druga klasa, MiniTunerWindow, repre- sze są dwa pliki. Pierwszy z nich
wania całego dostępnego pasma po kliknięciu zentuje nasz program. W tej klasie znajduje się
na przycisk Szukaj (ang. Find). statyczna oraz publiczna metoda main, to od tej #include
Program, który napiszemy nie jest duży, metody rozpoczyna się wykonywanie naszego
ale kod zródłowy zostanie podzielony na dwie programu. zawiera definicje potrzebnych struktur do ob-
części. Pierwszą część stanowią pliki tunerfm.c sługi tunera nie tylko radiowego, ale też tu-
oraz tunerfm.h zawierające funkcje do obsługi Funkcje do obsługi tunera nerów telewizyjnych. Można także dołączyć
tunera. Zostały ono celowo opracowane w ję- Tworzenie funkcji, czy też całego API do obsłu- drugi plik do obsługi karty dzwiękowej
zyku C, ponieważ z poziomu tego języka ła- gi sprzętu w większości przypadków nie jest ła-
twiej korzystać np. z funkcji ioctl oraz plików twym zadaniem. Jednakże w przypadku Linuksa #include
nagłówkowych jądra systemu, do których do- sterowanie np. tunerem radiowym jest względ-
stęp jest niezbędny, aby sterować tunerem ra- nie łatwe do zrealizowania. Ostatecznie tuner ra- co pozwoli na np. sterowanie głośnością.
Pierwsza funkcja, którą trzeba opisać to
FMTuner_Init, przedstawiona na Listingu 1.
Uzyskanie dostępu do urządzenia realizuje-
START
my za pomocą funkcji open. Różnego rodza-
ju karty są reprezentowane przez pliki w ka-
talogu /dev. Domyślna nazwa tunera radiowe-
budowa interfejsu
go to /dev/radio0. Po udanym dostępie do
użytkownika
tego pliku uzyskujemy uchwyt (ang. handle)
reprezentujący urządzenie. Zastosowanie funk-
cji close powoduje naturalnie zamknięcie do-
uzyskanie
dostępu do tunera
stępu do pliku oraz w naszym przypadku  do
urządzenia.
Użycie funkcji open na pliku /dev/radio0
obsługa interfejsu
lub innym podanym przez użytkownika zała-
graficznego
twia sprawę, jednakże trzeba uzyskać jeszcze
jedną istotną informację. Jest to współczyn-
nik, przez jaki należy podzielić lub pomnożyć
funkcje do obsługi
zmiana częstotliwości
częstotliwość, aby uzyskać poprawną wartość.
tunera radiowego
Do komunikacji z tunerem stosujemy funkcję
ioctl, potrzebne informacje odczytamy wysy-
łając komunikat VIDIOCGTUNER. W ostat-
następna, poprzednia
stacja
nim argumencie umieszczamy adres struktu-
ry, w której zostaną umieszczone wszystkie
informacje:
TAK
Pełne skanowanie przeszukiwanie
pasma? pisma
ioctl (fd, VIDIOCGTUNER, &tuner_fm)
NIE
Odczytanie informacji sprowadza się do spraw-
NIE
dzenia, czy jeden z bitów (reprezentowany przez
Koniec pracy
programu? definicję VIDEO_TUNER_LOW) w polu o nazwie
TAK
zamknięcie
dostępu do tunera
STOP
Rysunek 1. Schemat programu do obsługi tunera radiowego Rysunek 2. Interfejs naszej aplikacji
www.lpmagazine.org 45
Programowanie
Programowanie/GNOME
flag jest odpowiednio ustawiony, przy czym jeśli w przypadku tunera zapisana jako typ int, tym- Ustalenie nowej częstotliwości wykonamy za
ioctl zwróci wartość mniejszą niż zero, to za- czasem argument funkcji FMTuner_SetFreq to pomocą funkcji ioctl oraz stałej VIDIOCSFREQ
kłada się, że podzielnik jest równy 16. liczba zmiennoprzecinkowa. Odpowiedni wzór  przedstawia się to następująco:
Zamknięcie dostępu do tunera to zadanie z wykorzystaniem wcześniej odczytanego po-
dla funkcji FMTuner_Stop. Jednak w przeci- dzielnika częstotliwości zapiszemy w odpo- ioctl(fd, VIDIOCSFREQ, &int_freq);
wieństwie do funkcji FMTuner_Init jest ona wiedni sposób:
bardzo krótka, gdyż są to zaledwie dwie linie. Ważnym aspektem są potencjalne błędy. Li-
int_freq = (frequency+1.0 / sting 2. zawiera pełną implementację funkcji
if (fd >= 0) close(fd); 32)*frequency_fact; do zmiany częstotliwości. Przed zmianą często-
return 0;
Właściwe zamknięcie wykonuje funkcja clo-
Kilka informacji o języku VALA
se, zamykająca dostęp do pliku urządzenia.
Język VALA to jeden z najmłodszych projektów związanych
Plik tunerfm.c zawiera jeszcze kilka innych
ze środowiskiem GNOME. Jest on bardzo podobny do języka C# i powstał głównie po to,
funkcji, jak np. FMTuner_IsStereo sprawdza-
aby zaoferować programistom GNOME nowoczesny i obiektowy język programowania.
jącą, czy odbierany sygnał jest stereofoniczny.
Dlatego też język VALA jest bardzo ściśle zintegrowany z biblioteką GLib, która stanowi
Realizacja takiej funkcji nie jest trud-
podstawę modelu obiektowego GNOME.
nym zadaniem. W pierwszej kolejności two-
Język oferuje nowoczesne konstrukcje językowe dostępne również w Javie czy C#
rzy strukturę, w której zostaną umieszczone da-
oraz C++, czyli interfejsy, własności, sygnały, wyrażenia lambda, a nawet typy uogólnione
ne o tunerze, a do pola mode wpisujemy war-
(odpowiednik template z języka C++). Autorom zależało też na wysokiej wydajności, two-
tość -1, która oznacza, że sygnał nie jest ste-
rzenie programów w C# z pewnością jest łatwiejsze niż np. w C, ale ostatecznie uzyskany
reofoniczny:
program, ze względu na obecność maszyny wirtualnej traci sporo na wydajności. Dlatego
autorzy postanowili, że programy w języku VALA będą tłumaczone na kod w języku C. Mi-
struct video_audio va;
mo tego dodatkowego etapu podczas kompilacji, VALA oferuje wysoką wydajność, wyższą
va.mode=-1;
niż programy pisane w C#.
Aktualnie dostępna wersja pakietu (w chwili pisania artykułu) to 0.3.5, ale ten niski nu-
Odczytanie danych wykonamy za pomocą
mer jest nieco mylący  w rzeczywistości możemy już całkiem swobodne pisać normalne
funkcji ioctl:
oprogramowanie przy zastosowaniu tego języka. Pierwsza wersja stabilna powinna uka-
zać się w niedalekiej przyszłości, co z pewnością przyniesie z sobą większą popularność
ioctl(fd, VIDIOCGAUDIO, &va);
tego języka programowania.
Ostatecznie sprawdzenie, czy odbierana sta-
cja nadaje sygnał stereofoniczny, sprowa- Listing 1. Uzyskanie dostępu do tunera radiowego
dzić można do następującej instrukcji wa- int FMTuner_Init(char *dev) {
runkowej: int fd;
struct video_tuner tuner_fm;
if (va.mode == VIDEO_SOUND_STEREO) {
} else { } if(dev != NULL) {
if ((fd = open(dev, O_RDONLY)) < 0)
Ustalanie częstotliwości oraz siła sygnału return -1;
Zmiana częstotliwości jest dla naszego progra- }
mu bardzo ważna. Chcemy aby użytkownik else {
w programie samodzielnie przeszukiwał pa- if ((fd = open(&default_device[0], O_RDONLY)) < 0)
smo. Istotna jest również funkcja sprawdzają- return -1;
ca siłę sygnału. Zastosowanie prostej pętli oraz }
sprawdzanie siły sygnału daje nam możliwość
automatycznego przeszukiwania całego pasma. tuner_fm.tuner = 0;
Tym problemem zajmiemy się jednak w dal- if ( ioctl (fd, VIDIOCGTUNER, &tuner_fm) < 0 )
szej części artykułu. Nagłówki funkcji są na- frequency_fact = 16;
stępujące: else {
if ( (tuner_fm.flags & VIDEO_TUNER_LOW) == 0)
int FMTuner_SetFreq(int fd, float frequency_fact = 16;
frequency); else
int FMTuner_GetSignal(int fd); frequency_fact = 16000;
}
Ważna uwaga dotyczy argumentu frequency.
Będziemy podawać wartość częstotliwości w return fd;
megahercach, ale podaną wartość należy od- }
powiednio zmienić. Wartość częstotliwości jest
46 listopad 2008
Programowanie
Programowanie/GNOME
tliwości upewniamy się, czy wartość uchwytu Gdy użytkownik naszego programu bę- sób odczytania siły sygnału jest podobne do re-
hd jest większa niż zero, sprawdzana jest także dzie zmieniał częstotliwość, to jakość sygna- alizacji np. funkcji sprawdzającej, czy sygnał
wartość argumentu frequency  czy znajduje łu niewątpliwie będzie oceniał na ucho, ale jest nadawany w STEREO. Rozpoczniemy od
się w zakresie od 65 do 108 MHZ. Przy czym w trakcie automatycznego wyszukiwania stacji utworzenia struktury z informacjami o aktual-
nasz program oferuje dostęp do częstotliwości należy korzystać z możliwości sprzętu, który nym stanie tunera (za pomocą funkcji memset
w zakresie od 87.5 do 108 Mhz. samodzielnie potrafi ocenić siłę sygnału. Spo- wypełniamy całą strukturę zerami):
struct video_tuner vt;
Listing 2. Ustalenie częstotliwości dla tunera radiowego
memset(&vt, 0, sizeof(vt));
int FMTuner_SetFreq(int fd, float frequency) {
int int_freq, out_v; Odczytanie informacje realizujemy identycznie
jak w poprzednich przypadkach, choć potrzeb-
if (fd<0) return -1; ne informacje uzyskamy używając definicji VI-
if ((frequency > 108) || (frequency < 65)) DIOCGTUNER.
return -2;
ioctl (fd, VIDIOCGTUNER, &vt);
int_freq = (frequency+1.0 / 32)*frequency_fact;
out_v=ioctl(fd, VIDIOCSFREQ, &int_freq); Siła sygnału jest zapisana w polu signal struk-
tury vt. Jest to wartość szesnastobitowa. Brak
return out_v; sygnału to zero, silny sygnał to np.: 32768, sy-
} gnał o pełnej sile to 655536. Dlatego lepiej
byłoby wykorzystać np. wartości procentowe.
Listing 3. Fragmenty konstruktora odpowiedzialnego za utworzenie interfejsu Konwersja na taki typ opisu siły sygnały wy-
construct { maga tylko wykonania odpowiedniego dziele-
this.xml = new Glade.XML ("gr_mainwin.glade", null, null); nia i mnożenia przez 100:
MainWin = (Gtk.Window)this.xml.get_widget("MainWin"); (vt.signal/65536.0f)*100;
MainWin.destroy += Gtk.main_quit;
Klasa tunera w języku VALA
ConfigWin = (Gtk.Window)this.xml.get_widget("ConfigWin"); Funkcje obsługujące tuner przedstawione
ConfigWin.hide(); w poprzednim akapicie można w sposób bez-
pośredni zastosować na poziomie języka VA-
var btn1 = (Gtk.Button)this.xml.get_widget("CloseWinBTN"); LA. Wprowadzimy klasę RadioTuner, która
btn1.clicked += on_CloseWinBTN_clicked; będzie oferować kilka metod do obsługi tune-
... ra. Metody te naturalnie będą korzystać z funk-
cji napisanych w języku C znajdujących się
var RadioStationList = (Gtk.ComboBoxEntry)this.xml.get_widget("RadioSta w pliku tunerfm.c. Należy tylko odpowiednio je
tionList"); zadeklarować, np. funkcja z Listingu 1 na po-
list_stations_model = new Gtk.ListStore(2, typeof(string), ziom języka VALA jest wprowadzana w nastę-
typeof(string) ); pujący sposób:
RadioStationList.set_model(list_stations_model);
RadioStationList.set_text_column(0); [CCode (cname="FMTuner_Init")]
private static int FMTuner_Init(string
var RadioStationsView = (Gtk.TreeView)this.xml.get_widget("RadioStation dev);
sView");
RadioStationsView.set_model(list_stations_model); Typ string jest odpowiednikiem typu char*,
RadioStationsView.insert_column_with_attributes (-1, "Station Name", wprowadzenie funkcji FM_Tuner_SetFreq jest
new Gtk.CellRendererText(), "text", 0, null); bardzo podobne:
...
[CCode (cname="FMTuner_SetFreq")]
tuner_ctr = new RadioTuner(); private static int FMTuner_SetFreq(int
tuner_ctr.RadioTunerUp(); fd, float frequency);
TuneScale.set_range(tuner_ctr.begin_mhz, tuner_ctr.end_mhz); Sekcja CCode jest potrzebna, aby podać orygi-
TuneScale.set_digits(2); nalną nazwę funkcji, VALA będzie samodziel-
TuneScale.set_increments (0.05, 0.1); nie tłumaczyć nazwy. W ten sposób możemy
mute = 0; opracować API o bardziej obiektowym charak-
} terze, bez względu na oryginalne nazwy funk-
cji. Wszystkie wprowadzane funkcje zostały
www.lpmagazine.org 47
Programowanie
Programowanie/GNOME
zadeklarowane jako statyczne oraz prywatne, kowe czynności związane z interfejsem użyt- modelu wymaga zastosowania słowa kluczo-
więc nie będą one dostępne dla użytkownika kownika zostały zgromadzone w konstruktorze wego typeof informujące o zastosowanym
klasy. Dlatego wprowadzimy metody, za po- głównej klasy aplikacji (fragmenty kodu przed- typie. Sama nazwa typu to niestety za mało,
mocą których użytkownik sterował tunerem. stawia Listing 3). aby utworzenie modelu danych przebiegło po-
Ustalenie częstotliwości to zadanie dla meto- Jakiekolwiek czynności musi poprzedzić prawnie.
dy SetFrequency: proces wczytania pliku glade, z opisem inter-
fejsu: list_stations_model = new
public void SetFrequency(float freq) { Gtk.ListStore(2, typeof(string),
FMTuner_SetFreq(handle, freq); this.xml = new Glade.XML ("gr_ typeof(string) );
curr_mhz = freq; mainwin.glade", null, null);
} Tworzymy tylko dwa pola, w pierwszym znaj-
Następnie możemy odczytać odniesienia do dzie się nazwa stacji, natomiast w drugim czę-
Implementacja pozostałych metod jest rów- poszczególnych widgetów, np: dostęp do kon- stotliwość, na której dana stacja nadaje. Doda-
nie krótka. Ważny jest również konstruktor trolki okna głównego uzyskamy w następują- wanie nowej kolumny do kontrolki ze spisem
klasy RadioTuner. W konstruktorze ustalamy cy sposób: stacji przedstawia się następująco:
przede wszystkim wartości początkowe kil-
ku zmiennych. Jest to uchwyt do urządzenia MainWin = (Gtk.Window)this.xml.get_ RadioStationsView.insert_column_with_
(zmienna handle, wartość początkowa równa widget("MainWin"); attributes (-1, "Station Name",
jest -1), ścieżka dostępowa do tunera (zmien- new Gtk.CellRendererText(),
na device_name), jej domyślna wartość to Bardzo wygodnie, względem oryginalnego API "text", 0, null);
/dev/radio0. Natomiast, zakres pasma dla na- GTK+, przedstawia się proces podłączania ob-
szego odbiornika radiowego, oraz krok z jakim sługi sygnałów, np.: jeśli do zdarzenia destroy Typ nowej kolumny tworzymy za pomocą sło-
będziemy przeszukiwać pasmo, jest ustalany za dotyczącego okna chcemy podłączyć metodę wa kluczowego new, gdzie argumentem jest
pomocą trzech poniższych linii kodu: main_quit zamykającą całą aplikację, wystar- potrzebny nam typ, dla uproszczenia przyjmie-
czy napisać następujące wyrażenie: my, że będzie to Gtk.CellRendererText().
begin_mhz = 87.5f; Pozostały kod jaki jest widoczny na Li-
inc_mhz = 0.20f; MainWin.destroy += Gtk.main_quit; stingu 3 dotyczy tunera radiowego. Tworzymy
end_mhz = 108.0f; obiekt tunera tuner_ctr, a następnie za po-
Podobnie postępujemy w przypadku podłą- mocą metody RadioTunerUp, niejako włącza-
Budowa interfejsu czania obsługi sygnału clicked dla przycisków. my tuner. Ostatnie linie kodu są odpowiedzial-
Po opisie problemów zawiązanych z tunerem Nieco inaczej przedstawia się tworzenie mode- ne za ustalenie parametrów kontrolki TuneSca-
radiowym, trzeba zająć się interfejsem. Jedną lu danych dla listy. Model ten, wykorzystuje- le, wbrew pozorom jest to dość istotny etap,
z zalet języka VALA jest fakt, iż odwzorowu- my do zbierania informacji o wykrytych stacji ponieważ za pomocą tej kontrolki użytkownik,
je on wszystkie typowe zachowania biblioteki w czasie skanowania. Sam proces tworzenie będzie ustalał częstotliwość pracy tunera.
GTK+ i GNOME. Dlatego, tworzenie interfej-
su jest typowe dla GTK+, i co ważne uwypu-
kla obiektowy charakter nowego języka oraz Kompilacja programu
bibliotek GTK+ i GNOME. Wszystkie począt-
Kompilacja naszej aplikacji przebiega w dwóch etapach. Pierwszy krok, to kompilacja pliku
z funkcjami do obsługi tunera radiowego:
gcc -c tunerfm.c
Rezultatem jest plik obiektowy tunerfm.o, plik ten należy podać jako argument podczas
kompilacji programu w języku VALA. Całe polecenie przedstawia się następująco:
valac --pkg pango --pkg gtk+-2.0 --pkg libglade-2.0 --pkg gmodule-2.0 -o
minituner minituner.vala -X "tunerfm.o"
Za pomocą opcji --pkg określa się jakie pakiety będą stosowane w programie. Używa-
Rysunek 3. Projektowanie interfejsu w programie my standardowego zestawu dla programów pisanych w GTK+ i GLADE. Dołączenie pliku
GLADE obiektowego z funkcjami obsługi tunera zapewnia opcja -X.
Etapy pośrednie, jak np.: tłumaczenie do języka C, a następnie kompilacja takiego pliku
są nadzorowane przez polecenie valac. Naturalnie możliwe jest otrzymanie pliku w języku
C, aby dalej samodzielnie poddać go kompilacji, wydajemy wtedy następujące polecenie:
valac --pkg pango --pkg gtk+-2.0 --pkg libglade-2.0 --pkg gmodule-2.0 -C
minituner.vala
Ogromną zaletą języka VALA jest fakt, iż programy pisane w tym języku nie wymagają do-
datkowych specjalnych bibliotek związanych z tym językiem. Powstały program, jeśli moż-
na tak powiedzieć, z punktu widzenia binarnego jest aplikacją opracowaną w języku C.
Rysunek 4. Główna strona poświęcona językowi VALA
48 listopad 2008
Programowanie
Programowanie/GNOME
Suwak wyboru częstotliwości tywujemy bądz dezaktywujemy etykiety infor- na utknie na stacji, którą aktualnie słuchamy.
Zmiana częstotliwość, to chyba najważniej- mujące o typie nadawanego sygnału. Ostatnia W treści pętli for, pierwsza czynność, to wpro-
sza funkcja w każdym radiu, w naszym pro- linia kodu (MainWin.queue_draw()) jest dość wadzenie opóznienia:
gramie do tego celu służy widget TuneScale. ważna, ponieważ wymusza odrysowanie okna,
W pierwszym etapie tworzenia interfejsu, do co jest istotne, aby zmiany w kontrolkach zo- Thread.usleep( 100000 );
sygnału value_changed (zmiana wartości) stały szybko wprowadzone.
została podłączona funkcja o nazwie on_Tu- Jest to ważne, gdyż elektronika tunera radio-
neScale_value_changed. Jej treść jest dość Następna stacja radiowa wego, potrzebuje nieco czasu aby ustabilizo-
krótka, bowiem należy odczytać bieżącą war- W naszym programie, po naciśnięciu przyci- wać swoją pracę. Następnie możemy zmienić
tość częstotliwości: sku o nazwie NextStationBTN, program sa- częstotliwość, ustawiając także wartość widge-
modzielnie skanuje pasmo szukając następnej tu TunerScale:
mhz = (float)TuneScale.get_value(); stacji radiowej. Skanowanie następuje poprzez
zwiększanie częstotliwości. W podobny spo- TuneScale.set_value( freq );
a następie korzystając z metody radio_tune sób, choć poprzez sukcesywne zmniejszanie radio_tune( freq );
ustalić nową częstotliwość pracy: wartości częstotliwości, następuje skanowanie,
po wciśnięciu klawisza PrevStationBTN. Wprowadzamy, też dodatkową pętlę o następu-
radio_tune(mhz); Do realizacji tej funkcji wystarczy prosta jącej postaci:
pętla i sprawdzanie siły sygnału. Na początek
Metoda radio_tune jest dość krótka, jej peł- odczytujemy aktualną wartość częstotliwości, while( Gtk.main_iteration() );
ny kod zródłowy przedstawia Listing 4. Nowa a następnie wchodzimy w pętlę for:
częstotliwość pracy jest przekazywana w para- Zadaniem tej pętli jest obsłużenie zdarzeń wyge-
metrze mhz, wartość ta jest przekazana dalej do freq = (float)TuneScale.get_ nerowanych przez GTK+, np.: odświeżenie wid-
tunera za pomocą obiektu tuner_ctr i me- value()+0.25f; getu TuneScale. Co spowoduje, iż będziemy
tody SetFrequency. Następnie trzeba uaktu- widzieć jak postępuje szukanie nowej stacji.
alnić etykietę w której wyświetlamy aktualną for( ; freq<=tuner_ctr.end_mhz; Ostatni etap to sprawdzenie, czy odbierany
wartość częstotliwości. Kolejna instrukcja wa- freq+=tuner_ctr.inc_mhz) { ... } sygnał jest dostatecznie silny, co wykonujemy
runkowa sprawdza, czy odbierany sygnał jest w następujący sposób:
stereofoniczny. W zależności od zwróconej Aktualna częstotliwość jest celowo zwiększa
wartości metody IsStereo odpowiednio ak- o 0.25 Mhz, inaczej procedura przeszukiwa- if( tuner_ctr.SignalStrength() >=
50.0f ) break;
W Sieci
W przypadku gdy siła sygnału jest większa
niż 50%, to instrukcja break przerwie działa-
" Podstawowa strona dotycząca środowiska GNOME  http://www.gnome.org
nie pętli.
" Strona dotycząca języka VALA  http://live.gnome.org/Vala/Release
" Testy wydajności języka VALA w porównaniu do platformy MONO i języków C oraz
Podsumowanie
C++  http://code.google.com/p/vala-benchmarks/
Opracowany przez nasz program oferuje tylko
" Informacje o tunerach radiowych i telewizyjnych obsługiwanych przez jądro Linuksa
podstawowe funkcje. Nie ma np.: sterowania
 http://linuxtv.org/v4lwiki/index.php/Main_Page
głośnością, chociaż w oknie naszego progra-
mu znajduje się odpowiednia kontrolka. Z jed-
Listing 4. Funkcja ustalającą częstotliwość pracy tunera ną z ciekawszych funkcji byłaby możliwość
nagrywania aktualnie słuchanego programu.
private void radio_tune(float mhz) { Do samego interfejsu można wprowadzić cie-
kawsze rozwiązania graficzne. Również okno
tuner_ctr.SetFrequency(mhz); z konfiguracją jak na razie to tylko ozdoba.
FreqLBL.set_markup(""+mhz.to_string("%2.2f")+"big>"); mentować wszystkich pomysłów, więc war-
to potraktować przedstawiony program jako
if(tuner_ctr.IsStereo() == true) { punkt wyjścia do własnych eksperymentów,
MonoLBL.set_sensitive(false); do czego bardzo zachęcam.
StereoLBL.set_sensitive(true);
}
O autorze
else {
MonoLBL.set_sensitive(true);
Autor zajmuje się tworzeniem oprogramo-
StereoLBL.set_sensitive(false);
wania dla WIN32 i Linuksa. Zainteresowa-
}
nia: teoria języków programowania oraz
MainWin.queue_draw();
dobra literatura.
}
Kontakt z autorem: autorzy@linux.com.pl.
www.lpmagazine.org 49


Wyszukiwarka

Podobne podstrony:
2008 11 Opensource owe platformy blogowe [Programowanie PHP]
2008 Metody obliczeniowe 13 D 2008 11 28 20 56 53
2008 11 Maximum Math Free Computer Algebra with Maxima
2008 11 Tiny Shoes
[2008 11 25] MIKROEKONOMIA Kolokwium 1
(2008 11 27) Channel List
2009 11 Klasy cech w programowaniu generycznym [Programowanie C C ]
2004 02 Aplety dla GNOME [Programowanie]
2008 11 Gdy terminy gonią [Poczatkujacy]
2008 Metody obliczeniowe 08 D 2008 11 11 21 31 58
Dz U 2008 210 1321 zmiana z dnia 2008 11 07
2008 Metody obliczeniowe 09 D 2008 11 11 21 32 51
2008 Metody obliczeniowe 11 D 2008 11 28 20 52 53
2008 Metody obliczeniowe 12 D 2008 11 28 20 53 30
2009 11 Statyczne asercje w C [Programowanie C C ]
2008 03 Wojny rdzeniowe [Progra Nieznany
2009 11 Sprytne wskaźniki [Programowanie C C ]

więcej podobnych podstron