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