Integrate true metadata some more with the metadata hub
This commit is contained in:
@@ -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;
|
||||
|
||||
+103
-18
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user