Skip to content

Commit

Permalink
[DACP] - add callback for dacp remote control meta data (audio_remote…
Browse files Browse the repository at this point in the history
…_control_id)
  • Loading branch information
Memphiz committed May 5, 2015
1 parent bbb0ec3 commit 2fe2599
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/shairplay/raop.h
Expand Up @@ -40,6 +40,7 @@ struct raop_callbacks_s {
void (*audio_set_volume)(void *cls, void *session, float volume);
void (*audio_set_metadata)(void *cls, void *session, const void *buffer, int buflen);
void (*audio_set_coverart)(void *cls, void *session, const void *buffer, int buflen);
void (*audio_remote_control_id)(void *cls, const char *dacp_id, const char *active_remote_header);
};
typedef struct raop_callbacks_s raop_callbacks_t;

Expand Down
13 changes: 13 additions & 0 deletions src/lib/raop.c
Expand Up @@ -242,6 +242,19 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
const char *transport;
char buffer[1024];
int use_udp;
const char *dacp_id;
const char *active_remote_header;

dacp_id = http_request_get_header(request, "DACP-ID");
active_remote_header = http_request_get_header(request, "Active-Remote");

if (dacp_id && active_remote_header) {
logger_log(conn->raop->logger, LOGGER_DEBUG, "DACP-ID: %s", dacp_id);
logger_log(conn->raop->logger, LOGGER_DEBUG, "Active-Remote: %s", active_remote_header);
if (conn->raop_rtp) {
raop_rtp_remote_control_id(conn->raop_rtp, dacp_id, active_remote_header);
}
}

transport = http_request_get_header(request, "Transport");
assert(transport);
Expand Down
38 changes: 38 additions & 0 deletions src/lib/raop_rtp.c
Expand Up @@ -50,6 +50,8 @@ struct raop_rtp_s {
int metadata_len;
unsigned char *coverart;
int coverart_len;
const char *dacp_id;
const char *active_remote_header;

int flush;
thread_handle_t thread;
Expand Down Expand Up @@ -166,6 +168,8 @@ raop_rtp_destroy(raop_rtp_t *raop_rtp)
raop_buffer_destroy(raop_rtp->buffer);
free(raop_rtp->metadata);
free(raop_rtp->coverart);
free((char *)raop_rtp->dacp_id);
free((char *)raop_rtp->active_remote_header);
free(raop_rtp);
}
}
Expand Down Expand Up @@ -258,6 +262,8 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
int metadata_len;
unsigned char *coverart;
int coverart_len;
const char *dacp_id;
const char *active_remote_header;

assert(raop_rtp);

Expand Down Expand Up @@ -287,6 +293,13 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
coverart_len = raop_rtp->coverart_len;
raop_rtp->coverart = NULL;
raop_rtp->coverart_len = 0;

/* Read DACP remote control data */
dacp_id = raop_rtp->dacp_id;
active_remote_header = raop_rtp->active_remote_header;
raop_rtp->dacp_id = NULL;
raop_rtp->active_remote_header = NULL;

MUTEX_UNLOCK(raop_rtp->run_mutex);

/* Call set_volume callback if changed */
Expand Down Expand Up @@ -317,6 +330,15 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
free(coverart);
coverart = NULL;
}
if (dacp_id && active_remote_header) {
if (raop_rtp->callbacks.audio_remote_control_id) {
raop_rtp->callbacks.audio_remote_control_id(raop_rtp->callbacks.cls, dacp_id, active_remote_header);
}
free((char *)dacp_id);
dacp_id = NULL;
free((char *)active_remote_header);
active_remote_header = NULL;
}
return 0;
}

Expand Down Expand Up @@ -654,6 +676,22 @@ raop_rtp_set_coverart(raop_rtp_t *raop_rtp, const char *data, int datalen)
MUTEX_UNLOCK(raop_rtp->run_mutex);
}

void
raop_rtp_remote_control_id(raop_rtp_t *raop_rtp, const char *dacp_id, const char *active_remote_header)
{
assert(raop_rtp);

if (!dacp_id || !active_remote_header) {
return;
}

/* Set dacp stuff in thread instead */
MUTEX_LOCK(raop_rtp->run_mutex);
raop_rtp->dacp_id = strdup(dacp_id);
raop_rtp->active_remote_header = strdup(active_remote_header);
MUTEX_UNLOCK(raop_rtp->run_mutex);
}

void
raop_rtp_flush(raop_rtp_t *raop_rtp, int next_seq)
{
Expand Down
1 change: 1 addition & 0 deletions src/lib/raop_rtp.h
Expand Up @@ -33,6 +33,7 @@ void raop_rtp_start(raop_rtp_t *raop_rtp, int use_udp, unsigned short control_rp
void raop_rtp_set_volume(raop_rtp_t *raop_rtp, float volume);
void raop_rtp_set_metadata(raop_rtp_t *raop_rtp, const char *data, int datalen);
void raop_rtp_set_coverart(raop_rtp_t *raop_rtp, const char *data, int datalen);
void raop_rtp_remote_control_id(raop_rtp_t *raop_rtp, const char *dacp_id, const char *active_remote_header);
void raop_rtp_flush(raop_rtp_t *raop_rtp, int next_seq);
void raop_rtp_stop(raop_rtp_t *raop_rtp);
void raop_rtp_destroy(raop_rtp_t *raop_rtp);
Expand Down

0 comments on commit 2fe2599

Please sign in to comment.