| 
									
										
										
										
											2009-03-28 08:57:34 +00:00
										 |  |  | // Copyright (C) 2003-2009 Dolphin Project.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // This program is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, version 2.0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU General Public License 2.0 for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A copy of the GPL 2.0 should have been included with the program.
 | 
					
						
							|  |  |  | // If not, see http://www.gnu.org/licenses/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Official SVN repository and contact information can be found at
 | 
					
						
							|  |  |  | // http://code.google.com/p/dolphin-emu/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _WIN32
 | 
					
						
							| 
									
										
										
										
											2009-01-16 02:58:34 +00:00
										 |  |  | #include <windows.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | #include <mmsystem.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <time.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | #include <sys/timeb.h>
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "Common.h"
 | 
					
						
							|  |  |  | #include "Timer.h"
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | #include "StringUtil.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef __GNUC__
 | 
					
						
							|  |  |  | u32 timeGetTime() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct timeb t; | 
					
						
							|  |  |  | 	ftime(&t); | 
					
						
							|  |  |  | 	return((u32)(t.time * 1000 + t.millitm)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Common | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-28 08:57:34 +00:00
										 |  |  | // --------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | // Initiate, Start, Stop, and Update the time
 | 
					
						
							| 
									
										
										
										
											2009-03-28 08:57:34 +00:00
										 |  |  | // --------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Set initial values for the class
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | Timer::Timer() | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 	: m_LastTime(0), m_StartTime(0), m_Running(false) | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	Update(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | 	QueryPerformanceFrequency((LARGE_INTEGER*)&m_frequency); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | // Write the starting time
 | 
					
						
							|  |  |  | void Timer::Start() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_StartTime = timeGetTime(); | 
					
						
							|  |  |  | 	m_Running = true; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | // Stop the timer
 | 
					
						
							|  |  |  | void Timer::Stop() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	// Write the final time
 | 
					
						
							|  |  |  | 	m_LastTime = timeGetTime(); | 
					
						
							|  |  |  | 	m_Running = false; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Update the last time variable
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | void Timer::Update() | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	m_LastTime = timeGetTime(); | 
					
						
							|  |  |  | 	//TODO(ector) - QPF
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-28 08:57:34 +00:00
										 |  |  | // -------------------------------------
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | // Get time difference and elapsed time
 | 
					
						
							| 
									
										
										
										
											2009-03-28 08:57:34 +00:00
										 |  |  | // -------------------------------------
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Get the number of milliseconds since the last Update()
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | s64 Timer::GetTimeDifference() | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return(timeGetTime() - m_LastTime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 07:17:34 +00:00
										 |  |  | /* Add the time difference since the last Update() to the starting time. This is used to compensate
 | 
					
						
							|  |  |  |    for a paused game. */ | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | void Timer::AddTimeDifference() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_StartTime += GetTimeDifference(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-02-16 07:17:34 +00:00
										 |  |  | // Wind back the starting time to a custom time
 | 
					
						
							|  |  |  | void Timer::WindBackStartingTime(u64 WindBack) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	m_StartTime += WindBack; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Get the time elapsed since the Start()
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | u64 Timer::GetTimeElapsed() | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* If we have not started yet return 1 (because then I don't have to change the FPS
 | 
					
						
							|  |  |  | 	   calculation in CoreRerecording.cpp */ | 
					
						
							|  |  |  | 	if (m_StartTime == 0) return 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Rrturn the final timer time if the timer is stopped
 | 
					
						
							|  |  |  | 	if (!m_Running) return (m_LastTime - m_StartTime); | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 	return (timeGetTime() - m_StartTime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Get the formattet time elapsed since the Start()
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | std::string Timer::GetTimeElapsedFormatted() const | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	// If we have not started yet, return zero
 | 
					
						
							| 
									
										
										
										
											2009-02-20 22:04:52 +00:00
										 |  |  | 	if (m_StartTime == 0) | 
					
						
							|  |  |  | 		return "00:00:00:000"; | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// The number of milliseconds since the start, use a different value if the timer is stopped
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | 	u64 Milliseconds; | 
					
						
							| 
									
										
										
										
											2009-02-20 22:04:52 +00:00
										 |  |  | 	if (m_Running) | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 		Milliseconds = timeGetTime() - m_StartTime; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		Milliseconds = m_LastTime - m_StartTime; | 
					
						
							|  |  |  | 	// Seconds
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | 	u32 Seconds = (u32)(Milliseconds / 1000); | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 	// Minutes
 | 
					
						
							|  |  |  | 	u32 Minutes = Seconds / 60; | 
					
						
							|  |  |  | 	// Hours
 | 
					
						
							|  |  |  | 	u32 Hours = Minutes / 60; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	std::string TmpStr = StringFromFormat("%02i:%02i:%02i:%03i", Hours, Minutes % 60, Seconds % 60, Milliseconds % 1000); | 
					
						
							|  |  |  | 	return TmpStr; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Get current time
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | void Timer::IncreaseResolution() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | 	timeBeginPeriod(1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Timer::RestoreResolution() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #ifdef _WIN32
 | 
					
						
							|  |  |  | 	timeEndPeriod(1); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef __GNUC__
 | 
					
						
							|  |  |  | void _time64(u64* t) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	*t = 0; //TODO
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | // Get the number of seconds since January 1 1970
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | u64 Timer::GetTimeSinceJan1970() | 
					
						
							| 
									
										
										
										
											2008-12-08 05:30:24 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	time_t ltime; | 
					
						
							|  |  |  | 	time(<ime); | 
					
						
							|  |  |  | 	return((u64)ltime); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-12-13 11:57:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | u64 Timer::GetLocalTimeSinceJan1970() | 
					
						
							| 
									
										
										
										
											2008-12-13 11:57:01 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	time_t sysTime, tzDiff; | 
					
						
							|  |  |  | 	struct tm * gmTime; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	time(&sysTime); | 
					
						
							|  |  |  | 	// Lazy way to get local time in sec
 | 
					
						
							|  |  |  | 	gmTime	= gmtime(&sysTime); | 
					
						
							|  |  |  | 	tzDiff = sysTime - mktime(gmTime); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return (u64)(sysTime + tzDiff); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | // Return the current time formatted as Minutes:Seconds:Milliseconds in the form 00:00:000
 | 
					
						
							| 
									
										
										
										
											2009-02-22 12:43:25 +00:00
										 |  |  | std::string Timer::GetTimeFormatted() | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-15 05:34:35 +00:00
										 |  |  | 	time_t sysTime; | 
					
						
							|  |  |  | 	struct tm * gmTime; | 
					
						
							|  |  |  | 	char formattedTime[13]; | 
					
						
							| 
									
										
										
										
											2009-03-21 23:00:25 +00:00
										 |  |  | 	char tmp[13]; | 
					
						
							| 
									
										
										
										
											2009-03-15 05:34:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	time(&sysTime); | 
					
						
							|  |  |  | 	gmTime = localtime(&sysTime); | 
					
						
							| 
									
										
										
										
											2009-03-21 23:00:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	strftime(tmp, 6, "%M:%S", gmTime); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-15 05:34:35 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Now tack on the milliseconds
 | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | 	struct timeb tp; | 
					
						
							|  |  |  | 	(void)::ftime(&tp); | 
					
						
							| 
									
										
										
										
											2009-03-21 23:00:25 +00:00
										 |  |  | 	sprintf(formattedTime, "%s:%03i", tmp, tp.millitm); | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-15 05:34:35 +00:00
										 |  |  | 	return std::string(formattedTime); | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2009-02-16 06:18:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-28 08:57:34 +00:00
										 |  |  | } // Namespace Common
 |