chiark / gitweb /
Core Audio support should now include descriptions in error strings.
[disorder] / server / speaker-network.c
index 810aff766ba73c2041bd5b7b8efdae469beabc7d..e8a7190413dc914f90fabaf6ceb64c590375518c 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
  */
 /** @file server/speaker-network.c
  * @brief Support for @ref BACKEND_NETWORK */
 
-#include <config.h>
-#include "types.h"
+#include "common.h"
 
 #include <unistd.h>
 #include <poll.h>
 #include <gcrypt.h>
 #include <sys/socket.h>
 #include <sys/uio.h>
-#include <assert.h>
 #include <net/if.h>
 #include <ifaddrs.h>
 #include <errno.h>
+#include <netinet/in.h>
 
 #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;