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<NB_BDROPS; i++)
{
+ if (first_init)
+ buffers[i].buffer = NULL;
+ buffers[i].inuse = false;
backdrops[i].name[0] = '\0';
backdrops[i].buffer = NULL;
}
+ first_init = false;
}
int skin_backdrop_assign(char* backdrop, char *bmpdir,
@@ -91,6 +102,52 @@ int skin_backdrop_assign(char* backdrop, char *bmpdir,
return -1;
}
+static char* get_buffer(enum screen_type screen)
+{
+ size_t buf_size;
+ int i, found = -1, free = -1;
+#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;
+ for (i=0; found == -1 && i<NB_BDROPS; i++)
+ {
+ if (!buffers[i].inuse && buffers[i].screen == screen)
+ {
+ free = i;
+ if (buffers[i].buffer)
+ found = i;
+ }
+ }
+ if (found != -1)
+ {
+ buffers[found].inuse = true;
+ return buffers[found].buffer;
+ }
+ else if (free && !audio_status())
+ {
+ size_t temp;
+ char *buf = audio_get_buffer(true, &temp);
+ if (temp > 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)