X-Git-Url: https://git.distorted.org.uk/~mdw/disorder/blobdiff_plain/189e98302534f1bf59c7ed0b29ba6dd025b45fc1..ae5b28b95df354760fc05130db1d816691cc58ad:/server/speaker.c?ds=sidebyside diff --git a/server/speaker.c b/server/speaker.c index f9badeb..3aef0b0 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -104,10 +104,10 @@ * * Don't make this too big or arithmetic will start to overflow. */ -#define NETWORK_BYTES 1024 +#define NETWORK_BYTES (1024+sizeof(struct rtp_header)) -/** @brief Maximum RTP playahead (seconds) */ -#define RTP_AHEAD 1 +/** @brief Maximum RTP playahead (ms) */ +#define RTP_AHEAD_MS 1000 /** @brief Maximum number of FDs to poll for */ #define NFDS 256 @@ -869,6 +869,8 @@ int main(int argc, char **argv) { 0 }; static const int one = 1; + int sndbuf, target_sndbuf = 131072; + socklen_t len; char *sockname, *ssockname; #if API_ALSA int alsa_nslots = -1, err; @@ -923,7 +925,17 @@ int main(int argc, char **argv) { res->ai_protocol)) < 0) fatal(errno, "error creating broadcast socket"); if(setsockopt(bfd, SOL_SOCKET, SO_BROADCAST, &one, sizeof one) < 0) - fatal(errno, "error settting SO_BROADCAST on broadcast socket"); + fatal(errno, "error setting SO_BROADCAST on broadcast socket"); + len = sizeof sndbuf; + if(getsockopt(bfd, SOL_SOCKET, SO_SNDBUF, + &sndbuf, &len) < 0) + fatal(errno, "error getting SO_SNDBUF"); + if(setsockopt(bfd, SOL_SOCKET, SO_SNDBUF, + &target_sndbuf, sizeof target_sndbuf) < 0) + error(errno, "error setting SO_SNDBUF to %d", target_sndbuf); + else + info("changed socket send buffer size from %d to %d", + sndbuf, target_sndbuf); /* We might well want to set additional broadcast- or multicast-related * options here */ if(sres && bind(bfd, sres->ai_addr, sres->ai_addrlen) < 0) @@ -971,10 +983,13 @@ int main(int argc, char **argv) { struct timeval now; uint64_t target_us; uint64_t target_rtp_time; - const uint64_t samples_ahead = RTP_AHEAD * config->sample_format.rate - * config->sample_format.channels; - + const int64_t samples_ahead = ((uint64_t)RTP_AHEAD_MS + * config->sample_format.rate + * config->sample_format.channels + / 1000); +#if 0 static unsigned logit; +#endif /* If we're starting then initialize the base time */ if(!rtp_time) @@ -996,8 +1011,7 @@ int main(int argc, char **argv) { rtp_time - target_rtp_time, samples_ahead); #endif - if(rtp_time < target_rtp_time - || rtp_time - target_rtp_time < samples_ahead) + if((int64_t)(rtp_time - target_rtp_time) < samples_ahead) bfd_slot = addfd(bfd, POLLOUT); break; }