Different ways to allocate RAM usage for your feature
Rockbox has a "No Malloc" policy you can read about at WhyNoMalloc
but sometimes you really do need to grab some buffer possibly temporarily. This page will explain the different methods available.
Allocate on the Heap
This is the easiest way, (i.e add a global variable "static char my_buffer[BUFFER_SIZE]" to your file.c)
- Easy to do
- available in plugins and codecs (up to the plugin/codec buffer size)
- potentially wastes RAM
- not nice if the feature isnt common
Allocate on boot up (buffer_alloc(size_t size) )
Next easiest way. call buffer_alloc() in your "init" method and make sure thats calle before playback starts.
- can allocate exactly as much as you need
- If the feature is disabled no RAM needs to be allocate
- RAM cannot be deallocted or resized
- Playback must be stopped to allocate more
Steal a Buffer
Temporarily steal the talk/plugin/audio buffer, each has its own size and cons...
Talk buffer ( talk_buffer_steal() )
Plugin Buffer ( plugin_get_buffer() )
- cannot start a plugin while the buffer is stolen
- the remaining buffer may not be large if a pluign is already running
Audio Buffer ( plugin_get_audio_buffer() )
- playback needs to be stopped, but you can have up to ~30Mb on some targets
dynamic allocation like "malloc()" (bufalloc())
Most frowned-on method of allocation, use this carefully... The buffer is allocated as a handle in the playback buffer and could be moving around the buffer as playback advances.
- free/resize able
- playback doesnt need to be stopped
- the buffer may move, so you HAVE to call bufgetdata() to use the buffer
- might fail if there is no room on the playback buffer
Copyright © by the contributing authors.