#include "timeval.h"
#include "configuration.h"
-/** @brief Bytes to send per network packet
- *
- * This is the maximum number of bytes we pass to write(2); to determine actual
- * packet sizes, add a UDP header and an IP header (and a link layer header if
- * it's the link layer size you care about).
- *
- * Don't make this too big or arithmetic will start to overflow.
- */
-#define NETWORK_BYTES (1500-8/*UDP*/-40/*IP*/-8/*conservatism*/)
+/** @brief Bytes to send per network packet */
+static int rtp_max_payload;
/** @brief RTP payload type */
static int rtp_payload;
"multicast-ttl",
"multicast-loop",
"rtp-mode",
+ "rtp-max-payload",
NULL
};
uaudio_schedule_sent(nsamples);
return nsamples;
}
- if(rtp_mode == RTP_REQUEST) {
- struct rtp_recipient *r;
- struct msghdr m;
- memset(&m, 0, sizeof m);
- m.msg_iov = vec;
- m.msg_iovlen = 2;
- pthread_mutex_lock(&rtp_lock);
- for(r = rtp_recipient_list; r; r = r->next) {
- m.msg_name = &r->sa;
- m.msg_namelen = r->sa.ss_family == AF_INET ?
- sizeof(struct sockaddr_in) : sizeof (struct sockaddr_in6);
- sendmsg(r->sa.ss_family == AF_INET ? rtp_fd4 : rtp_fd6,
- &m, MSG_DONTWAIT|MSG_NOSIGNAL);
- // TODO similar error handling to other case?
- }
- pthread_mutex_unlock(&rtp_lock);
- } else {
+ /* Send stuff to explicitly registerd unicast addresses unconditionally */
+ struct rtp_recipient *r;
+ struct msghdr m;
+ memset(&m, 0, sizeof m);
+ m.msg_iov = vec;
+ m.msg_iovlen = 2;
+ pthread_mutex_lock(&rtp_lock);
+ for(r = rtp_recipient_list; r; r = r->next) {
+ m.msg_name = &r->sa;
+ m.msg_namelen = r->sa.ss_family == AF_INET ?
+ sizeof(struct sockaddr_in) : sizeof (struct sockaddr_in6);
+ sendmsg(r->sa.ss_family == AF_INET ? rtp_fd4 : rtp_fd6,
+ &m, MSG_DONTWAIT|MSG_NOSIGNAL);
+ // TODO similar error handling to other case?
+ }
+ pthread_mutex_unlock(&rtp_lock);
+ if(rtp_mode != RTP_REQUEST) {
int written_bytes;
do {
written_bytes = writev(rtp_fd, vec, 2);
rtp_mode = RTP_UNICAST;
}
}
+ rtp_max_payload = atoi(uaudio_get("rtp-max-payload", "-1"));
+ if(rtp_max_payload < 0)
+ rtp_max_payload = 1500 - 8/*UDP*/ - 40/*IP*/ - 8/*conservatism*/;
/* Create the sockets */
if(rtp_mode != RTP_REQUEST) {
if((rtp_fd = socket(dres->ai_family,
userdata,
rtp_play,
256 / uaudio_sample_size,
- (NETWORK_BYTES - sizeof(struct rtp_header))
+ (rtp_max_payload - sizeof(struct rtp_header))
/ uaudio_sample_size,
0);
if(config->rtp_verbose)
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_max_payload);
+ uaudio_set("rtp-max-payload", buffer);
if(config->rtp_verbose)
disorder_info("RTP: configured");
}