Pass metadata and coverart to the RTP thread
authorJuho Vähä-Herttua <juhovh@iki.fi>
Sun, 13 May 2012 13:09:09 +0000 (16:09 +0300)
committerJuho Vähä-Herttua <juhovh@iki.fi>
Wed, 16 May 2012 21:57:07 +0000 (00:57 +0300)
src/lib/raop.c
src/lib/raop_rtp.c
src/lib/raop_rtp.h

index d85756b78b523fbdb07b6dc9e32c4d5885c84d97..a0289b7319f41eed7fe7f7a0028d09ec83e93467 100644 (file)
@@ -299,9 +299,11 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
                        }
                        free(datastr);
                } else if (!strcmp(content_type, "image/jpeg")) {
-                       logger_log(&conn->raop->logger, LOGGER_INFO, "UNHANDLED: Got image data of %d bytes", datalen);
+                       logger_log(&conn->raop->logger, LOGGER_INFO, "Got image data of %d bytes", datalen);
+                       raop_rtp_set_coverart(conn->raop_rtp, data, datalen);
                } else if (!strcmp(content_type, "application/x-dmap-tagged")) {
-                       logger_log(&conn->raop->logger, LOGGER_INFO, "UNHANDLED: Got metadata of %d bytes", datalen);
+                       logger_log(&conn->raop->logger, LOGGER_INFO, "Got metadata of %d bytes", datalen);
+                       raop_rtp_set_metadata(conn->raop_rtp, data, datalen);
                }
        } else if (!strcmp(method, "FLUSH")) {
                const char *rtpinfo;
index 3c7c17745bfd551726bdff1d2688a45273349654..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;
@@ -153,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);
        }
 }
@@ -560,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)
 {
index 1e947d6bf07840caa708b2dbedf70c5331cc14d8..19734fcedc12c04dd74815794a39c045560bc5e6 100644 (file)
@@ -30,6 +30,8 @@ raop_rtp_t *raop_rtp_init(logger_t *logger, raop_callbacks_t *callbacks, const c
 void raop_rtp_start(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_rport, unsigned short timing_rport,
                     unsigned short *control_lport, unsigned short *timing_lport, unsigned short *data_lport);
 void raop_rtp_set_volume(raop_rtp_t *raop_rtp, float volume);
+void raop_rtp_set_metadata(raop_rtp_t *raop_rtp, const char *data, int datalen);
+void raop_rtp_set_coverart(raop_rtp_t *raop_rtp, const char *data, int datalen);
 void raop_rtp_flush(raop_rtp_t *raop_rtp, int next_seq);
 void raop_rtp_stop(raop_rtp_t *raop_rtp);
 void raop_rtp_destroy(raop_rtp_t *raop_rtp);