chiark / gitweb /
record whether tracks are connected to speaker in a sane and working way
authorRichard Kettlewell <rjk@greenend.org.uk>
Sun, 2 Dec 2007 18:10:08 +0000 (18:10 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Sun, 2 Dec 2007 18:10:08 +0000 (18:10 +0000)
lib/queue.h
server/play.c
server/server-queue.c
server/speaker.c

index 3ae4c2650962533d94821e3de8edaa180e82ceaa..ce43fc583d1351fe57694cdc52b9934acc1366c5 100644 (file)
@@ -54,6 +54,7 @@ struct queue_entry {
   const struct plugin *pl;             /* plugin that's playing this track */
   void *data;                          /* player data */
   long sofar;                          /* how much played so far */
   const struct plugin *pl;             /* plugin that's playing this track */
   void *data;                          /* player data */
   long sofar;                          /* how much played so far */
+  int prepared;                                /* true when connected to speaker */
   /* For DISORDER_PLAYER_PAUSES only: */
   time_t lastpaused, lastresumed;      /* when last paused/resumed, or 0 */
   long uptopause;                      /* how much played up to last pause */
   /* For DISORDER_PLAYER_PAUSES only: */
   time_t lastpaused, lastresumed;      /* when last paused/resumed, or 0 */
   long uptopause;                      /* how much played up to last pause */
index bd27474ce40a17ebd3ca23e4a672b4a25cbdfb21..7b7079994fbb2a2a3e88f80bf6b0790fb85ec5af 100644 (file)
@@ -312,14 +312,16 @@ static int start(ev_source *ev,
 
   memset(&sm, 0, sizeof sm);
   D(("start %s %d", q->id, prepare_only));
 
   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. */
     return START_OK;
   }
   /* Find the player plugin. */
@@ -478,6 +480,7 @@ static int start(ev_source *ev,
     return START_SOFTFAIL;
   }
   store_player_pid(q->id, pid);
     return START_SOFTFAIL;
   }
   store_player_pid(q->id, pid);
+  q->prepared = 1;
   if(lfd != -1)
     xclose(lfd);
   setpgid(pid, pid);
   if(lfd != -1)
     xclose(lfd);
   setpgid(pid, pid);
index 2b0e89e8f51fbae93c3f219094207de2f4a5a6a5..71262886ec1b1d123605961616eb523ac4cb2a57 100644 (file)
 #include "disorder.h"
 
 /* the head of the queue is played next, so normally we add to the tail */
 #include "disorder.h"
 
 /* the head of the queue is played next, so normally we add to the tail */
-struct queue_entry qhead = { &qhead, &qhead, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+struct queue_entry qhead = { &qhead, &qhead, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
 /* the head of the recent list is the oldest thing, the tail the most recently
  * played */
 
 /* the head of the recent list is the oldest thing, the tail the most recently
  * played */
-struct queue_entry phead = { &phead, &phead, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+struct queue_entry phead = { &phead, &phead, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
 static long pcount;
 
 
 static long pcount;
 
index 55dde7ee9bbf2572da6e317bf9e2ecfb378982cb..fabdfc496f869b198a53d61dd101010527fe1351 100644 (file)
@@ -495,7 +495,7 @@ static void mainloop(void) {
           t = findtrack(id, 1/*create*/);
           write(fd, "", 1);             /* write an ack */
           if(t->fd != -1) {
           t = findtrack(id, 1/*create*/);
           write(fd, "", 1);             /* write an ack */
           if(t->fd != -1) {
-            error(0, "got a connection for a track that already has one");
+            error(0, "%s: already got a connection", id);
             xclose(fd);
           } else {
             nonblock(fd);
             xclose(fd);
           } else {
             nonblock(fd);