]> git.vomp.tv Git - vompclient-marten.git/blob - main.cc
stopping logging in demuxer, reorganised shutdown in main to fix a
[vompclient-marten.git] / main.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #ifndef _GNU_SOURCE
22 #define _GNU_SOURCE
23 #endif
24
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <signal.h>
29 #include <unistd.h>
30 #include <endian.h>
31
32 #include "defines.h"
33 #include "log.h"
34 #include "remote.h"
35 #include "led.h"
36 #include "mtd.h"
37 #include "video.h"
38 #include "audio.h"
39 #include "vdr.h"
40 #include "osd.h"
41 #include "viewman.h"
42 #include "command.h"
43
44 void sighandler(int signal);
45 void shutdown(int code);
46
47 // Global variables --------------------------------------------------------------------------------------------------
48 int debugEnabled = 0;
49 Log* logger;
50 Remote* remote;
51 Mtd* mtd;
52 Led* led;
53 Osd* osd;
54 ViewMan* viewman;
55 Command* command;
56 VDR* vdr;
57 Video* video;
58 Audio* audio;
59
60 int main(int argc, char** argv)
61 {
62   if ((argc > 1) && (!strcmp(argv[1], "-d"))) debugEnabled = 1;
63
64
65   // Init global vars ------------------------------------------------------------------------------------------------
66
67   logger     = new Log();
68   remote     = new Remote();
69   mtd        = new Mtd();
70   led        = new Led();
71   osd        = new Osd();
72   vdr        = new VDR();
73   video      = new Video();
74   audio      = new Audio();
75   viewman    = new ViewMan();
76   command    = new Command();
77
78   if (!logger || !remote || !mtd || !led || !osd || !video || !audio || !viewman || !command)
79   {
80     printf("Could not create objects. Memory problems?\n");
81     shutdown(1);
82   }
83
84   // Get logging module started --------------------------------------------------------------------------------------
85
86   if (!logger->init(Log::DEBUG, "dummy", debugEnabled))
87   {
88     printf("Could not initialise log object. Aborting.\n");
89     shutdown(1);
90   }
91
92   logger->log("Core", Log::INFO, "Starting up...");
93
94   // Set up signal handling ------------------------------------------------------------------------------------------
95
96   sighandler_t sigtest;
97
98   sigtest = signal(SIGPIPE, SIG_IGN);
99   if (sigtest == SIG_ERR)
100   {
101     logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGPIPE. Aborting.");
102     shutdown(1);
103   }
104   sigtest = signal(SIGINT, sighandler);
105   if (sigtest == SIG_ERR)
106   {
107     logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGINT. Aborting.");
108     shutdown(1);
109   }
110   sigtest = signal(SIGTERM, sighandler);
111   if (sigtest == SIG_ERR)
112   {
113     logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGTERM. Aborting.");
114     shutdown(1);
115   }
116   sigtest = signal(SIGUSR1, sighandler);
117   if (sigtest == SIG_ERR)
118   {
119     logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGUSR1. Aborting.");
120     shutdown(1);
121   }
122   sigtest = signal(SIGUSR2, sighandler);
123   if (sigtest == SIG_ERR)
124   {
125     logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGUSR2. Aborting.");
126     shutdown(1);
127   }
128   sigtest = signal(SIGURG, sighandler);
129   if (sigtest == SIG_ERR)
130   {
131     logger->log("Core", Log::EMERG, "Could not set up signal handler for SIGURG. Aborting.");
132     shutdown(1);
133   }
134
135   logger->log("Core", Log::INFO, "Signal handlers set up successfully");
136
137
138   // Init modules ----------------------------------------------------------------------------------------------------
139   int success;
140
141   success = remote->init("/dev/rawir");
142   if (success)
143   {
144     logger->log("Core", Log::INFO, "Remote module initialised");
145   }
146   else
147   {
148     logger->log("Core", Log::EMERG, "Remote module failed to initialise");
149     shutdown(1);
150   }
151
152   success = led->init(remote->getDevice());
153   if (success)
154   {
155     logger->log("Core", Log::INFO, "LED module initialised");
156   }
157   else
158   {
159     logger->log("Core", Log::EMERG, "LED module failed to initialise");
160     shutdown(1);
161   }
162
163   success = mtd->init("/dev/mtd1");
164   if (success)
165   {
166     logger->log("Core", Log::INFO, "Mtd module initialised");
167   }
168   else
169   {
170     logger->log("Core", Log::EMERG, "Mtd module failed to initialise");
171     shutdown(1);
172   }
173
174   UCHAR videoFormat = (UCHAR)mtd->getPALorNTSC();
175   if      (videoFormat == Video::PAL)  logger->log("Core", Log::INFO, "Read from MTD: PAL 720x576");
176   else if (videoFormat == Video::NTSC) logger->log("Core", Log::INFO, "Read from MTD: NTSC 720x480");
177   else                                 logger->log("Core", Log::INFO, "No help from MTD. Assuming NTSC 720x480");
178
179   success = video->init(videoFormat);
180   if (success)
181   {
182     logger->log("Core", Log::INFO, "Video module initialised");
183   }
184   else
185   {
186     logger->log("Core", Log::EMERG, "Video module failed to initialise");
187     shutdown(1);
188   }
189
190   success = osd->init("/dev/stbgfx", 1);
191   if (success)
192   {
193     logger->log("Core", Log::INFO, "OSD module initialised");
194   }
195   else
196   {
197     logger->log("Core", Log::EMERG, "OSD module failed to initialise");
198     shutdown(1);
199   }
200
201   success = audio->init(Audio::MPEG2_PES);
202   if (success)
203   {
204     logger->log("Core", Log::INFO, "Audio module initialised");
205   }
206   else
207   {
208     logger->log("Core", Log::EMERG, "Audio module failed to initialise");
209     shutdown(1);
210   }
211
212   success = vdr->init(3024);
213   if (success)
214   {
215     logger->log("Core", Log::INFO, "VDR module initialised");
216   }
217   else
218   {
219     logger->log("Core", Log::EMERG, "VDR module failed to initialise");
220     shutdown(1);
221   }
222
223   success = viewman->init();
224   if (success)
225   {
226     logger->log("Core", Log::INFO, "ViewMan module initialised");
227   }
228   else
229   {
230     logger->log("Core", Log::EMERG, "ViewMan module failed to initialise");
231     shutdown(1);
232   }
233
234   success = command->init();
235   if (success)
236   {
237     logger->log("Core", Log::INFO, "Command module initialised");
238   }
239   else
240   {
241     logger->log("Core", Log::EMERG, "Command module failed to initialise");
242     shutdown(1);
243   }
244
245   // Other init ------------------------------------------------------------------------------------------------------
246
247   logger->log("Core", Log::NOTICE, "Startup successful");
248
249   // Run main loop ---------------------------------------------------------------------------------------------------
250
251   // Ok, all major device components and other bits are loaded and ready
252   command->run();
253
254   // When that returns quit ------------------------------------------------------------------------------------------
255
256   shutdown(0);
257   return 0;
258 }
259
260 // -------------------------------------------------------------------------------------------------------------------
261
262 void shutdown(int code)
263 {
264   if (command)
265   {
266     command->shutdown();
267     delete command;
268     logger->log("Core", Log::NOTICE, "Command module shut down");
269   }
270
271   if (viewman)
272   {
273       printf("here st 3\n");
274
275     viewman->shutdown();
276     delete viewman;
277     logger->log("Core", Log::NOTICE, "ViewMan module shut down");
278   }
279
280   if (vdr)
281   {
282     vdr->shutdown();
283     delete vdr;
284     logger->log("Core", Log::NOTICE, "VDR module shut down");
285   }
286
287   if (osd)
288   {
289     osd->shutdown();
290     delete osd;
291     logger->log("Core", Log::NOTICE, "OSD module shut down");
292   }
293
294   if (audio)
295   {
296     audio->shutdown();
297     delete audio;
298     logger->log("Core", Log::NOTICE, "Audio module shut down");
299   }
300
301   if (video)
302   {
303     video->shutdown();
304     delete video;
305     logger->log("Core", Log::NOTICE, "Video module shut down");
306   }
307
308   if (mtd)
309   {
310     mtd->shutdown();
311     delete mtd;
312     logger->log("Core", Log::NOTICE, "MTD module shut down");
313   }
314
315   if (led)
316   {
317     led->shutdown();
318     delete led;
319     logger->log("Core", Log::NOTICE, "LED module shut down");
320   }
321
322   if (remote)
323   {
324     remote->shutdown();
325     delete remote;
326     logger->log("Core", Log::NOTICE, "Remote module shut down");
327   }
328
329   if (logger)
330   {
331     logger->log("Core", Log::NOTICE, "Log module shutting down... bye!\n\n");
332     logger->shutdown();
333     delete logger;
334   }
335
336   exit(code);
337 }
338
339 // -------------------------------------------------------------------------------------------------------------------
340
341 void sighandler(int signal)
342 {
343   Log* logger = Log::getInstance();
344
345   logger->log("Core", Log::NOTICE, "Signal %i received", signal);
346
347   switch (signal)
348   {
349     case SIGINT:
350     {
351       logger->log("Core", Log::NOTICE, "Interrupt signal, shutting down...");
352       command->stop(); // FIXME this is probably not safe - use the messaging system / is that even safe?
353       break;
354     }
355     case SIGTERM:
356     {
357       logger->log("Core", Log::NOTICE, "Term signal, shutting down...");
358       command->stop(); // FIXME this is probably not safe - use the messaging system / is that even safe?
359       break;
360     }
361     case SIGUSR1:
362     {
363       logger->log("Core", Log::DEBUG, "SIGUSR1 caught");
364       logger->upLogLevel();
365       break;
366     }
367     case SIGUSR2:
368     {
369       logger->log("Core", Log::DEBUG, "SIGUSR2 caught");
370       logger->downLogLevel();
371       break;
372     }
373     case SIGURG:
374     {
375       logger->log("Core", Log::DEBUG, "SIGURG caught");
376       break;
377     }
378   }
379 }
380
381 // -------------------------------------------------------------------------------------------------------------------
382
383 ULLONG ntohll(ULLONG a)
384 {
385   return htonll(a);
386 }
387
388 ULLONG htonll(ULLONG a)
389 {
390   #if BYTE_ORDER == BIG_ENDIAN
391     return a;
392   #else
393     ULLONG b = 0;
394
395     b = ((a << 56) & 0xFF00000000000000ULL)
396       | ((a << 40) & 0x00FF000000000000ULL)
397       | ((a << 24) & 0x0000FF0000000000ULL)
398       | ((a <<  8) & 0x000000FF00000000ULL)
399       | ((a >>  8) & 0x00000000FF000000ULL)
400       | ((a >> 24) & 0x0000000000FF0000ULL)
401       | ((a >> 40) & 0x000000000000FF00ULL)
402       | ((a >> 56) & 0x00000000000000FFULL) ;
403
404     return b;
405   #endif
406 }