From e3953a418a97e0512da7421bb1374c0336fdfd4d Mon Sep 17 00:00:00 2001 Message-Id: From: Mark Wooding Date: Sun, 10 Nov 2013 13:53:25 +0000 Subject: [PATCH] speaker: protocol structure now has a union for different arg types Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/speaker-protocol.h | 10 ++++++---- server/play.c | 16 ++++++++-------- server/speaker.c | 20 ++++++++++---------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/lib/speaker-protocol.h b/lib/speaker-protocol.h index 24fc970..200e4b5 100644 --- a/lib/speaker-protocol.h +++ b/lib/speaker-protocol.h @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005, 2007, 2008 Richard Kettlewell + * Copyright (C) 2005, 2007, 2008, 2013 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 @@ -31,7 +31,7 @@ struct speaker_message { /** @brief Message type * - * Messges from the main server: + * Messages from the main server: * - @ref SM_PLAY * - @ref SM_PAUSE * - @ref SM_RESUME @@ -50,8 +50,10 @@ struct speaker_message { /** @brief Message-specific data */ long data; - /** @brief Track ID (including 0 terminator) */ - char id[24]; /* ID including terminator */ + union { + /** @brief Track ID (including 0 terminator) */ + char id[24]; /* ID including terminator */ + } u; }; /* messages from the main DisOrder server */ diff --git a/server/play.c b/server/play.c index 71782de..e15cda1 100644 --- a/server/play.c +++ b/server/play.c @@ -76,13 +76,13 @@ static int speaker_readable(ev_source *ev, int fd, switch(sm.type) { case SM_PAUSED: /* track ID is paused, DATA seconds played */ - D(("SM_PAUSED %s %ld", sm.id, sm.data)); + D(("SM_PAUSED %s %ld", sm.u.id, sm.data)); playing->sofar = sm.data; break; 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)) { + if(playing && !strcmp(sm.u.id, playing->id)) { if((playing->state == playing_unplayed || playing->state == playing_started) && sm.type == SM_FINISHED) @@ -92,13 +92,13 @@ static int speaker_readable(ev_source *ev, int fd, break; case SM_PLAYING: /* track ID is playing, DATA seconds played */ - D(("SM_PLAYING %s %ld", sm.id, sm.data)); + D(("SM_PLAYING %s %ld", sm.u.id, sm.data)); playing->sofar = sm.data; break; case SM_ARRIVED: { /* track ID is now prepared */ struct queue_entry *q; - for(q = qhead.next; q != &qhead && strcmp(q->id, sm.id); q = q->next) + for(q = qhead.next; q != &qhead && strcmp(q->id, sm.u.id); q = q->next) ; if(q && q->preparing) { q->preparing = 0; @@ -316,10 +316,10 @@ static int start(ev_source *ev, * a subprocess. See speaker.c for further discussion. */ struct speaker_message sm[1]; memset(sm, 0, sizeof sm); - strcpy(sm->id, q->id); + strcpy(sm->u.id, q->id); sm->type = SM_PLAY; speaker_send(speaker_fd, sm); - D(("sent SM_PLAY for %s", sm->id)); + D(("sent SM_PLAY for %s", sm->u.id)); /* Our caller will set playing and playing->state = playing_started */ return START_OK; } else { @@ -501,7 +501,7 @@ void abandon(ev_source attribute((unused)) *ev, /* Cancel the track. */ memset(&sm, 0, sizeof sm); sm.type = SM_CANCEL; - strcpy(sm.id, q->id); + strcpy(sm.u.id, q->id); speaker_send(speaker_fd, &sm); } @@ -707,7 +707,7 @@ void scratch(const char *who, const char *id) { if((playing->type & DISORDER_PLAYER_TYPEMASK) == DISORDER_PLAYER_RAW) { memset(&sm, 0, sizeof sm); sm.type = SM_CANCEL; - strcpy(sm.id, playing->id); + strcpy(sm.u.id, playing->id); speaker_send(speaker_fd, &sm); D(("sending SM_CANCEL for %s", playing->id)); } diff --git a/server/speaker.c b/server/speaker.c index fcfcf36..e470759 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -1,6 +1,6 @@ /* * This file is part of DisOrder - * Copyright (C) 2005-2012 Richard Kettlewell + * Copyright (C) 2005-2013 Richard Kettlewell * Portions (C) 2007 Mark Wooding * * This program is free software: you can redistribute it and/or modify @@ -386,7 +386,7 @@ static void report(void) { return; memset(&sm, 0, sizeof sm); sm.type = paused ? SM_PAUSED : SM_PLAYING; - strcpy(sm.id, playing->id); + strcpy(sm.u.id, playing->id); sm.data = playing->played / (uaudio_rate * uaudio_channels); speaker_send(1, &sm); xtime(&last_report); @@ -563,7 +563,7 @@ static void mainloop(void) { } /* Notify the server that the connection arrived */ sm.type = SM_ARRIVED; - strcpy(sm.id, id); + strcpy(sm.u.id, id); speaker_send(1, &sm); } } else @@ -593,7 +593,7 @@ static void mainloop(void) { if(pending_playing) disorder_fatal(0, "got SM_PLAY but have a pending playing track"); } - t = findtrack(sm.id, 1); + t = findtrack(sm.u.id, 1); D(("SM_PLAY %s fd %d", t->id, t->fd)); if(t->fd == -1) disorder_error(0, @@ -622,8 +622,8 @@ static void mainloop(void) { force_report = 1; break; case SM_CANCEL: - D(("SM_CANCEL %s", sm.id)); - t = removetrack(sm.id); + D(("SM_CANCEL %s", sm.u.id)); + t = removetrack(sm.u.id); if(t) { if(t == playing || t == pending_playing) { /* Scratching the track that the server believes is playing, @@ -640,16 +640,16 @@ static void mainloop(void) { * 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. */ - disorder_info("SM_CANCEL for nonplaying track %s", sm.id); + disorder_info("SM_CANCEL for nonplaying track %s", sm.u.id); sm.type = SM_STILLBORN; } - strcpy(sm.id, t->id); + strcpy(sm.u.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; - disorder_error(0, "SM_CANCEL for unknown track %s", sm.id); + disorder_error(0, "SM_CANCEL for unknown track %s", sm.u.id); } speaker_send(1, &sm); force_report = 1; @@ -689,7 +689,7 @@ static void mainloop(void) { && playing->used <= early_finish) { memset(&sm, 0, sizeof sm); sm.type = SM_FINISHED; - strcpy(sm.id, playing->id); + strcpy(sm.u.id, playing->id); speaker_send(1, &sm); playing->finished = 1; } -- [mdw]