Pass metadata and coverart to the RTP thread
[deb_shairplay.git] / src / lib / raop_rtp.c
index 3400c0c9169e65679b0ec573cb6899bf5573b2eb..1896e160b562c50e1b67081cb65c1950c86165fe 100644 (file)
@@ -39,13 +39,21 @@ struct raop_rtp_s {
        struct sockaddr_storage remote_saddr;
        socklen_t remote_saddr_len;
 
+       /* MUTEX LOCKED VARIABLES START */
        /* These variables only edited mutex locked */
        int running;
        int joined;
+
        float volume;
+       unsigned char *metadata;
+       int metadata_len;
+       unsigned char *coverart;
+       int coverart_len;
+
        int flush;
        thread_handle_t thread;
        mutex_handle_t run_mutex;
+       /* MUTEX LOCKED VARIABLES END */
 
        /* Remote control and timing ports */
        unsigned short control_rport;
@@ -94,6 +102,10 @@ raop_rtp_parse_remote(raop_rtp_t *raop_rtp, const char *remote)
                free(original);
                return -1;
        }
+       if (strstr(current, ":")) {
+               /* FIXME: iTunes sends IP4 even with an IPv6 address, does it mean something */
+               family = AF_INET6;
+       }
        ret = netutils_parse_address(family, current,
                                     &raop_rtp->remote_saddr,
                                     sizeof(raop_rtp->remote_saddr));
@@ -149,6 +161,8 @@ raop_rtp_destroy(raop_rtp_t *raop_rtp)
 
                MUTEX_DESTROY(raop_rtp->run_mutex);
                raop_buffer_destroy(raop_rtp->buffer);
+               free(raop_rtp->metadata);
+               free(raop_rtp->coverart);
                free(raop_rtp);
        }
 }
@@ -556,6 +570,48 @@ raop_rtp_set_volume(raop_rtp_t *raop_rtp, float volume)
        MUTEX_UNLOCK(raop_rtp->run_mutex);
 }
 
+void
+raop_rtp_set_metadata(raop_rtp_t *raop_rtp, const char *data, int datalen)
+{
+       unsigned char *metadata;
+
+       assert(raop_rtp);
+
+       if (datalen <= 0) {
+               return;
+       }
+       metadata = malloc(datalen);
+       assert(metadata);
+       memcpy(metadata, data, datalen);
+
+       /* Set metadata in thread instead */
+       MUTEX_LOCK(raop_rtp->run_mutex);
+       raop_rtp->metadata = metadata;
+       raop_rtp->metadata_len = datalen;
+       MUTEX_UNLOCK(raop_rtp->run_mutex);
+}
+
+void
+raop_rtp_set_coverart(raop_rtp_t *raop_rtp, const char *data, int datalen)
+{
+       unsigned char *coverart;
+
+       assert(raop_rtp);
+
+       if (datalen <= 0) {
+               return;
+       }
+       coverart = malloc(datalen);
+       assert(coverart);
+       memcpy(coverart, data, datalen);
+
+       /* Set coverart in thread instead */
+       MUTEX_LOCK(raop_rtp->run_mutex);
+       raop_rtp->coverart = coverart;
+       raop_rtp->coverart_len = datalen;
+       MUTEX_UNLOCK(raop_rtp->run_mutex);
+}
+
 void
 raop_rtp_flush(raop_rtp_t *raop_rtp, int next_seq)
 {