Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement