diff options
author | Franklin Wei <git@fwei.tk> | 2017-01-13 18:45:04 -0500 |
---|---|---|
committer | Franklin Wei <git@fwei.tk> | 2017-01-13 19:00:09 -0500 |
commit | 637c7414a91c33e2627f99fee7b4c9cbf04abdb4 (patch) | |
tree | ba34a8782405c936fc1ed735e95eec2bbded87e7 | |
parent | 954d934ad2b4ba2a26ba20e6000a3ed1856dc194 (diff) | |
download | rockbox-637c741.tar.gz rockbox-637c741.zip |
puzzles: enable fallback to audiobuf when smalloc() fails
- upon a failed smalloc(), the audio buffer will be used for further allocations
- should fix things on low-memory targets (c100 and c200v2), but breaks playback
- playback should still be intact on other targets
Change-Id: Ic239f1316efadc957050afacf5c614dbbca3f805
-rw-r--r-- | apps/plugins/puzzles/malloc.c | 38 | ||||
-rw-r--r-- | apps/plugins/puzzles/rockbox.c | 24 |
2 files changed, 55 insertions, 7 deletions
diff --git a/apps/plugins/puzzles/malloc.c b/apps/plugins/puzzles/malloc.c index d9943c6b40..47a7137459 100644 --- a/apps/plugins/puzzles/malloc.c +++ b/apps/plugins/puzzles/malloc.c @@ -14,12 +14,40 @@ int allocs = 0; int frees = 0; +bool audiobuf_available = +#ifndef COMBINED + true; +#else + false; +#endif + +static bool grab_audiobuf(void) +{ + if(!audiobuf_available) + return false; + + if(rb->audio_status()) + rb->audio_stop(); + + size_t sz, junk; + void *audiobuf = rb->plugin_get_audio_buffer(&sz); + extern char *giant_buffer; + + add_new_area(audiobuf, sz, giant_buffer); + audiobuf_available = false; + return true; +} + void *smalloc(size_t size) { void *p; p = malloc(size); LOGF("allocs: %d", ++allocs); if (!p) - fatal("out of memory"); + { + if(grab_audiobuf()) + return smalloc(size); + fatal("out of memory"); + } return p; } @@ -30,7 +58,7 @@ void sfree(void *p) { if (p) { ++frees; LOGF("frees: %d, total outstanding: %d", frees, allocs - frees); - free(p); + free(p); } } @@ -46,7 +74,11 @@ void *srealloc(void *p, size_t size) { q = malloc(size); } if (!q) - fatal("out of memory"); + { + if(grab_audiobuf()) + return srealloc(p, size); + fatal("out of memory"); + } return q; } diff --git a/apps/plugins/puzzles/rockbox.c b/apps/plugins/puzzles/rockbox.c index 86dc9cffd4..3e3bd15f33 100644 --- a/apps/plugins/puzzles/rockbox.c +++ b/apps/plugins/puzzles/rockbox.c @@ -71,6 +71,7 @@ static void fix_size(void); static struct viewport clip_rect; static bool clipped = false; +extern bool audiobuf_available; static struct settings_t { int slowmo_factor; @@ -1026,7 +1027,10 @@ static int pausemenu_cb(int action, const struct menu_item_ex *this_item) * care, I bet */ return ACTION_EXIT_MENUITEM; #else - break; + if(audiobuf_available) + break; + else + return ACTION_EXIT_MENUITEM; #endif case 9: if(!midend_num_presets(me)) @@ -1355,10 +1359,10 @@ void deactivate_timer(frontend *fe) #ifdef COMBINED /* can't use audio buffer */ -static char giant_buffer[1024*1024*4]; +char giant_buffer[1024*1024*4]; #else -/* points to audiobuf */ -static char *giant_buffer = NULL; +/* points to pluginbuf */ +char *giant_buffer = NULL; #endif static size_t giant_buffer_len = 0; /* set on start */ @@ -1566,6 +1570,18 @@ static int mainmenu_cb(int action, const struct menu_item_ex *this_item) #else break; #endif + case 4: +#ifdef COMBINED + /* audio buf is used, so no playback */ + /* TODO: neglects app builds, but not many people will + * care, I bet */ + return ACTION_EXIT_MENUITEM; +#else + if(audiobuf_available) + break; + else + return ACTION_EXIT_MENUITEM; +#endif case 5: if(!midend_num_presets(me)) return ACTION_EXIT_MENUITEM; |