audiod: introduce last_status_read, kill af_status
authorAndre <maan@p133.(none)>
Thu, 13 Jul 2006 11:51:32 +0000 (13:51 +0200)
committerAndre <maan@p133.(none)>
Thu, 13 Jul 2006 11:51:32 +0000 (13:51 +0200)
For additional robustness, let's remember the time we received the last
status message from para_server. This allows to close the connection
after 60 seconds as para_server sends at least one message per minute.

Kill af_status: We store all status items in
stat_task->stat_item_values[] anyway. No need to duplicate this
information.

audiod.c
audiod.h

index c88facc..ed5344c 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -456,10 +456,12 @@ static int open_current_receiver(struct sched *s)
 {
        int i;
        struct timeval diff;
+       char *audio_format = stat_task->stat_item_values[SI_FORMAT];
 
-       if (!stat_task->af_status || !stat_task->pcd)
+       if (!audio_format || !stat_task->pcd)
                return 0;
-       i = get_audio_format_num(stat_task->af_status);
+       i = get_audio_format_num(audio_format + strlen(
+               status_item_list[SI_FORMAT]) + 1);
        if (i < 0)
                return 0;
        if (receiver_running(i))
@@ -533,10 +535,6 @@ static void check_stat_line(char *line)
        case SI_STATUS:
                stat_task->playing = strstr(line, "playing")? 1 : 0;
                break;
-       case SI_FORMAT:
-               free(stat_task->af_status);
-               stat_task->af_status = para_strdup(line + ilen + 1);
-               break;
        case SI_OFFSET:
                stat_task->offset_seconds = atoi(line + ilen + 1);
                break;
@@ -641,10 +639,6 @@ static void audiod_pre_select(struct sched *s, __a_unused struct task *t)
                if (!sl->fc || !*sl->fc->out_loaded || sl->wng)
                        continue;
                if (tv_diff(now, &initial_delay_barrier, &diff) > 0) {
-                       PARA_INFO_LOG("barrier: %lu:%lu, now: %lu, %lu\n",
-                               initial_delay_barrier.tv_sec,
-                               initial_delay_barrier.tv_usec,
-                               now->tv_sec, now->tv_usec);
                        open_writers(i);
                        s->timeout = min_delay;
                        continue;
@@ -1021,13 +1015,22 @@ static void status_pre_select(struct sched *s, struct task *t)
 static void status_post_select(__a_unused struct sched *s, struct task *t)
 {
        struct status_task *st = t->private_data;
+       unsigned bytes_left;
 
        t->ret = 1;
-       if (!st->pcd || !st->pcd->loaded
-                       || st->pcd->status != CL_RECEIVING)
+       if (!st->pcd || st->pcd->status != CL_RECEIVING)
                return;
-       st->pcd->loaded = for_each_line(st->pcd->buf, st->pcd->loaded,
+       bytes_left = for_each_line(st->pcd->buf, st->pcd->loaded,
                &check_stat_line);
+       if (st->pcd->loaded != bytes_left) {
+               st->last_status_read = *now;
+               st->pcd->loaded = bytes_left;
+       } else {
+               struct timeval diff;
+               tv_diff(now, &st->last_status_read, &diff);
+               if (diff.tv_sec > 61)
+                       close_stat_pipe();
+       }
 }
 
 static void init_status_task(struct status_task *st)
index e4faea4..077ce03 100644 (file)
--- a/audiod.h
+++ b/audiod.h
@@ -61,6 +61,8 @@ struct status_task {
        char *stat_item_values[NUM_STAT_ITEMS];
        /** do not restart client command until this time */
        struct timeval restart_barrier;
+       /** last time we received status data from para_server */
+       struct timeval last_status_read;
        /** the offset value announced by para_server */
        int offset_seconds;
        /** the length of the current audio file as announced by para_server */
@@ -71,8 +73,6 @@ struct status_task {
        struct timeval sa_time_diff;
        /** whether client time is ahead of server time */
        int sa_time_diff_sign;
-       /** the audio format announced in server status */
-       char *af_status;
        /** non-zero if \a af_status is "playing" */
        int playing;
 };