X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/24d6fd25cb93a98a48ec16640fb9f0cc7cca8075..ca6b4a12640792d416b9fcbeb4baa8a3b84285ff:/server/speaker-network.c diff --git a/server/speaker-network.c b/server/speaker-network.c index 810aff7..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,10 +26,10 @@ #include #include #include -#include #include #include #include +#include #include "configuration.h" #include "syscalls.h" @@ -83,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; @@ -199,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; @@ -209,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 */ @@ -304,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;