SDL_MPWtimer.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_MPWtimer.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. #define MS_PER_TICK (1000/60) /* MacOS tick = 1/60 second */
  31. /* Note: This is only a step above the original 1/60s implementation.
  32.  *       For a good implementation, see FastTimes.[ch], by Matt Slot.
  33.  */
  34. #define USE_MICROSECONDS
  35. #define WideTo64bit(w) (*(UInt64 *) &(w))
  36. UInt64 start;
  37. void SDL_StartTicks(void)
  38. {
  39. #ifdef USE_MICROSECONDS
  40. UnsignedWide now;
  41. Microseconds(&now);
  42. start = WideTo64bit(now);
  43. #else
  44. /* FIXME: Should we implement a wrapping algorithm, like Win32? */
  45. #endif
  46. }
  47. Uint32 SDL_GetTicks(void)
  48. {
  49. #ifdef USE_MICROSECONDS
  50. UnsignedWide now;
  51. Microseconds(&now);
  52. return (Uint32)((WideTo64bit(now)-start)/1000);
  53. #else
  54. return(LMGetTicks()*MS_PER_TICK);
  55. #endif
  56. }
  57. void SDL_Delay(Uint32 ms)
  58. {
  59. #ifdef USE_MICROSECONDS
  60. Uint32 end_ms;
  61. end_ms = SDL_GetTicks() + ms;
  62. do {
  63. /* FIXME: Yield CPU? */ ;
  64. } while ( SDL_GetTicks() < end_ms );
  65. #else
  66. UInt32 unused; /* MJS */
  67. Delay(ms/MS_PER_TICK, &unused);
  68. #endif
  69. }
  70. /* Data to handle a single periodic alarm */
  71. typedef struct _ExtendedTimerRec
  72. {
  73. TMTask      tmTask;
  74. ProcessSerialNumber  taskPSN;
  75. } ExtendedTimerRec, *ExtendedTimerPtr;
  76. static ExtendedTimerRec gExtendedTimerRec;
  77. int SDL_SYS_TimerInit(void)
  78. {
  79. /* We don't need a setup? */
  80. return(0);
  81. }
  82. void SDL_SYS_TimerQuit(void)
  83. {
  84. /* We don't need a cleanup? */
  85. return;
  86. }
  87. /* Our Stub routine to set up and then call the real routine. */
  88. pascal void TimerCallbackProc(TMTaskPtr tmTaskPtr)
  89. {
  90. Uint32 ms;
  91. WakeUpProcess(&((ExtendedTimerPtr) tmTaskPtr)->taskPSN);
  92. ms = SDL_alarm_callback(SDL_alarm_interval);
  93. if ( ms ) {
  94. SDL_alarm_interval = ROUND_RESOLUTION(ms);
  95. PrimeTime((QElemPtr)&gExtendedTimerRec.tmTask,
  96.           SDL_alarm_interval);
  97. } else {
  98. SDL_alarm_interval = 0;
  99. }
  100. }
  101. int SDL_SYS_StartTimer(void)
  102. {
  103. /*
  104.  * Configure the global structure that stores the timing information.
  105.  */
  106. gExtendedTimerRec.tmTask.qLink = NULL;
  107. gExtendedTimerRec.tmTask.qType = 0;
  108. gExtendedTimerRec.tmTask.tmAddr = NewTimerUPP(TimerCallbackProc);
  109. gExtendedTimerRec.tmTask.tmCount = 0;
  110. gExtendedTimerRec.tmTask.tmWakeUp = 0;
  111. gExtendedTimerRec.tmTask.tmReserved = 0;
  112. GetCurrentProcess(&gExtendedTimerRec.taskPSN);
  113. /* Install the task record */
  114. InsXTime((QElemPtr)&gExtendedTimerRec.tmTask);
  115. /* Go! */
  116. PrimeTime((QElemPtr)&gExtendedTimerRec.tmTask, SDL_alarm_interval);
  117. return(0);
  118. }
  119. void SDL_SYS_StopTimer(void)
  120. {
  121. RmvTime((QElemPtr)&gExtendedTimerRec.tmTask);
  122. }