summaryrefslogtreecommitdiff
path: root/apps
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 /apps
parent280a0eb27ee0f9661c44e9230f7f59b2551b18af (diff)
downloadrockbox-58b4e71d3244b3c433e1fd3b494d17379bf57c48.tar.gz
rockbox-58b4e71d3244b3c433e1fd3b494d17379bf57c48.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>
Diffstat (limited to 'apps')
-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)
83 83
84static void gui_skin_reset(struct gui_skin *skin) 84static void gui_skin_reset(struct gui_skin *skin)
85{ 85{
86 struct wps_data *data;
87 struct skin_albumart *aa_save;
86 skin->failsafe_loaded = false; 88 skin->failsafe_loaded = false;
87 skin->needs_full_update = true; 89 skin->needs_full_update = true;
88 skin->gui_wps.data = &skin->data; 90 skin->gui_wps.data = data = &skin->data;
89 memset(skin->gui_wps.data, 0, sizeof(struct wps_data)); 91 /* copy to temp var to protect against memset */
92 if ((aa_save = SKINOFFSETTOPTR(get_skin_buffer(data), data->albumart)))
93 {
94 short old_width, old_height;
95 old_width = aa_save->width;
96 old_height = aa_save->height;
97 memset(data, 0, sizeof(struct wps_data));
98 data->last_albumart_width = old_width;
99 data->last_albumart_height = old_height;
100 }
101 else
102 memset(data, 0, sizeof(struct wps_data));
90 skin->data.wps_loaded = false; 103 skin->data.wps_loaded = false;
91 skin->data.buflib_handle = -1; 104 skin->data.buflib_handle = -1;
92 skin->data.tree = -1; 105 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,
2286 char *wps_buffer = NULL; 2286 char *wps_buffer = NULL;
2287 if (!wps_data || !buf) 2287 if (!wps_data || !buf)
2288 return false; 2288 return false;
2289#ifdef HAVE_ALBUMART
2290 int status;
2291 struct mp3entry *curtrack;
2292 long offset;
2293 struct skin_albumart old_aa = {.state = WPS_ALBUMART_NONE};
2294 struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart);
2295 if (aa)
2296 {
2297 old_aa.state = aa->state;
2298 old_aa.height = aa->height;
2299 old_aa.width = aa->width;
2300 }
2301#endif
2302#ifdef HAVE_LCD_BITMAP 2289#ifdef HAVE_LCD_BITMAP
2303 int i; 2290 int i;
2304 for (i=0;i<MAXUSERFONTS;i++) 2291 for (i=0;i<MAXUSERFONTS;i++)
@@ -2401,17 +2388,16 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
2401 } 2388 }
2402#endif 2389#endif
2403#if defined(HAVE_ALBUMART) && !defined(__PCTOOL__) 2390#if defined(HAVE_ALBUMART) && !defined(__PCTOOL__)
2404 status = audio_status(); 2391 int status = audio_status();
2405 if (status & AUDIO_STATUS_PLAY) 2392 if (status & AUDIO_STATUS_PLAY)
2406 { 2393 {
2394 /* last_albumart_{width,height} is either both 0 or valid AA dimensions */
2407 struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart); 2395 struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart);
2408 if (aa && ((aa->state && !old_aa.state) || 2396 if (aa && (aa->state != WPS_ALBUMART_NONE ||
2409 (aa->state && 2397 (((wps_data->last_albumart_height != aa->height) ||
2410 (((old_aa.height != aa->height) || 2398 (wps_data->last_albumart_width != aa->width)))))
2411 (old_aa.width != aa->width))))))
2412 { 2399 {
2413 curtrack = audio_current_track(); 2400 long offset = audio_current_track()->offset;
2414 offset = curtrack->offset;
2415 audio_stop(); 2401 audio_stop();
2416 if (!(status & AUDIO_STATUS_PAUSE)) 2402 if (!(status & AUDIO_STATUS_PAUSE))
2417 audio_play(offset); 2403 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
361#ifdef HAVE_ALBUMART 361#ifdef HAVE_ALBUMART
362 OFFSETTYPE(struct skin_albumart *) albumart; 362 OFFSETTYPE(struct skin_albumart *) albumart;
363 int playback_aa_slot; 363 int playback_aa_slot;
364 /* copy of albumart to survive skin resets, used to check if albumart
365 * dimensions changed on skin change */
366 short last_albumart_width, last_albumart_height;
364#endif 367#endif
365 368
366#ifdef HAVE_SKIN_VARIABLES 369#ifdef HAVE_SKIN_VARIABLES