return open_receiver(i) < 0? 0 : 1;
}
-static void compute_time_diff(const struct timeval *status_time)
+static unsigned compute_time_diff(const struct timeval *status_time)
{
struct timeval tmp, diff;
- static int count;
+ static unsigned count;
int sign, sa_time_diff_sign = stat_task->sa_time_diff_sign;
const struct timeval max_deviation = {0, 500 * 1000};
const int time_smooth = 5;
+ if (!status_time)
+ return count;
sign = tv_diff(status_time, now, &diff);
// PARA_NOTICE_LOG("%s: sign = %i, sa_time_diff_sign = %i\n", __func__,
// sign, sa_time_diff_sign);
);
out:
stat_task->sa_time_diff_sign = sa_time_diff_sign;
+ return count;
}
static void check_stat_line(char *line)
delay.tv_usec = (conf.stream_delay_arg % 1000) * 1000;
stat_task->server_stream_start.tv_sec = sec;
stat_task->server_stream_start.tv_usec = usec;
- if (stat_task->sa_time_diff_sign < 0)
- tv_add(&stat_task->server_stream_start,
- &stat_task->sa_time_diff, &a_start);
- else
- tv_diff(&stat_task->server_stream_start,
- &stat_task->sa_time_diff, &a_start);
- tv_add(&a_start, &delay, &initial_delay_barrier);
+ if (compute_time_diff(NULL) > 2) {
+ if (stat_task->sa_time_diff_sign < 0)
+ tv_add(&stat_task->server_stream_start,
+ &stat_task->sa_time_diff, &a_start);
+ else
+ tv_diff(&stat_task->server_stream_start,
+ &stat_task->sa_time_diff, &a_start);
+ tv_add(&a_start, &delay, &initial_delay_barrier);
+ }
}
break;
case SI_CURRENT_TIME:
s->timeout = min_delay;
continue;
}
- PARA_INFO_LOG("inital delay: %lu ms left\n", tv2ms(&diff));
+ PARA_INFO_LOG("initial delay: %lu ms left\n", tv2ms(&diff));
if (tv_diff(&s->timeout, &diff, NULL) > 0) {
s->timeout = diff;
}
exit(status);
}
+/* avoid busy loop if server is down */
+static void set_stat_task_restart_barrier(void)
+{
+ struct timeval delay = {5, 0};
+ tv_add(now, &delay, &stat_task->restart_barrier);
+}
static void client_task_event_handler(__a_unused struct task *t)
{
int i;
- struct timeval delay = {1, 0};
if (t->ret == -E_HANDSHAKE_COMPLETE)
return;
close_stat_pipe();
if (t->ret != -E_SERVER_EOF)
stat_task->clock_diff_count = conf.clock_diff_count_arg;
- /* avoid busy loop if server is down */
- tv_add(now, &delay, &stat_task->restart_barrier);
+ set_stat_task_restart_barrier();
FOR_EACH_AUDIO_FORMAT(i)
afi[i].restart_barrier = stat_task->restart_barrier;
}
int argc = 2;
ret = client_open(argc, argv, &st->pcd);
}
+ set_stat_task_restart_barrier();
if (ret < 0)
return;
st->pcd->task.event_handler = client_task_event_handler;