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
This commit is contained in:
Michael Giacomelli 2020-12-09 13:17:05 -05:00 committed by Solomon Peachy
parent b5e6c30a61
commit ca09f91f64
4 changed files with 21 additions and 4 deletions

7
apps/buffering.c Normal file → Executable file
View file

@ -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;