[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
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)
if (spk->selected)
dmap_add_char(evbuf, "caia", 1); /* 9 */
if (flags.has_password)
if (spk->has_password)
dmap_add_char(evbuf, "cahp", 1); /* 9 */
if (flags.has_video)
if (spk->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_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

View File

@ -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);
}

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.
* 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);
}
/*

View File

@ -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);
}
}

View File

@ -2,6 +2,7 @@
#ifndef __PLAYER_H__
#define __PLAYER_H__
#include <stdbool.h>
#include <stdint.h>
#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
{