X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/313acc774bff2f76f41ca75cbca43ff3f0ad20cc..819f5988d32fdaa25588018e71227961529bd23a:/server/speaker.c diff --git a/server/speaker.c b/server/speaker.c index 1d95758..7411a8e 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -69,6 +69,7 @@ #include #include #include +#include #include "configuration.h" #include "syscalls.h" @@ -78,6 +79,7 @@ #include "speaker-protocol.h" #include "user.h" #include "speaker.h" +#include "printf.h" /** @brief Linked list of all prepared tracks */ struct track *tracks; @@ -142,7 +144,7 @@ static void help(void) { /* Display version number and terminate. */ static void version(void) { - xprintf("disorder-speaker version %s\n", disorder_version_string); + xprintf("%s", disorder_version_string); xfclose(stdout); exit(0); } @@ -352,8 +354,10 @@ static void speaker_play(size_t frames) { if(!playing->used || playing->start == (sizeof playing->buffer)) playing->start = 0; /* If the buffer emptied out mark the track as unplayably */ - if(!playing->used) + if(!playing->used && !playing->eof) { + error(0, "track buffer emptied"); playing->playable = 0; + } frames -= written_frames; return; } @@ -549,18 +553,31 @@ static void mainloop(void) { report(); break; case SM_CANCEL: - D(("SM_CANCEL %s", sm.id)); + D(("SM_CANCEL %s", sm.id)); t = removetrack(sm.id); if(t) { if(t == playing) { + /* scratching the playing track */ sm.type = SM_FINISHED; - strcpy(sm.id, playing->id); - speaker_send(1, &sm); playing = 0; + } else { + /* Could be scratching the playing track before it's quite got + * going, or could be just removing a track from the queue. We + * log more because there's been a bug here recently than because + * it's particularly interesting; the log message will be removed + * if no further problems show up. */ + info("SM_CANCEL for nonplaying track %s", sm.id); + sm.type = SM_STILLBORN; } + strcpy(sm.id, t->id); destroy(t); - } else + } else { + /* Probably scratching the playing track well before it's got + * going, but could indicate a bug, so we log this as an error. */ + sm.type = SM_UNKNOWN; error(0, "SM_CANCEL for unknown track %s", sm.id); + } + speaker_send(1, &sm); report(); break; case SM_RELOAD: @@ -596,6 +613,7 @@ int main(int argc, char **argv) { static const int one = 1; struct speaker_message sm; const char *d; + char *dir; set_progname(argv); if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale"); @@ -630,18 +648,23 @@ int main(int argc, char **argv) { if(getuid() == 0 || geteuid() == 0) fatal(0, "do not run as root"); /* identify the backend used to play */ for(n = 0; backends[n]; ++n) - if(backends[n]->backend == config->speaker_backend) + if(backends[n]->backend == config->api) break; if(!backends[n]) - fatal(0, "unsupported backend %d", config->speaker_backend); + fatal(0, "unsupported api %d", config->api); backend = backends[n]; /* backend-specific initialization */ backend->init(); + /* create the socket directory */ + byte_xasprintf(&dir, "%s/speaker", config->home); + unlink(dir); /* might be a leftover socket */ + if(mkdir(dir, 0700) < 0 && errno != EEXIST) + fatal(errno, "error creating %s", dir); /* set up the listen socket */ listenfd = xsocket(PF_UNIX, SOCK_STREAM, 0); memset(&addr, 0, sizeof addr); addr.sun_family = AF_UNIX; - snprintf(addr.sun_path, sizeof addr.sun_path, "%s/speaker", + snprintf(addr.sun_path, sizeof addr.sun_path, "%s/speaker/socket", config->home); if(unlink(addr.sun_path) < 0 && errno != ENOENT) error(errno, "removing %s", addr.sun_path);