summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2013-05-14 07:03:44 +0200
committerThomas Martitz <kugel@rockbox.org>2013-06-09 17:39:08 +0200
commit58b4e71d3244b3c433e1fd3b494d17379bf57c48 (patch)
tree69530502e78b93fd09ec3db3faa59d91b765f438
parent280a0eb27ee0f9661c44e9230f7f59b2551b18af (diff)
downloadrockbox-58b4e71.tar.gz
rockbox-58b4e71.zip
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 <kugel@rockbox.org> Reviewed-by: Thomas Martitz <kugel@rockbox.org>
-rw-r--r--apps/gui/skin_engine/skin_engine.c17
-rw-r--r--apps/gui/skin_engine/skin_parser.c26
-rw-r--r--apps/gui/skin_engine/wps_internals.h3
3 files changed, 24 insertions, 22 deletions
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;i<MAXUSERFONTS;i++)
@@ -2401,17 +2388,16 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
}
#endif
#if defined(HAVE_ALBUMART) && !defined(__PCTOOL__)
- status = audio_status();
+ int status = audio_status();
if (status & AUDIO_STATUS_PLAY)
{
+ /* last_albumart_{width,height} is either both 0 or valid AA dimensions */
struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart);
- 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