From ca09f91f647f6677fea7804930d7d1b2c876f76e Mon Sep 17 00:00:00 2001 From: Michael Giacomelli Date: Wed, 9 Dec 2020 13:17:05 -0500 Subject: Fix deadlocks when trying to buffer large album art. Internally, buffering tries to load the entire album art file into the audio buffer, which will fail if the file is larger than the buffer. Playback.c interprets a file failing to buffer to mean that the buffer is full, so it waits for more space and tries again. This results in a deadlock since the file will never fit. Change bufopen to return a new error condition when an image file will not fit on the buffer because it is too large: ERR_BITMAP_TOO_LARGE. Note that we arbitrarily set "too large" to be within 64KB of the entire buffer size or larger, this could be adjusted if needed. Change audio_load_albumart to pass through error messages from bufopen. In playback.c, check to see why audio_load_albumart fails. If it fails because the file is too large to buffer, simply ignore the file. If it fails because the file would fit but the buffer is full, try again later. Change-Id: I66799ae26f124b495e1522fce7285332f4cf986f --- apps/radio/radioart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 apps/radio/radioart.c (limited to 'apps/radio/radioart.c') diff --git a/apps/radio/radioart.c b/apps/radio/radioart.c old mode 100644 new mode 100755 index 5e1a0ad5cf..87d37cd52c --- 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) -- cgit v1.2.3