From fa6cafd0be698ab0408450ca1147926bfadd669d Mon Sep 17 00:00:00 2001 From: Mike Brady Date: Mon, 15 Jan 2018 20:43:26 +0000 Subject: [PATCH] Integrate true metadata some more with the metadata hub --- dacp.c | 10 ++-- metadata_hub.c | 121 +++++++++++++++++++++++++++++++++++++++++-------- metadata_hub.h | 15 ++++++ 3 files changed, 122 insertions(+), 24 deletions(-) diff --git a/dacp.c b/dacp.c index 1b4bd0784..a1ac16970 100644 --- 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; diff --git a/metadata_hub.c b/metadata_hub.c index 36a933033..8aa7f6cd2 100644 --- a/metadata_hub.c +++ b/metadata_hub.c @@ -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); } diff --git a/metadata_hub.h b/metadata_hub.h index 3c09eff34..0c5ae0248 100644 --- a/metadata_hub.h +++ b/metadata_hub.h @@ -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;