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 */
switch(pid = fork()) {
case 0: /* child */
exitfn = _exit;
+ progname = "disorderd-fork";
ev_signal_atfork(ev);
signal(SIGPIPE, SIG_DFL);
if(lfd != -1) {
/* 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 */
* (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 */