Skip to content

Commit

Permalink
Add support for passing the progress values to raop callbacks.
Browse files Browse the repository at this point in the history
  • Loading branch information
juhovh authored and Memphiz committed May 8, 2015
1 parent 5be4c19 commit 3cce676
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/shairplay/raop.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ struct raop_callbacks_s {
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);
void (*audio_set_progress)(void *cls, void *session, unsigned int start, unsigned int curr, unsigned int end);
};
typedef struct raop_callbacks_s raop_callbacks_t;

Expand Down
6 changes: 5 additions & 1 deletion src/lib/raop.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,9 +325,13 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
float vol = 0.0;
sscanf(datastr+8, "%f", &vol);
raop_rtp_set_volume(conn->raop_rtp, vol);
} else if (!strncmp(datastr, "progress: ", 10)) {
unsigned int start, curr, end;
sscanf(datastr+10, "%u/%u/%u", &start, &curr, &end);
raop_rtp_set_progress(conn->raop_rtp, start, curr, end);
}
} else if (!conn->raop_rtp) {
logger_log(conn->raop->logger, LOGGER_WARNING, "RAOP not initialized at SET_PARAMETER volume");
logger_log(conn->raop->logger, LOGGER_WARNING, "RAOP not initialized at SET_PARAMETER");
}
free(datastr);
} else if (!strcmp(content_type, "image/jpeg") || !strcmp(content_type, "image/png")) {
Expand Down
37 changes: 37 additions & 0 deletions src/lib/raop_rtp.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ struct raop_rtp_s {
int coverart_len;
char *dacp_id;
char *active_remote_header;
unsigned int progress_start;
unsigned int progress_curr;
unsigned int progress_end;
int progress_changed;

int flush;
thread_handle_t thread;
Expand Down Expand Up @@ -264,6 +268,10 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
int coverart_len;
char *dacp_id;
char *active_remote_header;
unsigned int progress_start;
unsigned int progress_curr;
unsigned int progress_end;
int progress_changed;

assert(raop_rtp);

Expand Down Expand Up @@ -300,6 +308,13 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
raop_rtp->dacp_id = NULL;
raop_rtp->active_remote_header = NULL;

/* Read the progress values */
progress_start = raop_rtp->progress_start;
progress_curr = raop_rtp->progress_curr;
progress_end = raop_rtp->progress_end;
progress_changed = raop_rtp->progress_changed;
raop_rtp->progress_changed = 0;

MUTEX_UNLOCK(raop_rtp->run_mutex);

/* Call set_volume callback if changed */
Expand All @@ -316,13 +331,15 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
raop_rtp->callbacks.audio_flush(raop_rtp->callbacks.cls, cb_data);
}
}

if (metadata != NULL) {
if (raop_rtp->callbacks.audio_set_metadata) {
raop_rtp->callbacks.audio_set_metadata(raop_rtp->callbacks.cls, cb_data, metadata, metadata_len);
}
free(metadata);
metadata = NULL;
}

if (coverart != NULL) {
if (raop_rtp->callbacks.audio_set_coverart) {
raop_rtp->callbacks.audio_set_coverart(raop_rtp->callbacks.cls, cb_data, coverart, coverart_len);
Expand All @@ -339,6 +356,12 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data)
dacp_id = NULL;
active_remote_header = NULL;
}

if (progress_changed) {
if (raop_rtp->callbacks.audio_set_progress) {
raop_rtp->callbacks.audio_set_progress(raop_rtp->callbacks.cls, cb_data, progress_start, progress_curr, progress_end);
}
}
return 0;
}

Expand Down Expand Up @@ -692,6 +715,20 @@ raop_rtp_remote_control_id(raop_rtp_t *raop_rtp, const char *dacp_id, const char
MUTEX_UNLOCK(raop_rtp->run_mutex);
}

void
raop_rtp_set_progress(raop_rtp_t *raop_rtp, unsigned int start, unsigned int curr, unsigned int end)
{
assert(raop_rtp);

/* Set progress in thread instead */
MUTEX_LOCK(raop_rtp->run_mutex);
raop_rtp->progress_start = start;
raop_rtp->progress_curr = curr;
raop_rtp->progress_end = end;
raop_rtp->progress_changed = 1;
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
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ 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_set_progress(raop_rtp_t *raop_rtp, unsigned int start, unsigned int curr, unsigned int end);
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 3cce676

Please sign in to comment.