diff --git a/src/httpd_dacp.c b/src/httpd_dacp.c index 9cec68b8..8680f32d 100644 --- a/src/httpd_dacp.c +++ b/src/httpd_dacp.c @@ -510,34 +510,34 @@ playqueuecontents_add_queue_item(struct evbuffer *songlist, struct db_queue_item } static void -speaker_enum_cb(uint64_t id, const char *name, const char *output_type, int relvol, int absvol, struct spk_flags flags, void *arg) +speaker_enum_cb(struct spk_info *spk, void *arg) { struct evbuffer *evbuf; int len; evbuf = (struct evbuffer *)arg; - len = 8 + strlen(name) + 28; - if (flags.selected) + len = 8 + strlen(spk->name) + 28; + if (spk->selected) len += 9; - if (flags.has_password) + if (spk->has_password) len += 9; - if (flags.has_video) + if (spk->has_video) len += 9; CHECK_ERR(L_DACP, evbuffer_expand(evbuf, 71 + len)); - dmap_add_container(evbuf, "mdcl", len); /* 8 + len */ - if (flags.selected) - dmap_add_char(evbuf, "caia", 1); /* 9 */ - if (flags.has_password) - dmap_add_char(evbuf, "cahp", 1); /* 9 */ - if (flags.has_video) - dmap_add_char(evbuf, "caiv", 1); /* 9 */ - dmap_add_string(evbuf, "minm", name); /* 8 + len */ - dmap_add_long(evbuf, "msma", id); /* 16 */ + dmap_add_container(evbuf, "mdcl", len); /* 8 + len */ + if (spk->selected) + dmap_add_char(evbuf, "caia", 1); /* 9 */ + if (spk->has_password) + dmap_add_char(evbuf, "cahp", 1); /* 9 */ + if (spk->has_video) + dmap_add_char(evbuf, "caiv", 1); /* 9 */ + dmap_add_string(evbuf, "minm", spk->name); /* 8 + len */ + dmap_add_long(evbuf, "msma", spk->id); /* 16 */ - dmap_add_int(evbuf, "cmvo", relvol); /* 12 */ + dmap_add_int(evbuf, "cmvo", spk->relvol); /* 12 */ } static int diff --git a/src/httpd_jsonapi.c b/src/httpd_jsonapi.c index b39ae298..f98830b7 100644 --- a/src/httpd_jsonapi.c +++ b/src/httpd_jsonapi.c @@ -495,7 +495,7 @@ jsonapi_reply_lastfm_logout(struct httpd_request *hreq) } static void -speaker_enum_cb(uint64_t id, const char *name, const char *output_type, int relvol, int absvol, struct spk_flags flags, void *arg) +speaker_enum_cb(struct spk_info *spk, void *arg) { json_object *outputs; json_object *output; @@ -504,15 +504,15 @@ speaker_enum_cb(uint64_t id, const char *name, const char *output_type, int relv outputs = arg; output = json_object_new_object(); - snprintf(output_id, sizeof(output_id), "%" PRIu64, id); + snprintf(output_id, sizeof(output_id), "%" PRIu64, spk->id); json_object_object_add(output, "id", json_object_new_string(output_id)); - json_object_object_add(output, "name", json_object_new_string(name)); - json_object_object_add(output, "type", json_object_new_string(output_type)); - json_object_object_add(output, "selected", json_object_new_boolean(flags.selected)); - json_object_object_add(output, "has_password", json_object_new_boolean(flags.has_password)); - json_object_object_add(output, "requires_auth", json_object_new_boolean(flags.requires_auth)); - json_object_object_add(output, "needs_auth_key", json_object_new_boolean(flags.needs_auth_key)); - json_object_object_add(output, "volume", json_object_new_int(absvol)); + json_object_object_add(output, "name", json_object_new_string(spk->name)); + json_object_object_add(output, "type", json_object_new_string(spk->output_type)); + json_object_object_add(output, "selected", json_object_new_boolean(spk->selected)); + json_object_object_add(output, "has_password", json_object_new_boolean(spk->has_password)); + json_object_object_add(output, "requires_auth", json_object_new_boolean(spk->requires_auth)); + json_object_object_add(output, "needs_auth_key", json_object_new_boolean(spk->needs_auth_key)); + json_object_object_add(output, "volume", json_object_new_int(spk->absvol)); json_object_array_add(outputs, output); } diff --git a/src/mpd.c b/src/mpd.c index bf46df55..4754a57a 100644 --- a/src/mpd.c +++ b/src/mpd.c @@ -3571,10 +3571,11 @@ mpd_command_password(struct evbuffer *evbuf, int argc, char **argv, char **errms /* * Callback function for the 'player_speaker_enumerate' function. - * Adds a new struct output to the given struct outputs in *arg for the given speaker (id, name, etc.). + * Expect a struct output_get_param as argument and allocates a struct output if + * the shortid of output_get_param matches the given speaker/output spk. */ static void -outputs_enum_cb(uint64_t id, const char *name, const char *output_type, int relvol, int absvol, struct spk_flags flags, void *arg) +outputs_enum_cb(struct spk_info *spk, void *arg) { struct outputs *outputs; struct output *output; @@ -3583,15 +3584,15 @@ outputs_enum_cb(uint64_t id, const char *name, const char *output_type, int relv output = (struct output*)malloc(sizeof(struct output)); - output->id = id; - output->shortid = (unsigned short) id; - output->name = strdup(name); - output->selected = flags.selected; + output->id = spk->id; + output->shortid = (unsigned short) spk->id; + output->name = strdup(spk->name); + output->selected = spk->selected; output->next = outputs->outputs; outputs->outputs = output; outputs->count++; - if (flags.selected) + if (spk->selected) outputs->active++; DPRINTF(E_DBG, L_MPD, "Output enum: shortid %d, id %" PRIu64 ", name '%s', selected %d\n", @@ -3869,7 +3870,7 @@ mpd_command_toggleoutput(struct evbuffer *evbuf, int argc, char **argv, char **e * outputvolume: 50 */ static void -speaker_enum_cb(uint64_t id, const char *name, const char *output_type, int relvol, int absvol, struct spk_flags flags, void *arg) +speaker_enum_cb(struct spk_info *spk, void *arg) { struct evbuffer *evbuf; @@ -3880,10 +3881,10 @@ speaker_enum_cb(uint64_t id, const char *name, const char *output_type, int relv "outputname: %s\n" "outputenabled: %d\n" "outputvolume: %d\n", - (unsigned short) id, - name, - flags.selected, - absvol); + (unsigned short) spk->id, + spk->name, + spk->selected, + spk->absvol); } /* diff --git a/src/player.c b/src/player.c index 8f0f60b2..efb1b158 100644 --- a/src/player.c +++ b/src/player.c @@ -2384,27 +2384,25 @@ speaker_enumerate(void *arg, int *retval) { struct spk_enum *spk_enum = arg; struct output_device *device; - struct spk_flags flags; - -#ifdef DEBUG_RELVOL - DPRINTF(E_DBG, L_PLAYER, "*** master: %d\n", master_volume); -#endif + struct spk_info spk; for (device = dev_list; device; device = device->next) { if (device->advertised || device->selected) { - flags.selected = device->selected; - flags.has_password = device->has_password; - flags.has_video = device->has_video; - flags.requires_auth = device->requires_auth; - flags.needs_auth_key = (device->requires_auth && device->auth_key == NULL); + spk.id = device->id; + spk.name = device->name; + spk.output_type = device->type_name; + spk.relvol = device->relvol; + spk.absvol = device->volume; - spk_enum->cb(device->id, device->name, device->type_name, device->relvol, device->volume, flags, spk_enum->arg); + spk.selected = device->selected; + spk.has_password = device->has_password; + spk.has_video = device->has_video; + spk.requires_auth = device->requires_auth; + spk.needs_auth_key = (device->requires_auth && device->auth_key == NULL); -#ifdef DEBUG_RELVOL - DPRINTF(E_DBG, L_PLAYER, "*** %s: abs %d rel %d\n", device->name, device->volume, device->relvol); -#endif + spk_enum->cb(&spk, spk_enum->arg); } } diff --git a/src/player.h b/src/player.h index 26fe51d1..7f52d2c6 100644 --- a/src/player.h +++ b/src/player.h @@ -2,6 +2,7 @@ #ifndef __PLAYER_H__ #define __PLAYER_H__ +#include #include #include "db.h" @@ -28,13 +29,19 @@ enum repeat_mode { REPEAT_ALL = 2, }; -struct spk_flags { - unsigned selected:1; - unsigned has_password:1; - unsigned requires_auth:1; - unsigned needs_auth_key:1; +struct spk_info { + uint64_t id; + const char *name; + const char *output_type; + int relvol; + int absvol; - unsigned has_video:1; + bool selected; + bool has_password; + bool requires_auth; + bool needs_auth_key; + + bool has_video; }; struct player_status { @@ -57,7 +64,7 @@ struct player_status { uint32_t len_ms; }; -typedef void (*spk_enum_cb)(uint64_t id, const char *name, const char *output_type, int relvol, int absvol, struct spk_flags flags, void *arg); +typedef void (*spk_enum_cb)(struct spk_info *spk, void *arg); struct player_history {