OSDN Git Service

#26977 DTXViewerで使用しているjpeglib, libpng, zlib, libogg, libvorbisを最新のものにした。詳細はチケットを参照。
[dtxmania/dtxmania.git] / @FDK10プロジェクト / CTimer.cpp
1 #include "stdafx.h"\r
2 #include "CTimer.h"\r
3 \r
4 namespace FDK {\r
5         namespace General {\r
6 \r
7 // static \83\81\83\93\83o\r
8 int                                     CTimer::nRefCount = 0;\r
9 int                                     CTimer::timerType = TIMERTYPE_GETTICKCOUNT;\r
10 TIMECAPS                        CTimer::dwTimeCaps;\r
11 LARGE_INTEGER           CTimer::liFrequency;\r
12 //double                                CTimerEx::dbTimeGetTime = 0;\r
13 \r
14 void    CTimer::Init( int timerType )\r
15 {\r
16         // \8dÅ\8f\89\82Ì\83C\83\93\83X\83^\83\93\83X\82È\82ç\81A\91S\83C\83\93\83X\83^\83\93\83X\8b¤\92Ê\82Ì\8f\89\8aú\89»\82ð\8ds\82¤\81B\r
17         if( this->nRefCount == 0 )\r
18         {\r
19                 // \8eg\97p\82·\82é\83^\83C\83}\82ð\8c\88\92è\82·\82é\r
20                 switch( timerType )\r
21                 {\r
22                 // \82`\81D\8d\82\90¸\93x\83^\83C\83}\r
23                 // \82c\81D\96¢\92è\8b`\r
24                 case TIMERTYPE_PERFORMANCECOUNTER:\r
25                 case TIMERTYPE_UNKNOWN:\r
26                         if( CheckAndSetA_HighPerformanceTimer() ) break;\r
27                         if( CheckAndSetB_MultimediaTimer() ) break;\r
28                         SetC_OldTimer();\r
29                         break;\r
30 \r
31                 // \82a\81D\83}\83\8b\83`\83\81\83f\83B\83A\83^\83C\83}\r
32                 case TIMERTYPE_TIMEGTTIME:\r
33                         if( CheckAndSetB_MultimediaTimer() ) break;\r
34                         if( CheckAndSetA_HighPerformanceTimer() ) break;\r
35                         SetC_OldTimer();\r
36                         break;\r
37 \r
38                 // \82»\82Ì\91¼\81D\8b\8c\8e®\83^\83C\83}\r
39                 default:\r
40                         SetC_OldTimer();\r
41                         break;\r
42                 }\r
43         }\r
44 \r
45         Reset();                // \83^\83C\83}\83\8a\83Z\83b\83g\r
46         this->nRefCount++;      // \8eQ\8fÆ\83J\83E\83\93\83g\91\9d\89Á\r
47 }\r
48 \r
49 bool    CTimer::CheckAndSetA_HighPerformanceTimer()\r
50 {\r
51         if( ::QueryPerformanceFrequency( &liFrequency ) )\r
52         {\r
53                 CTimer::timerType = TIMERTYPE_PERFORMANCECOUNTER;\r
54                 return true;\r
55         }\r
56         return false;\r
57 }\r
58 \r
59 bool    CTimer::CheckAndSetB_MultimediaTimer()\r
60 {\r
61         if( ::timeGetDevCaps( &dwTimeCaps, sizeof( TIMECAPS ) ) == TIMERR_NOERROR && dwTimeCaps.wPeriodMin < 10 )\r
62         {\r
63                 CTimer::timerType = TIMERTYPE_TIMEGTTIME;\r
64                 ::timeBeginPeriod( dwTimeCaps.wPeriodMin );\r
65                 return true;\r
66         }\r
67         return false;\r
68 }\r
69 \r
70 bool    CTimer::SetC_OldTimer()\r
71 {\r
72         CTimer::timerType = TIMERTYPE_GETTICKCOUNT;\r
73         dwTimeCaps.wPeriodMax = 1;      // \90¸\93x1ms\81i\82Ì\82Â\82à\82è\82É\82È\82é\81j\r
74         return true;\r
75 }\r
76 \r
77 void    CTimer::Term()\r
78 {\r
79         // \8eQ\8fÆ\83J\83E\83\93\83g\8c¸\8f­\r
80         this->nRefCount --;\r
81 \r
82         // \83C\83\93\83X\83^\83\93\83X\82ª\82È\82­\82È\82Á\82½\82ç\8fI\97¹\8f\88\97\9d\r
83         if( this->nRefCount == 0 )\r
84         {\r
85                 if( this->timerType == TIMERTYPE_TIMEGTTIME )\r
86                         ::timeEndPeriod( this->dwTimeCaps.wPeriodMin );\r
87         }\r
88 }\r
89 \r
90 void    CTimer::Reset()\r
91 {\r
92         this->dbOffsetTime = this->dbPauseTime = GetTime();\r
93         this->nPaused = 0;\r
94 }\r
95 \r
96 double  CTimer::Get()\r
97 {\r
98         return ( this->nPaused > 0 ) ? (this->dbPauseTime - this->dbOffsetTime) : (GetTime() - this->dbOffsetTime);\r
99 }\r
100 \r
101 void    CTimer::Set( double dbTime )\r
102 {\r
103         this->dbOffsetTime = ( this->nPaused > 0 ) ? (this->dbPauseTime - dbTime) : (GetTime() - dbTime);\r
104 }\r
105 \r
106 void    CTimer::Pause()\r
107 {\r
108         if ( this->nPaused++ == 0 )\r
109                 this->dbPauseTime = GetTime();\r
110 }\r
111 \r
112 void    CTimer::Restart()\r
113 {\r
114         if ( --this->nPaused == 0)\r
115                 this->dbOffsetTime += GetTime() - this->dbPauseTime;\r
116 }\r
117 \r
118 double  CTimer::GetTime()\r
119 {\r
120         switch( CTimer::timerType )\r
121         {\r
122         case TIMERTYPE_GETTICKCOUNT:\r
123                 return (double) ::GetTickCount();\r
124 \r
125         case TIMERTYPE_TIMEGTTIME:\r
126                 return (double) ::timeGetTime();\r
127 \r
128         case TIMERTYPE_PERFORMANCECOUNTER:\r
129                 {\r
130                         double dbNow = 0.0;\r
131                         if( liFrequency.QuadPart != 0 )\r
132                         {\r
133                                 LARGE_INTEGER liNowTime;\r
134                                 ::QueryPerformanceCounter( &liNowTime );\r
135                                 dbNow = liNowTime.QuadPart / ( liFrequency.QuadPart / 1000.0 );\r
136                         }\r
137                         return dbNow;\r
138                 }\r
139         }\r
140         return 0.0;\r
141 }\r
142 \r
143         }//General\r
144 }//FDK