[MPlayer-dev-eng] Patch: ao_jack for smoother playback
Reimar Döffinger
Reimar.Doeffinger at stud.uni-karlsruhe.de
Sun Jul 10 11:33:19 CEST 2005
On Sat, Jul 09, 2005 at 10:15:43PM +0200, Reimar D?ffinger wrote:
> I wanted it to merge with my local changes (attached), but didn't get
> around to it...
> The merging would essentially consist of replacing my estimation code in
> the callback with yours (or maybe even keeping both, whatever).
Can you please see if the attached patch does what you want?
Greetings,
Reimar Döffinger
-------------- next part --------------
Index: libao2/ao_jack.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/ao_jack.c,v
retrieving revision 1.12
diff -u -r1.12 ao_jack.c
--- libao2/ao_jack.c 30 Jun 2005 13:25:08 -0000 1.12
+++ libao2/ao_jack.c 10 Jul 2005 09:31:32 -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 = 0;
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;
}
More information about the MPlayer-dev-eng
mailing list