summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x[-rw-r--r--]apps/buffering.c7
-rwxr-xr-x[-rw-r--r--]apps/buffering.h1
-rwxr-xr-x[-rw-r--r--]apps/playback.c15
-rwxr-xr-x[-rw-r--r--]apps/radio/radioart.c2
4 files changed, 21 insertions, 4 deletions
diff --git a/apps/buffering.c b/apps/buffering.c
index 9ffd35714c..3adbc4a6b9 100644..100755
--- a/apps/buffering.c
+++ b/apps/buffering.c
@@ -999,7 +999,14 @@ int bufopen(const char *file, off_t offset, enum data_type type,
DEBUGF("%s(): failed to add handle\n", __func__);
mutex_unlock(&llist_mutex);
close(fd);
+
+ /*warn playback.c if it is trying to buffer too large of an image*/
+ if(type == TYPE_BITMAP && padded_size >= buffer_len - 64*1024)
+ {
+ return ERR_BITMAP_TOO_LARGE;
+ }
return ERR_BUFFER_FULL;
+
}
handle_id = h->id;
diff --git a/apps/buffering.h b/apps/buffering.h
index fcffcf086c..1a75d865ae 100644..100755
--- a/apps/buffering.h
+++ b/apps/buffering.h
@@ -47,6 +47,7 @@ enum data_type {
#define ERR_HANDLE_NOT_DONE -5
#define ERR_UNSUPPORTED_TYPE -6
#define ERR_WRONG_THREAD -7
+#define ERR_BITMAP_TOO_LARGE -8
/* Initialise the buffering subsystem */
void buffering_init(void) INIT_ATTR;
diff --git a/apps/playback.c b/apps/playback.c
index 31aed2abe1..5419888c27 100644..100755
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -1689,7 +1689,7 @@ static bool audio_load_cuesheet(struct track_info *infop,
#ifdef HAVE_ALBUMART
/* Load any album art for the file - returns false if the buffer is full */
-static bool audio_load_albumart(struct track_info *infop,
+static int audio_load_albumart(struct track_info *infop,
struct mp3entry *track_id3)
{
FOREACH_ALBUMART(i)
@@ -1730,7 +1730,11 @@ static bool audio_load_albumart(struct track_info *infop,
if (hid == ERR_BUFFER_FULL)
{
logf("buffer is full for now (%s)", __func__);
- return false;
+ return ERR_BUFFER_FULL;
+ }
+ else if (hid == ERR_BITMAP_TOO_LARGE){
+ logf("image is too large to fit in buffer (%s)", __func__);
+ return ERR_BITMAP_TOO_LARGE;
}
else
{
@@ -1981,7 +1985,12 @@ static int audio_finish_load_track(struct track_info *infop)
#ifdef HAVE_ALBUMART
/* Try to load album art for the track */
- if (!audio_load_albumart(infop, track_id3))
+ int retval = audio_load_albumart(infop, track_id3);
+ if (retval == ERR_BITMAP_TOO_LARGE)
+ {
+ /* No space for album art on buffer because the file is larger than the buffer.
+ Ignore the file and keep buffering */
+ } else if (retval == ERR_BUFFER_FULL)
{
/* No space for album art on buffer, not an error */
filling = STATE_FULL;
diff --git a/apps/radio/radioart.c b/apps/radio/radioart.c
index 5e1a0ad5cf..87d37cd52c 100644..100755
--- a/apps/radio/radioart.c
+++ b/apps/radio/radioart.c
@@ -88,7 +88,7 @@ static int load_radioart_image(struct radioart *ra, const char* preset_name,
user_data.embedded_albumart = NULL;
user_data.dim = &ra->dim;
ra->handle = bufopen(path, 0, TYPE_BITMAP, &user_data);
- if (ra->handle == ERR_BUFFER_FULL)
+ if (ra->handle == ERR_BUFFER_FULL || ra->handle == ERR_BITMAP_TOO_LARGE)
{
int i = find_oldest_image_index();
if (i != -1)