Merged from linuxport rev21200:21590. Updated.
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / Application.h
1 #pragma once
2
3 /*
4  *      Copyright (C) 2005-2008 Team XBMC
5  *      http://xbmc.org
6  *
7  *  This Program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2, or (at your option)
10  *  any later version.
11  *
12  *  This Program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with XBMC; see the file COPYING.  If not, write to
19  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
20  *  http://www.gnu.org/copyleft/gpl.html
21  *
22  */
23
24 #include "XBApplicationEx.h"
25
26 #include "IMsgTargetCallback.h"
27 #include "Key.h"
28
29 class CFileItem;
30 class CFileItemList;
31
32 #include "GUIDialogSeekBar.h"
33 #include "GUIDialogKaiToast.h"
34 #include "GUIDialogVolumeBar.h"
35 #include "GUIDialogMuteBug.h"
36 #include "GUIWindowPointer.h"   // Mouse pointer
37 #include "Settings.h"
38
39 #include "utils/DelayController.h"
40 #include "cores/IPlayer.h"
41 #include "cores/PlayerCoreFactory.h"
42 #include "PlayListPlayer.h"
43 #include "DetectDVDType.h"
44 #include "Autorun.h"
45 #include "utils/Splash.h"
46 #include "utils/Stopwatch.h"
47 #include "ApplicationMessenger.h"
48 #include "utils/Network.h"
49 #include "MusicDatabase.h"
50 #include "VideoDatabase.h"
51 #ifdef HAS_PERFORMANCE_SAMPLE
52 #include "utils/PerformanceStats.h"
53 #endif
54 #ifdef _LINUX
55 #include "linux/LinuxResourceCounter.h"
56 #endif
57 #ifdef _WIN32PC
58 #include "WIN32Util.h"
59 #include "WINMessageHandler.h"
60 #endif
61
62 class CWebServer;
63 class CXBFileZilla;
64 class CSNTPClient;
65 class CKaraokeLyricsManager;
66 class CApplicationMessenger;
67 class DPMSSupport;
68
69 class CBackgroundPlayer : public CThread
70 {
71 public:
72   CBackgroundPlayer(const CFileItem &item, int iPlayList);
73   virtual ~CBackgroundPlayer();
74   virtual void Process();
75 protected:
76   CFileItem *m_item;
77   int       m_iPlayList;
78 };
79
80 class CApplication : public CXBApplicationEx, public IPlayerCallback, public IMsgTargetCallback
81 {
82 public:
83   CApplication(void);
84   virtual ~CApplication(void);
85   virtual HRESULT Initialize();
86   virtual void FrameMove();
87   virtual void Render();
88   virtual void DoRender();
89   virtual void RenderNoPresent();
90   virtual void Preflight();
91   virtual HRESULT Create(HWND hWnd);
92   virtual HRESULT Cleanup();
93
94   void StartServices();
95   void StopServices();
96   void StartWebServer();
97   void StopWebServer();
98   void StartFtpServer();
99   void StopFtpServer();
100   void StartTimeServer();
101   void StopTimeServer();
102   void StartUPnP();
103   void StopUPnP();
104   void StartUPnPRenderer();
105   void StopUPnPRenderer();
106   void StartUPnPClient();
107   void StopUPnPClient();
108   void StartUPnPServer();
109   void StopUPnPServer();
110   void StartEventServer();
111   bool StopEventServer(bool promptuser=false);
112   void RefreshEventServer();
113   void StartDbusServer();
114   bool StopDbusServer();
115   void StartZeroconf();
116   void StopZeroconf();
117   void DimLCDOnPlayback(bool dim);
118   DWORD GetThreadId() const { return m_threadID; };
119   void Stop();
120   void RestartApp();
121   void LoadSkin(const CStdString& strSkin);
122   void UnloadSkin();
123   bool LoadUserWindows(const CStdString& strSkinPath);
124   void DelayLoadSkin();
125   void CancelDelayLoadSkin();
126   void ReloadSkin();
127   const CStdString& CurrentFile();
128   CFileItem& CurrentFileItem();
129   virtual bool OnMessage(CGUIMessage& message);
130   PLAYERCOREID GetCurrentPlayer();
131   virtual void OnPlayBackEnded();
132   virtual void OnPlayBackStarted();
133   virtual void OnPlayBackStopped();
134   virtual void OnQueueNextItem();
135   bool PlayMedia(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC);
136   bool PlayMediaSync(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC);
137   bool ProcessAndStartPlaylist(const CStdString& strPlayList, PLAYLIST::CPlayList& playlist, int iPlaylist);
138   bool PlayFile(const CFileItem& item, bool bRestart = false);
139   void SaveFileState();
140   void UpdateFileState();
141   void StopPlaying();
142   void Restart(bool bSamePosition = true);
143   void DelayedPlayerRestart();
144   void CheckDelayedPlayerRestart();
145   void RenderFullScreen();
146   void DoRenderFullScreen();
147   bool NeedRenderFullScreen();
148   bool IsPlaying() const;
149   bool IsPaused() const;
150   bool IsPlayingAudio() const;
151   bool IsPlayingVideo() const;
152   bool IsPlayingFullScreenVideo() const;
153   bool IsStartingPlayback() const { return m_bPlaybackStarting; }
154   bool OnKey(CKey& key);
155   bool OnAction(CAction &action);
156   void RenderMemoryStatus();
157   void CheckShutdown();
158   // Checks whether the screensaver and / or DPMS should become active.
159   void CheckScreenSaverAndDPMS();
160   void CheckPlayingProgress();
161   void CheckAudioScrobblerStatus();
162   void ActivateScreenSaver(bool forceType = false);
163
164   virtual void Process();
165   void ProcessSlow();
166   void ResetScreenSaver();
167   int GetVolume() const;
168   void SetVolume(int iPercent);
169   void Mute(void);
170   int GetPlaySpeed() const;
171   int GetSubtitleDelay() const;
172   int GetAudioDelay() const;
173   void SetPlaySpeed(int iSpeed);
174   bool IsButtonDown(DWORD code);
175   bool AnyButtonDown();
176   void ResetScreenSaverTimer();
177   // Wakes up from the screensaver and / or DPMS. Returns true if woken up.
178   bool WakeUpScreenSaverAndDPMS();
179   bool WakeUpScreenSaver();
180   double GetTotalTime() const;
181   double GetTime() const;
182   float GetPercentage() const;
183   void SeekPercentage(float percent);
184   void SeekTime( double dTime = 0.0 );
185   void ResetPlayTime();
186
187   void SaveMusicScanSettings();
188   void RestoreMusicScanSettings();
189   void CheckMusicPlaylist();
190
191   bool ExecuteXBMCAction(std::string action);
192   bool ExecuteAction(CGUIActionDescriptor action);
193
194   CApplicationMessenger& getApplicationMessenger();
195 #if defined(HAS_LINUX_NETWORK)
196   CNetworkLinux& getNetwork();
197 #elif defined(HAS_WIN32_NETWORK)
198   CNetworkWin32& getNetwork();
199 #else
200   CNetwork& getNetwork();
201 #endif
202 #ifdef HAS_PERFORMANCE_SAMPLE
203   CPerformanceStats &GetPerformanceStats();
204 #endif
205
206   CGUIDialogVolumeBar m_guiDialogVolumeBar;
207   CGUIDialogSeekBar m_guiDialogSeekBar;
208   CGUIDialogKaiToast m_guiDialogKaiToast;
209   CGUIDialogMuteBug m_guiDialogMuteBug;
210   CGUIWindowPointer m_guiPointer;
211
212   MEDIA_DETECT::CAutorun m_Autorun;
213   MEDIA_DETECT::CDetectDVDMedia m_DetectDVDType;
214   CDelayController m_ctrDpad;
215   CSNTPClient *m_psntpClient;
216   CWebServer* m_pWebServer;
217   CXBFileZilla* m_pFileZilla;
218   IPlayer* m_pPlayer;
219
220   bool m_bSpinDown;
221   bool m_bNetworkSpinDown;
222   DWORD m_dwSpinDownTime;
223
224   inline bool IsInScreenSaver() { return m_bScreenSave; };
225   int m_iScreenSaveLock; // spiff: are we checking for a lock? if so, ignore the screensaver state, if -1 we have failed to input locks
226
227   DWORD m_dwSkinTime;
228   bool m_bIsPaused;
229   bool m_bPlaybackStarting;
230
231   CKaraokeLyricsManager* m_pKaraokeMgr;
232
233   PLAYERCOREID m_eForcedNextPlayer;
234   CStdString m_strPlayListFile;
235
236   int GlobalIdleTime();
237   void NewFrame();
238   bool WaitFrame(DWORD timeout);
239
240   void EnablePlatformDirectories(bool enable=true)
241   {
242     m_bPlatformDirectories = enable;
243   }
244
245   bool PlatformDirectoriesEnabled()
246   {
247     return m_bPlatformDirectories;
248   }
249
250   void SetStandAlone(bool value)
251   {
252     m_bStandalone = value;
253   }
254
255   bool IsStandAlone()
256   {
257     return m_bStandalone;
258   }
259
260   void SetEnableLegacyRes(bool value)
261   {
262     m_bEnableLegacyRes = value;
263   }
264
265   bool IsEnableLegacyRes()
266   {
267     return m_bEnableLegacyRes;
268   }
269
270   bool IsPresentFrame();
271
272   void Minimize(bool minimize = true);
273
274   bool m_bRunResumeJobs;
275
276 protected:
277   void RenderScreenSaver();
278
279   friend class CApplicationMessenger;
280   // screensaver
281   bool m_bScreenSave;
282   CStdString m_screenSaverMode;
283 #ifndef HAS_SDL
284   D3DGAMMARAMP m_OldRamp;
285 #else
286   Uint16 m_OldRampRed[256];
287   Uint16 m_OldRampGreen[256];
288   Uint16 m_OldRampBlue[256];
289 #endif
290
291   // timer information
292   CStopWatch m_idleTimer;
293   CStopWatch m_restartPlayerTimer;
294   CStopWatch m_frameTime;
295   CStopWatch m_navigationTimer;
296   CStopWatch m_slowTimer;
297   CStopWatch m_screenSaverTimer;
298   CStopWatch m_shutdownTimer;
299
300   DWORD      m_lastActionCode;
301   CStopWatch m_lastActionTimer;
302
303   DPMSSupport* m_dpms;
304   bool m_dpmsIsActive;
305
306   CFileItemPtr m_itemCurrentFile;
307   CFileItemList* m_currentStack;
308   CStdString m_prevMedia;
309   CSplash* m_splash;
310   DWORD m_threadID;       // application thread ID.  Used in applicationMessanger to know where we are firing a thread with delay from.
311   PLAYERCOREID m_eCurrentPlayer;
312   bool m_bXboxMediacenterLoaded;
313   bool m_bSettingsLoaded;
314   bool m_bAllSettingsLoaded;
315   bool m_bInitializing;
316   bool m_bPlatformDirectories;
317
318   CBookmark m_progressTrackingVideoResumeBookmark;
319   CFileItemPtr m_progressTrackingItem;
320   bool m_progressTrackingPlayCountUpdate;
321
322   int m_iPlaySpeed;
323   int m_currentStackPosition;
324   int m_nextPlaylistItem;
325
326   bool m_bPresentFrame;
327
328   bool m_bStandalone;
329   bool m_bEnableLegacyRes;
330   bool m_bWasFullScreenBeforeMinimize;
331
332 #ifdef HAS_SDL
333   int        m_frameCount;
334   SDL_mutex* m_frameMutex;
335   SDL_cond*  m_frameCond;
336 #endif
337
338   void SetHardwareVolume(long hardwareVolume);
339   void UpdateLCD();
340   void FatalErrorHandler(bool InitD3D, bool MapDrives, bool InitNetwork);
341   void InitBasicD3D();
342
343   bool PlayStack(const CFileItem& item, bool bRestart);
344   bool SwitchToFullScreen();
345   bool ProcessMouse();
346   bool ProcessHTTPApiButtons();
347   bool ProcessKeyboard();
348   bool ProcessRemote(float frameTime);
349   bool ProcessGamepad(float frameTime);
350   bool ProcessEventServer(float frameTime);
351
352   bool ProcessJoystickEvent(const std::string& joystickName, int button, bool isAxis, float fAmount);
353
354   void CheckForDebugButtonCombo();
355   void StartFtpEmergencyRecoveryMode();
356   float NavigationIdleTime();
357   void CheckForTitleChange();
358   static bool AlwaysProcess(const CAction& action);
359
360   void SaveCurrentFileSettings();
361
362   CProfile* InitDirectoriesLinux();
363   CProfile* InitDirectoriesOSX();
364   CProfile* InitDirectoriesWin32();
365
366   CApplicationMessenger m_applicationMessenger;
367 #if defined(HAS_LINUX_NETWORK)
368   CNetworkLinux m_network;
369 #elif defined(HAS_WIN32_NETWORK)
370   CNetworkWin32 m_network;
371 #else
372   CNetwork    m_network;
373 #endif
374 #ifdef HAS_PERFORMANCE_SAMPLE
375   CPerformanceStats m_perfStats;
376 #endif
377 #ifdef _LINUX
378   CLinuxResourceCounter m_resourceCounter;
379 #endif
380
381 #ifdef HAS_EVENT_SERVER
382   std::map<std::string, std::map<int, float> > m_lastAxisMap;
383 #endif
384 #ifdef _WIN32PC
385   CWIN32Util::SystemParams::SysParam *m_SSysParam;
386   CWINMessageHandler  m_messageHandler;
387 #endif
388 };
389
390 extern CApplication g_application;
391 extern CStdString g_LoadErrorStr;