mirror of
https://github.com/owntone/owntone-server.git
synced 2025-02-10 05:08:11 -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
|
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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
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.
|
* 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
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 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
21
src/player.h
21
src/player.h
@ -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
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user