diff --git a/renderers/video_renderer.c b/renderers/video_renderer.c index 59a95a6..3fd4550 100644 --- a/renderers/video_renderer.c +++ b/renderers/video_renderer.c @@ -507,10 +507,11 @@ bool waiting_for_x11_window() { return false; } - /* use this to cycle the jpeg renderer to remove expired coverart when no new coverart has replaced it */ int video_renderer_cycle() { - g_assert(renderer); + if (!renderer || !strstr(renderer->codec, jpeg)) { + return -1; + } GstState state, pending_state, target_state; GstStateChangeReturn ret; gst_element_get_state(renderer->pipeline, &state, NULL, 0); @@ -518,6 +519,7 @@ int video_renderer_cycle() { gst_element_state_get_name(state)); for (int i = 0 ; i < 2; i++) { + int count = 0; if (i == 0 ) { target_state = GST_STATE_NULL; video_renderer_stop(); @@ -526,7 +528,7 @@ int video_renderer_cycle() { gst_element_set_state (renderer->pipeline, target_state); } while (state != target_state) { - ret = gst_element_get_state(renderer->pipeline, &state, &pending_state, 100 * GST_MSECOND); + ret = gst_element_get_state(renderer->pipeline, &state, &pending_state, 1000 * GST_MSECOND); if (ret == GST_STATE_CHANGE_SUCCESS) { logger_log(logger, LOGGER_DEBUG, "current pipeline state is %s", gst_element_state_get_name(state)); if (pending_state != GST_STATE_VOID_PENDING) { @@ -534,7 +536,10 @@ int video_renderer_cycle() { } } else if (ret == GST_STATE_CHANGE_FAILURE) { logger_log(logger, LOGGER_ERR, "pipeline %s: state change to %s failed", renderer->codec, gst_element_state_get_name(target_state)); - return -1; + count++; + if (count > 10) { + return -1; + } } else if (ret == GST_STATE_CHANGE_ASYNC) { logger_log(logger, LOGGER_DEBUG, "state change to %s is asynchronous, waiting for completion ...", gst_element_state_get_name(target_state)); diff --git a/uxplay.cpp b/uxplay.cpp index 082339c..f8fbe62 100644 --- a/uxplay.cpp +++ b/uxplay.cpp @@ -182,9 +182,12 @@ static guint missed_feedback = 0; static guint playbin_version = DEFAULT_PLAYBIN_VERSION; static bool reset_httpd = false; static bool monitor_progress = false; -static uint32_t rtptime; -static uint32_t rtptime_start; -static uint32_t rtptime_end; +static uint32_t rtptime = 0; +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 coverart_artist; //Support for D-Bus-based screensaver inhibition (org.freedesktop.ScreenSaver) static unsigned int scrsv; @@ -580,6 +583,11 @@ static gboolean progress_callback (gpointer loop) { if (rtptime_start || rtptime_end) { display_progress(rtptime_start, rtptime, rtptime_end); } + if (render_coverart && coverart_artist == "_expired_" && rtptime - rtptime_coverart_expired > 44100 * 5) { + /* remove any expired coverart still being rendered more than 5 secs after it expired */ + coverart_artist.erase(); + video_renderer_cycle(); + } return TRUE; } else { progress_id = 0; @@ -626,6 +634,8 @@ static void main_loop() { rtptime_start = 0; rtptime_end = 0; monitor_progress = true; + artist.erase(); + coverart_artist.erase(); progress_id = g_timeout_add_seconds(1,(GSourceFunc) progress_callback, (gpointer) loop); n_audio_renderers = 2; g_assert(n_audio_renderers <= MAX_AUDIO_RENDERERS); @@ -1541,6 +1551,17 @@ static void process_metadata(int count, const char *dmap_tag, const unsigned cha break; case 'r': metadata_text->append("Artist: "); /*asar*/ + if (render_coverart) { + artist.erase(); + artist.append(metadata, metadata + datalen); + if (coverart_artist == "_pending_") { + coverart_artist = artist; + } + if (coverart_artist != "_expired_" && coverart_artist != artist) { + coverart_artist = "_expired_"; + rtptime_coverart_expired = rtptime; + } + } break; default: dmap_type = 0; @@ -2161,7 +2182,8 @@ extern "C" void audio_set_coverart(void *cls, const void *buffer, int buflen) { LOGI("coverart size %d written to %s", buflen, coverart_filename.c_str()); } else if (buffer && render_coverart) { video_renderer_choose_codec(true, false); /* video_is_jpeg = true */ - video_renderer_display_jpeg(buffer, &buflen); + video_renderer_display_jpeg(buffer, &buflen); + coverart_artist = "_pending_"; } }