From 93e48869934909b1c3c79b951754cfe1b7b0fb13 Mon Sep 17 00:00:00 2001 From: juergen kellerer Date: Thu, 13 Jul 2017 21:53:35 +0200 Subject: [PATCH] [pipe] Added instant volume support (pvol) to named metadata pipe. --- src/inputs/pipe.c | 52 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/src/inputs/pipe.c b/src/inputs/pipe.c index d1c1e2d4..92264947 100644 --- a/src/inputs/pipe.c +++ b/src/inputs/pipe.c @@ -302,6 +302,47 @@ parse_progress(struct input_metadata *m, char *progress) m->song_length = (end - start) * 10 / 441; // Convert to ms based on 44100 } +static void +parse_volume(char *volume) +{ + char *volume_next; + float airplay_volume; + float local_volume; + + errno = 0; + airplay_volume = strtof(volume, &volume_next); + + if ((errno == ERANGE) || (volume == volume_next)) + { + DPRINTF(E_LOG, L_PLAYER, "Invalid airplay volume in string (%s): %s\n", volume, + (errno == ERANGE ? strerror(errno) : "First token is not a number.")); + return; + } + + if (strcmp(volume_next, ",0.00,0.00,0.00") != 0) + { + DPRINTF(E_DBG, L_PLAYER, "Not applying airplay volume while software volume control is enabled (%s)\n", volume); + return; + } + + if (((int) airplay_volume) == -144) + { + DPRINTF(E_DBG, L_PLAYER, "Applying airplay volume ('mute', value: %.2f)\n", airplay_volume); + player_volume_set(0); + } + else if (airplay_volume >= -30.0 && airplay_volume <= 0.0) + { + local_volume = 100.0 + (airplay_volume / 30.0 * 100.0); + if (local_volume < 0 || local_volume > 100) + return; + + DPRINTF(E_DBG, L_PLAYER, "Applying airplay volume (percent: %.0f, value: %.2f)\n", local_volume, airplay_volume); + player_volume_set((int) local_volume); + } + else + DPRINTF(E_LOG, L_PLAYER, "Airplay volume out of range (-144.0, [-30.0 - 0.0]): %.2f\n", airplay_volume); +} + // returns 1 on metadata found, 0 on nothing, -1 on error static int parse_item(struct input_metadata *m, const char *item) @@ -313,6 +354,7 @@ parse_item(struct input_metadata *m, const char *item) uint32_t type; uint32_t code; char *progress; + char *volume; char **data; int ret; @@ -356,6 +398,8 @@ parse_item(struct input_metadata *m, const char *item) data = &m->genre; else if (code == dmapval("prgr")) data = &progress; + else if (code == dmapval("pvol")) + data = &volume; else goto out_nothing; @@ -364,7 +408,7 @@ parse_item(struct input_metadata *m, const char *item) { pthread_mutex_lock(&pipe_metadata_lock); - if (data != &progress) + if (data != &progress && data != &volume) free(*data); *data = b64_decode(s); @@ -376,6 +420,11 @@ parse_item(struct input_metadata *m, const char *item) parse_progress(m, progress); free(*data); } + else if (data == &volume) + { + parse_volume(volume); + free(*data); + } pthread_mutex_unlock(&pipe_metadata_lock); @@ -910,4 +959,3 @@ struct input_definition input_pipe = .init = init, .deinit = deinit, }; -