/*
* 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
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
/** @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 */
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)
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;
* 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 {
/* 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);
}
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));
}
/*
* 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
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);
}
/* 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
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,
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,
* 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;
&& 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;
}