annotate osdep/timer-darwin.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents 08cac43f1e38
children c10db72e1afc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
1 /*
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
2 * Precise timer routines using Mach timing
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
3 *
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
4 * Copyright (c) 2003-2004, Dan Villiom Podlaski Christiansen
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
5 *
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
6 * Permission is hereby granted, free of charge, to any person
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
7 * obtaining a copy of this software and associated documentation
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
8 * files (the "Software"), to deal in the Software without
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
9 * restriction, including without limitation the rights to use, copy,
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
10 * modify, merge, publish, distribute, sublicense, and/or sell copies
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
11 * of the Software, and to permit persons to whom the Software is
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
12 * furnished to do so, subject to the following conditions:
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
13 *
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
14 * The above copyright notice and this permission notice shall be
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
15 * included in all copies or substantial portions of the Software.
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
16 */
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
17
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
18 #include <unistd.h>
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
19 #include <stdlib.h>
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
20 #include <time.h>
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
21 #include <math.h>
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
22 #include <sys/time.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
23 #include <mach/mach_time.h>
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
24
16985
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15275
diff changeset
25 #include "config.h"
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15275
diff changeset
26 #include "mp_msg.h"
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
27 #include "timer.h"
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
28
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
29 /* global variables */
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
30 static double relative_time, startup_time;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
31 static double timebase_ratio;
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
32
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
33 const char *timer_name = "Darwin accurate";
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
34
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
35
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
36
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
37 /* the core sleep function, uses floats and is used in MPlayer G2 */
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
38 float sleep_accurate(float time_frame)
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
39 {
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
40 uint64_t deadline = time_frame / timebase_ratio + mach_absolute_time();
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
41
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
42 mach_wait_until(deadline);
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
43
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
44 return (mach_absolute_time() - deadline) * timebase_ratio;
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
45 }
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
46
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
47 /* wrapper for MPlayer G1 */
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
48 int usec_sleep(int usec_delay)
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
49 {
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
50 return sleep_accurate(usec_delay / 1e6) * 1e6;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
51 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
52
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
53
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
54 /* current time in microseconds */
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
55 unsigned int GetTimer()
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
56 {
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
57 return (unsigned int)((mach_absolute_time() * timebase_ratio - startup_time)
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
58 * 1e6);
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
59 }
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
60
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
61 /* current time in milliseconds */
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
62 unsigned int GetTimerMS()
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
63 {
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
64 return (unsigned int)(GetTimer() / 1000);
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
65 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
66
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
67 /* time spent between now and last call in seconds */
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
68 float GetRelativeTime()
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
69 {
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
70 double last_time = relative_time;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
71
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
72 if (!relative_time)
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
73 InitTimer();
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
74
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
75 relative_time = mach_absolute_time() * timebase_ratio;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
76
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
77 return (float)(relative_time-last_time);
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
78 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
79
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
80 /* initialize timer, must be called at least once at start */
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
81 void InitTimer()
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
82 {
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
83 struct mach_timebase_info timebase;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
84
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
85 mach_timebase_info(&timebase);
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
86 timebase_ratio = (double)timebase.numer / (double)timebase.denom
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
87 * (double)1e-9;
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
88
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
89 relative_time = startup_time =
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
90 (double)(mach_absolute_time() * timebase_ratio);
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
91 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
92
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
93 #if 0
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
94 #include <stdio.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
95
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
96 int main() {
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
97 int i,j, r, c = 200;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
98 long long t = 0;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
99
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
100 InitTimer();
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
101
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
102 for (i = 0; i < c; i++) {
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
103 const int delay = rand() / (RAND_MAX / 1e5);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
104 j = GetTimer();
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
105 #if 1
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
106 r = usec_sleep(delay);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
107 #else
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
108 r = sleep_accurate(delay / 1e6) * 1e6;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
109 #endif
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
110 j = (GetTimer() - j) - delay;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
111 printf("sleep time:%8i %5i (%i)\n", delay, j, j - r);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
112 t += j - r;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
113 }
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
114 fprintf(stderr, "average error:\t%lli\n", t / c);
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
115
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
116 return 0;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
117 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
118 #endif