diff --git a/apps/gui/skin_engine/skin_backdrops.c b/apps/gui/skin_engine/skin_backdrops.c index 3a000b2..114e55b 100644 --- a/apps/gui/skin_engine/skin_backdrops.c +++ b/apps/gui/skin_engine/skin_backdrops.c @@ -27,6 +27,8 @@ #include "wps_internals.h" #include "skin_engine.h" #include "skin_buffer.h" +#include "buffer.h" +#include "playback.h" #if (LCD_DEPTH > 1) || (defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1)) @@ -37,16 +39,25 @@ static struct skin_backdrop { enum screen_type screen; } backdrops[NB_BDROPS]; -#define NB_BDROPS SKINNABLE_SCREENS_COUNT*NB_SCREENS +static struct audio_alloced_buffers { + char *buffer; + enum screen_type screen; + bool inuse; +} buffers[NB_BDROPS]; +static bool first_init = true; void skin_backdrop_init(void) { int i; for (i=0; i 1) + if (screen == SCREEN_REMOTE) + buf_size = REMOTE_LCD_BACKDROP_BYTES; + else +#endif + buf_size = LCD_BACKDROP_BYTES; + for (i=0; found == -1 && i buf_size) + { + buf = buffer_alloc(buf_size); + buffers[free].buffer = buf; + buffers[free].inuse = true; + buffers[free].screen = screen; + } + printf("from audio_buf\n"); + audio_restore_playback(AUDIO_WANT_PLAYBACK); + return buffers[free].buffer; + } + else + { + return (char*)skin_buffer_alloc(buf_size); + } +} + + bool skin_backdrops_preload(void) { bool retval = true; @@ -100,16 +157,8 @@ bool skin_backdrops_preload(void) { if (backdrops[i].name[0] && !backdrops[i].buffer) { - size_t buf_size; bool loaded = false; enum screen_type screen = backdrops[i].screen; -#if defined(HAVE_REMOTE_LCD) && (LCD_REMOTE_DEPTH > 1) - if (screen == SCREEN_REMOTE) - buf_size = REMOTE_LCD_BACKDROP_BYTES; - else -#endif - buf_size = LCD_BACKDROP_BYTES; - filename = backdrops[i].name; if (screen == SCREEN_MAIN && global_settings.backdrop_file[0] && global_settings.backdrop_file[0] != '-' && filename[0] == '-') @@ -124,11 +173,14 @@ bool skin_backdrops_preload(void) } if (*filename && *filename != '-') { - backdrops[i].buffer = (char*)skin_buffer_alloc(buf_size); + backdrops[i].buffer = get_buffer(screen); loaded = backdrops[i].buffer && screens[screen].backdrop_load(filename, backdrops[i].buffer); if (!loaded) + { + printf("%s didnt load\n", filename); retval = false; + } } if (backdrops[i].name[0] == '-' && loaded) backdrops[i].name[2] = '.'; @@ -145,8 +197,36 @@ void skin_backdrop_show(int backdrop_id) if (backdrops[backdrop_id].name[0] == '-' && backdrops[backdrop_id].name[2] == '\0') screens[screen].backdrop_show(NULL); - else if (backdrops[backdrop_id].buffer) - screens[screen].backdrop_show(backdrops[backdrop_id].buffer); + else if (backdrops[backdrop_id].name[0] && !backdrops[backdrop_id].buffer) + { + /* No room, so try to swap out another backdrop... */ + int i=backdrop_id + 1; + while (i != backdrop_id) + { + if (i > NB_BDROPS) + i = 0; + if (backdrops[i].buffer && + backdrops[i].screen == backdrops[backdrop_id].screen) + { + break; + } + i++; + } + if (i == backdrop_id) + { + screens[screen].backdrop_show(NULL); + return; + } + backdrops[backdrop_id].buffer = backdrops[i].buffer; + backdrops[i].buffer = NULL; + if (!screens[screen].backdrop_load(backdrops[i].name, + backdrops[backdrop_id].buffer)) + { + screens[screen].backdrop_show(NULL); + return; + } + } + screens[screen].backdrop_show(backdrops[backdrop_id].buffer); } void skin_backdrop_unload(int backdrop_id)