4 * Copyright (C) 2005-2013 Team XBMC
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)
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.
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/>.
23 #include "system.h" // for HAS_DVD_DRIVE et. al.
24 #include "XBApplicationEx.h"
26 #include "guilib/IMsgTargetCallback.h"
27 #include "threads/Condition.h"
28 #include "utils/GlobalsHandling.h"
40 typedef boost::shared_ptr<IAddon> AddonPtr;
43 namespace MEDIA_DETECT
47 class CPlayerController;
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"
59 #include "win32/WIN32Util.h"
61 #include "utils/Stopwatch.h"
62 #ifdef HAS_PERFORMANCE_SAMPLE
63 #include "utils/PerformanceStats.h"
65 #include "windowing/XBMC_events.h"
66 #include "threads/Thread.h"
68 #include "ApplicationPlayer.h"
71 class CKaraokeLyricsManager;
72 class CInertialScrollingHandler;
80 class CVideoInfoScanner;
85 class CMusicInfoScanner;
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
93 // replay gain settings struct for quick access by the player multiple
94 // times per second (saves doing settings lookup)
95 struct ReplayGainSettings
103 class CBackgroundPlayer : public CThread
106 CBackgroundPlayer(const CFileItem &item, int iPlayList);
107 virtual ~CBackgroundPlayer();
108 virtual void Process();
114 class CApplication : public CXBApplicationEx, public IPlayerCallback, public IMsgTargetCallback,
115 public ISettingCallback, public ISettingsHandler, public ISubSettings
117 friend class CApplicationPlayer;
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();
143 bool DestroyWindow();
144 void StartServices();
147 bool StartServer(enum ESERVERS eServer, bool bStart, bool bWait = false);
149 void StartPVRManager(bool bOpenPVRWindow = false);
150 void StopPVRManager();
151 bool IsCurrentThread() const;
152 void Stop(int exitCode);
154 void UnloadSkin(bool forReload = false);
155 bool LoadUserWindows();
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();
177 void Restart(bool bSamePosition = true);
178 void DelayedPlayerRestart();
179 void CheckDelayedPlayerRestart();
180 bool IsPlayingFullScreenVideo() const;
181 bool IsStartingPlayback() const { return m_bPlaybackStarting; }
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);
194 virtual void Process();
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);
213 \brief Returns the total time in fractional seconds of the currently playing media
215 Beware that this method returns fractional seconds whereas IPlayer::GetTotalTime() returns milliseconds.
217 double GetTotalTime() const;
219 \brief Returns the current time in fractional seconds of the currently playing media
221 Beware that this method returns fractional seconds whereas IPlayer::GetTime() returns milliseconds.
223 double GetTime() const;
224 float GetPercentage() const;
226 // Get the percentage of data currently cached/buffered (aq/vq + FileCache) from the input stream if applicable.
227 float GetCachePercentage() const;
229 void SeekPercentage(float percent);
230 void SeekTime( double dTime = 0.0 );
232 void StopShutdownTimer();
233 void ResetShutdownTimers();
235 void StopVideoScan();
236 void StopMusicScan();
237 bool IsMusicScanning() const;
238 bool IsVideoScanning() const;
240 void StartVideoCleanup();
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);
247 void UpdateLibraries();
248 void CheckMusicPlaylist();
250 bool ExecuteXBMCAction(std::string action);
252 static bool OnEvent(XBMC_Event& newEvent);
254 CNetwork& getNetwork();
255 #ifdef HAS_PERFORMANCE_SAMPLE
256 CPerformanceStats &GetPerformanceStats();
260 MEDIA_DETECT::CAutorun* m_Autorun;
263 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
264 MEDIA_DETECT::CDetectDVDMedia m_DetectDVDType;
267 CApplicationPlayer* m_pPlayer;
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
272 bool m_bPlaybackStarting;
281 PlayState m_ePlayState;
282 CCriticalSection m_playStateMutex;
284 bool m_bInBackground;
285 inline bool IsInBackground() { return m_bInBackground; };
286 void SetInBackground(bool background);
288 CKaraokeLyricsManager* m_pKaraokeMgr;
290 PLAYERCOREID m_eForcedNextPlayer;
291 CStdString m_strPlayListFile;
293 int GlobalIdleTime();
295 void EnablePlatformDirectories(bool enable=true)
297 m_bPlatformDirectories = enable;
300 bool PlatformDirectoriesEnabled()
302 return m_bPlatformDirectories;
305 void SetStandAlone(bool value);
309 return m_bStandalone;
312 void SetEnableLegacyRes(bool value)
314 m_bEnableLegacyRes = value;
317 bool IsEnableLegacyRes()
319 return m_bEnableLegacyRes;
322 void SetEnableTestMode(bool value)
327 bool IsEnableTestMode()
333 bool ToggleDPMS(bool manual);
335 float GetDimScreenSaverLevel() const;
337 /*! \brief Retrieve the applications seek handler.
338 \return a constant pointer to the seek handler.
341 const CSeekHandler *GetSeekHandler() const { return m_seekHandler; };
343 bool SwitchToFullScreen();
345 CSplash* GetSplash() { return m_splash; }
346 void SetRenderGUI(bool renderGUI);
347 bool GetRenderGUI() const { return m_renderGUI; };
349 bool SetLanguage(const CStdString &strLanguage);
351 ReplayGainSettings& GetReplayGainSettings() { return m_replayGainSettings; }
353 void SetLoggingIn(bool loggingIn) { m_loggingIn = loggingIn; }
356 virtual bool OnSettingsSaving() const;
358 virtual bool Load(const TiXmlNode *settings);
359 virtual bool Save(TiXmlNode *settings) const;
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);
365 bool LoadSkin(const CStdString& skinID);
366 void LoadSkin(const boost::shared_ptr<ADDON::CSkinInfo>& skin);
368 bool m_skinReloading; // if true we disallow LoadSkin until ReloadSkin is called
372 #if defined(TARGET_DARWIN_IOS)
373 friend class CWinEventsIOS;
377 ADDON::AddonPtr m_screenSaver;
380 #ifdef TARGET_WINDOWS
381 CWinIdleTimer m_idleTimer;
382 CWinIdleTimer m_screenSaverTimer;
384 CStopWatch m_idleTimer;
385 CStopWatch m_screenSaverTimer;
387 CStopWatch m_restartPlayerTimer;
388 CStopWatch m_frameTime;
389 CStopWatch m_navigationTimer;
390 CStopWatch m_slowTimer;
391 CStopWatch m_shutdownTimer;
393 bool m_bInhibitIdleShutdown;
399 CFileItemPtr m_itemCurrentFile;
400 CFileItemList* m_currentStack;
401 CFileItemPtr m_stackFileItemToUpdate;
403 CStdString m_prevMedia;
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;
409 CBookmark& m_progressTrackingVideoResumeBookmark;
410 CFileItemPtr m_progressTrackingItem;
411 bool m_progressTrackingPlayCountUpdate;
413 int m_currentStackPosition;
414 int m_nextPlaylistItem;
416 bool m_bPresentFrame;
417 unsigned int m_lastFrameTime;
418 unsigned int m_lastRenderTime;
421 bool m_bEnableLegacyRes;
423 bool m_bSystemScreenSaverEnable;
425 VIDEO::CVideoInfoScanner *m_videoInfoScanner;
426 MUSIC_INFO::CMusicInfoScanner *m_musicInfoScanner;
434 void SetHardwareVolume(float hardwareVolume);
436 void VolumeChanged() const;
438 PlayBackRet PlayStack(const CFileItem& item, bool bRestart);
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);
448 float NavigationIdleTime();
449 static bool AlwaysProcess(const CAction& action);
451 void SaveCurrentFileSettings();
453 bool InitDirectoriesLinux();
454 bool InitDirectoriesOSX();
455 bool InitDirectoriesWin32();
456 void CreateUserDirs();
458 CSeekHandler *m_seekHandler;
459 CPlayerController *m_playerController;
460 CInertialScrollingHandler *m_pInertialScrollingHandler;
462 #ifdef HAS_PERFORMANCE_SAMPLE
463 CPerformanceStats m_perfStats;
466 #ifdef HAS_EVENT_SERVER
467 std::map<std::string, std::map<int, float> > m_lastAxisMap;
470 ReplayGainSettings m_replayGainSettings;
473 XBMC_GLOBAL_REF(CApplication,g_application);
474 #define g_application XBMC_GLOBAL_USE(CApplication)