From 3cce6768280c7b628c3ec71b7673b03db3c633bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20V=C3=A4h=C3=A4-Herttua?= Date: Sat, 5 Oct 2013 14:02:54 +0800 Subject: [PATCH] Add support for passing the progress values to raop callbacks. --- include/shairplay/raop.h | 1 + src/lib/raop.c | 6 +++++- src/lib/raop_rtp.c | 37 +++++++++++++++++++++++++++++++++++++ src/lib/raop_rtp.h | 1 + 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/include/shairplay/raop.h b/include/shairplay/raop.h index 80abdf5..172ecf8 100644 --- a/include/shairplay/raop.h +++ b/include/shairplay/raop.h @@ -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; diff --git a/src/lib/raop.c b/src/lib/raop.c index 33cf1e9..aea2a03 100644 --- a/src/lib/raop.c +++ b/src/lib/raop.c @@ -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")) { diff --git a/src/lib/raop_rtp.c b/src/lib/raop_rtp.c index 3ce9de9..e8bc381 100644 --- a/src/lib/raop_rtp.c +++ b/src/lib/raop_rtp.c @@ -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; @@ -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); @@ -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 */ @@ -316,6 +331,7 @@ 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); @@ -323,6 +339,7 @@ raop_rtp_process_events(raop_rtp_t *raop_rtp, void *cb_data) 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); @@ -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; } @@ -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) { diff --git a/src/lib/raop_rtp.h b/src/lib/raop_rtp.h index 3ee7369..45f71e8 100644 --- a/src/lib/raop_rtp.h +++ b/src/lib/raop_rtp.h @@ -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);