-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)
-{
- char *msg;
- 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 < RINGBUFFER_SIZE; i++)
- free(ringbuffer_add(stat_item_ringbuf, para_strdup(NULL)));
- dump_empty_status();
- length_seconds = 0;
- offset_seconds = 0;
- audiod_status_dump();
- playing = 0;
- msg = make_message("%s:no connection to para_server\n",
- status_item_list[SI_STATUS_BAR]);
- free(ringbuffer_add(stat_item_ringbuf, msg));
- stat_client_write(msg);
-}
-
-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);
-}
-
-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", tmp.tv_sec, 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);
- {
- struct timeval now;
- gettimeofday(&now, NULL);
- PARA_INFO_LOG("now: %lu:%lu\n", now.tv_sec, now.tv_usec);
- }
-out:
- return ret;
-}
-
-/** get the number of filters for the given audio format */