Merge pull request #3008 from herrnst/paplayer-mp3gain
[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
194   virtual void Process();
195   void ProcessSlow();
196   void ResetScreenSaver();
197   float GetVolume(bool percentage = true) const;
198   void SetVolume(float iValue, bool isPercentage = true);
199   bool IsMuted() const;
200   bool IsMutedInternal() const { return m_muted; }
201   void ToggleMute(void);
202   void SetMute(bool mute);
203   void ShowVolumeBar(const CAction *action = NULL);
204   int GetSubtitleDelay() const;
205   int GetAudioDelay() const;
206   void ResetSystemIdleTimer();
207   void ResetScreenSaverTimer();
208   void StopScreenSaverTimer();
209   // Wakes up from the screensaver and / or DPMS. Returns true if woken up.
210   bool WakeUpScreenSaverAndDPMS(bool bPowerOffKeyPressed = false);
211   bool WakeUpScreenSaver(bool bPowerOffKeyPressed = false);
212   /*!
213    \brief Returns the total time in fractional seconds of the currently playing media
214
215    Beware that this method returns fractional seconds whereas IPlayer::GetTotalTime() returns milliseconds.
216    */
217   double GetTotalTime() const;
218   /*!
219    \brief Returns the current time in fractional seconds of the currently playing media
220
221    Beware that this method returns fractional seconds whereas IPlayer::GetTime() returns milliseconds.
222    */
223   double GetTime() const;
224   float GetPercentage() const;
225
226   // Get the percentage of data currently cached/buffered (aq/vq + FileCache) from the input stream if applicable.
227   float GetCachePercentage() const;
228
229   void SeekPercentage(float percent);
230   void SeekTime( double dTime = 0.0 );
231
232   void StopShutdownTimer();
233   void ResetShutdownTimers();
234
235   void StopVideoScan();
236   void StopMusicScan();
237   bool IsMusicScanning() const;
238   bool IsVideoScanning() const;
239
240   void StartVideoCleanup();
241
242   void StartVideoScan(const CStdString &path, bool scanAll = false);
243   void StartMusicScan(const CStdString &path, int flags = 0);
244   void StartMusicAlbumScan(const CStdString& strDirectory, bool refresh=false);
245   void StartMusicArtistScan(const CStdString& strDirectory, bool refresh=false);
246
247   void UpdateLibraries();
248   void CheckMusicPlaylist();
249
250   bool ExecuteXBMCAction(std::string action);
251
252   static bool OnEvent(XBMC_Event& newEvent);
253
254   CNetwork& getNetwork();
255 #ifdef HAS_PERFORMANCE_SAMPLE
256   CPerformanceStats &GetPerformanceStats();
257 #endif
258
259 #ifdef HAS_DVD_DRIVE
260   MEDIA_DETECT::CAutorun* m_Autorun;
261 #endif
262
263 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
264   MEDIA_DETECT::CDetectDVDMedia m_DetectDVDType;
265 #endif
266
267   CApplicationPlayer* m_pPlayer;
268
269   inline bool IsInScreenSaver() { return m_bScreenSave; };
270   int m_iScreenSaveLock; // spiff: are we checking for a lock? if so, ignore the screensaver state, if -1 we have failed to input locks
271
272   bool m_bPlaybackStarting;
273   typedef enum
274   {
275     PLAY_STATE_NONE = 0,
276     PLAY_STATE_STARTING,
277     PLAY_STATE_PLAYING,
278     PLAY_STATE_STOPPED,
279     PLAY_STATE_ENDED,
280   } PlayState;
281   PlayState m_ePlayState;
282   CCriticalSection m_playStateMutex;
283
284   bool m_bInBackground;
285   inline bool IsInBackground() { return m_bInBackground; };
286   void SetInBackground(bool background);
287
288   CKaraokeLyricsManager* m_pKaraokeMgr;
289
290   PLAYERCOREID m_eForcedNextPlayer;
291   CStdString m_strPlayListFile;
292
293   int GlobalIdleTime();
294
295   void EnablePlatformDirectories(bool enable=true)
296   {
297     m_bPlatformDirectories = enable;
298   }
299
300   bool PlatformDirectoriesEnabled()
301   {
302     return m_bPlatformDirectories;
303   }
304
305   void SetStandAlone(bool value);
306
307   bool IsStandAlone()
308   {
309     return m_bStandalone;
310   }
311
312   void SetEnableLegacyRes(bool value)
313   {
314     m_bEnableLegacyRes = value;
315   }
316
317   bool IsEnableLegacyRes()
318   {
319     return m_bEnableLegacyRes;
320   }
321
322   void SetEnableTestMode(bool value)
323   {
324     m_bTestMode = value;
325   }
326
327   bool IsEnableTestMode()
328   {
329     return m_bTestMode;
330   }
331
332   void Minimize();
333   bool ToggleDPMS(bool manual);
334
335   float GetDimScreenSaverLevel() const;
336
337   /*! \brief Retrieve the applications seek handler.
338    \return a constant pointer to the seek handler.
339    \sa CSeekHandler
340    */
341   const CSeekHandler *GetSeekHandler() const { return m_seekHandler; };
342
343   bool SwitchToFullScreen();
344
345   CSplash* GetSplash() { return m_splash; }
346   void SetRenderGUI(bool renderGUI);
347   bool GetRenderGUI() const { return m_renderGUI; };
348
349   bool SetLanguage(const CStdString &strLanguage);
350
351   ReplayGainSettings& GetReplayGainSettings() { return m_replayGainSettings; }
352
353   void SetLoggingIn(bool loggingIn) { m_loggingIn = loggingIn; }
354
355 protected:
356   virtual bool OnSettingsSaving() const;
357
358   virtual bool Load(const TiXmlNode *settings);
359   virtual bool Save(TiXmlNode *settings) const;
360
361   virtual void OnSettingChanged(const CSetting *setting);
362   virtual void OnSettingAction(const CSetting *setting);
363   virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode);
364
365   bool LoadSkin(const CStdString& skinID);
366   void LoadSkin(const boost::shared_ptr<ADDON::CSkinInfo>& skin);
367
368   bool m_skinReloading; // if true we disallow LoadSkin until ReloadSkin is called
369
370   bool m_loggingIn;
371
372 #if defined(TARGET_DARWIN_IOS)
373   friend class CWinEventsIOS;
374 #endif
375   // screensaver
376   bool m_bScreenSave;
377   ADDON::AddonPtr m_screenSaver;
378
379   // timer information
380 #ifdef TARGET_WINDOWS
381   CWinIdleTimer m_idleTimer;
382   CWinIdleTimer m_screenSaverTimer;
383 #else
384   CStopWatch m_idleTimer;
385   CStopWatch m_screenSaverTimer;
386 #endif
387   CStopWatch m_restartPlayerTimer;
388   CStopWatch m_frameTime;
389   CStopWatch m_navigationTimer;
390   CStopWatch m_slowTimer;
391   CStopWatch m_shutdownTimer;
392
393   bool m_bInhibitIdleShutdown;
394
395   DPMSSupport* m_dpms;
396   bool m_dpmsIsActive;
397   bool m_dpmsIsManual;
398
399   CFileItemPtr m_itemCurrentFile;
400   CFileItemList* m_currentStack;
401   CFileItemPtr m_stackFileItemToUpdate;
402
403   CStdString m_prevMedia;
404   CSplash* m_splash;
405   ThreadIdentifier m_threadID;       // application thread ID.  Used in applicationMessanger to know where we are firing a thread with delay from.
406   bool m_bInitializing;
407   bool m_bPlatformDirectories;
408
409   CBookmark& m_progressTrackingVideoResumeBookmark;
410   CFileItemPtr m_progressTrackingItem;
411   bool m_progressTrackingPlayCountUpdate;
412
413   int m_currentStackPosition;
414   int m_nextPlaylistItem;
415
416   bool m_bPresentFrame;
417   unsigned int m_lastFrameTime;
418   unsigned int m_lastRenderTime;
419
420   bool m_bStandalone;
421   bool m_bEnableLegacyRes;
422   bool m_bTestMode;
423   bool m_bSystemScreenSaverEnable;
424
425   VIDEO::CVideoInfoScanner *m_videoInfoScanner;
426   MUSIC_INFO::CMusicInfoScanner *m_musicInfoScanner;
427
428   bool m_muted;
429   float m_volumeLevel;
430
431   void Mute();
432   void UnMute();
433
434   void SetHardwareVolume(float hardwareVolume);
435
436   void VolumeChanged() const;
437
438   PlayBackRet PlayStack(const CFileItem& item, bool bRestart);
439   bool ProcessMouse();
440   bool ProcessRemote(float frameTime);
441   bool ProcessGamepad(float frameTime);
442   bool ProcessEventServer(float frameTime);
443   bool ProcessPeripherals(float frameTime);
444   bool ProcessJoystickEvent(const std::string& joystickName, int button, bool isAxis, float fAmount, unsigned int holdTime = 0);
445   bool ExecuteInputAction(const CAction &action);
446   int  GetActiveWindowID(void);
447
448   float NavigationIdleTime();
449   static bool AlwaysProcess(const CAction& action);
450
451   void SaveCurrentFileSettings();
452
453   bool InitDirectoriesLinux();
454   bool InitDirectoriesOSX();
455   bool InitDirectoriesWin32();
456   void CreateUserDirs();
457
458   CSeekHandler *m_seekHandler;
459   CPlayerController *m_playerController;
460   CInertialScrollingHandler *m_pInertialScrollingHandler;
461   CNetwork    *m_network;
462 #ifdef HAS_PERFORMANCE_SAMPLE
463   CPerformanceStats m_perfStats;
464 #endif
465
466 #ifdef HAS_EVENT_SERVER
467   std::map<std::string, std::map<int, float> > m_lastAxisMap;
468 #endif
469
470   ReplayGainSettings m_replayGainSettings;
471 };
472
473 XBMC_GLOBAL_REF(CApplication,g_application);
474 #define g_application XBMC_GLOBAL_USE(CApplication)