annotate osdep/timer-darwin.c @ 35467:364387ae95f4

Fix bug with stop button and playlist. Although the current file was stopped and its information still displayed, play would skip to next file in list. Now, the file stopped can be resumed.
author ib
date Sun, 02 Dec 2012 15:56:19 +0000
parents c70109fc98b2
children
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>
32675
c70109fc98b2 Add/remove a few standard header #includes in our libc function replacements.
diego
parents: 31464
diff changeset
19 #include <stdint.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
20 #include <stdlib.h>
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
21 #include <time.h>
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
22 #include <math.h>
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
23 #include <sys/time.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
24 #include <mach/mach_time.h>
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
25
16985
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15275
diff changeset
26 #include "config.h"
08cac43f1e38 Unify include paths, -I.. is in CFLAGS.
diego
parents: 15275
diff changeset
27 #include "mp_msg.h"
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
28 #include "timer.h"
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
29
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
30 /* global variables */
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
31 static double relative_time;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
32 static double timebase_ratio;
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
33
31464
1453fc56d49c Change timer_name type from char* to char[]; patch taken from Uoti's tree.
diego
parents: 30673
diff changeset
34 const char timer_name[] = "Darwin accurate";
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
35
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
36
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
37
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
38 /* the core sleep function, uses floats and is used in MPlayer G2 */
30673
cfb6e0b4e2bd Mark sleep_accurate() as static, it is only used within the file.
diego
parents: 29263
diff changeset
39 static float sleep_accurate(float time_frame)
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
40 {
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
41 uint64_t deadline = time_frame / timebase_ratio + mach_absolute_time();
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
42
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
43 mach_wait_until(deadline);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
44
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
45 return (mach_absolute_time() - deadline) * timebase_ratio;
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
46 }
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
47
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
48 /* wrapper for MPlayer G1 */
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
49 int usec_sleep(int usec_delay)
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
50 {
15275
0e350095a07b use sleep_accurate darwin timer
nplourde
parents: 13776
diff changeset
51 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
52 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
53
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
54
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
55 /* current time in microseconds */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
56 unsigned int GetTimer(void)
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
57 {
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
58 return (unsigned int)(uint64_t)(mach_absolute_time() * timebase_ratio * 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 */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
62 unsigned int GetTimerMS(void)
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
63 {
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
64 return (unsigned int)(uint64_t)(mach_absolute_time() * timebase_ratio * 1e3);
10148
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 */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
68 float GetRelativeTime(void)
10148
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
71
12954
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();
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
74
10148
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 */
29212
eda346733b8c Add missing 'void' to parameterless function declarations.
diego
parents: 26640
diff changeset
81 void InitTimer(void)
10148
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);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
86 timebase_ratio = (double)timebase.numer / (double)timebase.denom
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
87 * (double)1e-9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
88
26640
503c2fd0c88b Remove useless variable startup_time, since we do not need it any more.
ulion
parents: 26550
diff changeset
89 relative_time = (double)(mach_absolute_time() * timebase_ratio);
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
90 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
91
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
92 #if 0
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
93 #include <stdio.h>
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
94
25100
531116b7693d main() --> main(void)
diego
parents: 24815
diff changeset
95 int main(void) {
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
96 int i,j, r, c = 200;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
97 long long t = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29212
diff changeset
98
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
99 InitTimer();
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
100
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
101 for (i = 0; i < c; i++) {
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
102 const int delay = rand() / (RAND_MAX / 1e5);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
103 j = GetTimer();
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
104 #if 1
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
105 r = usec_sleep(delay);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
106 #else
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
107 r = sleep_accurate(delay / 1e6) * 1e6;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
108 #endif
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
109 j = (GetTimer() - j) - delay;
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
110 printf("sleep time:%8i %5i (%i)\n", delay, j, j - r);
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
111 t += j - r;
10148
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
112 }
12954
f9755d9c479a Native darwin timer update.
wight
parents: 11867
diff changeset
113 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
114
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
115 return 0;
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
116 }
139b44930abc Precise timer for Darwin (it's more accurate than timer-macosx.c)
alex
parents:
diff changeset
117 #endif