timer.win32.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <windows.h>
  2. #include <mmsystem.h>
  3. #include <stdio.h>
  4. #include <brl.mod/systemdefault.mod/system.h>
  5. #define MAX_TIMERS 16
  6. void brl_timerdefault__TimerFired( BBObject *bbTimer );
  7. static uintptr_t timers[MAX_TIMERS],n_timers;
  8. static void timerSyncOp( BBObject *bbTimer,int timer ){
  9. int i;
  10. for( i=0;i<n_timers && timer!=timers[i];++i ) {}
  11. if( i<n_timers ) brl_timerdefault__TimerFired( bbTimer );
  12. }
  13. static void __stdcall timerProc( UINT timer,UINT msg,DWORD_PTR user,DWORD_PTR u1,DWORD_PTR u2 ){
  14. bbSystemPostSyncOp( timerSyncOp,(BBObject*)user,timer );
  15. }
  16. void * bbTimerStart( float hertz,BBObject *bbTimer ){
  17. uintptr_t timer;
  18. if( n_timers==MAX_TIMERS ) return 0;
  19. timer=(uintptr_t)timeSetEvent( 1000.0/hertz,0,timerProc,(DWORD_PTR)bbTimer,TIME_PERIODIC );
  20. if( !timer ) return 0;
  21. BBRETAIN( bbTimer );
  22. timers[n_timers++]=timer;
  23. return (void*)timer;
  24. }
  25. void bbTimerStop( void* t,BBObject *bbTimer ){
  26. int i;
  27. uintptr_t timer=(uintptr_t)t;
  28. for( i=0;i<n_timers && timer!=timers[i];++i ) {}
  29. if( i==n_timers ) return;
  30. timers[i]=timers[--n_timers];
  31. timeKillEvent( timer );
  32. BBRELEASE( bbTimer );
  33. }