/*
* 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
*/
#include "disorder-server.h"
-#include <ao/ao.h>
#define SPEAKER "disorder-speaker"
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 {
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,
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);
/* 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));
}
eventlog("state", "resume", (char *)0);
}
+/** @brief Request an RTP stream */
+void rtp_request(const struct sockaddr_storage *sa) {
+ struct speaker_message sm;
+ memset(&sm, 0, sizeof sm);
+ sm.type = SM_RTP_REQUEST;
+ sm.u.address = *sa;
+ speaker_send(speaker_fd, &sm);
+}
+
+/** @brief Cancel an RTP stream */
+void rtp_request_cancel(const struct sockaddr_storage *sa) {
+ struct speaker_message sm;
+ memset(&sm, 0, sizeof sm);
+ sm.type = SM_RTP_CANCEL;
+ sm.u.address = *sa;
+ speaker_send(speaker_fd, &sm);
+}
+
/*
Local Variables:
c-basic-offset:2