X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/2b2a5fed939a267d9ab95ce900a15bf11e108edf..d8b957853160200fe6b00d8c0e8c61a3f62ecd7c:/server/speaker.c diff --git a/server/speaker.c b/server/speaker.c index 407b1d7..3021652 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005, 2006, 2007 Richard Kettlewell + * Copyright (C) 2005-2008 Richard Kettlewell * Portions (C) 2007 Mark Wooding * * This program is free software; you can redistribute it and/or modify @@ -35,7 +35,7 @@ * this is arranged by the @c disorder-normalize program (see @ref * server/normalize.c). * - * @b Garbage @b Collection. This program deliberately does not use the +7 * @b Garbage @b Collection. This program deliberately does not use the * garbage collector even though it might be convenient to do so. This is for * two reasons. Firstly some sound APIs use thread threads and we do not want * to have to deal with potential interactions between threading and garbage @@ -50,19 +50,14 @@ * 2-byte samples. */ -#include -#include "types.h" +#include "common.h" #include -#include -#include #include #include #include #include #include -#include -#include #include #include #include @@ -80,6 +75,7 @@ #include "user.h" #include "speaker.h" #include "printf.h" +#include "version.h" /** @brief Linked list of all prepared tracks */ struct track *tracks; @@ -142,13 +138,6 @@ static void help(void) { exit(0); } -/* Display version number and terminate. */ -static void version(void) { - xprintf("%s", disorder_version_string); - xfclose(stdout); - exit(0); -} - /** @brief Return the number of bytes per frame in @p format */ static size_t bytes_per_frame(const struct stream_header *format) { return format->channels * format->bits / 8; @@ -553,21 +542,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 { + /* 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; - speaker_send(1, &sm); error(0, "SM_CANCEL for unknown track %s", sm.id); } + speaker_send(1, &sm); report(); break; case SM_RELOAD: @@ -610,7 +609,7 @@ int main(int argc, char **argv) { while((n = getopt_long(argc, argv, "hVc:dDSs", options, 0)) >= 0) { switch(n) { case 'h': help(); - case 'V': version(); + case 'V': version("disorder-speaker"); case 'c': configfile = optarg; break; case 'd': debugging = 1; break; case 'D': debugging = 0; break;