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);
193 void CloseNetworkShares();
195 virtual void Process();
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);
214 \brief Returns the total time in fractional seconds of the currently playing media
216 Beware that this method returns fractional seconds whereas IPlayer::GetTotalTime() returns milliseconds.
218 double GetTotalTime() const;
220 \brief Returns the current time in fractional seconds of the currently playing media
222 Beware that this method returns fractional seconds whereas IPlayer::GetTime() returns milliseconds.
224 double GetTime() const;
225 float GetPercentage() const;
227 // Get the percentage of data currently cached/buffered (aq/vq + FileCache) from the input stream if applicable.
228 float GetCachePercentage() const;
230 void SeekPercentage(float percent);
231 void SeekTime( double dTime = 0.0 );
233 void StopShutdownTimer();
234 void ResetShutdownTimers();
236 void StopVideoScan();
237 void StopMusicScan();
238 bool IsMusicScanning() const;
239 bool IsVideoScanning() const;
241 void StartVideoCleanup();
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);
248 void UpdateLibraries();
249 void CheckMusicPlaylist();
251 bool ExecuteXBMCAction(std::string action);
253 static bool OnEvent(XBMC_Event& newEvent);
255 CNetwork& getNetwork();
256 #ifdef HAS_PERFORMANCE_SAMPLE
257 CPerformanceStats &GetPerformanceStats();
261 MEDIA_DETECT::CAutorun* m_Autorun;
264 #if !defined(TARGET_WINDOWS) && defined(HAS_DVD_DRIVE)
265 MEDIA_DETECT::CDetectDVDMedia m_DetectDVDType;
268 CApplicationPlayer* m_pPlayer;
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
273 bool m_bPlaybackStarting;
282 PlayState m_ePlayState;
283 CCriticalSection m_playStateMutex;
285 bool m_bInBackground;
286 inline bool IsInBackground() { return m_bInBackground; };
287 void SetInBackground(bool background);
289 CKaraokeLyricsManager* m_pKaraokeMgr;
291 PLAYERCOREID m_eForcedNextPlayer;
292 CStdString m_strPlayListFile;
294 int GlobalIdleTime();
296 void EnablePlatformDirectories(bool enable=true)
298 m_bPlatformDirectories = enable;
301 bool PlatformDirectoriesEnabled()
303 return m_bPlatformDirectories;
306 void SetStandAlone(bool value);
310 return m_bStandalone;
313 void SetEnableLegacyRes(bool value)
315 m_bEnableLegacyRes = value;
318 bool IsEnableLegacyRes()
320 return m_bEnableLegacyRes;
323 void SetEnableTestMode(bool value)
328 bool IsEnableTestMode()
334 bool ToggleDPMS(bool manual);
336 float GetDimScreenSaverLevel() const;
338 /*! \brief Retrieve the applications seek handler.
339 \return a constant pointer to the seek handler.
342 const CSeekHandler *GetSeekHandler() const { return m_seekHandler; };
344 bool SwitchToFullScreen();
346 CSplash* GetSplash() { return m_splash; }
347 void SetRenderGUI(bool renderGUI);
348 bool GetRenderGUI() const { return m_renderGUI; };
350 bool SetLanguage(const CStdString &strLanguage);
352 ReplayGainSettings& GetReplayGainSettings() { return m_replayGainSettings; }
354 void SetLoggingIn(bool loggingIn) { m_loggingIn = loggingIn; }
357 virtual bool OnSettingsSaving() const;
359 virtual bool Load(const TiXmlNode *settings);
360 virtual bool Save(TiXmlNode *settings) const;
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);
366 bool LoadSkin(const CStdString& skinID);
367 void LoadSkin(const boost::shared_ptr<ADDON::CSkinInfo>& skin);
369 bool m_skinReloading; // if true we disallow LoadSkin until ReloadSkin is called
373 #if defined(TARGET_DARWIN_IOS)
374 friend class CWinEventsIOS;
378 ADDON::AddonPtr m_screenSaver;
381 #ifdef TARGET_WINDOWS
382 CWinIdleTimer m_idleTimer;
383 CWinIdleTimer m_screenSaverTimer;
385 CStopWatch m_idleTimer;
386 CStopWatch m_screenSaverTimer;
388 CStopWatch m_restartPlayerTimer;
389 CStopWatch m_frameTime;
390 CStopWatch m_navigationTimer;
391 CStopWatch m_slowTimer;
392 CStopWatch m_shutdownTimer;
394 bool m_bInhibitIdleShutdown;
400 CFileItemPtr m_itemCurrentFile;
401 CFileItemList* m_currentStack;
402 CFileItemPtr m_stackFileItemToUpdate;
404 CStdString m_prevMedia;
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;
410 CBookmark& m_progressTrackingVideoResumeBookmark;
411 CFileItemPtr m_progressTrackingItem;
412 bool m_progressTrackingPlayCountUpdate;
414 int m_currentStackPosition;
415 int m_nextPlaylistItem;
417 bool m_bPresentFrame;
418 unsigned int m_lastFrameTime;
419 unsigned int m_lastRenderTime;
422 bool m_bEnableLegacyRes;
424 bool m_bSystemScreenSaverEnable;
426 VIDEO::CVideoInfoScanner *m_videoInfoScanner;
427 MUSIC_INFO::CMusicInfoScanner *m_musicInfoScanner;
435 void SetHardwareVolume(float hardwareVolume);
437 void VolumeChanged() const;
439 PlayBackRet PlayStack(const CFileItem& item, bool bRestart);
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);
449 float NavigationIdleTime();
450 static bool AlwaysProcess(const CAction& action);
452 void SaveCurrentFileSettings();
454 bool InitDirectoriesLinux();
455 bool InitDirectoriesOSX();
456 bool InitDirectoriesWin32();
457 void CreateUserDirs();
459 CSeekHandler *m_seekHandler;
460 CPlayerController *m_playerController;
461 CInertialScrollingHandler *m_pInertialScrollingHandler;
463 #ifdef HAS_PERFORMANCE_SAMPLE
464 CPerformanceStats m_perfStats;
467 #ifdef HAS_EVENT_SERVER
468 std::map<std::string, std::map<int, float> > m_lastAxisMap;
471 ReplayGainSettings m_replayGainSettings;
474 XBMC_GLOBAL_REF(CApplication,g_application);
475 #define g_application XBMC_GLOBAL_USE(CApplication)