chiark / gitweb /
speaker-network.c network_play() no longer assumes
authorRichard Kettlewell <richard@fanticule>
Fri, 21 Mar 2008 19:15:21 +0000 (19:15 +0000)
committerRichard Kettlewell <richard@fanticule>
Fri, 21 Mar 2008 19:15:21 +0000 (19:15 +0000)
network_beforepoll() has been called.  Guaranteeing that assumption be
met would contradict it always being safe to call speaker_play().

server/speaker-network.c
server/speaker.h

index 67fca8388b089ddc80dae8f41d6f5f03a27b9cb6..2f3750cad58fdc60f02a82d4f82eed5d2db8957a 100644 (file)
@@ -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;
index 2786735c6d80c9e5a4e853496e90a9843e6a90a4..2af2c6bc0f3a0c206a6949866d8abb4d932ef3ee 100644 (file)
@@ -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);