diff options
author | Thomas Martitz <kugel@rockbox.org> | 2013-05-14 07:03:44 +0200 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2013-06-09 17:39:08 +0200 |
commit | 58b4e71d3244b3c433e1fd3b494d17379bf57c48 (patch) | |
tree | 69530502e78b93fd09ec3db3faa59d91b765f438 /apps | |
parent | 280a0eb27ee0f9661c44e9230f7f59b2551b18af (diff) | |
download | rockbox-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.c | 17 | ||||
-rw-r--r-- | apps/gui/skin_engine/skin_parser.c | 26 | ||||
-rw-r--r-- | apps/gui/skin_engine/wps_internals.h | 3 |
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 | ||
84 | static void gui_skin_reset(struct gui_skin *skin) | 84 | static 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 |