/* * Copyright (C) 12 Jun 2003 Tomas Cermak * * This file is part of wmradio program. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "const.h" #include "skin.h" #include "radio.h" #include "wmradio.h" #include "stationnames.h" #include "rc.h" #include "osd.h" #include "fifo.h" #ifdef GNOME_RADIO #include "gnome_applet_envelope.h" #else #include "wm_envelope.h" #endif static int min_freq = 8750, max_freq = 10800; RadioInfo radio_info; RadioInfo *wmradio_radio_info(void) { return &radio_info; } void wmradio_init_radio_info(void) { radio_info.is_on = 0; radio_info.current_station = 0; radio_info.dont_quit_mode = 0; } int open_radio() { radio_info.radiofd = open(rc_get_variable(SECTION_CONFIG,"device","/dev/radio"),O_RDONLY); return radio_info.radiofd>=0; } void close_radio() { if(radio_info.radiofd != -1) close(radio_info.radiofd); } void radio_refresh_freq (void) { char str[30]; radio_setfreq(radio_info.radiofd,radio_info.current_freq); if(rc_get_variable_as_int(SECTION_CONFIG,"osd",0)) { sprintf(str, "%.2i FM", radio_info.current_freq); osd_print(str); } } void tuned_to_preset_station(void) { int i; int x,y; x = radio_info.current_freq; for(i = 0; i<6; i++) { y = rc_get_freq(i); if(x == y) { skin_select_station(i); return; } } } void tune_plus(int fine_tuning) { if(fine_tuning) { radio_info.current_freq += 1; } else { radio_info.current_freq += 10; }; if(radio_info.current_freq>max_freq) radio_info.current_freq = min_freq; radio_refresh_freq(); } void tune_minus(int fine_tuning) { if(fine_tuning) { radio_info.current_freq -= 1; } else { radio_info.current_freq -= 10; }; if(radio_info.current_freq2 ) { radio_info.scan_in_progress = 0; tuned_to_preset_station(); } } } void wmradio_next_station(void) { radio_info.current_freq = station_next_freq(radio_info.current_freq); radio_refresh_freq(); } void wmradio_prev_station(void) { radio_info.current_freq = station_prev_freq(radio_info.current_freq); radio_refresh_freq(); } #define MOD(A,B) ((A)<0)? (B)+((A)%(B)) : (A)%(B) void wmradio_command(RadioCommand command, int value) { switch (command) { case POWER_SWITCH: if( (value && radio_info.dont_quit_mode) || (!value && !radio_info.dont_quit_mode)){ if (radio_info.is_on) { radio_mute(radio_info.radiofd); close_radio(); } /* rc_save_config(); */ video_close(); return; } if (radio_info.is_on) { if(rc_get_variable_as_int(SECTION_CONFIG,"osd",0)) { osd_print("FM off"); } radio_mute(radio_info.radiofd); close_radio(); skin_switch_radio(SKIN_OFF); radio_info.is_on = 0; /* rc_save_config(); */ } else { if(open_radio()) { radio_refresh_freq(); radio_unmute(radio_info.radiofd); skin_switch_radio(SKIN_ON); radio_info.is_on = 1; } else { printf("wmradio: can't open radio device\n"); #ifdef ONLY_TEST /* those next lines are for tests on my notebook */ /* without /dev/rario */ printf(" but radio is compiled with ONLY_TEST\n"); radio_refresh_freq(); radio_unmute(radio_info.radiofd); skin_switch_radio(SKIN_ON); radio_info.is_on = 1; #endif /* ONLY_TEST */ } } break; case TUNE_MINUS: if(radio_info.is_on) { tune_minus(value); skin_unselect_button(); tuned_to_preset_station(); } break; case TUNE_PLUS: if(radio_info.is_on) { tune_plus(value); skin_unselect_button(); tuned_to_preset_station(); } break; case SET_PRESET: if(radio_info.is_on){ radio_info.current_station = value; radio_info.current_freq = rc_get_freq(value); radio_refresh_freq(); skin_select_station(value); } break; case SAVE_PRESET: if(radio_info.is_on){ rc_set_freq(value,radio_info.current_freq); skin_select_station(value); rc_save_config(); } break; case SCAN: if(radio_info.is_on){ wmradio_scan(SCAN_START); skin_unselect_button(); } break; case TUNE_NAME_PREV: if(radio_info.is_on){ wmradio_prev_station(); skin_unselect_button(); tuned_to_preset_station(); } break; case TUNE_NAME_NEXT: if(radio_info.is_on){ wmradio_next_station(); skin_unselect_button(); tuned_to_preset_station(); } break; case READ_CONFIG: rc_free_config(); rc_read_config(); radio_info.dont_quit_mode = rc_get_variable_as_int(SECTION_CONFIG,"dont-quit-mode",0); break; } } void wmradio_handle_event(RadioEvent *e) { int i; int presetindex; /* int stations[] = {5829,5830,5831,5824,5825,5826};*/ switch (e->type) { case REVENT_EXPOSE: video_draw(radio_info.current_freq,radio_getstereo(radio_info.radiofd)); break; case REVENT_QUIT: if(radio_info.is_on) radio_mute(radio_info.radiofd); close_radio(); /* rc_save_config(); */ video_close(); break; case REVENT_BUTTON_PRESS: skin_mouse_event(e->x,e-> y,e->button,1); video_draw(radio_info.current_freq,radio_getstereo(radio_info.radiofd)); break; case REVENT_TIMER: wmradio_scan(SCAN_NO_CHANGE); video_draw(radio_info.current_freq,radio_getstereo(radio_info.radiofd)); break; case REVENT_BUTTON_RELEASE: setlocale(LC_ALL,"C"); wmradio_scan(SCAN_STOP); i = skin_mouse_event(e->x, e->y,e->button, 0); presetindex = -1; if( (e->button == 4 || e->button == 5) ) { } else { /* this is not mouse wheel */ if (i) { switch (i) { case XOR_OFF: wmradio_command(POWER_SWITCH, e->control); break; case XOR_TUNEm: if(e->shift) { wmradio_command(TUNE_NAME_PREV, e->control); } else { wmradio_command(TUNE_MINUS, e->control); } break; case XOR_TUNEp: if(e->shift) { wmradio_command(TUNE_NAME_NEXT, e->control); } else { wmradio_command(TUNE_PLUS, e->control); } break; case XOR_SCAN: wmradio_command(SCAN, 0); break; case XOR_PRESET1: presetindex = 0; break; case XOR_PRESET2: presetindex = 1; break; case XOR_PRESET3: presetindex = 2; break; case XOR_PRESET4: presetindex = 3; break; case XOR_PRESET5: presetindex = 4; break; case XOR_PRESET6: presetindex = 5; break; }; if(presetindex >= 0) { if( e->control ) { wmradio_command(SAVE_PRESET,presetindex); } else { wmradio_command(SET_PRESET,presetindex); } radio_info.current_station = presetindex; } } } video_draw(radio_info.current_freq, radio_getstereo(radio_info.radiofd)); break; case REVENT_SCROLL_UP: skin_mouse_event(e->x, e->y,e->button, 1); i = skin_mouse_event(e->x, e->y,e->button, 0); if(i == 4507) if(e->shift) { wmradio_command(TUNE_MINUS, e->control); } else { wmradio_command(TUNE_NAME_PREV, e->control); } else wmradio_command(SET_PRESET, MOD(radio_info.current_station-1, 6)); break; case REVENT_SCROLL_DOWN: skin_mouse_event(e->x, e->y,e->button, 1); i = skin_mouse_event(e->x, e->y,e->button, 0); if(i == 4507) if(e->shift) { wmradio_command(TUNE_PLUS, e->control); } else { wmradio_command(TUNE_NAME_NEXT, e->control); } else wmradio_command(SET_PRESET, MOD(radio_info.current_station+1, 6)); break; } fifo_parse(); } int wmradio_init(void) { if (rc_get_variable_as_int(SECTION_CONFIG,"osd",0) ){ if (! osd_init("wmradio", rc_get_variable(SECTION_CONFIG,"osd-font","*-courier-*"), rc_get_variable(SECTION_CONFIG,"osd-color","green"), rc_get_variable_as_int(SECTION_CONFIG,"osd-position",10), rc_get_variable_as_int(SECTION_CONFIG,"osd-position",10), rc_get_variable_as_int(SECTION_CONFIG,"osd-shadow-offset",5), rc_get_variable_as_int(SECTION_CONFIG,"osd-timeout",3) ) ) { printf("osd init failed\n"); rc_set_variable_as_int(SECTION_CONFIG,"osd",0); } } fifo_init(); skin_switch_radio(SKIN_OFF); radio_info.is_on = 0; radio_info.dont_quit_mode = rc_get_variable_as_int(SECTION_CONFIG,"dont-quit-mode",1); radio_info.current_freq = rc_get_freq(radio_info.current_station); if(! rc_get_variable_as_int(SECTION_CONFIG,"start-muted",1) ) { if(open_radio()) { radio_setfreq(radio_info.radiofd,radio_info.current_freq); radio_unmute(radio_info.radiofd); skin_switch_radio(SKIN_ON); radio_info.is_on = 1; } else { printf("wmradio: can't open radio device\n"); radio_info.is_on = 0; } } return 1; } void wmradio_done(void) { osd_close(); fifo_close(); }