From 1b84706462cc5a2c00d22b9f562cfee4c7a3278c Mon Sep 17 00:00:00 2001 From: "F. Duncanh" Date: Wed, 4 Feb 2026 15:25:45 -0500 Subject: [PATCH] add features used in proposed macOS native renderer --- renderers/video_renderer.c | 13 +++++++++++++ renderers/video_renderer.h | 2 ++ uxplay.cpp | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index 040df8c..4750adc 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_renderer.c @@ -657,6 +657,19 @@ void video_renderer_stop() { } } +void video_renderer_set_device_model(const char *model, const char *name) { + // Device frame not supported in GStreamer renderer + (void)model; + (void)name; +} + +void video_renderer_set_track_metadata(const char *title, const char *artist, const char *album) { + // Track metadata display not supported in GStreamer renderer + (void)title; + (void)artist; + (void)album; +} + static void video_renderer_destroy_instance(video_renderer_t *renderer) { if (renderer) { logger_log(logger, LOGGER_DEBUG,"destroying renderer instance %p codec=%s ", renderer, renderer->codec); diff --git a/renderers/video_renderer.h b/renderers/video_renderer.h index 73b13a1..fd48415 100644 --- a/renderers/video_renderer.h +++ b/renderers/video_renderer.h @@ -53,6 +53,8 @@ void video_renderer_init (logger_t *logger, const char *server_name, videoflip_t guint playbin_version, const char *uri); void video_renderer_start (); void video_renderer_stop (); +void video_renderer_set_device_model(const char *model, const char *name); +void video_renderer_set_track_metadata(const char *title, const char *artist, const char *album); void video_renderer_pause (); void video_renderer_hls_ready (); void video_renderer_seek(float position); diff --git a/uxplay.cpp b/uxplay.cpp index 418c54e..3b68a1c 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -193,6 +193,8 @@ static uint32_t rtptime_start = 0; static uint32_t rtptime_end = 0; static uint32_t rtptime_coverart_expired = 0; static std::string artist; +static std::string track_title; +static std::string track_album; static std::string coverart_artist; static std::string ble_filename = ""; static std::string rtp_pipeline = ""; @@ -1766,6 +1768,10 @@ static void process_metadata(int count, const char *dmap_tag, const unsigned cha break; case 'l': metadata_text->append("Album: "); /*asal*/ + if (render_coverart) { + track_album.erase(); + track_album.append(metadata, metadata + datalen); + } break; case 'r': metadata_text->append("Artist: "); /*asar*/ @@ -1849,6 +1855,10 @@ static void process_metadata(int count, const char *dmap_tag, const unsigned cha } else if (strcmp (dmap_tag, "minm") == 0) { dmap_type = 9; metadata_text->append("Title: "); + if (render_coverart) { + track_title.erase(); + track_title.append(metadata, metadata + datalen); + } } if (dmap_type == 9) { @@ -2251,6 +2261,10 @@ extern "C" void report_client_request(void *cls, char *deviceid, char * model, c *admit = false; LOGI("*** attempt to connect by blocked client (clientID %s): DENIED\n", deviceid); } + // Pass device model to renderer for device frame display + if (*admit && use_video) { + video_renderer_set_device_model(model, name); + } } extern "C" void audio_process (void *cls, raop_ntp_t *ntp, audio_decode_struct *data) { @@ -2518,6 +2532,13 @@ extern "C" void audio_set_metadata(void *cls, const void *buffer, int buflen) { if (buflen != 0) { LOGE("%d bytes of metadata were not processed", buflen); } + // Update video renderer with track metadata for cover art display + if (render_coverart) { + video_renderer_set_track_metadata( + track_title.length() ? track_title.c_str() : NULL, + artist.length() ? artist.c_str() : NULL, + track_album.length() ? track_album.c_str() : NULL); + } } extern "C" void register_client(void *cls, const char *device_id, const char *client_pk, const char *client_name) {