-/*
- Copyright 2004-2005 Chris Tallon
-
- This file is part of VOMP.
-
- VOMP 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.
-
- VOMP 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 VOMP; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-#ifdef WIN32
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <signal.h>
-
-#define _WIN32_WINNT 0x501
-#include <winsock2.h>
-#include <windows.h>
-
-#include "vompreswin.h"
-
-#include "defines.h"
-#include "log.h"
-#include "remotewin.h"
-#include "ledwin.h"
-#include "mtdwin.h"
-#include "timers.h"
-#include "videowin.h"
-#include "audiowin.h"
-#include "vdr.h"
-#include "osdwin.h"
-#include "viewman.h"
-#include "command.h"
-
-void sighandler(int signalReceived);
-void shutdown(int code);
-
-// Global variables --------------------------------------------------------------------------------------------------
-int debugEnabled = 0;
-Log* logger;
-Remote* remote;
-Mtd* mtd;
-Led* led;
-Osd* osd;
-Timers* timers;
-ViewMan* viewman;
-Command* command;
-VDR* vdr;
-Video* video;
-Audio* audio;
-
-
+/*\r
+ Copyright 2004-2005 Chris Tallon\r
+\r
+ This file is part of VOMP.\r
+\r
+ VOMP is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ VOMP is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with VOMP; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+*/\r
+#ifdef WIN32\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <signal.h>\r
+\r
+#define _WIN32_WINNT 0x501\r
+#include <winsock2.h>\r
+#include <windows.h>\r
+\r
+#include "vompreswin.h"\r
+\r
+#include "defines.h"\r
+#include "log.h"\r
+#include "remotewin.h"\r
+#include "ledwin.h"\r
+#include "mtdwin.h"\r
+#include "timers.h"\r
+#include "videowin.h"\r
+#include "audiowin.h"\r
+#include "vdr.h"\r
+#include "osdwin.h"\r
+#include "viewman.h"\r
+#include "command.h"\r
+\r
+void sighandler(int signalReceived);\r
+void shutdown(int code);\r
+\r
+// Global variables --------------------------------------------------------------------------------------------------\r
+int debugEnabled = 0;\r
+Log* logger;\r
+Remote* remote;\r
+Mtd* mtd;\r
+Led* led;\r
+Osd* osd;\r
+Timers* timers;\r
+ViewMan* viewman;\r
+Command* command;\r
+VDR* vdr;\r
+Video* video;\r
+Audio* audio;\r
+bool wnd_fullscreen=false;\r
+RECT wnd_fs_rect={20,20,768+20,576+20};\r
+RECT wnd_fs_rect_client={0,0,768,576};\r
+\r
+\r
void MILLISLEEP(ULONG a)
{
Sleep(a);
-}
-
-DWORD WINAPI commandthreadStart(void *arg)
-{
- command->run();
- return 0;
-}
-
-bool InitApp(HINSTANCE hinst,int cmdshow);
-
-HWND win;//global window handle
-HACCEL acc;
-
-#define ERROR_MSG(str) MessageBox(win,str,"Error!",MB_OK|MB_ICONWARNING)
-INT WINAPI WinMain( HINSTANCE hinst , HINSTANCE previnst, LPSTR cmdline, int cmdshow)
-{
- //On Windows we have to init a window, we use DXUT
- if (!InitApp(hinst,cmdshow)) return false;
- //Starting Network support
- WSADATA wsadat;
- int result = WSAStartup(MAKEWORD(2,2),&wsadat);
- if (result!=NO_ERROR) {
- ERROR_MSG("Initialising WinSocked: Error at WSAStartup()\n");
- return 0;
- }
- result= CoInitializeEx(NULL,COINIT_MULTITHREADED );//Initialize COM for DirectShow
- if (result!=S_OK) {
- ERROR_MSG("Initialising COM: Error at Coinitialize()\n");
- return 0;
- }
-
-
-
-
- // Init global vars ------------------------------------------------------------------------------------------------
-
- logger = new Log();
- remote = new RemoteWin();
- mtd = new MtdWin();
- led = new LedWin();
- timers = new Timers();
- osd = new OsdWin();
- vdr = new VDR();
- video = new VideoWin();
- audio = new AudioWin();
- viewman = new ViewMan();
- command = new Command();
-
- if (!logger || !remote || !mtd || !led || !osd || !video || !audio || !viewman || !command)
- {
- ERROR_MSG("Could not create objects. Memory problems?\n");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- // Get logging module started --------------------------------------------------------------------------------------
-
- if (!logger->init(Log::DEBUG, "vompwin.log", true))
- {
- ERROR_MSG("Could not initialise log object. Aborting.\n");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- logger->log("Core", Log::INFO, "Starting up...");
-
-
-
- // Init modules ----------------------------------------------------------------------------------------------------
- int success;
-
- success = remote->init("/dev/rawir");
- if (success)
- {
- logger->log("Core", Log::INFO, "Remote module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "Remote module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = led->init(0);
- if (success)
- {
- logger->log("Core", Log::INFO, "LED module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "LED module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = mtd->init("/dev/mtd1");
- if (success)
- {
- logger->log("Core", Log::INFO, "Mtd module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "Mtd module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = timers->init();
- if (success)
- {
- logger->log("Core", Log::INFO, "Timers module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "Timers module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- UCHAR videoFormat = (UCHAR)mtd->getPALorNTSC();
- if (videoFormat == Video::PAL) logger->log("Core", Log::INFO, "Read from MTD: PAL 720x576");
- else if (videoFormat == Video::NTSC) logger->log("Core", Log::INFO, "Read from MTD: NTSC 720x480");
- else logger->log("Core", Log::INFO, "No help from MTD. Assuming NTSC 720x480");
-
- success = video->init(videoFormat);
- if (success)
- {
- logger->log("Core", Log::INFO, "Video module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "Video module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = osd->init((void*)&win);
- if (success)
- {
- logger->log("Core", Log::INFO, "OSD module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "OSD module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = audio->init(Audio::MPEG2_PES);
- if (success)
- {
- logger->log("Core", Log::INFO, "Audio module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "Audio module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = vdr->init(3024);
- if (success)
- {
- logger->log("Core", Log::INFO, "VDR module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "VDR module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = viewman->init();
- if (success)
- {
- logger->log("Core", Log::INFO, "ViewMan module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "ViewMan module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- success = command->init();
- if (success)
- {
- logger->log("Core", Log::INFO, "Command module initialised");
- }
- else
- {
- logger->log("Core", Log::EMERG, "Command module failed to initialise");
- shutdown(1);
- WSACleanup();
- return 0;
- }
-
- // Other init ------------------------------------------------------------------------------------------------------
-
- logger->log("Core", Log::NOTICE, "Startup successful");
-
- // Run main loop ---------------------------------------------------------------------------------------------------
-
- // Ok, all major device components and other bits are loaded and ready
-
- HANDLE commandthread;
- commandthread= CreateThread(NULL, 0, commandthreadStart, NULL,0,
- NULL);
- MSG message;
- message.message=WM_NULL;
- bool run=true;
- while(run && WaitForSingleObject(commandthread,0)==WAIT_TIMEOUT) {
- if (PeekMessage(&message, NULL, 0,0,PM_REMOVE)!=0) {
- if (TranslateAccelerator(win,acc,&message)==NULL) {
- TranslateMessage(&message);
- DispatchMessage(&message);
- switch (message.message) {
- case WM_QUIT:
- run=false; //TODO post exit to command Messages
- };
- }
- } else {
- //Render
- ((OsdWin*)osd)->Render();
- }
- }
- // When that returns quit ------------------------------------------------------------------------------------------
- WaitForSingleObject(commandthread,INFINITE);
- shutdown(0);
- WSACleanup();
- return 0;
-
-}
-
-
-
-void CalculateWindowSize(RECT * size,ULONG size_mode) {
- DWORD width, height;
- DWORD adjheight,adjwidth;
- DWORD flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU
- |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX;
- RECT wnted={50,50,150,150};
- AdjustWindowRect(&wnted,flags ,false);
- adjwidth=-wnted.left+wnted.right-100;
- adjheight=-wnted.top+wnted.bottom-100;
- width=size->right-size->left-adjwidth;
- height=size->bottom-size->top-adjheight;
- UCHAR mode=video->getMode();
- UCHAR aspect=((VideoWin*)video)->getAspectRatio();
- UCHAR tvsize=((VideoWin*)video)->getPseudoTVsize();
- double aspectrt=4./3.;
- if (tvsize==Video::ASPECT16X9) {
- if (aspect==Video::ASPECT16X9) {
- aspectrt=4./3.; //looks strange, but it is a 16:9 tv
- } else if (aspect==Video::ASPECT4X3) {
- aspectrt=4./3./(16./9.)*(4./3.); //I hope this is correct
- }
- } else if (tvsize==Video::ASPECT4X3) {
- if (aspect==Video::ASPECT16X9) {
- if (mode==Video::LETTERBOX) {
- aspectrt=16./9.;
- } else {
- aspectrt=4./3.;
- }
- } if (aspect==Video::ASPECT4X3) {
- aspectrt=4./3.;
- }
- }
- switch (size_mode) {
- case WMSZ_BOTTOM:
- case WMSZ_BOTTOMRIGHT:
- case WMSZ_TOP:
- case WMSZ_TOPRIGHT:
- width=(ULONG)(((double)height)*aspectrt);
- size->right=size->left+width+adjwidth;
- break;
- case WMSZ_BOTTOMLEFT:
- case WMSZ_TOPLEFT:
- width=(ULONG)(((double)height)*aspectrt);
- size->left=size->right-width-adjwidth;
- break;
- case WMSZ_LEFT:
- case WMSZ_RIGHT:
- height=(ULONG)(((double)width)/aspectrt);
- size->bottom=size->top+height+adjheight;
- break;
- }
-}
-
-void AdjustWindow() {
- RECT winrect;
- GetWindowRect(win,&winrect);
- CalculateWindowSize(&winrect,WMSZ_BOTTOM);
- MoveWindow(win,winrect.left,
- winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,true);
-
-}
-
-LONG FAR PASCAL WindowProc(HWND win, UINT msg, WPARAM wparam, LPARAM lparam)
-{
- switch (msg) {
- case WM_DESTROY: {
- //TODO: call command
- logger->log("Core", Log::NOTICE, "Window closed, shutting down...");
- command->stop(); // FIXME this is probably not safe - use the messaging system / is that even safe?
- ((RemoteWin*)Remote::getInstance())->Signal();
- PostQuitMessage(0);
- }break;
- case WM_SIZING: {
- CalculateWindowSize((RECT*) lparam,wparam);
- return TRUE;
- }break;
- case WM_SIZE: {
- int width = LOWORD(lparam);
- int height = HIWORD(lparam);
- //Call device
- }
- break;
- case WM_PAINT:
- RECT r;
- PAINTSTRUCT ps;
- if (GetUpdateRect(win, &r, FALSE)) {
- BeginPaint(win, &ps);
- //Call Painting Mechanism
- EndPaint(win, &ps);
- }
- break;
- case WM_KEYDOWN:
- if (((RemoteWin*)remote)->ReceiveButtonVK(wparam)) {
- return 0L; //We process that Key
- } else {
- return DefWindowProc(win, msg, wparam, lparam);
- }
-
- break;
- case WM_APPCOMMAND:
- if (((RemoteWin*)remote)->ReceiveButtonAP(GET_APPCOMMAND_LPARAM(lparam))){
- return TRUE; //yes we process that message
- } else {
- return DefWindowProc(win, msg, wparam, lparam);
- }
-
- break;
- case WM_COMMAND:
- if (((RemoteWin*)remote)->ReceiveButtonAP(LOWORD(wparam))){
- return 0; //yes we process that message
- } else {
- return DefWindowProc(win, msg, wparam, lparam);
- }
-
- break;
- default:
- return DefWindowProc(win, msg, wparam, lparam);
- }
- return 0L;
-}
-
-
-bool InitApp(HINSTANCE hinst,int cmdshow) {
- WNDCLASS wcs;
- DWORD flags;
- wcs.style = CS_HREDRAW | CS_VREDRAW;
- wcs.lpfnWndProc = WindowProc;
- wcs.cbClsExtra = 0;
- wcs.cbWndExtra = sizeof(DWORD);
- wcs.hInstance = hinst;
- wcs.hIcon = NULL;
- wcs.hCursor = NULL;
- wcs.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
- wcs.lpszMenuName = NULL;
- wcs.lpszClassName = "vomp";
- acc=LoadAccelerators(hinst,MAKEINTRESOURCE(VOMPACCELERATOR));
- if (!RegisterClass(&wcs))
- return false;
- flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU
- |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX;
- RECT wnted={50,50,768+50,576+50};
- AdjustWindowRect(&wnted,flags ,false);
- win=CreateWindow("vomp","vomp",flags, CW_USEDEFAULT,CW_USEDEFAULT,
- wnted.right-wnted.left,wnted.bottom-wnted.top,NULL,NULL,hinst,NULL);
- if (!win)
- return FALSE;
- ShowWindow(win,SW_SHOWNORMAL);
- UpdateWindow(win);
- return TRUE;
-}
-
-
-
-
-
-// -------------------------------------------------------------------------------------------------------------------
-
-void shutdown(int code)
-{
- if (viewman)
- {
- viewman->shutdown();
- delete viewman;
- logger->log("Core", Log::NOTICE, "ViewMan module shut down");
- }
-
- if (command) // shut down command here in case views have posted messages
- {
- command->shutdown();
- delete command;
- logger->log("Core", Log::NOTICE, "Command module shut down");
- }
-
- if (vdr)
- {
- vdr->shutdown();
- delete vdr;
- logger->log("Core", Log::NOTICE, "VDR module shut down");
- }
-
- if (osd)
- {
- osd->shutdown();
- delete osd;
- logger->log("Core", Log::NOTICE, "OSD module shut down");
- }
-
- if (audio)
- {
- audio->shutdown();
- delete audio;
- logger->log("Core", Log::NOTICE, "Audio module shut down");
- }
-
- if (video)
- {
- video->shutdown();
- delete video;
- logger->log("Core", Log::NOTICE, "Video module shut down");
- }
-
- if (timers)
- {
- timers->shutdown();
- delete timers;
- logger->log("Core", Log::NOTICE, "Timers module shut down");
- }
-
- if (mtd)
- {
- mtd->shutdown();
- delete mtd;
- logger->log("Core", Log::NOTICE, "MTD module shut down");
- }
-
- if (led)
- {
- led->shutdown();
- delete led;
- logger->log("Core", Log::NOTICE, "LED module shut down");
- }
-
- if (remote)
- {
- remote->shutdown();
- delete remote;
- logger->log("Core", Log::NOTICE, "Remote module shut down");
- }
-
- if (logger)
- {
- logger->log("Core", Log::NOTICE, "Log module shutting down... bye!\n\n");
- logger->shutdown();
- delete logger;
- }
- ExitProcess(0);
-
-}
-
-// -------------------------------------------------------------------------------------------------------------------
-
-ULLONG ntohll(ULLONG a)
-{
- return htonll(a);
-}
-
-ULLONG htonll(ULLONG a)
-{
- return (((ULLONG)htonl((ULONG)((a<<32)>> 32))<<32)
- |(ULONG)htonl(((ULONG) (a >> 32))));
-}
-#endif
+}\r
+\r
+DWORD WINAPI commandthreadStart(void *arg)\r
+{\r
+ command->run();\r
+ return 0;\r
+}\r
+\r
+bool InitApp(HINSTANCE hinst,int cmdshow);\r
+\r
+HWND win_main;//global window handle\r
+HWND win;//global child window handle\r
+HACCEL acc;\r
+\r
+#define ERROR_MSG(str) MessageBox(win_main,str,"Error!",MB_OK|MB_ICONWARNING)\r
+INT WINAPI WinMain( HINSTANCE hinst , HINSTANCE previnst, LPSTR cmdline, int cmdshow)\r
+{\r
+ //On Windows we have to init a window, we use DXUT\r
+ if (!InitApp(hinst,cmdshow)) return false;\r
+ //Starting Network support\r
+ WSADATA wsadat; \r
+ int result = WSAStartup(MAKEWORD(2,2),&wsadat);\r
+ if (result!=NO_ERROR) {\r
+ ERROR_MSG("Initialising WinSocked: Error at WSAStartup()\n");\r
+ return 0;\r
+ }\r
+ result= CoInitializeEx(NULL,COINIT_MULTITHREADED );//Initialize COM for DirectShow\r
+ if (result!=S_OK) {\r
+ ERROR_MSG("Initialising COM: Error at Coinitialize()\n");\r
+ return 0;\r
+ }\r
+\r
+\r
+\r
+\r
+ // Init global vars ------------------------------------------------------------------------------------------------\r
+\r
+ logger = new Log();\r
+ remote = new RemoteWin();\r
+ mtd = new MtdWin();\r
+ led = new LedWin();\r
+ timers = new Timers();\r
+ osd = new OsdWin();\r
+ vdr = new VDR();\r
+ video = new VideoWin();\r
+ audio = new AudioWin();\r
+ viewman = new ViewMan();\r
+ command = new Command();\r
+\r
+ if (!logger || !remote || !mtd || !led || !osd || !video || !audio || !viewman || !command)\r
+ {\r
+ ERROR_MSG("Could not create objects. Memory problems?\n");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ // Get logging module started --------------------------------------------------------------------------------------\r
+\r
+ if (!logger->init(Log::DEBUG, "vompwin.log", true))\r
+ {\r
+ ERROR_MSG("Could not initialise log object. Aborting.\n");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ logger->log("Core", Log::INFO, "Starting up...");\r
+ \r
+\r
+\r
+ // Init modules ----------------------------------------------------------------------------------------------------\r
+ int success;\r
+\r
+ success = remote->init("/dev/rawir");\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "Remote module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "Remote module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = led->init(0);\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "LED module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "LED module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = mtd->init("/dev/mtd1");\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "Mtd module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "Mtd module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = timers->init();\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "Timers module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "Timers module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ UCHAR videoFormat = (UCHAR)mtd->getPALorNTSC();\r
+ if (videoFormat == Video::PAL) logger->log("Core", Log::INFO, "Read from MTD: PAL 720x576");\r
+ else if (videoFormat == Video::NTSC) logger->log("Core", Log::INFO, "Read from MTD: NTSC 720x480");\r
+ else logger->log("Core", Log::INFO, "No help from MTD. Assuming NTSC 720x480");\r
+\r
+ success = video->init(videoFormat);\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "Video module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "Video module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = osd->init((void*)&win);\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "OSD module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "OSD module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = audio->init(Audio::MPEG2_PES);\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "Audio module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "Audio module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = vdr->init(3024);\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "VDR module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "VDR module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = viewman->init();\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "ViewMan module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "ViewMan module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ success = command->init();\r
+ if (success)\r
+ {\r
+ logger->log("Core", Log::INFO, "Command module initialised");\r
+ }\r
+ else\r
+ {\r
+ logger->log("Core", Log::EMERG, "Command module failed to initialise");\r
+ shutdown(1);\r
+ WSACleanup();\r
+ return 0;\r
+ }\r
+\r
+ // Other init ------------------------------------------------------------------------------------------------------\r
+\r
+ logger->log("Core", Log::NOTICE, "Startup successful");\r
+\r
+ // Run main loop ---------------------------------------------------------------------------------------------------\r
+\r
+ // Ok, all major device components and other bits are loaded and ready\r
+ \r
+ HANDLE commandthread;\r
+ commandthread= CreateThread(NULL, 0, commandthreadStart, NULL,0, \r
+ NULL);\r
+ MSG message;\r
+ message.message=WM_NULL;\r
+ bool run=true;\r
+ while(run && WaitForSingleObject(commandthread,0)==WAIT_TIMEOUT) {\r
+ if (PeekMessage(&message, NULL, 0,0,PM_REMOVE)!=0) {\r
+ if (TranslateAccelerator(win_main,acc,&message)==NULL) {\r
+ TranslateMessage(&message);\r
+ DispatchMessage(&message);\r
+ switch (message.message) {\r
+ case WM_QUIT:\r
+ run=false; //TODO post exit to command Messages\r
+ };\r
+ }\r
+ } else {\r
+ //Render\r
+ ((OsdWin*)osd)->Render();\r
+ }\r
+ }\r
+ // When that returns quit ------------------------------------------------------------------------------------------\r
+ WaitForSingleObject(commandthread,INFINITE);\r
+ shutdown(0);\r
+ WSACleanup();\r
+ return 0;\r
+\r
+}\r
+\r
+\r
+\r
+void CalculateWindowSize(RECT * size,ULONG size_mode) {\r
+ \r
+ DWORD width, height;\r
+ DWORD adjheight,adjwidth;\r
+ if (!wnd_fullscreen) {\r
+ DWORD flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU \r
+ |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX;\r
+ RECT wnted={50,50,150,150};\r
+ AdjustWindowRect(&wnted,flags ,false);\r
+ adjwidth=-wnted.left+wnted.right-100;\r
+ adjheight=-wnted.top+wnted.bottom-100;\r
+ } else {\r
+ adjwidth=adjheight=0;\r
+ }\r
+ width=size->right-size->left-adjwidth;\r
+ height=size->bottom-size->top-adjheight;\r
+ UCHAR mode=video->getMode();\r
+ UCHAR aspect=((VideoWin*)video)->getAspectRatio();\r
+ UCHAR tvsize=((VideoWin*)video)->getPseudoTVsize();\r
+ double aspectrt=4./3.;\r
+ if (tvsize==Video::ASPECT16X9) {\r
+ if (aspect==Video::ASPECT16X9) {\r
+ aspectrt=4./3.; //looks strange, but it is a 16:9 tv\r
+ } else if (aspect==Video::ASPECT4X3) {\r
+ aspectrt=4./3./(16./9.)*(4./3.); //I hope this is correct\r
+ }\r
+ } else if (tvsize==Video::ASPECT4X3) {\r
+ if (aspect==Video::ASPECT16X9) {\r
+ if (mode!=Video::NORMAL) {\r
+ aspectrt=16./9.;\r
+ } else {\r
+ aspectrt=4./3.;\r
+ }\r
+ } else if (aspect==Video::ASPECT4X3) {\r
+ aspectrt=4./3.;\r
+ }\r
+ }\r
+ if (!wnd_fullscreen) {\r
+ switch (size_mode) {\r
+ case WMSZ_BOTTOM:\r
+ case WMSZ_BOTTOMRIGHT:\r
+ case WMSZ_TOP:\r
+ case WMSZ_TOPRIGHT:\r
+ width=(ULONG)(((double)height)*aspectrt);\r
+ size->right=size->left+width+adjwidth;\r
+ break;\r
+ case WMSZ_BOTTOMLEFT:\r
+ case WMSZ_TOPLEFT:\r
+ width=(ULONG)(((double)height)*aspectrt);\r
+ size->left=size->right-width-adjwidth;\r
+ break;\r
+ case WMSZ_LEFT:\r
+ case WMSZ_RIGHT:\r
+ height=(ULONG)(((double)width)/aspectrt);\r
+ size->bottom=size->top+height+adjheight;\r
+ break;\r
+ }\r
+ MoveWindow(win,0,0,width,height,TRUE);\r
+ } else {\r
+ RECT newrect={0,0,width,height};\r
+ DWORD newlength;\r
+ if ((ULONG)(((double)height)*aspectrt)>width) {\r
+ newlength=(ULONG)(((double)width)/aspectrt);\r
+ newrect.top+=(height-newlength)/2;\r
+ newrect.bottom-=(height-newlength);\r
+ } else {\r
+ newlength=(ULONG)(((double)height)*aspectrt);\r
+ newrect.left+=(width-newlength)/2;\r
+ newrect.right-=(width-newlength);\r
+ }\r
+ MoveWindow(win,newrect.left,newrect.top,newrect.right,newrect.bottom,TRUE);\r
+ }\r
+ \r
+}\r
+\r
+void AdjustWindow() {\r
+ if (!wnd_fullscreen) {\r
+ RECT winrect;\r
+ GetWindowRect(win_main,&winrect);\r
+ CalculateWindowSize(&winrect,WMSZ_BOTTOM);\r
+ MoveWindow(win_main,winrect.left,\r
+ winrect.top,winrect.right-winrect.left,winrect.bottom-winrect.top,true);\r
+ } else {\r
+ RECT winrect;\r
+ GetWindowRect(win_main,&winrect);\r
+ CalculateWindowSize(&winrect,WMSZ_BOTTOM);\r
+\r
+ }\r
+}\r
+\r
+void ToggleFullscreen() {\r
+ if (wnd_fullscreen) {\r
+ wnd_fullscreen=false;\r
+ SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU \r
+ |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX);\r
+ SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
+\r
+ SetWindowPos(win_main,HWND_TOP,wnd_fs_rect.left,wnd_fs_rect.top,\r
+ wnd_fs_rect.right-wnd_fs_rect.left,\r
+ wnd_fs_rect.bottom-wnd_fs_rect.top,\r
+ SWP_DRAWFRAME | SWP_FRAMECHANGED);\r
+ MoveWindow(win,wnd_fs_rect_client.left,wnd_fs_rect_client.top,\r
+ wnd_fs_rect_client.right-wnd_fs_rect_client.left,\r
+ wnd_fs_rect_client.bottom-wnd_fs_rect_client.top,TRUE);\r
+ AdjustWindow();\r
+ } else {\r
+ GetWindowRect(win_main,&wnd_fs_rect);\r
+ GetWindowRect(win,&wnd_fs_rect_client);\r
+ SetWindowLong(win_main,GWL_STYLE,WS_VISIBLE | WS_POPUP );\r
+ SetWindowPos(win_main,NULL,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);\r
+ HMONITOR monitor=MonitorFromWindow(win_main,MONITOR_DEFAULTTONEAREST); \r
+ MONITORINFO moninfo;\r
+ moninfo.cbSize=sizeof(moninfo);\r
+ wnd_fullscreen=true;\r
+ if (!GetMonitorInfo(monitor,&moninfo)) return ;\r
+ SetWindowPos(win_main,HWND_TOP,moninfo.rcMonitor.left,moninfo.rcMonitor.top,\r
+ moninfo.rcMonitor.right,moninfo.rcMonitor.bottom,SWP_FRAMECHANGED);\r
+ \r
+ AdjustWindow();\r
+ \r
+ }\r
+\r
+\r
+}\r
+\r
+LONG FAR PASCAL WindowProc(HWND wind, UINT msg, WPARAM wparam, LPARAM lparam)\r
+{\r
+ switch (msg) {\r
+ case WM_DESTROY: {\r
+ //TODO: call command\r
+ logger->log("Core", Log::NOTICE, "Window closed, shutting down...");\r
+ command->stop(); // FIXME this is probably not safe - use the messaging system / is that even safe?\r
+ ((RemoteWin*)Remote::getInstance())->Signal();\r
+ PostQuitMessage(0);\r
+ }break;\r
+ case WM_SIZING: {\r
+ CalculateWindowSize((RECT*) lparam,wparam);\r
+ return TRUE;\r
+ }break;\r
+ case WM_SIZE: {\r
+ int width = LOWORD(lparam);\r
+ int height = HIWORD(lparam);\r
+ //Call device\r
+ }\r
+ break;\r
+ case WM_PAINT:\r
+ RECT r;\r
+ PAINTSTRUCT ps;\r
+ if (GetUpdateRect(wind, &r, FALSE)) {\r
+ BeginPaint(wind, &ps);\r
+ //Call Painting Mechanism\r
+ EndPaint(wind, &ps);\r
+ }\r
+ break;\r
+ case WM_KEYDOWN:\r
+ if (((RemoteWin*)remote)->ReceiveButtonVK(wparam)) {\r
+ return 0L; //We process that Key\r
+ } else {\r
+ return DefWindowProc(wind, msg, wparam, lparam);\r
+ }\r
+\r
+ break;\r
+ case WM_APPCOMMAND:\r
+ if (((RemoteWin*)remote)->ReceiveButtonAP(GET_APPCOMMAND_LPARAM(lparam))){\r
+ return TRUE; //yes we process that message\r
+ } else {\r
+ return DefWindowProc(wind, msg, wparam, lparam);\r
+ }\r
+\r
+ break;\r
+ case WM_COMMAND:\r
+ if (LOWORD(wparam)==VOMP_FULL_SCREEN) {\r
+ ToggleFullscreen();\r
+ return 0;\r
+ }\r
+ if (((RemoteWin*)remote)->ReceiveButtonAP(LOWORD(wparam))){\r
+ return 0; //yes we process that message\r
+ } else {\r
+ return DefWindowProc(wind, msg, wparam, lparam);\r
+ }\r
+\r
+ break;\r
+ case WM_SETCURSOR:\r
+ if (((HANDLE)wparam)==win) {\r
+ SetCursor(NULL);\r
+ return 1;\r
+ } else {\r
+ return DefWindowProc(wind, msg, wparam, lparam);\r
+ }\r
+ break;\r
+ default:\r
+ return DefWindowProc(wind, msg, wparam, lparam);\r
+ }\r
+ return 0L;\r
+}\r
+\r
+\r
+bool InitApp(HINSTANCE hinst,int cmdshow) {\r
+ /* main window */\r
+ WNDCLASS wcs;\r
+ DWORD flags;\r
+ wcs.style = CS_HREDRAW | CS_VREDRAW;\r
+ wcs.lpfnWndProc = WindowProc;\r
+ wcs.cbClsExtra = 0;\r
+ wcs.cbWndExtra = sizeof(DWORD);\r
+ wcs.hInstance = hinst;\r
+ wcs.hIcon = NULL;\r
+ wcs.hCursor = NULL;\r
+ wcs.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);\r
+ wcs.lpszMenuName = NULL;\r
+ wcs.lpszClassName = "vomp";\r
+ acc=LoadAccelerators(hinst,MAKEINTRESOURCE(VOMPACCELERATOR));\r
+ if (!RegisterClass(&wcs))\r
+ return false;\r
+ flags =WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU \r
+ |WS_MINIMIZEBOX | WS_SIZEBOX |WS_MAXIMIZEBOX;\r
+ RECT wnted={50,50,768+50,576+50};\r
+ AdjustWindowRect(&wnted,flags ,false);\r
+ win_main=CreateWindow("vomp","VOMP on Windows",flags, CW_USEDEFAULT,CW_USEDEFAULT,\r
+ wnted.right-wnted.left,wnted.bottom-wnted.top,NULL,NULL,hinst,NULL);\r
+ if (!win_main)\r
+ return FALSE;\r
+ ShowWindow(win_main,SW_SHOWNORMAL);\r
+ UpdateWindow(win_main);\r
+ /* in order to handle letterboxing we use a child window */\r
+ WNDCLASS child_wcs;\r
+ child_wcs.style = CS_HREDRAW | CS_VREDRAW;\r
+ child_wcs.lpfnWndProc = DefWindowProc;\r
+ child_wcs.cbClsExtra = 0;\r
+ child_wcs.cbWndExtra = sizeof(DWORD);\r
+ child_wcs.hInstance = hinst;\r
+ child_wcs.hIcon = NULL;\r
+ child_wcs.hCursor = NULL;\r
+ child_wcs.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);\r
+ child_wcs.lpszMenuName = NULL;\r
+ child_wcs.lpszClassName = "vomp_playback";\r
+ if (!RegisterClass(&child_wcs))\r
+ return false;\r
+\r
+ win=CreateWindow("vomp_playback","Vomp Playback Window",WS_VISIBLE | WS_CHILD |WS_CLIPCHILDREN,\r
+ 0,0,768,576,win_main,NULL,hinst,NULL);\r
+ if (!win)\r
+ return FALSE;\r
+ ShowWindow(win,SW_SHOWNORMAL);\r
+ UpdateWindow(win);\r
+ return TRUE;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+// -------------------------------------------------------------------------------------------------------------------\r
+\r
+void shutdown(int code)\r
+{\r
+ if (viewman)\r
+ {\r
+ viewman->shutdown();\r
+ delete viewman;\r
+ logger->log("Core", Log::NOTICE, "ViewMan module shut down");\r
+ }\r
+\r
+ if (command) // shut down command here in case views have posted messages\r
+ {\r
+ command->shutdown();\r
+ delete command;\r
+ logger->log("Core", Log::NOTICE, "Command module shut down");\r
+ }\r
+\r
+ if (vdr)\r
+ {\r
+ vdr->shutdown();\r
+ delete vdr;\r
+ logger->log("Core", Log::NOTICE, "VDR module shut down");\r
+ }\r
+\r
+ if (osd)\r
+ {\r
+ osd->shutdown();\r
+ delete osd;\r
+ logger->log("Core", Log::NOTICE, "OSD module shut down");\r
+ }\r
+\r
+ if (audio)\r
+ {\r
+ audio->shutdown();\r
+ delete audio;\r
+ logger->log("Core", Log::NOTICE, "Audio module shut down");\r
+ }\r
+\r
+ if (video)\r
+ {\r
+ video->shutdown();\r
+ delete video;\r
+ logger->log("Core", Log::NOTICE, "Video module shut down");\r
+ }\r
+\r
+ if (timers)\r
+ {\r
+ timers->shutdown();\r
+ delete timers;\r
+ logger->log("Core", Log::NOTICE, "Timers module shut down");\r
+ }\r
+\r
+ if (mtd)\r
+ {\r
+ mtd->shutdown();\r
+ delete mtd;\r
+ logger->log("Core", Log::NOTICE, "MTD module shut down");\r
+ }\r
+\r
+ if (led)\r
+ {\r
+ led->shutdown();\r
+ delete led;\r
+ logger->log("Core", Log::NOTICE, "LED module shut down");\r
+ }\r
+\r
+ if (remote)\r
+ {\r
+ remote->shutdown();\r
+ delete remote;\r
+ logger->log("Core", Log::NOTICE, "Remote module shut down");\r
+ }\r
+\r
+ if (logger)\r
+ {\r
+ logger->log("Core", Log::NOTICE, "Log module shutting down... bye!\n\n");\r
+ logger->shutdown();\r
+ delete logger;\r
+ }\r
+ ExitProcess(0);\r
+\r
+}\r
+\r
+// -------------------------------------------------------------------------------------------------------------------\r
+\r
+ULLONG ntohll(ULLONG a)\r
+{\r
+ return htonll(a);\r
+}\r
+\r
+ULLONG htonll(ULLONG a)\r
+{\r
+ return (((ULLONG)htonl((ULONG)((a<<32)>> 32))<<32) \r
+ |(ULONG)htonl(((ULONG) (a >> 32))));\r
+}\r
+#endif\r