debug(1, "Unidentified image type of cover art -- jpg extension used.");
ext = jpg;
}
-
- int result = mkpath(config.cover_art_cache_dir, 0700);
+ mode_t oldumask = umask(000);
+ int result = mkpath(config.cover_art_cache_dir, 0777);
+ umask(oldumask);
if ((result == 0) || (result == -EEXIST)) {
// see if the file exists by opening it.
// if it exists, we're done
// 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
+
+ // all the following items of metadata are contained in one metadata packet
+ // they are preseded by an 'ssnc' 'mdst' item and followed by an 'ssnc 'mden' item.
+
if (type == 'core') {
switch (code) {
case 'asal':
case 'ascm':
if ((metadata_store.comment == NULL) ||
(strncmp(metadata_store.comment, data, length) != 0)) {
- if (metadata_store.comment)
+ if (metadata_store.comment)
free(metadata_store.comment);
metadata_store.comment = strndup(data, length);
// debug(1, "MH Comment set to: \"%s\"", metadata_store.comment);
}
} else if (type == 'ssnc') {
switch (code) {
+
+ // ignore the following
+ case 'pcst':
+ case 'pcen':
+ break;
+
+
+ case 'mdst':
+ debug(1, "MH Metadata stream processing start.");
+ metadata_hub_modify_prolog();
+ break;
+ case 'mden':
+ metadata_hub_modify_epilog();
+ debug(1, "MH Metadata stream processing end.");
+ break;
case 'PICT':
debug(1, "MH Picture received, length %u bytes.", length);
if (length > 16) {
+ metadata_hub_modify_prolog();
if (metadata_store.cover_art_pathname)
free(metadata_store.cover_art_pathname);
metadata_store.cover_art_pathname = metadata_write_image_file(data, length);
+ metadata_hub_modify_epilog();
}
break;
case 'clip':
if ((metadata_store.client_ip == NULL) ||
(strncmp(metadata_store.client_ip, data, length) != 0)) {
+ metadata_hub_modify_prolog();
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);
+ debug(1, "MH Client IP set to: \"%s\"", metadata_store.client_ip);
metadata_store.client_ip_changed = 1;
metadata_store.changed = 1;
+ metadata_hub_modify_epilog();
+ }
+ break;
+ case 'svip':
+ if ((metadata_store.server_ip == NULL) ||
+ (strncmp(metadata_store.server_ip, data, length) != 0)) {
+ metadata_hub_modify_prolog();
+ if (metadata_store.server_ip)
+ free(metadata_store.server_ip);
+ metadata_store.server_ip = strndup(data, length);
+ debug(1, "MH Server IP set to: \"%s\"", metadata_store.server_ip);
+ metadata_hub_modify_epilog();
}
break;
default: {
// say we have started playing here
#ifdef HAVE_METADATA_HUB
- if (metadata_store.player_state != PS_PLAYING) {
- metadata_store.player_state = PS_PLAYING;
- run_metadata_watchers();
- }
+ metadata_hub_modify_prolog();
+ metadata_store.player_state = PS_PLAYING;
+ metadata_hub_modify_epilog();
#endif
if (reference_timestamp) { // if we have a reference time
// debug(1,"First frame seen with timestamp...");
#endif
#ifdef HAVE_METADATA_HUB
- if (metadata_store.player_state != PS_PAUSED) {
- metadata_store.player_state = PS_PAUSED;
- run_metadata_watchers();
- }
+ metadata_hub_modify_prolog();
+ metadata_store.player_state = PS_PAUSED;
+ metadata_hub_modify_epilog();
#endif
}
pthread_create(pt, &tattr, player_thread_func, (void *)conn);
pthread_attr_destroy(&tattr);
#ifdef HAVE_METADATA_HUB
- if (metadata_store.player_state != PS_PLAYING) {
- metadata_store.player_state = PS_PLAYING;
- run_metadata_watchers();
- }
+ metadata_hub_modify_prolog();
+ metadata_store.player_state = PS_PLAYING;
+ metadata_hub_modify_epilog();
#endif
return 0;
}
free(conn->player_thread);
conn->player_thread = NULL;
#ifdef HAVE_METADATA_HUB
- if (metadata_store.player_state != PS_STOPPED) {
- metadata_store.player_state = PS_STOPPED;
- run_metadata_watchers();
- }
+ metadata_hub_modify_prolog();
+ metadata_store.player_state = PS_STOPPED;
+ metadata_hub_modify_epilog();
#endif
} else {
debug(3, "player thread of RTSP conversation %d is already deleted.", conn->connection_number);