Store previous reported time in order to assure a monotonic clock.
authorPierre Ossman <ossman@cendio.se>
Tue, 10 Jan 2006 12:45:11 +0000 (12:45 +0000)
committerPierre Ossman <ossman@cendio.se>
Tue, 10 Jan 2006 12:45:11 +0000 (12:45 +0000)
This is a resurrection of a feature previously removed. The new version
is without the race condition of the original one.

git-svn-id: file:///home/lennart/svn/public/pulseaudio/branches/ossman@442 fefdeb5f-60dc-0310-8127-8f9354f1896f

polyp/polyplib-internal.h
polyp/polyplib-stream.c

index 9417430..8677c81 100644 (file)
@@ -92,6 +92,8 @@ struct pa_stream {
     enum pa_stream_direction direction;
     uint32_t requested_bytes;
     uint64_t counter;
+    pa_usec_t previous_time;
+    pa_usec_t previous_ipol_time;
     enum pa_stream_state state;
     struct pa_mcalign *mcalign;
 
index 7058b54..b6a091b 100644 (file)
@@ -65,6 +65,8 @@ struct pa_stream *pa_stream_new(struct pa_context *c, const char *name, const st
     s->mcalign = pa_mcalign_new(pa_frame_size(ss), c->memblock_stat);
 
     s->counter = 0;
+    s->previous_time = 0;
+    s->previous_ipol_time = 0;
 
     s->corked = 0;
     s->interpolate = 0;
@@ -697,6 +699,11 @@ pa_usec_t pa_stream_get_time(struct pa_stream *s, const struct pa_latency_info *
         }
     }
 
+    if (usec < s->previous_time)
+        usec = s->previous_time;
+
+    s->previous_time = usec;
+
     return usec;
 }
 
@@ -756,6 +763,11 @@ pa_usec_t pa_stream_get_interpolated_time(struct pa_stream *s) {
             usec = s->ipol_usec + pa_timeval_age(&s->ipol_timestamp);
     }
     
+    if (usec < s->previous_ipol_time)
+        usec = s->previous_ipol_time;
+
+    s->previous_ipol_time = usec;
+
     return usec;
 }