X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/edbd470fa6b1d1286a4500f3a8263905fbc2d11d..ca6b4a12640792d416b9fcbeb4baa8a3b84285ff:/server/speaker-network.c
diff --git a/server/speaker-network.c b/server/speaker-network.c
index 67fca83..e8a7190 100644
--- a/server/speaker-network.c
+++ b/server/speaker-network.c
@@ -1,27 +1,24 @@
/*
* This file is part of DisOrder
- * Copyright (C) 2005, 2006, 2007 Richard Kettlewell
+ * Copyright (C) 2005-2008 Richard Kettlewell
*
- * This program is free software; you can redistribute it and/or modify
+ * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
* You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
+ * along with this program. If not, see .
*/
/** @file server/speaker-network.c
* @brief Support for @ref BACKEND_NETWORK */
-#include
-#include "types.h"
+#include "common.h"
#include
#include
@@ -29,7 +26,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -84,24 +80,16 @@ static int audio_errors;
static void network_init(void) {
struct addrinfo *res, *sres;
static const struct addrinfo pref = {
- 0,
- PF_INET,
- SOCK_DGRAM,
- IPPROTO_UDP,
- 0,
- 0,
- 0,
- 0
+ .ai_flags = 0,
+ .ai_family = PF_INET,
+ .ai_socktype = SOCK_DGRAM,
+ .ai_protocol = IPPROTO_UDP,
};
static const struct addrinfo prefbind = {
- AI_PASSIVE,
- PF_INET,
- SOCK_DGRAM,
- IPPROTO_UDP,
- 0,
- 0,
- 0,
- 0
+ .ai_flags = AI_PASSIVE,
+ .ai_family = PF_INET,
+ .ai_socktype = SOCK_DGRAM,
+ .ai_protocol = IPPROTO_UDP,
};
static const int one = 1;
int sndbuf, target_sndbuf = 131072;
@@ -200,6 +188,9 @@ static size_t network_play(size_t frames) {
/* We transmit using RTP (RFC3550) and attempt to conform to the internet
* AVT profile (RFC3551). */
+ /* If we're starting then initialize the base time */
+ if(!rtp_time)
+ xgettimeofday(&rtp_time_0, 0);
if(idled) {
/* There may have been a gap. Fix up the RTP time accordingly. */
struct timeval now;
@@ -210,7 +201,12 @@ static size_t network_play(size_t frames) {
xgettimeofday(&now, 0);
/* Find the number of microseconds elapsed since rtp_time=0 */
delta = tvsub_us(now, rtp_time_0);
- assert(delta <= UINT64_MAX / 88200);
+ if(delta > UINT64_MAX / 88200)
+ fatal(0, "rtp_time=%"PRIu64" now=%ld.%06ld rtp_time_0=%ld.%06ld delta=%"PRIu64" (%"PRId64")",
+ rtp_time,
+ (long)now.tv_sec, (long)now.tv_usec,
+ (long)rtp_time_0.tv_sec, (long)rtp_time_0.tv_usec,
+ delta, delta);
target_rtp_time = (delta * config->sample_format.rate
* config->sample_format.channels) / 1000000;
/* Overflows at ~6 years uptime with 44100Hz stereo */
@@ -305,7 +301,12 @@ static void network_beforepoll(int *timeoutp) {
/* We send audio data whenever we would otherwise get behind */
xgettimeofday(&now, 0);
target_us = tvsub_us(now, rtp_time_0);
- assert(target_us <= UINT64_MAX / 88200);
+ if(target_us > UINT64_MAX / 88200)
+ fatal(0, "rtp_time=%"PRIu64" rtp_time_0=%ld.%06ld now=%ld.%06ld target_us=%"PRIu64" (%"PRId64")\n",
+ rtp_time,
+ (long)rtp_time_0.tv_sec, (long)rtp_time_0.tv_usec,
+ (long)now.tv_sec, (long)now.tv_usec,
+ target_us, target_us);
target_rtp_time = (target_us * config->sample_format.rate
* config->sample_format.channels)
/ 1000000;