A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 143 lines 3.4 kB view raw
1 2#include "config.h" 3#include <string.h> 4#include "system.h" 5#include "core_alloc.h" 6#include "buflib.h" 7 8/* not static so it can be discovered by core_get_data() */ 9struct buflib_context core_ctx; 10 11#if (CONFIG_PLATFORM & PLATFORM_NATIVE) && !defined(__PCTOOL__) 12 13#if defined(IPOD_VIDEO) && !defined(BOOTLOADER) 14/* defined in linker script */ 15extern unsigned char audiobuffer[]; 16extern unsigned char *audiobufend_lds[]; 17/* pointer to end of audio buffer filled at runtime allocator_init */ 18unsigned char *audiobufend; 19#elif defined(SANSA_E200) && defined(HAVE_BOOTLOADER_USB_MODE) 20/* defined in linker script */ 21extern unsigned char freebuffer[]; 22extern unsigned char freebufferend[]; 23/* map linker symbol to the audiobuffer in order to use core_alloc */ 24unsigned char *audiobuffer = (unsigned char *)freebuffer; 25unsigned char *audiobufend = (unsigned char *)freebufferend; 26#else /* !IPOD_VIDEO, !SANSA_E200&&BOOTLOADERUSB */ 27/* defined in linker script */ 28extern unsigned char audiobuffer[]; 29extern unsigned char audiobufend[]; 30#endif 31 32#else /* PLATFORM_HOSTED */ 33static unsigned char audiobuffer[(MEMORYSIZE-1)*1024*1024]; 34unsigned char *audiobufend = audiobuffer + sizeof(audiobuffer); 35#endif 36 37#ifdef BUFLIB_DEBUG_PRINT 38/* debug test alloc */ 39static int test_alloc; 40#endif 41 42void core_allocator_init(void) 43{ 44 unsigned char *start = ALIGN_UP(audiobuffer, sizeof(intptr_t)); 45 46#if defined(IPOD_VIDEO) && !defined(BOOTLOADER) && !defined(SIMULATOR) 47 audiobufend=(unsigned char *)audiobufend_lds; 48 if(MEMORYSIZE==64 && probed_ramsize!=64) 49 { 50 audiobufend -= (32<<20); 51 } 52#endif 53 54 buflib_init(&core_ctx, start, audiobufend - start); 55 56#ifdef BUFLIB_DEBUG_PRINT 57 test_alloc = core_alloc(112); 58#endif 59} 60 61/* Allocate memory in the "core" context. See documentation 62 * of buflib_alloc_ex() for details. 63 * 64 * Note: Buffers allocated by this functions are movable. 65 * Don't pass them to functions that call yield() 66 * like disc input/output. */ 67int core_alloc(size_t size) 68{ 69 return buflib_alloc_ex(&core_ctx, size, NULL); 70} 71 72int core_alloc_ex(size_t size, struct buflib_callbacks *ops) 73{ 74 return buflib_alloc_ex(&core_ctx, size, ops); 75} 76 77size_t core_available(void) 78{ 79 return buflib_available(&core_ctx); 80} 81 82size_t core_allocatable(void) 83{ 84 return buflib_allocatable(&core_ctx); 85} 86 87int core_free(int handle) 88{ 89 return buflib_free(&core_ctx, handle); 90} 91 92int core_alloc_maximum(size_t *size, struct buflib_callbacks *ops) 93{ 94 return buflib_alloc_maximum(&core_ctx, size, ops); 95} 96 97bool core_shrink(int handle, void* new_start, size_t new_size) 98{ 99 return buflib_shrink(&core_ctx, handle, new_start, new_size); 100} 101 102void core_pin(int handle) 103{ 104 buflib_pin(&core_ctx, handle); 105} 106 107void core_unpin(int handle) 108{ 109 buflib_unpin(&core_ctx, handle); 110} 111 112unsigned core_pin_count(int handle) 113{ 114 return buflib_pin_count(&core_ctx, handle); 115} 116 117#ifdef BUFLIB_DEBUG_PRINT 118int core_get_num_blocks(void) 119{ 120 return buflib_get_num_blocks(&core_ctx); 121} 122 123bool core_print_block_at(int block_num, char* buf, size_t bufsize) 124{ 125 return buflib_print_block_at(&core_ctx, block_num, buf, bufsize); 126} 127 128bool core_test_free(void) 129{ 130 bool ret = test_alloc > 0; 131 if (ret) 132 test_alloc = core_free(test_alloc); 133 134 return ret; 135} 136#endif 137 138#ifdef BUFLIB_DEBUG_CHECK_VALID 139void core_check_valid(void) 140{ 141 buflib_check_valid(&core_ctx); 142} 143#endif