37eae3f9a68cd1ad797941c7420341175b76fbd5
[vuplus_xbmc] / xbmc / Application.h
1 #pragma once
2
3 /*
4  *      Copyright (C) 2005-2013 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, see
19  *  <http://www.gnu.org/licenses/>.
20  *
21  */
22
23 #include "system.h" // for HAS_DVD_DRIVE et. al.
24 #include "XBApplicationEx.h"
25
26 #include "guilib/IMsgTargetCallback.h"
27 #include "threads/Condition.h"
28 #include "utils/GlobalsHandling.h"
29
30 #include <map>
31
32 class CAction;
33 class CFileItem;
34 class CFileItemList;
35 class CKey;
36 namespace ADDON
37 {
38   class CSkinInfo;
39   class IAddon;
40   typedef boost::shared_ptr<IAddon> AddonPtr;
41 }
42
43 namespace MEDIA_DETECT
44 {
45   class CAutorun;
46 }
47 class CPlayerController;
48
49 #include "cores/IPlayerCallback.h"
50 #include "cores/playercorefactory/PlayerCoreFactory.h"
51 #include "PlayListPlayer.h"
52 #include "settings/ISettingsHandler.h"
53 #include "settings/ISettingCallback.h"
54 #include "settings/ISubSettings.h"
55 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
56 #include "storage/DetectDVDType.h"
57 #endif
58 #ifdef TARGET_WINDOWS
59 #include "win32/WIN32Util.h"
60 #endif
61 #include "utils/Stopwatch.h"
62 #ifdef HAS_PERFORMANCE_SAMPLE
63 #include "utils/PerformanceStats.h"
64 #endif
65 #include "windowing/XBMC_events.h"
66 #include "threads/Thread.h"
67
68 #include "ApplicationPlayer.h"
69
70 class CSeekHandler;
71 class CKaraokeLyricsManager;
72 class CInertialScrollingHandler;
73 class DPMSSupport;
74 class CSplash;
75 class CBookmark;
76 class CNetwork;
77
78 namespace VIDEO
79 {
80   class CVideoInfoScanner;
81 }
82
83 namespace MUSIC_INFO
84 {
85   class CMusicInfoScanner;
86 }
87
88 #define VOLUME_MINIMUM 0.0f        // -60dB
89 #define VOLUME_MAXIMUM 1.0f        // 0dB
90 #define VOLUME_DYNAMIC_RANGE 90.0f // 60dB
91 #define VOLUME_CONTROL_STEPS 90    // 90 steps
92
93 // replay gain settings struct for quick access by the player multiple
94 // times per second (saves doing settings lookup)
95 struct ReplayGainSettings
96 {
97   int iPreAmp;
98   int iNoGainPreAmp;
99   int iType;
100   bool bAvoidClipping;
101 };
102
103 class CBackgroundPlayer : public CThread
104 {
105 public:
106   CBackgroundPlayer(const CFileItem &item, int iPlayList);
107   virtual ~CBackgroundPlayer();
108   virtual void Process();
109 protected:
110   CFileItem *m_item;
111   int       m_iPlayList;
112 };
113
114 class CApplication : public CXBApplicationEx, public IPlayerCallback, public IMsgTargetCallback,
115                      public ISettingCallback, public ISettingsHandler, public ISubSettings
116 {
117   friend class CApplicationPlayer;
118 public:
119
120   enum ESERVERS
121   {
122     ES_WEBSERVER = 1,
123     ES_AIRPLAYSERVER,
124     ES_JSONRPCSERVER,
125     ES_UPNPRENDERER,
126     ES_UPNPSERVER,
127     ES_EVENTSERVER,
128     ES_ZEROCONF
129   };
130
131   CApplication(void);
132   virtual ~CApplication(void);
133   virtual bool Initialize();
134   virtual void FrameMove(bool processEvents, bool processGUI = true);
135   virtual void Render();
136   virtual bool RenderNoPresent();
137   virtual void Preflight();
138   virtual bool Create();
139   virtual bool Cleanup();
140
141   bool CreateGUI();
142   bool InitWindow();
143   bool DestroyWindow();
144   void StartServices();
145   void StopServices();
146
147   bool StartServer(enum ESERVERS eServer, bool bStart, bool bWait = false);
148
149   void StartPVRManager(bool bOpenPVRWindow = false);
150   void StopPVRManager();
151   bool IsCurrentThread() const;
152   void Stop(int exitCode);
153   void RestartApp();
154   void UnloadSkin(bool forReload = false);
155   bool LoadUserWindows();
156   void ReloadSkin();
157   const CStdString& CurrentFile();
158   CFileItem& CurrentFileItem();
159   virtual bool OnMessage(CGUIMessage& message);
160   PLAYERCOREID GetCurrentPlayer();
161   virtual void OnPlayBackEnded();
162   virtual void OnPlayBackStarted();
163   virtual void OnPlayBackPaused();
164   virtual void OnPlayBackResumed();
165   virtual void OnPlayBackStopped();
166   virtual void OnQueueNextItem();
167   virtual void OnPlayBackSeek(int iTime, int seekOffset);
168   virtual void OnPlayBackSeekChapter(int iChapter);
169   virtual void OnPlayBackSpeedChanged(int iSpeed);
170   bool PlayMedia(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC);
171   bool PlayMediaSync(const CFileItem& item, int iPlaylist = PLAYLIST_MUSIC);
172   bool ProcessAndStartPlaylist(const CStdString& strPlayList, PLAYLIST::CPlayList& playlist, int iPlaylist, int track=0);
173   PlayBackRet PlayFile(const CFileItem& item, bool bRestart = false);
174   void SaveFileState(bool bForeground = false);
175   void UpdateFileState();
176   void StopPlaying();
177   void Restart(bool bSamePosition = true);
178   void DelayedPlayerRestart();
179   void CheckDelayedPlayerRestart();
180   bool IsPlayingFullScreenVideo() const;
181   bool IsStartingPlayback() const { return m_bPlaybackStarting; }
182   bool IsFullScreen();
183   bool OnKey(const CKey& key);
184   bool OnAppCommand(const CAction &action);
185   bool OnAction(const CAction &action);
186   void CheckShutdown();
187   void InhibitIdleShutdown(bool inhibit);
188   bool IsIdleShutdownInhibited() const;
189   // Checks whether the screensaver and / or DPMS should become active.
190   void CheckScreenSaverAndDPMS();
191   void CheckPlayingProgress();
192   void ActivateScreenSaver(bool forceType = false);
193   void CloseNetworkShares();
194
195   virtual void Process();
196   void ProcessSlow();
197   void ResetScreenSaver();
198   float GetVolume(bool percentage = true) const;
199   void SetVolume(float iValue, bool isPercentage = true);
200   bool IsMuted() const;
201   bool IsMutedInternal() const { return m_muted; }
202   void ToggleMute(void);
203   void SetMute(bool mute);
204   void ShowVolumeBar(const CAction *action = NULL);
205   int GetSubtitleDelay() const;
206   int GetAudioDelay() const;
207   void ResetSystemIdleTimer();
208   void ResetScreenSaverTimer();
209   void StopScreenSaverTimer();
210   // Wakes up from the screensaver and / or DPMS. Returns true if woken up.
211   bool WakeUpScreenSaverAndDPMS(bool bPowerOffKeyPressed = false);
212   bool WakeUpScreenSaver(bool bPowerOffKeyPressed = false);
213   /*!
214    \brief Returns the total time in fractional seconds of the currently playing media
215
216    Beware that this method returns fractional seconds whereas IPlayer::GetTotalTime() returns milliseconds.
217    */
218   double GetTotalTime() const;
219   /*!
220    \brief Returns the current time in fractional seconds of the currently playing media
221
222    Beware that this method returns fractional seconds whereas IPlayer::GetTime() returns milliseconds.
223    */
224   double GetTime() const;
225   float GetPercentage() const;
226
227   // Get the percentage of data currently cached/buffered (aq/vq + FileCache) from the input stream if applicable.
228   float GetCachePercentage() const;
229
230   void SeekPercentage(float percent);
231   void SeekTime( double dTime = 0.0 );
232
233   void StopShutdownTimer();
234   void ResetShutdownTimers();
235
236   void StopVideoScan();
237   void StopMusicScan();
238   bool IsMusicScanning() const;
239   bool IsVideoScanning() const;
240
241   void StartVideoCleanup();
242
243   void StartVideoScan(const CStdString &path, bool scanAll = false);
244   void StartMusicScan(const CStdString &path, int flags = 0);
245   void StartMusicAlbumScan(const CStdString& strDirectory, bool refresh=false);
246   void StartMusicArtistScan(const CStdString& strDirectory, bool refresh=false);
247
248   void UpdateLibraries();
249   void CheckMusicPlaylist();
250
251   bool ExecuteXBMCAction(std::string action);
252
253   static bool OnEvent(XBMC_Event& newEvent);
254
255   CNetwork& getNetwork();
256 #ifdef HAS_PERFORMANCE_SAMPLE
257   CPerformanceStats &GetPerformanceStats();
258 #endif
259
260 #ifdef HAS_DVD_DRIVE
261   MEDIA_DETECT::CAutorun* m_Autorun;
262 #endif
263
264 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
265   MEDIA_DETECT::CDetectDVDMedia m_DetectDVDType;
266 #endif
267
268   CApplicationPlayer* m_pPlayer;
269
270   inline bool IsInScreenSaver() { return m_bScreenSave; };
271   int m_iScreenSaveLock; // spiff: are we checking for a lock? if so, ignore the screensaver state, if -1 we have failed to input locks
272
273   bool m_bPlaybackStarting;
274   typedef enum
275   {
276     PLAY_STATE_NONE = 0,
277     PLAY_STATE_STARTING,
278     PLAY_STATE_PLAYING,
279     PLAY_STATE_STOPPED,
280     PLAY_STATE_ENDED,
281   } PlayState;
282   PlayState m_ePlayState;
283   CCriticalSection m_playStateMutex;
284
285   bool m_bInBackground;
286   inline bool IsInBackground() { return m_bInBackground; };
287   void SetInBackground(bool background);
288
289   CKaraokeLyricsManager* m_pKaraokeMgr;
290
291   PLAYERCOREID m_eForcedNextPlayer;
292   CStdString m_strPlayListFile;
293
294   int GlobalIdleTime();
295
296   void EnablePlatformDirectories(bool enable=true)
297   {
298     m_bPlatformDirectories = enable;
299   }
300
301   bool PlatformDirectoriesEnabled()
302   {
303     return m_bPlatformDirectories;
304   }
305
306   void SetStandAlone(bool value);
307
308   bool IsStandAlone()
309   {
310     return m_bStandalone;
311   }
312
313   void SetEnableLegacyRes(bool value)
314   {
315     m_bEnableLegacyRes = value;
316   }
317
318   bool IsEnableLegacyRes()
319   {
320     return m_bEnableLegacyRes;
321   }
322
323   void SetEnableTestMode(bool value)
324   {
325     m_bTestMode = value;
326   }
327
328   bool IsEnableTestMode()
329   {
330     return m_bTestMode;
331   }
332
333   void Minimize();
334   bool ToggleDPMS(bool manual);
335
336   float GetDimScreenSaverLevel() const;
337
338   /*! \brief Retrieve the applications seek handler.
339    \return a constant pointer to the seek handler.
340    \sa CSeekHandler
341    */
342   const CSeekHandler *GetSeekHandler() const { return m_seekHandler; };
343
344   bool SwitchToFullScreen();
345
346   CSplash* GetSplash() { return m_splash; }
347   void SetRenderGUI(bool renderGUI);
348   bool GetRenderGUI() const { return m_renderGUI; };
349
350   bool SetLanguage(const CStdString &strLanguage);
351
352   ReplayGainSettings& GetReplayGainSettings() { return m_replayGainSettings; }
353
354   void SetLoggingIn(bool loggingIn) { m_loggingIn = loggingIn; }
355
356 protected:
357   virtual bool OnSettingsSaving() const;
358
359   virtual bool Load(const TiXmlNode *settings);
360   virtual bool Save(TiXmlNode *settings) const;
361
362   virtual void OnSettingChanged(const CSetting *setting);
363   virtual void OnSettingAction(const CSetting *setting);
364   virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode);
365
366   bool LoadSkin(const CStdString& skinID);
367   void LoadSkin(const boost::shared_ptr<ADDON::CSkinInfo>& skin);
368
369   bool m_skinReloading; // if true we disallow LoadSkin until ReloadSkin is called
370
371   bool m_loggingIn;
372
373 #if defined(TARGET_DARWIN_IOS)
374   friend class CWinEventsIOS;
375 #endif
376   // screensaver
377   bool m_bScreenSave;
378   ADDON::AddonPtr m_screenSaver;
379
380   // timer information
381 #ifdef TARGET_WINDOWS
382   CWinIdleTimer m_idleTimer;
383   CWinIdleTimer m_screenSaverTimer;
384 #else
385   CStopWatch m_idleTimer;
386   CStopWatch m_screenSaverTimer;
387 #endif
388   CStopWatch m_restartPlayerTimer;
389   CStopWatch m_frameTime;
390   CStopWatch m_navigationTimer;
391   CStopWatch m_slowTimer;
392   CStopWatch m_shutdownTimer;
393
394   bool m_bInhibitIdleShutdown;
395
396   DPMSSupport* m_dpms;
397   bool m_dpmsIsActive;
398   bool m_dpmsIsManual;
399
400   CFileItemPtr m_itemCurrentFile;
401   CFileItemList* m_currentStack;
402   CFileItemPtr m_stackFileItemToUpdate;
403
404   CStdString m_prevMedia;
405   CSplash* m_splash;
406   ThreadIdentifier m_threadID;       // application thread ID.  Used in applicationMessanger to know where we are firing a thread with delay from.
407   bool m_bInitializing;
408   bool m_bPlatformDirectories;
409
410   CBookmark& m_progressTrackingVideoResumeBookmark;
411   CFileItemPtr m_progressTrackingItem;
412   bool m_progressTrackingPlayCountUpdate;
413
414   int m_currentStackPosition;
415   int m_nextPlaylistItem;
416
417   bool m_bPresentFrame;
418   unsigned int m_lastFrameTime;
419   unsigned int m_lastRenderTime;
420
421   bool m_bStandalone;
422   bool m_bEnableLegacyRes;
423   bool m_bTestMode;
424   bool m_bSystemScreenSaverEnable;
425
426   VIDEO::CVideoInfoScanner *m_videoInfoScanner;
427   MUSIC_INFO::CMusicInfoScanner *m_musicInfoScanner;
428
429   bool m_muted;
430   float m_volumeLevel;
431
432   void Mute();
433   void UnMute();
434
435   void SetHardwareVolume(float hardwareVolume);
436
437   void VolumeChanged() const;
438
439   PlayBackRet PlayStack(const CFileItem& item, bool bRestart);
440   bool ProcessMouse();
441   bool ProcessRemote(float frameTime);
442   bool ProcessGamepad(float frameTime);
443   bool ProcessEventServer(float frameTime);
444   bool ProcessPeripherals(float frameTime);
445   bool ProcessJoystickEvent(const std::string& joystickName, int button, bool isAxis, float fAmount, unsigned int holdTime = 0);
446   bool ExecuteInputAction(const CAction &action);
447   int  GetActiveWindowID(void);
448
449   float NavigationIdleTime();
450   static bool AlwaysProcess(const CAction& action);
451
452   void SaveCurrentFileSettings();
453
454   bool InitDirectoriesLinux();
455   bool InitDirectoriesOSX();
456   bool InitDirectoriesWin32();
457   void CreateUserDirs();
458
459   CSeekHandler *m_seekHandler;
460   CPlayerController *m_playerController;
461   CInertialScrollingHandler *m_pInertialScrollingHandler;
462   CNetwork    *m_network;
463 #ifdef HAS_PERFORMANCE_SAMPLE
464   CPerformanceStats m_perfStats;
465 #endif
466
467 #ifdef HAS_EVENT_SERVER
468   std::map<std::string, std::map<int, float> > m_lastAxisMap;
469 #endif
470
471   ReplayGainSettings m_replayGainSettings;
472 };
473
474 XBMC_GLOBAL_REF(CApplication,g_application);
475 #define g_application XBMC_GLOBAL_USE(CApplication)