Mercurial > mplayer.hg
annotate udp_sync.c @ 32676:db882cd69776
Do not #define _WIN32 on the command line for Cygwin.
Newer Cygwin versions no longer do this and hopefully we should be able
to survive without this hack as well. This change necessitates adapting
two #ifdefs in the MPlayer codebase. It is committed untested as I do
not have access to a Cygwin system.
author | diego |
---|---|
date | Thu, 06 Jan 2011 12:42:59 +0000 |
parents | bf0574ca5c57 |
children | 5dcbfb18ad58 |
rev | line source |
---|---|
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
1 /* |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
2 * Network playback synchronization |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
3 * Copyright (C) 2009 Google Inc. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
4 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
5 * This file is part of MPlayer. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
6 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
7 * MPlayer is free software; you can redistribute it and/or modify |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
8 * it under the terms of the GNU General Public License as published by |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
9 * the Free Software Foundation; either version 2 of the License, or |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
10 * (at your option) any later version. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
11 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
12 * MPlayer is distributed in the hope that it will be useful, |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
15 * GNU General Public License for more details. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
16 * |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
17 * You should have received a copy of the GNU General Public License along |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
20 */ |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
21 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
22 #include "config.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
23 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
24 #if !HAVE_WINSOCK2_H |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
25 #include <errno.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
26 #include <sys/types.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
27 #include <sys/socket.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
28 #include <netinet/in.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
29 #include <stdlib.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
30 #include <sys/ioctl.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
31 #include <fcntl.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
32 #include <string.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
33 #include <strings.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
34 #include <netdb.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
35 #include <signal.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
36 #else |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
37 #include <winsock2.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
38 #include <ws2tcpip.h> |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
39 #endif /* HAVE_WINSOCK2_H */ |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
40 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
41 #include "mplayer.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
42 #include "mp_core.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
43 #include "mp_msg.h" |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
44 #include "help_mp.h" |
31985 | 45 #include "udp_sync.h" |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
46 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
47 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
48 // config options for UDP sync |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
49 int udp_master = 0; |
31985 | 50 int udp_slave = 0; |
51 int udp_port = 23867; | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
52 const char *udp_ip = "127.0.0.1"; // where the master sends datagrams |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
53 // (can be a broadcast address) |
31985 | 54 float udp_seek_threshold = 1.0; // how far off before we seek |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
55 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
56 // remember where the master is in the file |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
57 static float udp_master_position = -1.0; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
58 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
59 // how far off is still considered equal |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
60 #define UDP_TIMING_TOLERANCE 0.02 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
61 |
32001 | 62 static void set_blocking(int fd, int blocking) |
63 { | |
64 long sock_flags; | |
65 #if HAVE_WINSOCK2_H | |
66 sock_flags = blocking; | |
67 ioctlsocket(fd, FIONBIO, &sock_flags); | |
68 #else | |
69 sock_flags = fcntl(fd, F_GETFL, 0); | |
70 sock_flags = blocking ? sock_flags & ~O_NONBLOCK : sock_flags | O_NONBLOCK; | |
71 fcntl(fd, F_SETFL, sock_flags); | |
72 #endif /* HAVE_WINSOCK2_H */ | |
73 } | |
74 | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
75 // gets a datagram from the master with or without blocking. updates |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
76 // master_position if successful. if the master has exited, returns 1. |
32007 | 77 // returns -1 on error. |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
78 // otherwise, returns 0. |
32009
31db5ee9280d
Make get_udp static, it is not used outside the file.
reimar
parents:
32008
diff
changeset
|
79 static int get_udp(int blocking, float *master_position) |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
80 { |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
81 char mesg[100]; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
82 |
31998
28fb4ef194f9
Avoid duplicating the recvfrom/"bye"-handling code.
reimar
parents:
31996
diff
changeset
|
83 int chars_received = -1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
84 int n; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
85 |
32008
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
86 static int sockfd = -1; |
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
87 if (sockfd == -1) { |
32002
86d37b0e4dbc
Use initializer to avoid leaving struct timeval half-uninitialized.
reimar
parents:
32001
diff
changeset
|
88 struct timeval tv = { .tv_sec = 30 }; |
31990
4111548d28f9
Use initializer instead of memset, the memset in addition never
reimar
parents:
31985
diff
changeset
|
89 struct sockaddr_in servaddr = { 0 }; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
90 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
91 sockfd = socket(AF_INET, SOCK_DGRAM, 0); |
32007 | 92 if (sockfd == -1) |
93 return -1; | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
94 |
31985 | 95 servaddr.sin_family = AF_INET; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
96 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); |
31985 | 97 servaddr.sin_port = htons(udp_port); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
98 bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
99 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
100 setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
101 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
102 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
103 |
32001 | 104 set_blocking(sockfd, blocking); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
105 |
31998
28fb4ef194f9
Avoid duplicating the recvfrom/"bye"-handling code.
reimar
parents:
31996
diff
changeset
|
106 while (-1 != (n = recvfrom(sockfd, mesg, sizeof(mesg)-1, 0, |
32010
120953a1fc50
Use NULL for recvfrom return arguments we don't care about (source address).
reimar
parents:
32009
diff
changeset
|
107 NULL, NULL))) { |
31998
28fb4ef194f9
Avoid duplicating the recvfrom/"bye"-handling code.
reimar
parents:
31996
diff
changeset
|
108 // flush out any further messages so we don't get behind |
32001 | 109 if (chars_received == -1) |
110 set_blocking(sockfd, 0); | |
111 | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
112 chars_received = n; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
113 mesg[chars_received] = 0; |
31991 | 114 if (strcmp(mesg, "bye") == 0) |
31985 | 115 return 1; |
32011
bf0574ca5c57
Simply parse all received packets even if we might overwrite the
reimar
parents:
32010
diff
changeset
|
116 sscanf(mesg, "%f", master_position); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
117 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
118 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
119 return 0; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
120 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
121 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
122 void send_udp(const char *send_to_ip, int port, char *mesg) |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
123 { |
32008
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
124 static int sockfd = -1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
125 static struct sockaddr_in socketinfo; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
126 |
32008
221819bef85e
Use sockfd value to detect if we initialized already instead of a
reimar
parents:
32007
diff
changeset
|
127 if (sockfd == -1) { |
32003
30a84c65efa4
Mark a constant as such and move it into the block where it is used.
reimar
parents:
32002
diff
changeset
|
128 static const int one = 1; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
129 int ip_valid = 0; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
130 |
31985 | 131 sockfd = socket(AF_INET, SOCK_DGRAM, 0); |
32007 | 132 if (sockfd == -1) |
133 exit_player(EXIT_ERROR); | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
134 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
135 // Enable broadcast |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
136 setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
137 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
138 #if HAVE_WINSOCK2_H |
32006
3133252ce3fa
Actually set the destination address in the sockaddr_in struct for Windows as well...
reimar
parents:
32003
diff
changeset
|
139 socketinfo.sin_addr.s_addr = inet_addr(send_to_ip); |
3133252ce3fa
Actually set the destination address in the sockaddr_in struct for Windows as well...
reimar
parents:
32003
diff
changeset
|
140 ip_valid = socketinfo.sin_addr.s_addr != INADDR_NONE; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
141 #else |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
142 ip_valid = inet_aton(send_to_ip, &socketinfo.sin_addr); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
143 #endif |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
144 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
145 if (!ip_valid) { |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
146 mp_msg(MSGT_CPLAYER, MSGL_FATAL, MSGTR_InvalidIP); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
147 exit_player(EXIT_ERROR); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
148 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
149 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
150 socketinfo.sin_family = AF_INET; |
31985 | 151 socketinfo.sin_port = htons(port); |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
152 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
153 |
31985 | 154 sendto(sockfd, mesg, strlen(mesg), 0, (struct sockaddr *) &socketinfo, |
155 sizeof(socketinfo)); | |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
156 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
157 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
158 // this function makes sure we stay as close as possible to the master's |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
159 // position. returns 1 if the master tells us to exit, 0 otherwise. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
160 int udp_slave_sync(MPContext *mpctx) |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
161 { |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
162 // grab any waiting datagrams without blocking |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
163 int master_exited = get_udp(0, &udp_master_position); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
164 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
165 while (!master_exited) { |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
166 float my_position = mpctx->sh_video->pts; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
167 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
168 // if we're way off, seek to catch up |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
169 if (FFABS(my_position - udp_master_position) > udp_seek_threshold) { |
31985 | 170 abs_seek_pos = SEEK_ABSOLUTE; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
171 rel_seek_secs = udp_master_position; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
172 break; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
173 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
174 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
175 // normally we expect that the master will have just played the |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
176 // frame we're ready to play. break out and play it, and we'll be |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
177 // right in sync. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
178 // or, the master might be up to a few seconds ahead of us, in |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
179 // which case we also want to play the current frame immediately, |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
180 // without waiting. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
181 // UDP_TIMING_TOLERANCE is a small value that lets us consider |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
182 // the master equal to us even if it's very slightly ahead. |
31991 | 183 if (udp_master_position + UDP_TIMING_TOLERANCE > my_position) |
31992 | 184 break; |
31982
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
185 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
186 // the remaining case is that we're slightly ahead of the master. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
187 // usually, it just means we called get_udp() before the datagram |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
188 // arrived. call get_udp again, but this time block until we receive |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
189 // a datagram. |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
190 master_exited = get_udp(1, &udp_master_position); |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
191 } |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
192 |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
193 return master_exited; |
184969a3a437
Add synchronization of multiple MPlayer instances over UDP.
reimar
parents:
diff
changeset
|
194 } |