#include "configuration.h"
#include "queue.h"
#include "server-queue.h"
+#include "rights.h"
#include "trackdb.h"
#include "play.h"
#include "plugin.h"
D(("SM_FINISHED %s", sm.id));
finished(ev);
break;
+ case SM_UNKNOWN:
+ /* we asked for an unknown track to be cancelled */
+ if(playing && !strcmp(sm.id, playing->id))
+ finished(ev);
+ break;
case SM_PLAYING:
/* track ID is playing, DATA seconds played */
D(("SM_PLAYING %s %ld", sm.id, sm.data));
}
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);
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,
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. */
memset(&addr, 0, sizeof addr);
addr.sun_family = AF_UNIX;
snprintf(addr.sun_path, sizeof addr.sun_path,
- "%s/speaker", config->home);
+ "%s/speaker/socket", config->home);
sfd = xsocket(PF_UNIX, SOCK_STREAM, 0);
if(connect(sfd, (const struct sockaddr *)&addr, sizeof addr) < 0)
fatal(errno, "connecting to %s", addr.sun_path);
speaker_send(speaker_fd, &sm);
D(("sent SM_PLAY for %s", sm.id));
}
+ /* 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",
+ "--config", configfile,
(char *)0);
fatal(errno, "executing disorder-normalize");
/* end of the innermost fork */
return START_SOFTFAIL;
}
store_player_pid(q->id, pid);
+ q->prepared = 1;
if(lfd != -1)
xclose(lfd);
setpgid(pid, pid);