From 237413906dcdf4b1ba1e5809bb7510bae71b1956 Mon Sep 17 00:00:00 2001 Message-Id: <237413906dcdf4b1ba1e5809bb7510bae71b1956.1714929745.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 21 Mar 2008 19:15:21 +0000 Subject: [PATCH] speaker-network.c network_play() no longer assumes network_beforepoll() has been called. Guaranteeing that assumption be met would contradict it always being safe to call speaker_play(). Organization: Straylight/Edgeware From: Richard Kettlewell --- server/speaker-network.c | 17 +++++++++++++++-- server/speaker.h | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/server/speaker-network.c b/server/speaker-network.c index 67fca83..2f3750c 100644 --- a/server/speaker-network.c +++ b/server/speaker-network.c @@ -200,6 +200,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 +213,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=%llu now=%ld.%06ld rtp_time_0=%ld.%06ld delta=%llu (%lld)", + 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 +313,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=%llu rtp_time_0=%ld.%06ld now=%ld.%06ld target_us=%llu (%lld)\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; diff --git a/server/speaker.h b/server/speaker.h index 2786735..2af2c6b 100644 --- a/server/speaker.h +++ b/server/speaker.h @@ -182,6 +182,8 @@ struct speaker_backend { * * @p timeoutp points to the poll timeout value in milliseconds. It may be * reduced, but never increased. + * + * NB you can NOT assume that @c beforepoll is always called before @c play. */ void (*beforepoll)(int *timeoutp); -- [mdw]