mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-28 16:15:57 -05:00
Implement DACP setspeakers
This commit is contained in:
parent
aa20a2e485
commit
bb5703d878
@ -28,6 +28,7 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include <event.h>
|
#include <event.h>
|
||||||
#include "evhttp/evhttp.h"
|
#include "evhttp/evhttp.h"
|
||||||
@ -447,14 +448,84 @@ static void
|
|||||||
dacp_reply_setspeakers(struct evhttp_request *req, struct evbuffer *evbuf, char **uri, struct evkeyvalq *query)
|
dacp_reply_setspeakers(struct evhttp_request *req, struct evbuffer *evbuf, char **uri, struct evkeyvalq *query)
|
||||||
{
|
{
|
||||||
struct daap_session *s;
|
struct daap_session *s;
|
||||||
|
const char *param;
|
||||||
|
const char *ptr;
|
||||||
|
uint64_t *ids;
|
||||||
|
int nspk;
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
s = daap_session_find(req, query, evbuf);
|
s = daap_session_find(req, query, evbuf);
|
||||||
if (!s)
|
if (!s)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Query: /setspeakers?speaker-id=0,0xapexid,0xapexid */
|
param = evhttp_find_header(query, "speaker-id");
|
||||||
|
if (!param)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DACP, "Missing speaker-id parameter in DACP setspeakers request\n");
|
||||||
|
|
||||||
/* TODO */
|
evhttp_send_error(req, HTTP_BADREQUEST, "Bad Request");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strlen(param) == 0)
|
||||||
|
{
|
||||||
|
ids = NULL;
|
||||||
|
goto fastpath;
|
||||||
|
}
|
||||||
|
|
||||||
|
nspk = 1;
|
||||||
|
ptr = param;
|
||||||
|
while ((ptr = strchr(ptr + 1, ',')))
|
||||||
|
nspk++;
|
||||||
|
|
||||||
|
ids = (uint64_t *)malloc((nspk + 1) * sizeof(uint64_t));
|
||||||
|
if (!ids)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DACP, "Out of memory for speaker ids\n");
|
||||||
|
|
||||||
|
evhttp_send_error(req, HTTP_SERVUNAVAIL, "Internal Server Error");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
param--;
|
||||||
|
i = 1;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
param++;
|
||||||
|
ret = safe_hextou64(param, &ids[i]);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DACP, "Invalid speaker id in request: %s\n", param);
|
||||||
|
|
||||||
|
nspk--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
while ((param = strchr(param + 1, ',')));
|
||||||
|
|
||||||
|
ids[0] = nspk;
|
||||||
|
|
||||||
|
fastpath:
|
||||||
|
ret = player_speaker_set(ids);
|
||||||
|
|
||||||
|
if (ids)
|
||||||
|
free(ids);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
DPRINTF(E_LOG, L_DACP, "Speakers de/activation failed!\n");
|
||||||
|
|
||||||
|
/* Password problem */
|
||||||
|
if (ret == -2)
|
||||||
|
evhttp_send_error(req, 902, "");
|
||||||
|
else
|
||||||
|
evhttp_send_error(req, 500, "Internal Server Error");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* 204 No Content is the canonical reply */
|
/* 204 No Content is the canonical reply */
|
||||||
evhttp_send_reply(req, HTTP_NOCONTENT, "No Content", evbuf);
|
evhttp_send_reply(req, HTTP_NOCONTENT, "No Content", evbuf);
|
||||||
|
Loading…
Reference in New Issue
Block a user