alsa: throw timing data away after device resume
authorLennart Poettering <lennart@poettering.net>
Fri, 24 Jul 2009 18:13:52 +0000 (20:13 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 24 Jul 2009 18:13:52 +0000 (20:13 +0200)
src/modules/alsa/alsa-sink.c
src/modules/alsa/alsa-source.c
src/pulse/stream.c
src/pulsecore/time-smoother.c
src/pulsecore/time-smoother.h

index 46562cb..7fc602b 100644 (file)
@@ -899,9 +899,13 @@ static int unsuspend(struct userdata *u) {
     if (build_pollfd(u) < 0)
         goto fail;
 
+    u->write_count = 0;
+    pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);
+
     u->first = TRUE;
     u->since_start = 0;
 
+
     pa_log_info("Resumed successfully...");
 
     return 0;
@@ -1204,7 +1208,7 @@ static int process_rewind(struct userdata *u) {
         if (rewind_nbytes <= 0)
             pa_log_info("Tried rewind, but was apparently not possible.");
         else {
-            u->write_count -= out_frames * u->frame_size;
+            u->write_count -= rewind_nbytes;
             pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes);
             pa_sink_process_rewind(u->sink, rewind_nbytes);
 
index 8a1fbe5..ed9c148 100644 (file)
@@ -854,7 +854,9 @@ static int unsuspend(struct userdata *u) {
     /* FIXME: We need to reload the volume somehow */
 
     snd_pcm_start(u->pcm_handle);
-    pa_smoother_resume(u->smoother, pa_rtclock_now(), TRUE);
+
+    u->read_count = 0;
+    pa_smoother_reset(u->smoother, pa_rtclock_now(), TRUE);
 
     pa_log_info("Resumed successfully...");
 
index 5baf5c2..a22816a 100644 (file)
@@ -827,7 +827,7 @@ static void create_stream_complete(pa_stream *s) {
     if (s->flags & PA_STREAM_AUTO_TIMING_UPDATE) {
         s->auto_timing_interval_usec = AUTO_TIMING_INTERVAL_START_USEC;
         pa_assert(!s->auto_timing_update_event);
-       s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_interval_usec, &auto_timing_update_callback, s);
+        s->auto_timing_update_event = pa_context_rttime_new(s->context, pa_rtclock_now() + s->auto_timing_interval_usec, &auto_timing_update_callback, s);
 
         request_auto_timing_update(s, TRUE);
     }
index 9d5a070..1289f2b 100644 (file)
@@ -108,29 +108,11 @@ pa_smoother* pa_smoother_new(
     s = pa_xnew(pa_smoother, 1);
     s->adjust_time = adjust_time;
     s->history_time = history_time;
-    s->time_offset = 0;
+    s->min_history = min_history;
     s->monotonic = monotonic;
-
-    s->px = s->py = 0;
-    s->dp = 1;
-
-    s->ex = s->ey = s->ry = 0;
-    s->de = 1;
-
-    s->history_idx = 0;
-    s->n_history = 0;
-
-    s->last_y = s->last_x = 0;
-
-    s->abc_valid = FALSE;
-
-    s->paused = FALSE;
     s->smoothing = smoothing;
 
-    s->min_history = min_history;
-
-    s->paused = paused;
-    s->time_offset = s->pause_time = time_offset;
+    pa_smoother_reset(s, time_offset, paused);
 
     return s;
 }
@@ -514,9 +496,26 @@ pa_usec_t pa_smoother_translate(pa_smoother *s, pa_usec_t x, pa_usec_t y_delay)
     return (pa_usec_t) llrint((double) y_delay / nde);
 }
 
-void pa_smoother_reset(pa_smoother *s) {
+void pa_smoother_reset(pa_smoother *s, pa_usec_t time_offset, pa_bool_t paused) {
     pa_assert(s);
 
+    s->px = s->py = 0;
+    s->dp = 1;
+
+    s->ex = s->ey = s->ry = 0;
+    s->de = 1;
+
+    s->history_idx = 0;
     s->n_history = 0;
+
+    s->last_y = s->last_x = 0;
+
     s->abc_valid = FALSE;
+
+    s->paused = paused;
+    s->time_offset = s->pause_time = time_offset;
+
+    /* #ifdef DEBUG_DATA */
+    pa_log_debug("reset()");
+/* #endif */
 }
index 5244a7e..63d33e4 100644 (file)
@@ -52,7 +52,7 @@ void pa_smoother_set_time_offset(pa_smoother *s, pa_usec_t x_offset);
 void pa_smoother_pause(pa_smoother *s, pa_usec_t x);
 void pa_smoother_resume(pa_smoother *s, pa_usec_t x, pa_bool_t abrupt);
 
-void pa_smoother_reset(pa_smoother *s);
+void pa_smoother_reset(pa_smoother *s, pa_usec_t time_offset, pa_bool_t paused);
 
 void pa_smoother_fix_now(pa_smoother *s);