{
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))
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;
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;
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)
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 */
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;
};