From 7f97fda7b59bd9d3beb9bd4591a4e6dea9efccab Mon Sep 17 00:00:00 2001 Message-Id: <7f97fda7b59bd9d3beb9bd4591a4e6dea9efccab.1714424330.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sun, 10 Nov 2013 13:58:33 +0000 Subject: [PATCH] speaker: new comments to add/remove RTP recipients Organization: Straylight/Edgeware From: Richard Kettlewell --- lib/speaker-protocol.h | 12 ++++++++++++ server/play.c | 18 ++++++++++++++++++ server/speaker.c | 9 +++++++++ 3 files changed, 39 insertions(+) diff --git a/lib/speaker-protocol.h b/lib/speaker-protocol.h index 200e4b5..cd6a192 100644 --- a/lib/speaker-protocol.h +++ b/lib/speaker-protocol.h @@ -26,6 +26,7 @@ #define SPEAKER_PROTOCOL_H #include "byte-order.h" +#include /** @brief A message from the main server to the speaker, or vica versa */ struct speaker_message { @@ -37,6 +38,8 @@ struct speaker_message { * - @ref SM_RESUME * - @ref SM_CANCEL * - @ref SM_RELOAD + * - @ref SM_RTP_REQUEST + * - @ref SM_RTP_CANCEL * * Messages from the speaker: * - @ref SM_PAUSED @@ -53,6 +56,9 @@ struct speaker_message { union { /** @brief Track ID (including 0 terminator) */ char id[24]; /* ID including terminator */ + + /** @brief An IP address (for @ref SM_RTP_REQUEST and @ref SM_RTP_CANCEL) */ + struct sockaddr_storage address; } u; }; @@ -76,6 +82,12 @@ struct speaker_message { /** @brief Reload configuration */ #define SM_RELOAD 5 +/** @brief Reload configuration */ +#define SM_RTP_REQUEST 6 + +/** @brief Reload configuration */ +#define SM_RTP_CANCEL 7 + /* messages from the speaker */ /** @brief Paused track @c id, @c data seconds in * diff --git a/server/play.c b/server/play.c index e15cda1..a5d318c 100644 --- a/server/play.c +++ b/server/play.c @@ -823,6 +823,24 @@ void resume_playing(const char *who) { 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 diff --git a/server/speaker.c b/server/speaker.c index e470759..a55b074 100644 --- a/server/speaker.c +++ b/server/speaker.c @@ -660,6 +660,15 @@ static void mainloop(void) { disorder_error(0, "cannot read configuration"); disorder_info("reloaded configuration"); break; + case SM_RTP_REQUEST: + /* TODO the error behavior here is really unhelpful */ + if(rtp_add_recipient(&sm.u.address)) + disorder_error(0, "unacceptable RTP destination"); + break; + case SM_RTP_CANCEL: + if(rtp_remove_recipient(&sm.u.address)) + disorder_error(0, "unacceptable RTP destination for removal"); + break; default: disorder_error(0, "unknown message type %d", sm.type); } -- [mdw]