]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Integrate true metadata some more with the metadata hub
authorMike Brady <mikebrady@eircom.net>
Mon, 15 Jan 2018 20:43:26 +0000 (20:43 +0000)
committerMike Brady <mikebrady@eircom.net>
Mon, 15 Jan 2018 20:43:26 +0000 (20:43 +0000)
dacp.c
metadata_hub.c
metadata_hub.h

diff --git a/dacp.c b/dacp.c
index 1b4bd078498a2bc89933a2c2536b2e2177f7963a..a1ac16970ba59554eb965fd29de6b01ef4023de3 100644 (file)
--- a/dacp.c
+++ b/dacp.c
@@ -615,7 +615,6 @@ int32_t dacp_get_client_volume(void) {
     int32_t item_size;
     if (reply_size >= 8) {
       if (dacp_tlv_crawl(&sp, &item_size) == 'cmgt') {
-        debug(1, "Volume:", item_size);
         sp -= item_size; // drop down into the array -- don't skip over it
         reply_size -= 8;
         while (reply_size >= 8) {
@@ -632,7 +631,7 @@ int32_t dacp_get_client_volume(void) {
     } else {
       debug(1, "Too short a response from getproperty?properties=dmcp.volume");
     }
-    debug(1, "Overall Volume is %d.", overall_volume);
+    // debug(1, "Overall Volume is %d.", overall_volume);
     free(server_reply);
   } else {
     debug(1, "Unexpected response %d to dacp volume control request", response);
@@ -709,7 +708,7 @@ int dacp_get_speaker_list(dacp_spkr_stuff *speaker_info, int max_size_of_array)
               t = sp - item_size;
               r = ntohl(*(int32_t *)(t));
               speaker_info[speaker_index].volume = r;
-              // debug(1,"Volume: \"%d\".",r);
+              // debug(1,"The individual volume of speaker \"%s\" is \"%d\".",speaker_info[speaker_index].name,r);
               break;
             case 'msma':
               t = sp - item_size;
@@ -774,7 +773,7 @@ void dacp_get_volume(void) {
   // calculate the real volume
 
   int32_t overall_volume = dacp_get_client_volume();
-  debug(1, "DACP Volume: %d.", overall_volume);
+  // debug(1, "DACP Volume: %d.", overall_volume);
   int speaker_count = dacp_get_speaker_list((dacp_spkr_stuff *)&speaker_info, 50);
   // debug(1,"DACP Speaker Count: %d.",speaker_count);
 
@@ -795,8 +794,7 @@ void dacp_get_volume(void) {
     }
   }
   int32_t actual_volume = (overall_volume * relative_volume + 50) / 100;
-  // debug(1,"Overall volume: %d, relative volume: %d%, actual volume:
-  // %d.",overall_volume,relative_volume,actual_volume);
+  // debug(1,"Overall volume: %d, relative volume: %d%, actual volume: %d.",overall_volume,relative_volume,actual_volume);
   // debug(1,"Our actual speaker volume is %d.",actual_volume);
   if (metadata_store.speaker_volume != actual_volume) {
     metadata_store.speaker_volume = actual_volume;
index 36a933033afe99fb40137effb1dd135acd248bbe..8aa7f6cd29e87b97fa0e7a7e5d80c621283ebe16 100644 (file)
@@ -65,53 +65,138 @@ void metadata_hub_process_metadata(uint32_t type, uint32_t code, char *data, uin
   // metadata coming in from the audio source or from Shairport Sync itself passes through here
   // this has more information about tags, which might be relevant:
   // https://code.google.com/p/ytrack/wiki/DMAP
-  char *payload;
-  if (length < 2048)
-    payload = strndup(data, length);
-  else
-    payload = NULL;
   switch (code) {
   case 'asal':
-    debug(1, "MH Album Name: \"%s\".", payload);
+    if ((metadata_store.album_name == NULL) ||
+        (strncmp(metadata_store.album_name, data, length) != 0)) {
+      if (metadata_store.album_name)
+        free(metadata_store.album_name);
+      metadata_store.album_name = strndup(data, length);
+      // debug(1, "MH Album name set to: \"%s\"", metadata_store.album_name);
+      metadata_store.album_name_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'asar':
-    debug(1, "MH Artist: \"%s\".", payload);
+    if ((metadata_store.artist_name == NULL) ||
+        (strncmp(metadata_store.artist_name, data, length) != 0)) {
+      if (metadata_store.artist_name)
+        free(metadata_store.artist_name);
+      metadata_store.artist_name = strndup(data, length);
+      // debug(1, "MH Artist name set to: \"%s\"", metadata_store.artist_name);
+      metadata_store.artist_name_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'ascm':
-    debug(1, "MH Comment: \"%s\".", payload);
+    if ((metadata_store.comment == NULL) ||
+        (strncmp(metadata_store.comment, data, length) != 0)) {
+      if (metadata_store.comment)
+        free(metadata_store.comment);
+      metadata_store.comment = strndup(data, length);
+      // debug(1, "MH Comment set to: \"%s\"", metadata_store.comment);
+      metadata_store.comment_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'asgn':
-    debug(1, "MH Genre: \"%s\".", payload);
+    if ((metadata_store.genre == NULL) ||
+        (strncmp(metadata_store.genre, data, length) != 0)) {
+      if (metadata_store.genre)
+        free(metadata_store.genre);
+      metadata_store.genre = strndup(data, length);
+      // debug(1, "MH Genre set to: \"%s\"", metadata_store.genre);
+      metadata_store.genre_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'minm':
-    debug(1, "MH Title: \"%s\".", payload);
+    if ((metadata_store.track_name == NULL) ||
+        (strncmp(metadata_store.track_name, data, length) != 0)) {
+      if (metadata_store.track_name)
+        free(metadata_store.track_name);
+      metadata_store.track_name = strndup(data, length);
+      // debug(1, "MH Track name set to: \"%s\"", metadata_store.track_name);
+      metadata_store.track_name_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'ascp':
-    debug(1, "MH Composer: \"%s\".", payload);
+    if ((metadata_store.composer == NULL) ||
+        (strncmp(metadata_store.composer, data, length) != 0)) {
+      if (metadata_store.composer)
+        free(metadata_store.composer);
+      metadata_store.composer = strndup(data, length);
+      // debug(1, "MH Composer set to: \"%s\"", metadata_store.composer);
+      metadata_store.composer_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'asdt':
-    debug(1, "MH File kind: \"%s\".", payload);
+    if ((metadata_store.file_kind == NULL) ||
+        (strncmp(metadata_store.file_kind, data, length) != 0)) {
+      if (metadata_store.file_kind)
+        free(metadata_store.file_kind);
+      metadata_store.file_kind = strndup(data, length);
+      // debug(1, "MH File Kind set to: \"%s\"", metadata_store.file_kind);
+      metadata_store.file_kind_changed = 1;
+      metadata_store.changed = 1;
+    }
+    break;
+  case 'asaa':
+    if ((metadata_store.file_kind == NULL) ||
+        (strncmp(metadata_store.file_kind, data, length) != 0)) {
+      if (metadata_store.file_kind)
+        free(metadata_store.file_kind);
+      metadata_store.file_kind = strndup(data, length);
+      // debug(1, "MH File Kind set to: \"%s\"", metadata_store.file_kind);
+      metadata_store.file_kind_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'assn':
-    debug(1, "MH Sort as: \"%s\".", payload);
+    if ((metadata_store.sort_as == NULL) ||
+        (strncmp(metadata_store.sort_as, data, length) != 0)) {
+      if (metadata_store.sort_as)
+        free(metadata_store.sort_as);
+      metadata_store.sort_as = strndup(data, length);
+      // debug(1, "MH Sort As set to: \"%s\"", metadata_store.sort_as);
+      metadata_store.sort_as_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
   case 'PICT':
     debug(1, "MH Picture received, length %u bytes.", length);
     break;
   case 'clip':
-    debug(1, "MH Client's IP: \"%s\".", payload);
+    if ((metadata_store.client_ip == NULL) ||
+        (strncmp(metadata_store.client_ip, data, length) != 0)) {
+      if (metadata_store.client_ip)
+        free(metadata_store.client_ip);
+      metadata_store.client_ip = strndup(data, length);
+      // debug(1, "MH Client IP set to: \"%s\"", metadata_store.client_ip);
+      metadata_store.client_ip_changed = 1;
+      metadata_store.changed = 1;
+    }
     break;
+      
   default:
-    if (type == 'ssnc') {
+    if (type == 'ssnc')
+    {
       char typestring[5];
       *(uint32_t *)typestring = htonl(type);
       typestring[4] = 0;
       char codestring[5];
       *(uint32_t *)codestring = htonl(code);
       codestring[4] = 0;
-      debug(1, "MH \"%s\" \"%s\": \"%s\".", typestring, codestring, payload);
+      char *payload;
+      if (length < 2048)
+        payload = strndup(data, length);
+      else
+        payload = NULL;
+      debug(1, "MH \"%s\" \"%s\" (%d bytes): \"%s\".", typestring, codestring, length, payload);
+      if (payload)
+        free(payload);
     }
   }
-  if (payload)
-    free(payload);
 }
index 3c09eff343524d3f752ffbf582bc49142f9dbe17..0c5ae0248c467d9311543d78fd3f5882542f4f3e 100644 (file)
@@ -51,6 +51,21 @@ typedef struct metadata_bundle {
   char *genre; // a malloced string -- if non-zero, free it before replacing it
   int genre_changed;
 
+  char *comment; // a malloced string -- if non-zero, free it before replacing it
+  int comment_changed;
+
+  char *composer; // a malloced string -- if non-zero, free it before replacing it
+  int composer_changed;
+
+  char *file_kind; // a malloced string -- if non-zero, free it before replacing it
+  int file_kind_changed;
+
+  char *sort_as; // a malloced string -- if non-zero, free it before replacing it
+  int sort_as_changed;
+
+  char *client_ip; // a malloced string -- if non-zero, free it before replacing it
+  int client_ip_changed;
+
   uint32_t item_id; // seems to be a track ID -- see itemid in DACP.c
   int item_id_changed;