]> git.vomp.tv Git - vompclient.git/blob - winmain.cc
Update for windows
[vompclient.git] / winmain.cc
1 /*\r
2     Copyright 2004-2005 Chris Tallon\r
3 \r
4     This file is part of VOMP.\r
5 \r
6     VOMP is free software; you can redistribute it and/or modify\r
7     it under the terms of the GNU General Public License as published by\r
8     the Free Software Foundation; either version 2 of the License, or\r
9     (at your option) any later version.\r
10 \r
11     VOMP is distributed in the hope that it will be useful,\r
12     but WITHOUT ANY WARRANTY; without even the implied warranty of\r
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
14     GNU General Public License for more details.\r
15 \r
16     You should have received a copy of the GNU General Public License\r
17     along with VOMP; if not, write to the Free Software\r
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
19 */\r
20 #ifdef WIN32\r
21 #include <stdio.h>\r
22 #include <stdlib.h>\r
23 #include <string.h>\r
24 #include <signal.h>\r
25 \r
26 #define _WIN32_WINNT 0x501\r
27 #include <winsock2.h>\r
28 #include <windows.h>\r
29 \r
30 #include "vompreswin.h"\r
31 \r
32 #include "defines.h"\r
33 #include "log.h"\r
34 #include "remotewin.h"\r
35 #include "ledwin.h"\r
36 #include "mtdwin.h"\r
37 #include "timers.h"\r
38 #include "videowin.h"\r
39 #include "audiowin.h"\r
40 #include "vdr.h"\r
41 #include "osdwin.h"\r
42 #include "viewman.h"\r
43 #include "command.h"\r
44 \r
45 void sighandler(int signalReceived);\r
46 void shutdown(int code);\r
47 \r
48 // Global variables --------------------------------------------------------------------------------------------------\r
49 int debugEnabled = 0;\r
50 Log* logger;\r
51 Remote* remote;\r
52 Mtd* mtd;\r
53 Led* led;\r
54 Osd* osd;\r
55 Timers* timers;\r
56 ViewMan* viewman;\r
57 Command* command;\r
58 VDR* vdr;\r
59 Video* video;\r
60 Audio* audio;\r
61 bool wnd_fullscreen=false;\r
62 RECT wnd_fs_rect={20,20,768+20,576+20};\r
63 RECT wnd_fs_rect_client={0,0,768,576};\r
64 OSVERSIONINFO windows_ver; //attempt to distigsh windows versions\r
65 \r
66 \r
67 void MILLISLEEP(ULONG a)
68 {
69
70   Sleep(a);
71
72 }\r
73 \r
74 DWORD WINAPI commandthreadStart(void *arg)\r
75 {\r
76          command->run();\r
77          return 0;\r
78 }\r
79 \r
80 bool InitApp(HINSTANCE hinst,int cmdshow);\r
81 \r
82 HWND win_main;//global window handle\r
83 HWND win;//global child window handle\r
84 HACCEL acc;\r
85 \r
86 #define ERROR_MSG(str) MessageBox(win_main,str,"Error!",MB_OK|MB_ICONWARNING)\r
87 INT WINAPI WinMain( HINSTANCE hinst , HINSTANCE previnst, LPSTR cmdline, int cmdshow)\r
88 {\r
89   //On Windows we have to init a window, we use DXUT\r
90         if (!InitApp(hinst,cmdshow)) return false;\r
91   //Starting Network support\r
92   WSADATA wsadat; \r
93   int result = WSAStartup(MAKEWORD(2,2),&wsadat);\r
94   if (result!=NO_ERROR) {\r
95         ERROR_MSG("Initialising WinSocked: Error at WSAStartup()\n");\r
96                 return 0;\r
97   }\r
98   result= CoInitializeEx(NULL,COINIT_MULTITHREADED );//Initialize COM for DirectShow\r
99   if (result!=S_OK) {\r
100           ERROR_MSG("Initialising COM: Error at Coinitialize()\n");\r
101           return 0;\r
102   }\r
103 \r
104 \r
105 \r
106 \r
107   // Init global vars ------------------------------------------------------------------------------------------------\r
108 \r
109   logger     = new Log();\r
110   remote     = new RemoteWin();\r
111   mtd        = new MtdWin();\r
112   led        = new LedWin();\r
113   timers     = new Timers();\r
114   osd        = new OsdWin();\r
115   vdr        = new VDR();\r
116   video      = new VideoWin();\r
117   audio      = new AudioWin();\r
118   viewman    = new ViewMan();\r
119   command    = new Command();\r
120 \r
121   if (!logger || !remote || !mtd || !led || !osd || !video || !audio || !viewman || !command)\r
122   {\r
123     ERROR_MSG("Could not create objects. Memory problems?\n");\r
124     shutdown(1);\r
125         WSACleanup();\r
126         return 0;\r
127   }\r
128 \r
129   // Get logging module started --------------------------------------------------------------------------------------\r
130 \r
131   if (!logger->init(Log::DEBUG, "vompwin.log", true))\r
132   {\r
133     ERROR_MSG("Could not initialise log object. Aborting.\n");\r
134     shutdown(1);\r
135         WSACleanup();\r
136         return 0;\r
137   }\r
138 \r
139   logger->log("Core", Log::INFO, "Starting up...");\r
140   \r
141 \r
142 \r
143   // Init modules ----------------------------------------------------------------------------------------------------\r
144   int success;\r
145 \r
146   success = remote->init("/dev/rawir");\r
147   if (success)\r
148   {\r
149     logger->log("Core", Log::INFO, "Remote module initialised");\r
150   }\r
151   else\r
152   {\r
153     logger->log("Core", Log::EMERG, "Remote module failed to initialise");\r
154     shutdown(1);\r
155         WSACleanup();\r
156         return 0;\r
157   }\r
158 \r
159   success = led->init(0);\r
160   if (success)\r
161   {\r
162     logger->log("Core", Log::INFO, "LED module initialised");\r
163   }\r
164   else\r
165   {\r
166     logger->log("Core", Log::EMERG, "LED module failed to initialise");\r
167     shutdown(1);\r
168         WSACleanup();\r
169         return 0;\r
170   }\r
171 \r
172   success = mtd->init("/dev/mtd1");\r
173   if (success)\r
174   {\r
175     logger->log("Core", Log::INFO, "Mtd module initialised");\r
176   }\r
177   else\r
178   {\r
179     logger->log("Core", Log::EMERG, "Mtd module failed to initialise");\r
180     shutdown(1);\r
181         WSACleanup();\r
182         return 0;\r
183   }\r
184 \r
185   success = timers->init();\r
186   if (success)\r
187   {\r
188     logger->log("Core", Log::INFO, "Timers module initialised");\r
189   }\r
190   else\r
191   {\r
192     logger->log("Core", Log::EMERG, "Timers module failed to initialise");\r
193     shutdown(1);\r
194         WSACleanup();\r
195         return 0;\r
196   }\r
197 \r
198   UCHAR videoFormat = (UCHAR)mtd->getPALorNTSC();\r
199   if      (videoFormat == Video::PAL)  logger->log("Core", Log::INFO, "Read from MTD: PAL 720x576");\r
200   else if (videoFormat == Video::NTSC) logger->log("Core", Log::INFO, "Read from MTD: NTSC 720x480");\r
201   else                                 logger->log("Core", Log::INFO, "No help from MTD. Assuming NTSC 720x480");\r
202 \r
203   success = video->init(videoFormat);\r
204   if (success)\r
205   {\r
206     logger->log("Core", Log::INFO, "Video module initialised");\r
207   }\r
208   else\r
209   {\r
210     logger->log("Core", Log::EMERG, "Video module failed to initialise");\r
211     shutdown(1);\r
212         WSACleanup();\r
213         return 0;\r
214   }\r
215 \r
216   success = osd->init((void*)&win);\r
217   if (success)\r
218   {\r
219     logger->log("Core", Log::INFO, "OSD module initialised");\r
220   }\r
221   else\r
222   {\r
223     logger->log("Core", Log::EMERG, "OSD module failed to initialise");\r
224     shutdown(1);\r
225         WSACleanup();\r
226         return 0;\r
227   }\r
228 \r
229   success = audio->init(Audio::MPEG2_PES);\r
230   if (success)\r
231   {\r
232     logger->log("Core", Log::INFO, "Audio module initialised");\r
233   }\r
234   else\r
235   {\r
236     logger->log("Core", Log::EMERG, "Audio module failed to initialise");\r
237     shutdown(1);\r
238         WSACleanup();\r
239         return 0;\r
240   }\r
241 \r
242   success = vdr->init(3024);\r
243   if (success)\r
244   {\r
245     logger->log("Core", Log::INFO, "VDR module initialised");\r
246   }\r
247   else\r
248   {\r
249     logger->log("Core", Log::EMERG, "VDR module failed to initialise");\r
250     shutdown(1);\r
251         WSACleanup();\r
252         return 0;\r
253   }\r
254 \r
255   success = viewman->init();\r
256   if (success)\r
257   {\r
258     logger->log("Core", Log::INFO, "ViewMan module initialised");\r
259   }\r
260   else\r
261   {\r
262     logger->log("Core", Log::EMERG, "ViewMan module failed to initialise");\r
263     shutdown(1);\r
264         WSACleanup();\r
265         return 0;\r
266   }\r
267 \r
268   success = command->init();\r
269   if (success)\r
270   {\r
271     logger->log("Core", Log::INFO, "Command module initialised");\r
272   }\r
273   else\r
274   {\r
275     logger->log("Core", Log::EMERG, "Command module failed to initialise");\r
276     shutdown(1);\r
277         WSACleanup();\r
278         return 0;\r
279   }\r
280 \r
281   // Other init ------------------------------------------------------------------------------------------------------\r
282 \r
283   logger->log("Core", Log::NOTICE, "Startup successful");\r
284 \r
285   // Run main loop ---------------------------------------------------------------------------------------------------\r
286 \r
287   // Ok, all major device components and other bits are loaded and ready\r
288   \r
289   HANDLE commandthread;\r
290  commandthread= CreateThread(NULL, 0, commandthreadStart, NULL,0, \r
291           NULL);\r
292   MSG message;\r
293   message.message=WM_NULL;\r
294   bool run=true;\r
295   while(run && WaitForSingleObject(commandthread,0)==WAIT_TIMEOUT) {\r
296           if (PeekMessage(&message, NULL, 0,0,PM_REMOVE)!=0) {\r
297                   if (TranslateAccelerator(win_main,acc,&message)==NULL) {\r
298                           TranslateMessage(&message);\r
299                           DispatchMessage(&message);\r
300                           switch (message.message) {\r
301                           case WM_QUIT:\r
302                                   run=false; //TODO post exit to command Messages\r
303                           };\r
304                   }\r
305           } else {\r
306                   //Render\r
307                   ((OsdWin*)osd)->Render();\r
308           }\r
309   }\r
310   // When that returns quit ------------------------------------------------------------------------------------------\r
311   WaitForSingleObject(commandthread,INFINITE);\r
312   shutdown(0);\r
313   WSACleanup();\r
314   return 0;\r
315 \r
316 }\r
317 \r
318 \r
319 \r
320 void CalculateWindowSize(RECT * size,ULONG size_mode) {\r
321         \r
322         DWORD width, height;\r
323         DWORD adjheight,adjwidth;\r
324         if (!wnd_fullscreen) {\r
325                 DWORD flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU \r
326                                  |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX;\r
327                 RECT wnted={50,50,150,150};\r
328                 AdjustWindowRect(&wnted,flags ,false);\r
329                 adjwidth=-wnted.left+wnted.right-100;\r
330                 adjheight=-wnted.top+wnted.bottom-100;\r
331         } else {\r
332                 adjwidth=adjheight=0;\r
333         }\r
334         width=size->right-size->left-adjwidth;\r
335         height=size->bottom-size->top-adjheight;\r
336         UCHAR mode=video->getMode();\r
337         UCHAR aspect=((VideoWin*)video)->getAspectRatio();\r
338         UCHAR tvsize=((VideoWin*)video)->getPseudoTVsize();\r
339         double aspectrt=4./3.;\r
340         if (tvsize==Video::ASPECT16X9) {\r
341                 if (aspect==Video::ASPECT16X9) {\r
342                         aspectrt=4./3.; //looks strange, but it is a 16:9 tv\r
343                 } else if (aspect==Video::ASPECT4X3) {\r
344                         aspectrt=4./3./(16./9.)*(4./3.); //I hope this is correct\r
345                 }\r
346         } else if (tvsize==Video::ASPECT4X3) {\r
347                 if (aspect==Video::ASPECT16X9) {\r
348                         if (mode!=Video::NORMAL) {\r
349                                 aspectrt=16./9.;\r
350                         } else {\r
351                                 aspectrt=4./3.;\r
352                         }\r
353                 } else if (aspect==Video::ASPECT4X3) {\r
354                         aspectrt=4./3.;\r
355                 }\r
356         }\r
357         if (!wnd_fullscreen) {\r
358                 switch (size_mode) {\r
359                 case WMSZ_BOTTOM:\r
360                 case WMSZ_BOTTOMRIGHT:\r
361                 case WMSZ_TOP:\r
362                 case WMSZ_TOPRIGHT:\r
363                 width=(ULONG)(((double)height)*aspectrt);\r
364                 size->right=size->left+width+adjwidth;\r
365                 break;\r
366                 case WMSZ_BOTTOMLEFT:\r
367                 case WMSZ_TOPLEFT:\r
368                 width=(ULONG)(((double)height)*aspectrt);\r
369                 size->left=size->right-width-adjwidth;\r
370                 break;\r
371                 case WMSZ_LEFT:\r
372                 case WMSZ_RIGHT:\r
373                 height=(ULONG)(((double)width)/aspectrt);\r
374                 size->bottom=size->top+height+adjheight;\r
375                 break;\r
376                 }\r
377                 MoveWindow(win,0,0,width,height,TRUE);\r
378         } else {\r
379                 RECT newrect={0,0,width,height};\r
380                 DWORD newlength;\r
381                 if ((ULONG)(((double)height)*aspectrt)>width) {\r
382                         newlength=(ULONG)(((double)width)/aspectrt);\r
383                         newrect.top+=(height-newlength)/2;\r
384                         newrect.bottom-=(height-newlength);\r
385                 } else {\r
386                         newlength=(ULONG)(((double)height)*aspectrt);\r
387                         newrect.left+=(width-newlength)/2;\r
388                         newrect.right-=(width-newlength);\r
389                 }\r
390                 MoveWindow(win,newrect.left,newrect.top,newrect.right,newrect.bottom,TRUE);\r
391         }\r
392         \r
393 }\r
394 \r
395 void AdjustWindow() {\r
396         if (!wnd_fullscreen) {\r
397                 RECT winrect;\r
398                 GetWindowRect(win_main,&winrect);\r
399                 CalculateWindowSize(&winrect,WMSZ_BOTTOM);\r
400                 MoveWindow(win_main,winrect.left,\r
401                         winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,true);\r
402         } else {\r
403                 RECT winrect;\r
404                 GetWindowRect(win_main,&winrect);\r
405                 CalculateWindowSize(&winrect,WMSZ_BOTTOM);\r
406 \r
407         }\r
408 }\r
409 \r
410 void ToggleFullscreen() {\r
411         if (wnd_fullscreen) {\r
412                 wnd_fullscreen=false;\r
413                 SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU \r
414                  |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX);\r
415                 SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
416 \r
417                 SetWindowPos(win_main,HWND_TOP,wnd_fs_rect.left,wnd_fs_rect.top,\r
418                                                         wnd_fs_rect.right-wnd_fs_rect.left,\r
419                                                         wnd_fs_rect.bottom-wnd_fs_rect.top,\r
420                                                         SWP_DRAWFRAME | SWP_FRAMECHANGED);\r
421                 MoveWindow(win,wnd_fs_rect_client.left,wnd_fs_rect_client.top,\r
422                                                         wnd_fs_rect_client.right-wnd_fs_rect_client.left,\r
423                                                         wnd_fs_rect_client.bottom-wnd_fs_rect_client.top,TRUE);\r
424                 AdjustWindow();\r
425         } else {\r
426                 GetWindowRect(win_main,&wnd_fs_rect);\r
427                 GetWindowRect(win,&wnd_fs_rect_client);\r
428                 SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP );\r
429                 SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
430                 HMONITOR monitor=MonitorFromWindow(win_main,MONITOR_DEFAULTTONEAREST);  \r
431                 MONITORINFO moninfo;\r
432                 moninfo.cbSize=sizeof(moninfo);\r
433                 wnd_fullscreen=true;\r
434                 if (!GetMonitorInfo(monitor,&moninfo)) return ;\r
435                 SetWindowPos(win_main,HWND_TOP,moninfo.rcMonitor.left,moninfo.rcMonitor.top,\r
436                         moninfo.rcMonitor.right,moninfo.rcMonitor.bottom,SWP_FRAMECHANGED);\r
437                 \r
438                 AdjustWindow();\r
439                 \r
440         }\r
441 \r
442 \r
443 }\r
444 \r
445 LONG FAR PASCAL WindowProc(HWND wind, UINT msg, WPARAM wparam, LPARAM lparam)\r
446 {\r
447    \r
448    switch (msg) {\r
449    case WM_DESTROY: {\r
450            //TODO: call command\r
451            logger->log("Core", Log::NOTICE, "Window closed, shutting down...");\r
452         \r
453            ((RemoteWin*)Remote::getInstance())->SendPower();\r
454            PostQuitMessage(0);\r
455         }break;\r
456    case WM_SIZING: {\r
457            CalculateWindowSize((RECT*) lparam,wparam);\r
458            return TRUE;\r
459                                    }break;\r
460         case WM_SIZE: {\r
461         int width = LOWORD(lparam);\r
462         int height = HIWORD(lparam);\r
463          //Call device\r
464         }\r
465         break;\r
466          case WM_PAINT:\r
467         RECT r;\r
468         PAINTSTRUCT ps;\r
469         if (GetUpdateRect(wind, &r, FALSE)) {\r
470             BeginPaint(wind, &ps);\r
471             //Call Painting Mechanism\r
472             EndPaint(wind, &ps);\r
473         }\r
474         break;\r
475          case WM_KEYDOWN:\r
476                  if (((RemoteWin*)remote)->ReceiveButtonVK(wparam)) {\r
477                          return 0L; //We process that Key\r
478                  } else {\r
479                          return DefWindowProc(wind, msg, wparam, lparam);\r
480                  }\r
481 \r
482                  break;\r
483         case WM_APPCOMMAND:\r
484                 if (((RemoteWin*)remote)->ReceiveButtonAP(GET_APPCOMMAND_LPARAM(lparam))){\r
485                         return TRUE; //yes we process that message\r
486                 } else {\r
487                         return DefWindowProc(wind, msg, wparam, lparam);\r
488                 }\r
489 \r
490                 break;\r
491         case WM_INPUT:\r
492                 if ((windows_ver.dwMajorVersion>5 || \r
493                         (windows_ver.dwMajorVersion==5 && windows_ver.dwMinorVersion>=1)) ) {\r
494                         //only on XP!\r
495                          LPRAWINPUT lpit;\r
496                          UINT risize;\r
497                          GetRawInputData((HRAWINPUT)lparam,RID_INPUT,NULL,&risize,sizeof(RAWINPUTHEADER));\r
498                          lpit=(LPRAWINPUT)malloc(risize);\r
499                          GetRawInputData((HRAWINPUT)lparam,RID_INPUT,lpit,&risize,sizeof(RAWINPUTHEADER));\r
500   \r
501                         if (lpit->header.dwType==RIM_TYPEHID && lpit->data.hid.dwSizeHid>=2) {\r
502                                 DWORD button=lpit->data.hid.bRawData[1] | (lpit->data.hid.bRawData[0]<< 8);\r
503                                 if (((RemoteWin*)remote)->ReceiveButtonRI(button)){\r
504                                         free(lpit);\r
505                                         return 0; //yes we process that message\r
506                                 }\r
507                         }\r
508                         free(lpit);\r
509                 }\r
510                 return DefWindowProc(wind, msg, wparam, lparam);\r
511                 \r
512 \r
513                 break;\r
514         case WM_COMMAND:\r
515                 if (LOWORD(wparam)==VOMP_FULL_SCREEN) {\r
516                         ToggleFullscreen();\r
517                         return 0;\r
518                 }\r
519                 if (((RemoteWin*)remote)->ReceiveButtonAP(LOWORD(wparam))){\r
520                         return 0; //yes we process that message\r
521                 } else {\r
522                         return DefWindowProc(wind, msg, wparam, lparam);\r
523                 }\r
524 \r
525                 break;\r
526         case WM_SETCURSOR:\r
527                 if (((HANDLE)wparam)==win) {\r
528                         SetCursor(NULL);\r
529                         return 1;\r
530                 } else {\r
531                         return DefWindowProc(wind, msg, wparam, lparam);\r
532                 }\r
533                 break;\r
534         case WM_SYSCOMMAND:\r
535                 if (wparam==SC_MAXIMIZE) {\r
536                         ToggleFullscreen();\r
537                         return 0;\r
538                 } else {\r
539                         return DefWindowProc(wind,msg,wparam, lparam);\r
540                 }\r
541                 break;\r
542     default:\r
543         return DefWindowProc(wind, msg, wparam, lparam);\r
544     }\r
545     return 0L;\r
546 }\r
547 \r
548 \r
549 bool InitApp(HINSTANCE hinst,int cmdshow) {\r
550         /* main window */\r
551         windows_ver.dwOSVersionInfoSize=sizeof(windows_ver);\r
552         GetVersionEx(&windows_ver);\r
553         WNDCLASS wcs;\r
554         DWORD flags;\r
555         wcs.style = CS_HREDRAW | CS_VREDRAW;\r
556     wcs.lpfnWndProc = WindowProc;\r
557     wcs.cbClsExtra = 0;\r
558     wcs.cbWndExtra = sizeof(DWORD);\r
559     wcs.hInstance = hinst;\r
560     wcs.hIcon = NULL;\r
561     wcs.hCursor = NULL;\r
562     wcs.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);\r
563     wcs.lpszMenuName = NULL;\r
564     wcs.lpszClassName = "vomp";\r
565         acc=LoadAccelerators(hinst,MAKEINTRESOURCE(VOMPACCELERATOR));\r
566         if (!RegisterClass(&wcs))\r
567         return false;\r
568         flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU \r
569                  |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX;\r
570         RECT wnted={50,50,768+50,576+50};\r
571         AdjustWindowRect(&wnted,flags ,false);\r
572         win_main=CreateWindow("vomp","VOMP on Windows",flags, CW_USEDEFAULT,CW_USEDEFAULT,\r
573                 wnted.right-wnted.left,wnted.bottom-wnted.top,NULL,NULL,hinst,NULL);\r
574         if (!win_main)\r
575         return FALSE;\r
576         ShowWindow(win_main,SW_SHOWNORMAL);\r
577     UpdateWindow(win_main);\r
578         /* in order to handle letterboxing we use a child window */\r
579         WNDCLASS child_wcs;\r
580         child_wcs.style = CS_HREDRAW | CS_VREDRAW;\r
581     child_wcs.lpfnWndProc = DefWindowProc;\r
582     child_wcs.cbClsExtra = 0;\r
583     child_wcs.cbWndExtra = sizeof(DWORD);\r
584     child_wcs.hInstance = hinst;\r
585     child_wcs.hIcon = NULL;\r
586     child_wcs.hCursor = NULL;\r
587     child_wcs.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);\r
588     child_wcs.lpszMenuName = NULL;\r
589     child_wcs.lpszClassName = "vomp_playback";\r
590         if (!RegisterClass(&child_wcs))\r
591         return false;\r
592 \r
593         win=CreateWindow("vomp_playback","Vomp Playback Window",WS_VISIBLE | WS_CHILD |WS_CLIPCHILDREN,\r
594                 0,0,768,576,win_main,NULL,hinst,NULL);\r
595         if (!win)\r
596                 return FALSE;\r
597         ShowWindow(win,SW_SHOWNORMAL);\r
598         UpdateWindow(win);\r
599         if (windows_ver.dwMajorVersion>5 || \r
600                 ( windows_ver.dwMajorVersion==5 && windows_ver.dwMinorVersion>=1)) {//at least windows XP\r
601                 /* We want to support MCE Remote controls*/\r
602                 RAWINPUTDEVICE remote_control_data[4];\r
603                 ZeroMemory(remote_control_data,sizeof(remote_control_data));\r
604                 remote_control_data[0].usUsagePage=0xFFBC; \r
605                 remote_control_data[0].usUsage=0x88; \r
606                 remote_control_data[0].dwFlags=0;\r
607                 remote_control_data[1].usUsagePage=0x0C; \r
608                 remote_control_data[1].usUsage=0x80; \r
609                 remote_control_data[1].dwFlags=0;\r
610                 remote_control_data[2].usUsagePage=0x0C; \r
611                 remote_control_data[2].usUsage=0x01; \r
612                 remote_control_data[2].dwFlags=0;\r
613                 remote_control_data[3].usUsagePage=0x01; \r
614                 remote_control_data[3].usUsage=0x80; \r
615                 remote_control_data[3].dwFlags=0;\r
616                 if (RegisterRawInputDevices(remote_control_data,4,sizeof(remote_control_data[0]))!=TRUE) {\r
617                         MessageBox(0,"Registering remote control failed!","Aborting!",0);\r
618                         return FALSE;\r
619                 }\r
620         \r
621         }\r
622         return TRUE;\r
623 }\r
624 \r
625 \r
626 \r
627 \r
628 \r
629 // -------------------------------------------------------------------------------------------------------------------\r
630 \r
631 void shutdown(int code)\r
632 {\r
633   if (viewman)\r
634   {\r
635     viewman->shutdown();\r
636     delete viewman;\r
637     logger->log("Core", Log::NOTICE, "ViewMan module shut down");\r
638   }\r
639 \r
640   if (command) // shut down command here in case views have posted messages\r
641   {\r
642     command->shutdown();\r
643     delete command;\r
644     logger->log("Core", Log::NOTICE, "Command module shut down");\r
645   }\r
646 \r
647   if (vdr)\r
648   {\r
649     vdr->shutdown();\r
650     delete vdr;\r
651     logger->log("Core", Log::NOTICE, "VDR module shut down");\r
652   }\r
653 \r
654   if (osd)\r
655   {\r
656     osd->shutdown();\r
657     delete osd;\r
658     logger->log("Core", Log::NOTICE, "OSD module shut down");\r
659   }\r
660 \r
661   if (audio)\r
662   {\r
663     audio->shutdown();\r
664     delete audio;\r
665     logger->log("Core", Log::NOTICE, "Audio module shut down");\r
666   }\r
667 \r
668   if (video)\r
669   {\r
670     video->shutdown();\r
671     delete video;\r
672     logger->log("Core", Log::NOTICE, "Video module shut down");\r
673   }\r
674 \r
675   if (timers)\r
676   {\r
677     timers->shutdown();\r
678     delete timers;\r
679     logger->log("Core", Log::NOTICE, "Timers module shut down");\r
680   }\r
681 \r
682   if (mtd)\r
683   {\r
684     mtd->shutdown();\r
685     delete mtd;\r
686     logger->log("Core", Log::NOTICE, "MTD module shut down");\r
687   }\r
688 \r
689   if (led)\r
690   {\r
691     led->shutdown();\r
692     delete led;\r
693     logger->log("Core", Log::NOTICE, "LED module shut down");\r
694   }\r
695 \r
696   if (remote)\r
697   {\r
698     remote->shutdown();\r
699     delete remote;\r
700     logger->log("Core", Log::NOTICE, "Remote module shut down");\r
701   }\r
702 \r
703   if (logger)\r
704   {\r
705     logger->log("Core", Log::NOTICE, "Log module shutting down... bye!\n\n");\r
706     logger->shutdown();\r
707     delete logger;\r
708   }\r
709   ExitProcess(0);\r
710 \r
711 }\r
712 \r
713 // -------------------------------------------------------------------------------------------------------------------\r
714 \r
715 ULLONG ntohll(ULLONG a)\r
716 {\r
717   return htonll(a);\r
718 }\r
719 \r
720 ULLONG htonll(ULLONG a)\r
721 {\r
722         return (((ULLONG)htonl((ULONG)((a<<32)>> 32))<<32) \r
723                 |(ULONG)htonl(((ULONG) (a >> 32))));\r
724 }\r
725 #endif\r