+ if(config->rtp_verbose)
+ disorder_info("RTP: configured");
+}
+
+/** @brief Add an RTP recipient address
+ * @param sa Pointer to recipient address
+ * @return 0 on success, -1 on error
+ */
+int rtp_add_recipient(const struct sockaddr_storage *sa) {
+ struct rtp_recipient *r;
+ int rc;
+ pthread_mutex_lock(&rtp_lock);
+ for(r = rtp_recipient_list;
+ r && sockaddrcmp((struct sockaddr *)sa,
+ (struct sockaddr *)&r->sa);
+ r = r->next)
+ ;
+ if(r)
+ rc = -1;
+ else {
+ r = xmalloc(sizeof *r);
+ memcpy(&r->sa, sa, sizeof *sa);
+ r->next = rtp_recipient_list;
+ rtp_recipient_list = r;
+ rc = 0;
+ }
+ pthread_mutex_unlock(&rtp_lock);
+ return rc;
+}
+
+/** @brief Remove an RTP recipient address
+ * @param sa Pointer to recipient address
+ * @return 0 on success, -1 on error
+ */
+int rtp_remove_recipient(const struct sockaddr_storage *sa) {
+ struct rtp_recipient *r, **rr;
+ int rc;
+ pthread_mutex_lock(&rtp_lock);
+ for(rr = &rtp_recipient_list;
+ (r = *rr) && sockaddrcmp((struct sockaddr *)sa,
+ (struct sockaddr *)&r->sa);
+ rr = &r->next)
+ ;
+ if(r) {
+ *rr = r->next;
+ xfree(r);
+ rc = 0;
+ } else {
+ disorder_error(0, "bogus rtp_remove_recipient");
+ rc = -1;
+ }
+ pthread_mutex_unlock(&rtp_lock);
+ return rc;