X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/e8c92ba7b0a64a05806dc207b31c5c84b1edb16c..eb5dc014179415a0e5476e986519ac96c36221f9:/server/play.c diff --git a/server/play.c b/server/play.c index f0ac386..e9c2b68 100644 --- a/server/play.c +++ b/server/play.c @@ -44,6 +44,7 @@ #include "configuration.h" #include "queue.h" #include "server-queue.h" +#include "rights.h" #include "trackdb.h" #include "play.h" #include "plugin.h" @@ -127,16 +128,12 @@ static int speaker_readable(ev_source *ev, int fd, } void speaker_setup(ev_source *ev) { - int sp[2], lfd; + int sp[2]; pid_t pid; struct speaker_message sm; if(socketpair(PF_UNIX, SOCK_DGRAM, 0, sp) < 0) fatal(errno, "error calling socketpair"); - if(!isatty(2)) - lfd = logfd(ev, SPEAKER); - else - lfd = -1; if(!(pid = xfork())) { exitfn = _exit; ev_signal_atfork(ev); @@ -144,17 +141,17 @@ void speaker_setup(ev_source *ev) { xdup2(sp[0], 1); xclose(sp[0]); xclose(sp[1]); - if(lfd != -1) { - xdup2(lfd, 2); - xclose(lfd); - } signal(SIGPIPE, SIG_DFL); #if 0 execlp("valgrind", "valgrind", SPEAKER, "--config", configfile, - debugging ? "--debug" : "--no-debug", (char *)0); + debugging ? "--debug" : "--no-debug", + log_default == &log_syslog ? "--syslog" : "--no-syslog", + (char *)0); #else execlp(SPEAKER, SPEAKER, "--config", configfile, - debugging ? "--debug" : "--no-debug", (char *)0); + debugging ? "--debug" : "--no-debug", + log_default == &log_syslog ? "--syslog" : "--no-syslog", + (char *)0); #endif fatal(errno, "error invoking %s", SPEAKER); } @@ -285,15 +282,15 @@ static int find_player(const struct queue_entry *q) { } /* Return values from start() */ -#define START_OK 0 /* Succeeded. */ -#define START_HARDFAIL 1 /* Track is broken. */ -#define START_SOFTFAIL 2 /* Track OK, system (temporarily?) broken */ +#define START_OK 0 /**< @brief Succeeded. */ +#define START_HARDFAIL 1 /**< @brief Track is broken. */ +#define START_SOFTFAIL 2 /**< @brief Track OK, system (temporarily?) broken */ /** @brief Play or prepare @p q * @param ev Event loop * @param q Track to play/prepare * @param prepare_only If true, only prepares track - * @return @ref START_OK, @ref START_HARDFAIL or @ref START_SOFTFTAIL + * @return @ref START_OK, @ref START_HARDFAIL or @ref START_SOFTFAIL */ static int start(ev_source *ev, struct queue_entry *q, @@ -316,14 +313,16 @@ static int start(ev_source *ev, memset(&sm, 0, sizeof sm); D(("start %s %d", q->id, prepare_only)); - if(find_player_pid(q->id) > 0) { - if(prepare_only) return START_OK; - /* We have already prepared this track so we just need to tell the speaker - * process to start actually playing the queued up audio data */ - strcpy(sm.id, q->id); - sm.type = SM_PLAY; - speaker_send(speaker_fd, &sm); - D(("sent SM_PLAY for %s", sm.id)); + if(q->prepared) { + /* The track is alraedy prepared */ + if(!prepare_only) { + /* We want to run it, since it's prepared the answer is to tell the + * speaker to set it off */ + strcpy(sm.id, q->id); + sm.type = SM_PLAY; + speaker_send(speaker_fd, &sm); + D(("sent SM_PLAY for %s", sm.id)); + } return START_OK; } /* Find the player plugin. */ @@ -424,7 +423,11 @@ static int start(ev_source *ev, speaker_send(speaker_fd, &sm); D(("sent SM_PLAY for %s", sm.id)); } - execlp("disorder-normalize", "disorder-normalize", (char *)0); + /* TODO stderr shouldn't be redirected for disorder-normalize + * (but it should be for play_track() */ + execlp("disorder-normalize", "disorder-normalize", + log_default == &log_syslog ? "--syslog" : "--no-syslog", + (char *)0); fatal(errno, "executing disorder-normalize"); /* end of the innermost fork */ } @@ -478,6 +481,7 @@ static int start(ev_source *ev, return START_SOFTFAIL; } store_player_pid(q->id, pid); + q->prepared = 1; if(lfd != -1) xclose(lfd); setpgid(pid, pid);