X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/ec57f6c97b41d54ade912f7e3b9f727b40e38e16..d76bbdea349bf3856172ce9599e657d566e91162:/lib/uaudio-rtp.c diff --git a/lib/uaudio-rtp.c b/lib/uaudio-rtp.c index ea1d1ca..31e8f57 100644 --- a/lib/uaudio-rtp.c +++ b/lib/uaudio-rtp.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -36,6 +38,7 @@ #include "addr.h" #include "ifreq.h" #include "timeval.h" +#include "configuration.h" /** @brief Bytes to send per network packet * @@ -143,17 +146,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 +166,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 +184,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, @@ -283,7 +281,8 @@ static void rtp_start(uaudio_callback *callback, rtp_play, 256 / uaudio_sample_size, (NETWORK_BYTES - sizeof(struct rtp_header)) - / uaudio_sample_size); + / uaudio_sample_size, + 0); } static void rtp_stop(void) { @@ -301,13 +300,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, }; /*