chiark / gitweb /
Abolish playrtp's "readahead" variable (and associated -b option).
[disorder] / clients / playrtp.c
index f566409fa4d9e6243a44a5839587f2dd6464f0d8..a5542dbd51fbc3ce5d5f09a9264a3cd20be24137 100644 (file)
@@ -81,8 +81,6 @@
 #include "version.h"
 #include "uaudio.h"
 
-#define readahead linux_headers_are_borked
-
 /** @brief Obsolete synonym */
 #ifndef IPV6_JOIN_GROUP
 # define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP
@@ -101,11 +99,6 @@ static FILE *logfp;
  * We'll stop playing if there's only this many samples in the buffer. */
 unsigned minbuffer = 2 * 44100 / 10;  /* 0.2 seconds */
 
-/** @brief Buffer high watermark
- *
- * We'll only start playing when this many samples are available. */
-static unsigned readahead = 44100;      /* 0.5 seconds */
-
 /** @brief Maximum buffer size
  *
  * We'll stop reading from the network if we have this many samples. */
@@ -204,7 +197,6 @@ static const struct option options[] = {
   { "device", required_argument, 0, 'D' },
   { "min", required_argument, 0, 'm' },
   { "max", required_argument, 0, 'x' },
-  { "buffer", required_argument, 0, 'b' },
   { "rcvbuf", required_argument, 0, 'R' },
 #if HAVE_SYS_SOUNDCARD_H || EMPEG_HOST
   { "oss", no_argument, 0, 'o' },
@@ -440,12 +432,15 @@ static void *listen_thread(void attribute((unused)) *arg) {
  * Must be called with @ref lock held.
  */
 void playrtp_fill_buffer(void) {
+  /* Discard current buffer contents */
   while(nsamples)
     drop_first_packet();
   info("Buffering...");
-  while(nsamples < readahead) {
+  /* Wait until there's at least minbuffer samples available */
+  while(nsamples < minbuffer) {
     pthread_cond_wait(&cond, &lock);
   }
+  /* Start from whatever is earliest */
   next_timestamp = pheap_first(&packets)->timestamp;
   active = 1;
 }
@@ -480,7 +475,6 @@ static void help(void) {
          "Options:\n"
           "  --device, -D DEVICE     Output device\n"
           "  --min, -m FRAMES        Buffer low water mark\n"
-          "  --buffer, -b FRAMES     Buffer high water mark\n"
           "  --max, -x FRAMES        Buffer maximum size\n"
           "  --rcvbuf, -R BYTES      Socket receive buffer size\n"
           "  --config, -C PATH       Set configuration file\n"
@@ -568,7 +562,7 @@ int main(int argc, char **argv) {
   struct addrinfo *res;
   struct stringlist sl;
   char *sockname;
-  int rcvbuf, target_rcvbuf = 131072;
+  int rcvbuf, target_rcvbuf = 0;
   socklen_t len;
   struct ip_mreq mreq;
   struct ipv6_mreq mreq6;
@@ -598,14 +592,13 @@ int main(int argc, char **argv) {
   mem_init();
   if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
   backend = uaudio_apis[0];
-  while((n = getopt_long(argc, argv, "hVdD:m:b:x:L:R:M:aocC:re:P:", options, 0)) >= 0) {
+  while((n = getopt_long(argc, argv, "hVdD:m:x:L:R:M:aocC:re:P:", options, 0)) >= 0) {
     switch(n) {
     case 'h': help();
     case 'V': version("disorder-playrtp");
     case 'd': debugging = 1; break;
     case 'D': uaudio_set("device", optarg); break;
     case 'm': minbuffer = 2 * atol(optarg); break;
-    case 'b': readahead = 2 * atol(optarg); break;
     case 'x': maxbuffer = 2 * atol(optarg); break;
     case 'L': logfp = fopen(optarg, "w"); break;
     case 'R': target_rcvbuf = atoi(optarg); break;
@@ -628,7 +621,7 @@ int main(int argc, char **argv) {
   }
   if(config_read(0)) fatal(0, "cannot read configuration");
   if(!maxbuffer)
-    maxbuffer = 4 * readahead;
+    maxbuffer = 2 * minbuffer;
   argc -= optind;
   argv += optind;
   switch(argc) {
@@ -794,7 +787,15 @@ int main(int argc, char **argv) {
     pthread_mutex_unlock(&lock);
     backend->activate();
     pthread_mutex_lock(&lock);
-    /* Wait until the buffer empties out */
+    /* Wait until the buffer empties out
+     *
+     * If there's a packet that we can play right now then we definitely
+     * continue.
+     *
+     * Also if there's at least minbuffer samples we carry on regardless and
+     * insert silence.  The assumption is there's been a pause but more data
+     * is now available.
+     */
     while(nsamples >= minbuffer
          || (nsamples > 0
              && contains(pheap_first(&packets), next_timestamp))) {