Home | History | Annotate | Download | only in test
      1 /*
      2   Copyright (C) 1997-2014 Sam Lantinga <slouken (at) libsdl.org>
      3 
      4   This software is provided 'as-is', without any express or implied
      5   warranty.  In no event will the authors be held liable for any damages
      6   arising from the use of this software.
      7 
      8   Permission is granted to anyone to use this software for any purpose,
      9   including commercial applications, and to alter it and redistribute it
     10   freely.
     11 */
     12 
     13 /* Test program to check the resolution of the SDL timer on the current
     14    platform
     15 */
     16 
     17 #include <stdlib.h>
     18 #include <stdio.h>
     19 
     20 #include "SDL.h"
     21 
     22 #define DEFAULT_RESOLUTION  1
     23 
     24 static int ticks = 0;
     25 
     26 static Uint32 SDLCALL
     27 ticktock(Uint32 interval, void *param)
     28 {
     29     ++ticks;
     30     return (interval);
     31 }
     32 
     33 static Uint32 SDLCALL
     34 callback(Uint32 interval, void *param)
     35 {
     36     SDL_Log("Timer %d : param = %d\n", interval, (int) (uintptr_t) param);
     37     return interval;
     38 }
     39 
     40 int
     41 main(int argc, char *argv[])
     42 {
     43     int i, desired;
     44     SDL_TimerID t1, t2, t3;
     45     Uint32 start32, now32;
     46     Uint64 start, now;
     47 
     48 	/* Enable standard application logging */
     49     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
     50 
     51     if (SDL_Init(SDL_INIT_TIMER) < 0) {
     52         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
     53         return (1);
     54     }
     55 
     56     /* Start the timer */
     57     desired = 0;
     58     if (argv[1]) {
     59         desired = atoi(argv[1]);
     60     }
     61     if (desired == 0) {
     62         desired = DEFAULT_RESOLUTION;
     63     }
     64     t1 = SDL_AddTimer(desired, ticktock, NULL);
     65 
     66     /* Wait 10 seconds */
     67     SDL_Log("Waiting 10 seconds\n");
     68     SDL_Delay(10 * 1000);
     69 
     70     /* Stop the timer */
     71     SDL_RemoveTimer(t1);
     72 
     73     /* Print the results */
     74     if (ticks) {
     75         SDL_Log("Timer resolution: desired = %d ms, actual = %f ms\n",
     76                 desired, (double) (10 * 1000) / ticks);
     77     }
     78 
     79     /* Test multiple timers */
     80     SDL_Log("Testing multiple timers...\n");
     81     t1 = SDL_AddTimer(100, callback, (void *) 1);
     82     if (!t1)
     83         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"Could not create timer 1: %s\n", SDL_GetError());
     84     t2 = SDL_AddTimer(50, callback, (void *) 2);
     85     if (!t2)
     86         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"Could not create timer 2: %s\n", SDL_GetError());
     87     t3 = SDL_AddTimer(233, callback, (void *) 3);
     88     if (!t3)
     89         SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,"Could not create timer 3: %s\n", SDL_GetError());
     90 
     91     /* Wait 10 seconds */
     92     SDL_Log("Waiting 10 seconds\n");
     93     SDL_Delay(10 * 1000);
     94 
     95     SDL_Log("Removing timer 1 and waiting 5 more seconds\n");
     96     SDL_RemoveTimer(t1);
     97 
     98     SDL_Delay(5 * 1000);
     99 
    100     SDL_RemoveTimer(t2);
    101     SDL_RemoveTimer(t3);
    102 
    103     start = SDL_GetPerformanceCounter();
    104     for (i = 0; i < 1000000; ++i) {
    105         ticktock(0, NULL);
    106     }
    107     now = SDL_GetPerformanceCounter();
    108     SDL_Log("1 million iterations of ticktock took %f ms\n", (double)((now - start)*1000) / SDL_GetPerformanceFrequency());
    109 
    110     SDL_Log("Performance counter frequency: %llu\n", (unsigned long long) SDL_GetPerformanceFrequency());
    111     start32 = SDL_GetTicks();
    112     start = SDL_GetPerformanceCounter();
    113     SDL_Delay(1000);
    114     now = SDL_GetPerformanceCounter();
    115     now32 = SDL_GetTicks();
    116     SDL_Log("Delay 1 second = %d ms in ticks, %f ms according to performance counter\n", (now32-start32), (double)((now - start)*1000) / SDL_GetPerformanceFrequency());
    117 
    118     SDL_Quit();
    119     return (0);
    120 }
    121 
    122 /* vi: set ts=4 sw=4 expandtab: */
    123