Pass metadata and coverart to the RTP thread
[deb_shairplay.git] / src / lib / raop.c
index dbd6ea241d189e08abfc3bb28c618141b227d934..a0289b7319f41eed7fe7f7a0028d09ec83e93467 100644 (file)
@@ -28,6 +28,7 @@
 #include "utils.h"
 #include "netutils.h"
 #include "logger.h"
+#include "compat.h"
 
 /* Actually 345 bytes for 2048-bit key */
 #define MAX_SIGNATURE_LEN 512
@@ -279,21 +280,31 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
                http_response_add_header(res, "Transport", buffer);
                http_response_add_header(res, "Session", "DEADBEEF");
        } else if (!strcmp(method, "SET_PARAMETER")) {
+               const char *content_type;
                const char *data;
                int datalen;
-               char *datastr;
 
+               content_type = http_request_get_header(request, "Content-Type");
                data = http_request_get_data(request, &datalen);
-               datastr = calloc(1, datalen+1);
-               if (data && datastr && conn->raop_rtp) {
-                       memcpy(datastr, data, datalen);
-                       if (!strncmp(datastr, "volume: ", 8)) {
-                               float vol = 0.0;
-                               sscanf(datastr+8, "%f", &vol);
-                               raop_rtp_set_volume(conn->raop_rtp, vol);
+               if (!strcmp(content_type, "text/parameters")) {
+                       char *datastr;
+                       datastr = calloc(1, datalen+1);
+                       if (data && datastr && conn->raop_rtp) {
+                               memcpy(datastr, data, datalen);
+                               if (!strncmp(datastr, "volume: ", 8)) {
+                                       float vol = 0.0;
+                                       sscanf(datastr+8, "%f", &vol);
+                                       raop_rtp_set_volume(conn->raop_rtp, vol);
+                               }
                        }
+                       free(datastr);
+               } else if (!strcmp(content_type, "image/jpeg")) {
+                       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, "Got metadata of %d bytes", datalen);
+                       raop_rtp_set_metadata(conn->raop_rtp, data, datalen);
                }
-               free(datastr);
        } else if (!strcmp(method, "FLUSH")) {
                const char *rtpinfo;
                int next_seq = -1;