X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=audiod.c;h=dbc1e850c2f615e3775d06fe62441274ff470bd3;hp=ec9f34d5ad52e0fdc32bca3e1059553272a7de6d;hb=9f487d2aaaa3462d9e4ecd76f22a75c9ae847e92;hpb=a80216b0764589538a840cb3b1c61922ae7250a2 diff --git a/audiod.c b/audiod.c index ec9f34d5..dbc1e850 100644 --- a/audiod.c +++ b/audiod.c @@ -66,12 +66,28 @@ struct audio_format_info { struct timeval restart_barrier; }; +/** + * para_audiod uses \p MAX_STREAM_SLOTS different slots, each of which may + * be associated with a receiver/filter/writer triple. This array holds all + * information on the status of these slots. + * + * \sa struct slot_info + * */ struct slot_info slot[MAX_STREAM_SLOTS]; +/** + * the current mode of operation of which can be changed by the on/off/cycle + * commands. It is either, AUDIOD_OFF, AUDIOD_ON or AUDIOD_STANDBY. + */ int audiod_status = AUDIOD_ON; +/** + * the gengetopt args_info struct that holds information on all command line + * arguments + */ struct audiod_args_info conf; + static char *socket_name; static FILE *logfile; static struct audio_format_info afi[NUM_AUDIO_FORMATS]; @@ -79,6 +95,12 @@ static struct audio_format_info afi[NUM_AUDIO_FORMATS]; static struct signal_task signal_task_struct, *sig_task = &signal_task_struct; static struct status_task status_task_struct; + +/** + * the task that calls the status command of para_server + * + * \sa struct status_task + */ struct status_task *stat_task = &status_task_struct; static struct timeval initial_delay_barrier; @@ -125,8 +147,11 @@ int get_audio_format_num(char *name) return -E_UNSUPPORTED_AUDIO_FORMAT; } -/* - * log function. first argument is loglevel. +/** + * the log function of para_audiod + * + * \param ll loglevel + * \param fmt the format string */ void para_log(int ll, const char* fmt,...) { @@ -442,14 +467,16 @@ static int open_current_receiver(struct sched *s) 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); @@ -479,6 +506,7 @@ static void compute_time_diff(const struct timeval *status_time) ); out: stat_task->sa_time_diff_sign = sa_time_diff_sign; + return count; } static void check_stat_line(char *line) @@ -521,13 +549,15 @@ 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: @@ -960,6 +990,18 @@ static void close_stat_pipe(void) } } +/** + * close the connection to para_server and exit + * + * \param status the exit status which is passed to exit(3) + * \param msg the log message + * + * Log \a msg with loglevel \p EMERG, close the connection to para_server if + * open, and call \p exit(status). \a status should be either EXIT_SUCCESS or + * EXIT_FAILURE. + * + * \sa exit(3) + */ void __noreturn clean_exit(int status, const char *msg) { PARA_EMERG_LOG("%s\n", msg); @@ -1073,6 +1115,16 @@ static void set_initial_status(void) PARA_WARNING_LOG("%s", "invalid mode\n"); } +/** + * the main function of para_audiod + * + * \param argc usual argument count + * \param argv usual argument vector + * + * \return EXIT_SUCCESS or EXIT_FAILURE + * + * \sa para_audiod(1) + * */ int main(int argc, char *argv[]) { char *cf;