mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-09-24 15:54:12 +00:00
116 lines
2.7 KiB
C++
116 lines
2.7 KiB
C++
//------------------------------------------------------------------------------
|
|
// File: RefTime.h
|
|
//
|
|
// Desc: DirectShow base classes - defines CRefTime, a class that manages
|
|
// reference times.
|
|
//
|
|
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
//
|
|
// CRefTime
|
|
//
|
|
// Manage reference times.
|
|
// Shares same data layout as REFERENCE_TIME, but adds some (nonvirtual)
|
|
// functions providing simple comparison, conversion and arithmetic.
|
|
//
|
|
// A reference time (at the moment) is a unit of seconds represented in
|
|
// 100ns units as is used in the Win32 FILETIME structure. BUT the time
|
|
// a REFERENCE_TIME represents is NOT the time elapsed since 1/1/1601 it
|
|
// will either be stream time or reference time depending upon context
|
|
//
|
|
// This class provides simple arithmetic operations on reference times
|
|
//
|
|
// keep non-virtual otherwise the data layout will not be the same as
|
|
// REFERENCE_TIME
|
|
|
|
|
|
// -----
|
|
// note that you are safe to cast a CRefTime* to a REFERENCE_TIME*, but
|
|
// you will need to do so explicitly
|
|
// -----
|
|
|
|
|
|
#ifndef __REFTIME__
|
|
#define __REFTIME__
|
|
|
|
|
|
const LONGLONG MILLISECONDS = (1000); // 10 ^ 3
|
|
const LONGLONG NANOSECONDS = (1000000000); // 10 ^ 9
|
|
const LONGLONG UNITS = (NANOSECONDS / 100); // 10 ^ 7
|
|
|
|
/* Unfortunately an inline function here generates a call to __allmul
|
|
- even for constants!
|
|
*/
|
|
#define MILLISECONDS_TO_100NS_UNITS(lMs) \
|
|
Int32x32To64((lMs), (UNITS / MILLISECONDS))
|
|
|
|
class CRefTime
|
|
{
|
|
public:
|
|
|
|
// *MUST* be the only data member so that this class is exactly
|
|
// equivalent to a REFERENCE_TIME.
|
|
// Also, must be *no virtual functions*
|
|
|
|
REFERENCE_TIME m_time;
|
|
|
|
inline CRefTime()
|
|
{
|
|
// default to 0 time
|
|
m_time = 0;
|
|
};
|
|
|
|
inline CRefTime(LONG msecs)
|
|
{
|
|
m_time = MILLISECONDS_TO_100NS_UNITS(msecs);
|
|
};
|
|
|
|
inline CRefTime(REFERENCE_TIME rt)
|
|
{
|
|
m_time = rt;
|
|
};
|
|
|
|
inline operator REFERENCE_TIME() const
|
|
{
|
|
return m_time;
|
|
};
|
|
|
|
inline CRefTime& operator=(const CRefTime& rt)
|
|
{
|
|
m_time = rt.m_time;
|
|
return *this;
|
|
};
|
|
|
|
inline CRefTime& operator=(const LONGLONG ll)
|
|
{
|
|
m_time = ll;
|
|
return *this;
|
|
};
|
|
|
|
inline CRefTime& operator+=(const CRefTime& rt)
|
|
{
|
|
return (*this = *this + rt);
|
|
};
|
|
|
|
inline CRefTime& operator-=(const CRefTime& rt)
|
|
{
|
|
return (*this = *this - rt);
|
|
};
|
|
|
|
inline LONG Millisecs(void)
|
|
{
|
|
return (LONG)(m_time / (UNITS / MILLISECONDS));
|
|
};
|
|
|
|
inline LONGLONG GetUnits(void)
|
|
{
|
|
return m_time;
|
|
};
|
|
};
|
|
|
|
const LONGLONG TimeZero = 0;
|
|
|
|
#endif /* __REFTIME__ */
|
|
|