mirror of
https://github.com/owntone/owntone-server.git
synced 2025-02-05 02:38:09 -05:00
[player] Refactor speaker enumerate callback
This commit is contained in:
parent
94fd370df2
commit
93879c6f90
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
25
src/mpd.c
25
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
26
src/player.c
26
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
21
src/player.h
21
src/player.h
@ -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
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user