vss: Fix offset handling.
authorAndre Noll <maan@systemlinux.org>
Tue, 12 Jan 2010 00:10:36 +0000 (01:10 +0100)
committerAndre Noll <maan@systemlinux.org>
Tue, 12 Jan 2010 00:10:36 +0000 (01:10 +0100)
Commit fb6d93240 (vss: Update offset directly when setting the REPOS
flag.) was buggy. On pause/restart we miss to update mmd->offset,
hence the status items which are sent to the stat clients like audiod
did not contain the correct offset value either which messes up
the time string that audiod sends to its clients (para_gui).

We need to set the new offset both on repos requests and on restart,
do introduce a small helper function for this purpose.

vss.c

diff --git a/vss.c b/vss.c
index fef61cbe4bc469e4884540a3be1f44038e29c423..1a038f060bd1f0e2ecfd842e9f08fd7f704f70e2 100644 (file)
--- a/vss.c
+++ b/vss.c
@@ -677,6 +677,13 @@ static int need_to_request_new_audio_file(struct vss_task *vsst)
        return 1;
 }
 
+static void set_mmd_offset(void)
+{
+       struct timeval offset;
+       tv_scale(mmd->current_chunk, &mmd->afd.afhi.chunk_tv, &offset);
+       mmd->offset = tv2ms(&offset);
+}
+
 /**
  * Compute the timeout for the main select-loop of the scheduler.
  *
@@ -716,14 +723,12 @@ static void vss_pre_select(struct sched *s, struct task *t)
                        set_eof_barrier(vsst);
                mmd->chunks_sent = 0;
        } else if (vss_repos()) {
-               struct timeval offset;
                tv_add(now, &vsst->announce_tv, &vsst->data_send_barrier);
                set_eof_barrier(vsst);
                mmd->chunks_sent = 0;
                mmd->current_chunk = mmd->repos_request;
                mmd->new_vss_status_flags &= ~VSS_REPOS;
-               tv_scale(mmd->current_chunk, &mmd->afd.afhi.chunk_tv, &offset);
-               mmd->offset = tv2ms(&offset);
+               set_mmd_offset();
        }
        if (need_to_request_new_audio_file(vsst)) {
                PARA_DEBUG_LOG("ready and playing, but no audio file\n");
@@ -880,6 +885,7 @@ static void vss_send(struct vss_task *vsst)
                if (!mmd->chunks_sent) {
                        mmd->stream_start = *now;
                        mmd->events++;
+                       set_mmd_offset();
                }
                /*
                 * We call the send function also in case of empty chunks as