chiark / gitweb /
uaudio gains a new 'configure' method, which imposes the audio API's
[disorder] / lib / uaudio-rtp.c
index ea1d1ca76d15faa935278d02c43e83b1bd4cf9c1..b800b8b612661175b28e5e078854f6f6a6a91476 100644 (file)
@@ -36,6 +36,7 @@
 #include "addr.h"
 #include "ifreq.h"
 #include "timeval.h"
+#include "configuration.h"
 
 /** @brief Bytes to send per network packet
  *
@@ -143,17 +144,16 @@ static void rtp_open(void) {
   socklen_t len;
   char *sockname, *ssockname;
   struct stringlist dst, src;
-  const char *delay;
   
   /* Get configuration */
   dst.n = 2;
   dst.s = xcalloc(2, sizeof *dst.s);
-  dst.s[0] = uaudio_get("rtp-destination");
-  dst.s[1] = uaudio_get("rtp-destination-port");
+  dst.s[0] = uaudio_get("rtp-destination", NULL);
+  dst.s[1] = uaudio_get("rtp-destination-port", NULL);
   src.n = 2;
   src.s = xcalloc(2, sizeof *dst.s);
-  src.s[0] = uaudio_get("rtp-source");
-  src.s[1] = uaudio_get("rtp-source-port");
+  src.s[0] = uaudio_get("rtp-source", NULL);
+  src.s[1] = uaudio_get("rtp-source-port", NULL);
   if(!dst.s[0])
     fatal(0, "'rtp-destination' not set");
   if(!dst.s[1])
@@ -164,10 +164,8 @@ static void rtp_open(void) {
     src.n = 2;
   } else
     src.n = 0;
-  if((delay = uaudio_get("rtp-delay-threshold")))
-    rtp_delay_threshold = atoi(delay);
-  else
-    rtp_delay_threshold = 1000;         /* microseconds */
+  rtp_delay_threshold = atoi(uaudio_get("rtp-delay-threshold", "1000"));
+  /* ...microseconds */
 
   /* Resolve addresses */
   res = get_address(&dst, &pref, &sockname);
@@ -184,10 +182,8 @@ static void rtp_open(void) {
     fatal(errno, "error creating broadcast socket");
   if(multicast(res->ai_addr)) {
     /* Enable multicast options */
-    const char *ttls = uaudio_get("multicast-ttl");
-    const int ttl = ttls ? atoi(ttls) : 1;
-    const char *loops = uaudio_get("multicast-loop");
-    const int loop = loops ? !strcmp(loops, "yes") : 1;
+    const int ttl = atoi(uaudio_get("multicast-ttl", "1"));
+    const int loop = !strcmp(uaudio_get("multicast-loop", "yes"), "yes");
     switch(res->ai_family) {
     case PF_INET: {
       if(setsockopt(rtp_fd, IPPROTO_IP, IP_MULTICAST_TTL,
@@ -301,13 +297,33 @@ static void rtp_deactivate(void) {
   uaudio_thread_deactivate();
 }
 
+static void rtp_configure(void) {
+  char buffer[64];
+
+  uaudio_set("rtp-destination", config->broadcast.s[0]);
+  uaudio_set("rtp-destination-port", config->broadcast.s[1]);
+  if(config->broadcast_from.n) {
+    uaudio_set("rtp-source", config->broadcast_from.s[0]);
+    uaudio_set("rtp-source-port", config->broadcast_from.s[0]);
+  } else {
+    uaudio_set("rtp-source", NULL);
+    uaudio_set("rtp-source-port", NULL);
+  }
+  snprintf(buffer, sizeof buffer, "%ld", config->multicast_ttl);
+  uaudio_set("multicast-ttl", buffer);
+  uaudio_set("multicast-loop", config->multicast_loop ? "yes" : "no");
+  snprintf(buffer, sizeof buffer, "%ld", config->rtp_delay_threshold);
+  uaudio_set("delay-threshold", buffer);
+}
+
 const struct uaudio uaudio_rtp = {
   .name = "rtp",
   .options = rtp_options,
   .start = rtp_start,
   .stop = rtp_stop,
   .activate = rtp_activate,
-  .deactivate = rtp_deactivate
+  .deactivate = rtp_deactivate,
+  .configure = rtp_configure,
 };
 
 /*