chiark / gitweb /
Typo fix.
[disorder] / server / play.c
index fa46329fc63a5436073ff018e86b5a336a09b3d7..f38c9d549f40ae296fa4a0b0e15a86f7aab26219 100644 (file)
@@ -111,10 +111,11 @@ static int speaker_readable(ev_source *ev, int fd,
     D(("SM_PAUSED %s %ld", sm.id, sm.data));
     playing->sofar = sm.data;
     break;
-  case SM_FINISHED:
-    /* the playing track finished */
-    D(("SM_FINISHED %s", sm.id));
-    finished(ev);
+  case SM_FINISHED:                    /* scratched the playing track */
+  case SM_STILLBORN:                   /* scratched too early */
+  case SM_UNKNOWN:                     /* scratched WAY too early */
+    if(playing && !strcmp(sm.id, playing->id))
+      finished(ev);
     break;
   case SM_PLAYING:
     /* track ID is playing, DATA seconds played */
@@ -372,6 +373,7 @@ static int start(ev_source *ev,
   switch(pid = fork()) {
   case 0:                      /* child */
     exitfn = _exit;
+    progname = "disorderd-fork";
     ev_signal_atfork(ev);
     signal(SIGPIPE, SIG_DFL);
     if(lfd != -1) {
@@ -388,8 +390,14 @@ static int start(ev_source *ev,
       /* np will be the pipe to disorder-normalize */
       if(socketpair(PF_UNIX, SOCK_STREAM, 0, np) < 0)
        fatal(errno, "error calling socketpair");
-      xshutdown(np[0], SHUT_WR);       /* normalize reads from np[0] */
+      /* Beware of the Leopard!  On OS X 10.5.x, the order of the shutdown
+       * calls here DOES MATTER.  If you do the SHUT_WR first then the SHUT_RD
+       * fails with "Socket is not connected".  I think this is a bug but
+       * provided implementors either don't care about the order or all agree
+       * about the order, choosing the reliable order is an adequate
+       * workaround.  */
       xshutdown(np[1], SHUT_RD);       /* decoder writes to np[1] */
+      xshutdown(np[0], SHUT_WR);       /* normalize reads from np[0] */
       blocking(np[0]);
       blocking(np[1]);
       /* Start disorder-normalize */