-static int decoder_running(int format)
-{
- int i, ret = 0;
- struct slot_info *s;
-
- FOR_EACH_SLOT(i) {
- s = &slot[i];
- if (s->format == format && s->receiver_node)
- ret |= 1;
- if (s->format == format && s->wpid > 0)
- ret |= 2;
- }
- return ret;
-}
-
-static void close_stat_pipe(void)
-{
- int i;
-
- if (stat_pipe < 0)
- return;
- PARA_NOTICE_LOG("%s", "closing status pipe\n");
- close(stat_pipe);
- del_close_on_fork_list(stat_pipe);
- stat_pipe = -1;
- kill_all_decoders();
- for (i = 0; i < NUM_STAT_ITEMS; i++) {
- free(stat_item_values[i]);
- stat_item_values[i] = NULL;
- }
- dump_empty_status();
- length_seconds = 0;
- offset_seconds = 0;
- audiod_status_dump();
- playing = 0;
- stat_item_values[SI_STATUS_BAR] = make_message("%s:no connection to para_server\n",
- status_item_list[SI_STATUS_BAR]);
- stat_client_write(stat_item_values[SI_STATUS_BAR], SI_STATUS_BAR);
-}
-
-static void __noreturn clean_exit(int status, const char *msg)
-{
- PARA_EMERG_LOG("%s\n", msg);
- kill_all_decoders();
- if (socket_name)
- unlink(socket_name);
- if (stat_pipe >= 0)
- close_stat_pipe();
- exit(status);
-}
-
-__malloc static char *glob_cmd(char *cmd)
-{
- char *ret, *replacement;
- struct timeval tmp, delay, rss; /* real stream start */
-
- delay.tv_sec = conf.stream_delay_arg / 1000;
- delay.tv_usec = (conf.stream_delay_arg % 1000) * 1000;
-// PARA_INFO_LOG("delay: %lu:%lu\n", delay.tv_sec, delay.tv_usec);
- if (sa_time_diff_sign < 0)
- tv_add(&server_stream_start, &sa_time_diff, &rss);
- else
- tv_diff(&server_stream_start, &sa_time_diff, &rss);
- tv_add(&rss, &delay, &tmp);
- replacement = make_message("%lu:%lu",
- (long unsigned)tmp.tv_sec,
- (long unsigned)tmp.tv_usec);
- ret = s_a_r(cmd, "STREAM_START", replacement);
- free(replacement);
- if (!ret)
- goto out;
- PARA_INFO_LOG("cmd: %s, repl: %s\n", cmd, ret);
-out:
- return ret;
-}
-
-/** get the number of filters for the given audio format */
-int num_filters(int audio_format_num)