changeset 16104:fc2459a18bf3

improved audio delay estimation, supposed to help make the video smoother
author reimar
date Tue, 26 Jul 2005 10:47:29 +0000
parents 1b10f858d873
children a274b6bd2e23
files libao2/ao_jack.c
diffstat 1 files changed, 23 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/libao2/ao_jack.c	Tue Jul 26 10:41:59 2005 +0000
+++ b/libao2/ao_jack.c	Tue Jul 26 10:47:29 2005 +0000
@@ -43,15 +43,12 @@
 static int num_ports; ///< Number of used ports == number of channels
 static jack_client_t *client;
 static float jack_latency;
+static int estimate;
 static volatile int paused = 0; ///< set if paused
 static volatile int underrun = 0; ///< signals if an underrun occured
 
-//! If this is defined try to make a more precise delay estimation. Will be slower.
-#undef JACK_ESTIMATE_DELAY
-#ifdef JACK_ESTIMATE_DELAY
-static volatile int callback_samples = 0;
-static volatile unsigned int callback_time = 0;
-#endif
+static volatile float callback_interval = 0;
+static volatile float callback_time = 0;
 
 //! size of one chunk, if this is too small MPlayer will start to "stutter"
 //! after a short time of playback
@@ -186,10 +183,15 @@
       underrun = 1;
   if (paused || underrun)
     silence(bufs, nframes, num_ports);
-#ifdef JACK_ESTIMATE_DELAY
-  callback_samples = nframes;
-  callback_time = GetTimer();
-#endif
+  if (estimate) {
+    float now = (float)GetTimer() / 1000000.0;
+    float diff = callback_time + callback_interval - now;
+    if (diff < 0.002)
+      callback_time += callback_interval;
+    else
+      callback_time = now;
+    callback_interval = (float)nframes / (float)ao_data.samplerate;
+  }
   return 0;
 }
 
@@ -204,7 +206,9 @@
            "  connects MPlayer to the jack ports named myout\n"
            "\nOptions:\n"
            "  port=<port name>\n"
-           "    Connects to the given ports instead of the default physical ones\n");
+           "    Connects to the given ports instead of the default physical ones\n"
+           "  estimate\n"
+           "    Estimates the amount of data in buffers (experimental)\n");
 }
 
 static int init(int rate, int channels, int format, int flags) {
@@ -213,10 +217,12 @@
   char client_name[40];
   opt_t subopts[] = {
     {"port", OPT_ARG_MSTRZ, &port_name, NULL},
+    {"estimate", OPT_ARG_BOOL, &estimate, NULL},
     {NULL}
   };
   int port_flags = JackPortIsInput;
   int i;
+  estimate = 1;
   if (subopt_parse(ao_subdevice, subopts) != 0) {
     print_help();
     return 0;
@@ -269,6 +275,7 @@
   rate = jack_get_sample_rate(client);
   jack_latency = (float)(jack_port_get_total_latency(client, ports[0]) +
                          jack_get_buffer_size(client)) / (float)rate;
+  callback_interval = 0;
   buffer = (unsigned char *) malloc(BUFFSIZE);
 
   ao_data.channels = channels;
@@ -343,11 +350,11 @@
 static float get_delay() {
   int buffered = BUFFSIZE - CHUNK_SIZE - buf_free(); // could be less
   float in_jack = jack_latency;
-#ifdef JACK_ESTIMATE_DELAY
-  unsigned int elapsed = GetTimer() - callback_time;
-  in_jack += (float)callback_samples / (float)ao_data.samplerate - (float)elapsed / 1000.0 / 1000.0;
-  if (in_jack < 0) in_jack = 0;
-#endif
+  if (estimate && callback_interval > 0) {
+    float elapsed = (float)GetTimer() / 1000000.0 - callback_time;
+    in_jack += callback_interval - elapsed;
+    if (in_jack < 0) in_jack = 0;
+  }
   return (float)buffered / (float)ao_data.bps + in_jack;
 }