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

流媒体/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 <Types.h>
  23. #include <Timer.h>
  24. #include <OSUtils.h>
  25. #include <Gestalt.h>
  26. #include <Processes.h>
  27. #include <LowMem.h>
  28. #include "SDL_timer.h"
  29. #include "SDL_timer_c.h"
  30. #include "FastTimes.h"
  31. #define MS_PER_TICK (1000.0/60.0) /* MacOS tick = 1/60 second */
  32. #define kTwoPower32     (4294967296.0)          /* 2^32 */
  33. static double start_tick;
  34. static int    is_fast_inited = 0;
  35. void SDL_StartTicks(void)
  36. {
  37.         if ( ! is_fast_inited )     // important to check or FastTime may hang machine!
  38.             SDL_SYS_TimerInit();
  39.         start_tick = FastMicroseconds();
  40. }
  41. Uint32 SDL_GetTicks(void)
  42. {
  43.         
  44.         if ( ! is_fast_inited )
  45.             SDL_SYS_TimerInit();
  46.          
  47.         return FastMilliseconds();
  48. }
  49. void SDL_Delay(Uint32 ms)
  50. {
  51.         Uint32 stop, now;
  52.         stop = SDL_GetTicks() + ms;
  53.         do {
  54.                 SystemTask();
  55.                 now = SDL_GetTicks();
  56.         } while ( stop > now );
  57. }
  58. /*
  59. void SDL_StartTicks(void)
  60. {
  61. // FIXME: Should we implement a wrapping algorithm, like Win32? 
  62. }
  63. Uint32 SDL_GetTicks(void)
  64. {
  65. UnsignedWide ms;
  66. Microseconds (&ms);
  67. return ( ms.lo / 1000 );
  68. }
  69. void SDL_Delay(Uint32 ms)
  70. {
  71. UnsignedWide microsecs;
  72. UInt32       stop;
  73. Microseconds (&microsecs);
  74. stop = microsecs.lo + (ms * 1000);
  75. while ( stop > microsecs.lo ) {
  76.    SystemTask ();
  77.    
  78.    Microseconds (&microsecs);
  79. }
  80. }*/
  81.  
  82. /* Data to handle a single periodic alarm */
  83. typedef struct _ExtendedTimerRec
  84. {
  85. TMTask      tmTask;
  86. ProcessSerialNumber  taskPSN;
  87. } ExtendedTimerRec, *ExtendedTimerPtr;
  88. static ExtendedTimerRec gExtendedTimerRec;
  89. int SDL_SYS_TimerInit(void)
  90. {
  91. FastInitialize ();
  92. is_fast_inited = 1;
  93. return(0);
  94. }
  95. void SDL_SYS_TimerQuit(void)
  96. {
  97. /* We don't need a cleanup? */
  98. return;
  99. }
  100. /* Our Stub routine to set up and then call the real routine. */
  101. pascal void TimerCallbackProc(TMTaskPtr tmTaskPtr)
  102. {
  103. Uint32 ms;
  104. WakeUpProcess(&((ExtendedTimerPtr) tmTaskPtr)->taskPSN);
  105. ms = SDL_alarm_callback(SDL_alarm_interval);
  106. if ( ms ) {
  107. SDL_alarm_interval = ROUND_RESOLUTION(ms);
  108. PrimeTime((QElemPtr)&gExtendedTimerRec.tmTask,
  109.           SDL_alarm_interval);
  110. } else {
  111. SDL_alarm_interval = 0;
  112. }
  113. }
  114. int SDL_SYS_StartTimer(void)
  115. {
  116. /*
  117.  * Configure the global structure that stores the timing information.
  118.  */
  119. gExtendedTimerRec.tmTask.qLink = NULL;
  120. gExtendedTimerRec.tmTask.qType = 0;
  121. gExtendedTimerRec.tmTask.tmAddr = NewTimerProc(TimerCallbackProc);
  122. gExtendedTimerRec.tmTask.tmCount = 0;
  123. gExtendedTimerRec.tmTask.tmWakeUp = 0;
  124. gExtendedTimerRec.tmTask.tmReserved = 0;
  125. GetCurrentProcess(&gExtendedTimerRec.taskPSN);
  126. /* Install the task record */
  127. InsXTime((QElemPtr)&gExtendedTimerRec.tmTask);
  128. /* Go! */
  129. PrimeTime((QElemPtr)&gExtendedTimerRec.tmTask, SDL_alarm_interval);
  130. return(0);
  131. }
  132. void SDL_SYS_StopTimer(void)
  133. {
  134. RmvTime((QElemPtr)&gExtendedTimerRec.tmTask);
  135. }