X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/657fdb79cbec1dba609675200797415978a50315..7489d3af05a4394e9621e14a196a9f6c4f788a26:/server/play.c?ds=inline diff --git a/server/play.c b/server/play.c index b6d3dcc..96e4a50 100644 --- a/server/play.c +++ b/server/play.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder. - * Copyright (C) 2004-2009 Richard Kettlewell + * Copyright (C) 2004-2012 Richard Kettlewell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -250,10 +250,12 @@ static int player_finished(ev_source *ev, q->state = playing_ok; break; } - /* Regardless we always report and record the status and do cleanup for - * prefork calls. */ - if(status) - disorder_error(0, "player for %s %s", q->track, wstat(status)); + /* Report the status unless we killed it */ + if(status) { + if(!(q->killed && WIFSIGNALED(status) && WTERMSIG(status) == q->killed)) + disorder_error(0, "player for %s %s", q->track, wstat(status)); + } + /* Clean up any prefork calls */ if(q->type & DISORDER_PLAYER_PREFORK) play_cleanup(q->pl, q->data); q->wstat = status; @@ -338,8 +340,6 @@ static int start(ev_source *ev, static int start_child(struct queue_entry *q, const struct pbgc_params *params, void attribute((unused)) *bgdata) { - int n; - /* Play the track */ play_track(q->pl, params->argv, params->argc, @@ -422,7 +422,7 @@ static int prepare_child(struct queue_entry *q, memset(&addr, 0, sizeof addr); addr.sun_family = AF_UNIX; snprintf(addr.sun_path, sizeof addr.sun_path, - "%s/speaker/socket", config->home); + "%s/private/speaker", config->home); int sfd = xsocket(PF_UNIX, SOCK_STREAM, 0); if(connect(sfd, (const struct sockaddr *)&addr, sizeof addr) < 0) disorder_fatal(errno, "connecting to %s", addr.sun_path); @@ -474,6 +474,15 @@ static int prepare_child(struct queue_entry *q, return 0; } +/** @brief Kill a player + * @param q Queue entry corresponding to player + */ +static void kill_player(struct queue_entry *q) { + if(q->pid >= 0) + kill(-q->pid, config->signal); + q->killed = config->signal; +} + /** @brief Abandon a queue entry * * Called from c_remove() (but NOT when scratching a track). Only does @@ -489,7 +498,7 @@ void abandon(ev_source attribute((unused)) *ev, if((q->type & DISORDER_PLAYER_TYPEMASK) != DISORDER_PLAYER_RAW) return; /* Not a raw player. */ /* Terminate the player. */ - kill(-q->pid, config->signal); + kill_player(q); /* Cancel the track. */ memset(&sm, 0, sizeof sm); sm.type = SM_CANCEL; @@ -693,10 +702,8 @@ void scratch(const char *who, const char *id) { playing->state = playing_scratched; playing->scratched = who ? xstrdup(who) : 0; /* Find the player and kill the whole process group */ - if(playing->pid >= 0) { - D(("kill -%d -%lu", config->signal, (unsigned long)playing->pid)); - kill(-playing->pid, config->signal); - } + if(playing->pid >= 0) + kill_player(playing); /* Tell the speaker, if we think it'll care */ if((playing->type & DISORDER_PLAYER_TYPEMASK) == DISORDER_PLAYER_RAW) { memset(&sm, 0, sizeof sm); @@ -735,17 +742,13 @@ void quitting(ev_source *ev) { shutting_down = 1; /* Shut down the current player */ if(playing) { - if(playing->pid >= 0) - kill(-playing->pid, config->signal); + kill_player(playing); playing->state = playing_quitting; finished(0); } /* Zap any background decoders that are going */ for(q = qhead.next; q != &qhead; q = q->next) - if(q->pid >= 0) { - D(("kill -%d %lu", config->signal, (unsigned long)q->pid)); - kill(-q->pid, config->signal); - } + kill_player(q); /* Don't need the speaker any more */ ev_fd_cancel(ev, ev_read, speaker_fd); xclose(speaker_fd);