From 58b4e71d3244b3c433e1fd3b494d17379bf57c48 Mon Sep 17 00:00:00 2001 From: Thomas Martitz Date: Tue, 14 May 2013 07:03:44 +0200 Subject: skin_engine: Fix albumart logic on skin reloading. This logic checks whether the skin's albumart dimensions differ from the previous skin to force rebuffering if necessary. This was broken since a while as the necessary information was reset. Change-Id: I3b9f3a819c6af202af8ad66c13742f704ce45ab1 Reviewed-on: http://gerrit.rockbox.org/476 Tested-by: Thomas Martitz Reviewed-by: Thomas Martitz --- apps/gui/skin_engine/skin_engine.c | 17 +++++++++++++++-- apps/gui/skin_engine/skin_parser.c | 26 ++++++-------------------- apps/gui/skin_engine/wps_internals.h | 3 +++ 3 files changed, 24 insertions(+), 22 deletions(-) (limited to 'apps') diff --git a/apps/gui/skin_engine/skin_engine.c b/apps/gui/skin_engine/skin_engine.c index 4c113e5c68..5253b88363 100644 --- a/apps/gui/skin_engine/skin_engine.c +++ b/apps/gui/skin_engine/skin_engine.c @@ -83,10 +83,23 @@ struct skin_stats *skin_get_stats(int number, int screen) static void gui_skin_reset(struct gui_skin *skin) { + struct wps_data *data; + struct skin_albumart *aa_save; skin->failsafe_loaded = false; skin->needs_full_update = true; - skin->gui_wps.data = &skin->data; - memset(skin->gui_wps.data, 0, sizeof(struct wps_data)); + skin->gui_wps.data = data = &skin->data; + /* copy to temp var to protect against memset */ + if ((aa_save = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart))) + { + short old_width, old_height; + old_width = aa_save->width; + old_height = aa_save->height; + memset(data, 0, sizeof(struct wps_data)); + data->last_albumart_width = old_width; + data->last_albumart_height = old_height; + } + else + memset(data, 0, sizeof(struct wps_data)); skin->data.wps_loaded = false; skin->data.buflib_handle = -1; skin->data.tree = -1; diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c index a0386c5529..3238c48c63 100644 --- a/apps/gui/skin_engine/skin_parser.c +++ b/apps/gui/skin_engine/skin_parser.c @@ -2286,19 +2286,6 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data, char *wps_buffer = NULL; if (!wps_data || !buf) return false; -#ifdef HAVE_ALBUMART - int status; - struct mp3entry *curtrack; - long offset; - struct skin_albumart old_aa = {.state = WPS_ALBUMART_NONE}; - struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart); - if (aa) - { - old_aa.state = aa->state; - old_aa.height = aa->height; - old_aa.width = aa->width; - } -#endif #ifdef HAVE_LCD_BITMAP int i; for (i=0;ialbumart); - if (aa && ((aa->state && !old_aa.state) || - (aa->state && - (((old_aa.height != aa->height) || - (old_aa.width != aa->width)))))) + if (aa && (aa->state != WPS_ALBUMART_NONE || + (((wps_data->last_albumart_height != aa->height) || + (wps_data->last_albumart_width != aa->width))))) { - curtrack = audio_current_track(); - offset = curtrack->offset; + long offset = audio_current_track()->offset; audio_stop(); if (!(status & AUDIO_STATUS_PAUSE)) audio_play(offset); diff --git a/apps/gui/skin_engine/wps_internals.h b/apps/gui/skin_engine/wps_internals.h index c9d5429484..be99ad82ae 100644 --- a/apps/gui/skin_engine/wps_internals.h +++ b/apps/gui/skin_engine/wps_internals.h @@ -361,6 +361,9 @@ struct wps_data #ifdef HAVE_ALBUMART OFFSETTYPE(struct skin_albumart *) albumart; int playback_aa_slot; + /* copy of albumart to survive skin resets, used to check if albumart + * dimensions changed on skin change */ + short last_albumart_width, last_albumart_height; #endif #ifdef HAVE_SKIN_VARIABLES -- cgit v1.2.3