diff options
Diffstat (limited to 'src/modules/rtp/module-rtp-send.c')
| -rw-r--r-- | src/modules/rtp/module-rtp-send.c | 23 | 
1 files changed, 21 insertions, 2 deletions
| diff --git a/src/modules/rtp/module-rtp-send.c b/src/modules/rtp/module-rtp-send.c index 5e542253..1423cbc1 100644 --- a/src/modules/rtp/module-rtp-send.c +++ b/src/modules/rtp/module-rtp-send.c @@ -67,10 +67,12 @@ PA_MODULE_USAGE(          "destination=<destination IP address> "          "port=<port number> "          "mtu=<maximum transfer unit> " -        "loop=<loopback to local host?>" +        "loop=<loopback to local host?> " +        "ttl=<ttl value>"  );  #define DEFAULT_PORT 46000 +#define DEFAULT_TTL 1  #define SAP_PORT 9875  #define DEFAULT_DESTINATION "224.0.0.56"  #define MEMBLOCKQ_MAXLENGTH (1024*170) @@ -86,6 +88,7 @@ static const char* const valid_modargs[] = {      "port",      "mtu" ,      "loop", +    "ttl",      NULL  }; @@ -167,6 +170,7 @@ int pa__init(pa_module*m) {      pa_modargs *ma = NULL;      const char *dest;      uint32_t port = DEFAULT_PORT, mtu; +    uint32_t ttl = DEFAULT_TTL;      int af, fd = -1, sap_fd = -1;      pa_source *s;      pa_sample_spec ss; @@ -235,6 +239,11 @@ int pa__init(pa_module*m) {      if (port & 1)          pa_log_warn("Port number not even as suggested in RFC3550!"); +    if (pa_modargs_get_value_u32(ma, "ttl", &ttl) < 0 || ttl < 1 || ttl > 0xFF) { +        pa_log("ttl= expects a numerical argument between 1 and 255."); +        goto fail; +    } +      dest = pa_modargs_get_value(ma, "destination", DEFAULT_DESTINATION);      if (inet_pton(AF_INET6, dest, &sa6.sin6_addr) > 0) { @@ -279,6 +288,15 @@ int pa__init(pa_module*m) {          goto fail;      } +    if (ttl != DEFAULT_TTL) { +        int _ttl = (int) ttl; + +        if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &_ttl, sizeof(_ttl)) < 0) { +            pa_log("IP_MULTICAST_TTL failed: %s", pa_cstrerror(errno)); +            goto fail; +        } +    } +      /* If the socket queue is full, let's drop packets */      pa_make_fd_nonblock(fd);      pa_make_udp_socket_low_delay(fd); @@ -290,6 +308,7 @@ int pa__init(pa_module*m) {      pa_proplist_sets(data.proplist, "rtp.destination", dest);      pa_proplist_setf(data.proplist, "rtp.mtu", "%lu", (unsigned long) mtu);      pa_proplist_setf(data.proplist, "rtp.port", "%lu", (unsigned long) port); +    pa_proplist_setf(data.proplist, "rtp.ttl", "%lu", (unsigned long) ttl);      data.driver = __FILE__;      data.module = m;      data.source = s; @@ -342,7 +361,7 @@ int pa__init(pa_module*m) {      pa_rtp_context_init_send(&u->rtp_context, fd, m->core->cookie, payload, pa_frame_size(&ss));      pa_sap_context_init_send(&u->sap_context, sap_fd, p); -    pa_log_info("RTP stream initialized with mtu %u on %s:%u, SSRC=0x%08x, payload=%u, initial sequence #%u", mtu, dest, port, u->rtp_context.ssrc, payload, u->rtp_context.sequence); +    pa_log_info("RTP stream initialized with mtu %u on %s:%u ttl=%u, SSRC=0x%08x, payload=%u, initial sequence #%u", mtu, dest, port, ttl, u->rtp_context.ssrc, payload, u->rtp_context.sequence);      pa_log_info("SDP-Data:\n%s\nEOF", p);      pa_sap_send(&u->sap_context, 0); | 
