chiark / gitweb /
speaker: protocol structure now has a union for different arg types
authorRichard Kettlewell <rjk@greenend.org.uk>
Sun, 10 Nov 2013 13:53:25 +0000 (13:53 +0000)
committerRichard Kettlewell <rjk@terraraq.org.uk>
Sun, 10 Nov 2013 14:04:18 +0000 (14:04 +0000)
lib/speaker-protocol.h
server/play.c
server/speaker.c

index 24fc970587d7f748e1b6aa3db3e23a9fe2b58d69..200e4b53029db74f1f28fe8cb661ed21f39e5695 100644 (file)
@@ -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 */
index 71782de365a17bc8faee3863b180423ef9f159d9..e15cda1012b43d4cfd0846438a2fdfe28de3dedf 100644 (file)
@@ -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));
     }
index fcfcf361a316beb8ec433c765f8c2f1370090024..e4707596b2921996c6390ee53dda2a98132af66c 100644 (file)
@@ -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;
     }