[player] Refactor speaker enumerate callback

This commit is contained in:
chme 2018-02-07 22:18:09 +01:00
parent 94fd370df2
commit 93879c6f90
5 changed files with 63 additions and 57 deletions

View File

@ -510,34 +510,34 @@ playqueuecontents_add_queue_item(struct evbuffer *songlist, struct db_queue_item
} }
static void 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; struct evbuffer *evbuf;
int len; int len;
evbuf = (struct evbuffer *)arg; evbuf = (struct evbuffer *)arg;
len = 8 + strlen(name) + 28; len = 8 + strlen(spk->name) + 28;
if (flags.selected) if (spk->selected)
len += 9; len += 9;
if (flags.has_password) if (spk->has_password)
len += 9; len += 9;
if (flags.has_video) if (spk->has_video)
len += 9; len += 9;
CHECK_ERR(L_DACP, evbuffer_expand(evbuf, 71 + len)); CHECK_ERR(L_DACP, evbuffer_expand(evbuf, 71 + len));
dmap_add_container(evbuf, "mdcl", len); /* 8 + len */ dmap_add_container(evbuf, "mdcl", len); /* 8 + len */
if (flags.selected) if (spk->selected)
dmap_add_char(evbuf, "caia", 1); /* 9 */ dmap_add_char(evbuf, "caia", 1); /* 9 */
if (flags.has_password) if (spk->has_password)
dmap_add_char(evbuf, "cahp", 1); /* 9 */ dmap_add_char(evbuf, "cahp", 1); /* 9 */
if (flags.has_video) if (spk->has_video)
dmap_add_char(evbuf, "caiv", 1); /* 9 */ dmap_add_char(evbuf, "caiv", 1); /* 9 */
dmap_add_string(evbuf, "minm", name); /* 8 + len */ dmap_add_string(evbuf, "minm", spk->name); /* 8 + len */
dmap_add_long(evbuf, "msma", id); /* 16 */ 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 static int

View File

@ -495,7 +495,7 @@ jsonapi_reply_lastfm_logout(struct httpd_request *hreq)
} }
static void 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 *outputs;
json_object *output; json_object *output;
@ -504,15 +504,15 @@ speaker_enum_cb(uint64_t id, const char *name, const char *output_type, int relv
outputs = arg; outputs = arg;
output = json_object_new_object(); 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, "id", json_object_new_string(output_id));
json_object_object_add(output, "name", json_object_new_string(name)); json_object_object_add(output, "name", json_object_new_string(spk->name));
json_object_object_add(output, "type", json_object_new_string(output_type)); json_object_object_add(output, "type", json_object_new_string(spk->output_type));
json_object_object_add(output, "selected", json_object_new_boolean(flags.selected)); json_object_object_add(output, "selected", json_object_new_boolean(spk->selected));
json_object_object_add(output, "has_password", json_object_new_boolean(flags.has_password)); 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(flags.requires_auth)); 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(flags.needs_auth_key)); 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(absvol)); json_object_object_add(output, "volume", json_object_new_int(spk->absvol));
json_object_array_add(outputs, output); json_object_array_add(outputs, output);
} }

View File

@ -3571,10 +3571,11 @@ mpd_command_password(struct evbuffer *evbuf, int argc, char **argv, char **errms
/* /*
* Callback function for the 'player_speaker_enumerate' function. * 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 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 outputs *outputs;
struct output *output; 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 = (struct output*)malloc(sizeof(struct output));
output->id = id; output->id = spk->id;
output->shortid = (unsigned short) id; output->shortid = (unsigned short) spk->id;
output->name = strdup(name); output->name = strdup(spk->name);
output->selected = flags.selected; output->selected = spk->selected;
output->next = outputs->outputs; output->next = outputs->outputs;
outputs->outputs = output; outputs->outputs = output;
outputs->count++; outputs->count++;
if (flags.selected) if (spk->selected)
outputs->active++; outputs->active++;
DPRINTF(E_DBG, L_MPD, "Output enum: shortid %d, id %" PRIu64 ", name '%s', selected %d\n", 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 * outputvolume: 50
*/ */
static void 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; 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" "outputname: %s\n"
"outputenabled: %d\n" "outputenabled: %d\n"
"outputvolume: %d\n", "outputvolume: %d\n",
(unsigned short) id, (unsigned short) spk->id,
name, spk->name,
flags.selected, spk->selected,
absvol); spk->absvol);
} }
/* /*

View File

@ -2384,27 +2384,25 @@ speaker_enumerate(void *arg, int *retval)
{ {
struct spk_enum *spk_enum = arg; struct spk_enum *spk_enum = arg;
struct output_device *device; struct output_device *device;
struct spk_flags flags; struct spk_info spk;
#ifdef DEBUG_RELVOL
DPRINTF(E_DBG, L_PLAYER, "*** master: %d\n", master_volume);
#endif
for (device = dev_list; device; device = device->next) for (device = dev_list; device; device = device->next)
{ {
if (device->advertised || device->selected) if (device->advertised || device->selected)
{ {
flags.selected = device->selected; spk.id = device->id;
flags.has_password = device->has_password; spk.name = device->name;
flags.has_video = device->has_video; spk.output_type = device->type_name;
flags.requires_auth = device->requires_auth; spk.relvol = device->relvol;
flags.needs_auth_key = (device->requires_auth && device->auth_key == NULL); 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 spk_enum->cb(&spk, spk_enum->arg);
DPRINTF(E_DBG, L_PLAYER, "*** %s: abs %d rel %d\n", device->name, device->volume, device->relvol);
#endif
} }
} }

View File

@ -2,6 +2,7 @@
#ifndef __PLAYER_H__ #ifndef __PLAYER_H__
#define __PLAYER_H__ #define __PLAYER_H__
#include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "db.h" #include "db.h"
@ -28,13 +29,19 @@ enum repeat_mode {
REPEAT_ALL = 2, REPEAT_ALL = 2,
}; };
struct spk_flags { struct spk_info {
unsigned selected:1; uint64_t id;
unsigned has_password:1; const char *name;
unsigned requires_auth:1; const char *output_type;
unsigned needs_auth_key:1; 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 { struct player_status {
@ -57,7 +64,7 @@ struct player_status {
uint32_t len_ms; 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 struct player_history
{ {