SDL_systimer.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_systimer.c,v 1.4 2002/04/22 21:38:03 wmay Exp $";
  21. #endif
  22. #include <stdio.h>
  23. #include <time.h>
  24. #include <signal.h>
  25. #include <unistd.h>
  26. #include <string.h>
  27. #include <errno.h>
  28. #include <exec/types.h>
  29. #ifdef __SASC
  30. #include <proto/dos.h>
  31. #include <clib/graphics_protos.h>
  32. #include <pragmas/graphics.h>
  33. #include <clib/exec_protos.h>
  34. #include <pragmas/exec.h>
  35. #elif defined(STORMC4_WOS)
  36. #include <proto/dos.h>
  37. #include <proto/exec.h>
  38. #include <proto/graphics.h>
  39. #else
  40. #include <inline/dos.h>
  41. #include <inline/exec.h>
  42. #include <inline/graphics.h>
  43. #endif
  44. #include "mydebug.h"
  45. extern struct DosLibrary *DOSBase;
  46. extern struct ExecBase *SysBase;
  47. static struct GfxBase *GfxBase;
  48. #include "SDL_error.h"
  49. #include "SDL_timer.h"
  50. #include "SDL_timer_c.h"
  51. #if defined(DISABLE_THREADS) || defined(FORK_HACK)
  52. #define USE_ITIMER
  53. #endif
  54. /* The first ticks value of the application */
  55. #if !defined(__PPC__) || defined(STORMC4_WOS) || defined(MORPHOS)
  56. static clock_t start;
  57. void SDL_StartTicks(void)
  58. {
  59. /* Set first ticks value */
  60. start=clock();
  61. }
  62. Uint32 SDL_GetTicks (void)
  63. {
  64. clock_t ticks;
  65. ticks=clock()-start;
  66. #ifdef __SASC
  67. // CLOCKS_PER_SEC == 1000 !
  68. return(ticks);
  69. #else
  70. // CLOCKS_PER_SEC != 1000 !
  71. return ticks*(1000/CLOCKS_PER_SEC);
  72. #endif
  73. }
  74. void SDL_Delay (Uint32 ms)
  75. {
  76. // Do a busy wait if time is less than 50ms
  77. if(ms<50)
  78. {
  79. clock_t to_wait=clock();
  80. #ifndef __SASC
  81. ms*=(CLOCKS_PER_SEC/1000);
  82. #endif
  83. to_wait+=ms;
  84. while(clock()<to_wait);
  85. }
  86. else
  87. {
  88. Delay(ms/20);
  89. }
  90. }
  91. #else
  92. ULONG MY_CLOCKS_PER_SEC;
  93. void PPC_TimerInit(void);
  94. APTR MyTimer;
  95. ULONG start[2];
  96. void SDL_StartTicks(void)
  97. {
  98. /* Set first ticks value */
  99. if(!MyTimer)
  100. PPC_TimerInit();
  101. PPCGetTimerObject(MyTimer,PPCTIMERTAG_CURRENTTICKS,start);
  102. start[1]>>=10;
  103. start[1]|=((result[0]&0x3ff)<<22);
  104. start[0]>>=10;
  105. }
  106. Uint32 SDL_GetTicks (void)
  107. {
  108. ULONG result[2];
  109. PPCGetTimerObject(MyTimer,PPCTIMERTAG_CURRENTTICKS,result);
  110. // PPCAsr64p(result,10);
  111. // Non va, la emulo:
  112. result[1]>>=10;
  113. result[1]|=((result[0]&0x3ff)<<22);
  114. // Non mi interessa piu' result[0]
  115. return result[1]*1000/MY_CLOCKS_PER_SEC;
  116. }
  117. void SDL_Delay (Uint32 ms)
  118. {
  119. // Do a busy wait if time is less than 50ms
  120. if(ms<50)
  121. {
  122. ULONG to_wait[2],actual[2];
  123. PPCGetTimerObject(MyTimer,PPCTIMERTAG_CURRENTTICKS,result);
  124. actual[1]=0;
  125. to_wait[1]+=ms*1000/MY_CLOCKS_PER_SEC;
  126. while(actual[1]<to_wait[1])
  127. {
  128. PPCGetTimerObject(MyTimer,PPCTIMERTAG_CURRENTTICKS,actual);
  129. }
  130. }
  131. else
  132. {
  133. Delay(ms/50);
  134. }
  135. }
  136. void PPC_TimerInit(void)
  137. {
  138. struct TagItem tags[]=
  139. {
  140. PPCTIMERTAG_CPU,TRUE,
  141. TAG_DONE,0
  142. };
  143. if(MyTimer=PPCCreateTimerObject(tags))
  144. {
  145. ULONG result[2];
  146. PPCGetTimerObject(MyTimer,PPCTIMERTAG_TICKSPERSEC,result);
  147. D(bug("Timer inizializzato, TPS: %lu - %lun",result[0],result[1]));
  148. // PPCAsr64p(result,10);
  149. result[1]>>=10;
  150. result[1]|=((result[0]&0x3ff)<<22);
  151. result[0]>>=10;
  152. D(bug("Shiftato TPS: %lu - %lun",result[0],result[1]));
  153. MY_CLOCKS_PER_SEC=result[1];
  154. PPCGetTimerObject(MyTimer,PPCTIMERTAG_CURRENTTICKS,result);
  155. D(bug("Current ticks: %lu - %lun",result[0],result[1]));
  156. result[1]>>=10;
  157. result[1]|=((result[0]&0x3ff)<<22);
  158. result[0]>>=10;
  159. // PPCAsr64p(result,10);
  160. D(bug("Shiftato: %lu - %lun",result[0],result[1]));
  161. }
  162. else
  163. {
  164. D(bug("Errore nell'inizializzazione del timer!n"));
  165. }
  166. }
  167. #endif
  168. #include "SDL_thread.h"
  169. /* Data to handle a single periodic alarm */
  170. static int timer_alive = 0;
  171. static SDL_Thread *timer_thread = NULL;
  172. static int RunTimer(void *unused)
  173. {
  174. D(bug("SYSTimer: Entering RunTimer loop..."));
  175. if(GfxBase==NULL)
  176. GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",37);
  177. while ( timer_alive ) {
  178. if ( SDL_timer_running ) {
  179. SDL_ThreadedTimerCheck();
  180. }
  181. if(GfxBase)
  182. WaitTOF();  // Check the timer every fifth of seconds. Was SDL_Delay(1)->BusyWait!
  183. else
  184. Delay(1);
  185. }
  186. D(bug("SYSTimer: EXITING RunTimer loop..."));
  187. return(0);
  188. }
  189. /* This is only called if the event thread is not running */
  190. int SDL_SYS_TimerInit(void)
  191. {
  192. D(bug("Creating thread for the timer (NOITIMER)...n"));
  193. timer_alive = 1;
  194. timer_thread = SDL_CreateThread(RunTimer, NULL);
  195. if ( timer_thread == NULL )
  196. {
  197. D(bug("Creazione del thread fallita...n"));
  198. return(-1);
  199. }
  200. return(SDL_SetTimerThreaded(1));
  201. }
  202. void SDL_SYS_TimerQuit(void)
  203. {
  204. timer_alive = 0;
  205. if ( timer_thread ) {
  206. SDL_WaitThread(timer_thread, NULL);
  207. timer_thread = NULL;
  208. }
  209. }
  210. int SDL_SYS_StartTimer(void)
  211. {
  212. SDL_SetError("Internal logic error: AmigaOS uses threaded timer");
  213. return(-1);
  214. }
  215. void SDL_SYS_StopTimer(void)
  216. {
  217. return;
  218. }