00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00037 #ifndef __CRADIOSCHED_H
00038 #define __CRADIOSCHED_H
00039
00040 #include <math.h>
00041 #include <pthread.h>
00042 #include <sys/time.h>
00043
00044 #include <inchannels.h>
00045 #include <outchannels.h>
00046 #include <gui.h>
00047
00048 #include <generic.h>
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 #define SCHEDFILE "schedule.xml" //under $HOME/.muse
00071 const char *sched_file_path(void);
00072
00073
00074 class Basic_scheduler {
00075
00076 public:
00077 Basic_scheduler( const void *sched );
00078 virtual ~Basic_scheduler();
00079
00080 void register_mixer(Stream_mixer *mix) {mixer=mix;};
00081
00082 virtual void run();
00083 virtual bool stop();
00084 virtual bool play();
00085 virtual void on_wakeup();
00086 virtual void load_schedule() { on_load_schedule();};
00088 virtual void on_load_schedule() =0;
00089
00090 void set_schedule( const void *s ) {_schedule = s;};
00091
00092 bool on;
00093 bool running;
00094 bool quit;
00095 Channel *channel;
00096
00097
00098 void start() {
00099 pthread_create(&_thread, &_attr, &kickoff, this); };
00100 void lock() { pthread_mutex_lock(&_mutex); };
00101 void unlock() { pthread_mutex_unlock(&_mutex); };
00102 void wait() { pthread_cond_wait(&_cond,&_mutex); };
00103 void signal() { pthread_cond_signal(&_cond); };
00104
00105
00106 protected:
00107 static void* kickoff(void *arg) { ((Basic_scheduler*) arg)->run(); return NULL; };
00108
00109
00110 bool match( const char *left, int right );
00111 void stop_channel(void);
00112 bool play_code;
00113
00114 bool start_channel( Url *rec );
00115
00116 const void *_schedule;
00117 Playlist *playlist;
00118 void dump();
00119 time_t prev_time;
00120
00121
00122 Url *playing;
00123
00124 void stop_inner_channel(void);
00125 bool start_inner_channel( Url *rec );
00126
00127 Stream_mixer *mixer;
00128 void stop_mixer_channel( Url *rec );
00129 bool start_mixer_channel( Url *rec );
00130
00131 private:
00132
00133 void _thread_init();
00134 void _thread_destroy();
00135 pthread_t _thread;
00136 pthread_attr_t _attr;
00137 pthread_mutex_t _mutex;
00138 pthread_cond_t _cond;
00139
00140
00141 };
00142
00143
00144 extern Basic_scheduler *rscheduler;
00145
00146
00147
00148
00149
00150 #define CRONSIZE (8192*2)
00151 #define TSEPARATOR " \t"
00152 class Scheduler_text : public Basic_scheduler {
00153 public:
00154 Scheduler_text(const void *sched) : Basic_scheduler(sched)
00155 {memset(crontab, '\0', CRONSIZE);};
00156 virtual ~Scheduler_text() {};
00157 void on_load_schedule();
00158
00159 private:
00160 char crontab[CRONSIZE];
00161 void load_crontab( const char *cronf );
00162 void addentry( char *line );
00163
00164 };
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 typedef struct _sched_rec {
00176 const char *src;
00177 const char *comment;
00178 const char *wkd;
00179 const char *month;
00180 const char *day;
00181 const char *stime;
00182 const char *etime;
00183 const char *secs;
00184 } sched_rec;
00185
00186
00187
00188
00189 class Scheduler_xml : public Basic_scheduler {
00190 public:
00191 Scheduler_xml(const void *sched) : Basic_scheduler(sched) {};
00192 void on_load_schedule();
00193 virtual ~Scheduler_xml() {};
00194
00195 private:
00196 void load_crontab( const char *cronf );
00197 static int addentry( void *instance, sched_rec *sr );
00198
00199 };
00200
00201
00202
00203
00204
00205 typedef int (*sched_rec_callb)(void*, sched_rec*);
00208 int parse_xml_sched_file( sched_rec_callb callb, void *udata, sched_rec *data );
00210 int create_xml_schedule_file(void);
00213 int write_xml_schedule_file(const char *content);
00215 char *format_xml_sched_rec(const sched_rec *rec);
00216
00217 #endif
00218