Support custom memory allocators

This commit is contained in:
raysan5 2020-01-19 11:42:16 +01:00
parent bec467705e
commit d797bb3e1c
2 changed files with 43 additions and 37 deletions

View file

@ -81,15 +81,13 @@
#ifndef INCLUDE_JAR_MOD_H #ifndef INCLUDE_JAR_MOD_H
#define INCLUDE_JAR_MOD_H #define INCLUDE_JAR_MOD_H
#include <stdio.h> // Allow custom memory allocators
#include <stdlib.h> #ifndef JARMOD_MALLOC
//#include <stdbool.h> #define JARMOD_MALLOC(sz) malloc(sz)
#endif
#ifndef JARMOD_FREE
#ifdef __cplusplus #define JARMOD_FREE(p) free(p)
extern "C" {
#endif #endif
// Basic type // Basic type
@ -240,7 +238,9 @@ typedef struct jar_mod_tracker_buffer_state_
tracker_state * track_state_buf; tracker_state * track_state_buf;
}jar_mod_tracker_buffer_state; }jar_mod_tracker_buffer_state;
#ifdef __cplusplus
extern "C" {
#endif
bool jar_mod_init(jar_mod_context_t * modctx); bool jar_mod_init(jar_mod_context_t * modctx);
bool jar_mod_setcfg(jar_mod_context_t * modctx, int samplerate, int bits, int stereo, int stereo_separation, int filter); bool jar_mod_setcfg(jar_mod_context_t * modctx, int samplerate, int bits, int stereo, int stereo_separation, int filter);
@ -261,6 +261,10 @@ void jar_mod_seek_start(jar_mod_context_t * ctx);
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
#ifdef JAR_MOD_IMPLEMENTATION #ifdef JAR_MOD_IMPLEMENTATION
#include <stdio.h>
#include <stdlib.h>
//#include <stdbool.h>
// Effects list // Effects list
#define EFFECT_ARPEGGIO 0x0 // Supported #define EFFECT_ARPEGGIO 0x0 // Supported
#define EFFECT_PORTAMENTO_UP 0x1 // Supported #define EFFECT_PORTAMENTO_UP 0x1 // Supported
@ -1504,7 +1508,7 @@ void jar_mod_unload( jar_mod_context_t * modctx)
{ {
if(modctx->modfile) if(modctx->modfile)
{ {
free(modctx->modfile); JARMOD_FREE(modctx->modfile);
modctx->modfile = 0; modctx->modfile = 0;
modctx->modfilesize = 0; modctx->modfilesize = 0;
modctx->loopcount = 0; modctx->loopcount = 0;
@ -1513,14 +1517,12 @@ void jar_mod_unload( jar_mod_context_t * modctx)
} }
} }
mulong jar_mod_load_file(jar_mod_context_t * modctx, const char* filename) mulong jar_mod_load_file(jar_mod_context_t * modctx, const char* filename)
{ {
mulong fsize = 0; mulong fsize = 0;
if(modctx->modfile) if(modctx->modfile)
{ {
free(modctx->modfile); JARMOD_FREE(modctx->modfile);
modctx->modfile = 0; modctx->modfile = 0;
} }
@ -1533,7 +1535,7 @@ mulong jar_mod_load_file(jar_mod_context_t * modctx, const char* filename)
if(fsize && fsize < 32*1024*1024) if(fsize && fsize < 32*1024*1024)
{ {
modctx->modfile = malloc(fsize); modctx->modfile = JARMOD_MALLOC(fsize);
modctx->modfilesize = fsize; modctx->modfilesize = fsize;
memset(modctx->modfile, 0, fsize); memset(modctx->modfile, 0, fsize);
fread(modctx->modfile, fsize, 1, f); fread(modctx->modfile, fsize, 1, f);

50
src/external/jar_xm.h vendored
View file

@ -56,22 +56,22 @@
#define JAR_XM_DEFENSIVE 1 #define JAR_XM_DEFENSIVE 1
#define JAR_XM_RAMPING 1 #define JAR_XM_RAMPING 1
#include <stdio.h> // Allow custom memory allocators
#include <stdlib.h> #ifndef JARXM_MALLOC
#include <stdint.h> #define JARXM_MALLOC(sz) malloc(sz)
#include <limits.h> #endif
#include <string.h> #ifndef JARXM_FREE
#define JARXM_FREE(p) free(p)
#endif
//------------------------------------------------------------------------------- //-------------------------------------------------------------------------------
struct jar_xm_context_s;
typedef struct jar_xm_context_s jar_xm_context_t;
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
struct jar_xm_context_s;
typedef struct jar_xm_context_s jar_xm_context_t;
/** Create a XM context. /** Create a XM context.
* *
* @param moddata the contents of the module * @param moddata the contents of the module
@ -133,7 +133,7 @@ void jar_xm_generate_samples(jar_xm_context_t* ctx, float* output, size_t numsam
*/ */
void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t numsamples) void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t numsamples)
{ {
float* musicBuffer = malloc((2*numsamples)*sizeof(float)); float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float));
jar_xm_generate_samples(ctx, musicBuffer, numsamples); jar_xm_generate_samples(ctx, musicBuffer, numsamples);
if(output){ if(output){
@ -142,7 +142,7 @@ void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t
output[x] = musicBuffer[x] * SHRT_MAX; output[x] = musicBuffer[x] * SHRT_MAX;
} }
free(musicBuffer); JARXM_FREE(musicBuffer);
} }
/** Play the module, resample from 32 bit to 8 bit, and put the sound samples in an output buffer. /** Play the module, resample from 32 bit to 8 bit, and put the sound samples in an output buffer.
@ -152,7 +152,7 @@ void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t
*/ */
void jar_xm_generate_samples_8bit(jar_xm_context_t* ctx, char* output, size_t numsamples) void jar_xm_generate_samples_8bit(jar_xm_context_t* ctx, char* output, size_t numsamples)
{ {
float* musicBuffer = malloc((2*numsamples)*sizeof(float)); float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float));
jar_xm_generate_samples(ctx, musicBuffer, numsamples); jar_xm_generate_samples(ctx, musicBuffer, numsamples);
if(output){ if(output){
@ -161,7 +161,7 @@ void jar_xm_generate_samples_8bit(jar_xm_context_t* ctx, char* output, size_t nu
output[x] = musicBuffer[x] * CHAR_MAX; output[x] = musicBuffer[x] * CHAR_MAX;
} }
free(musicBuffer); JARXM_FREE(musicBuffer);
} }
@ -306,6 +306,10 @@ uint64_t jar_xm_get_remaining_samples(jar_xm_context_t* ctx);
#ifdef JAR_XM_IMPLEMENTATION #ifdef JAR_XM_IMPLEMENTATION
#include <math.h> #include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <limits.h>
#include <string.h> #include <string.h>
#if JAR_XM_DEBUG //JAR_XM_DEBUG defined as 0 #if JAR_XM_DEBUG //JAR_XM_DEBUG defined as 0
@ -630,10 +634,10 @@ int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, siz
#endif #endif
bytes_needed = jar_xm_get_memory_needed_for_context(moddata, moddata_length); bytes_needed = jar_xm_get_memory_needed_for_context(moddata, moddata_length);
mempool = malloc(bytes_needed); mempool = JARXM_MALLOC(bytes_needed);
if(mempool == NULL && bytes_needed > 0) { if(mempool == NULL && bytes_needed > 0) {
/* malloc() failed, trouble ahead */ /* JARXM_MALLOC() failed, trouble ahead */
DEBUG("call to malloc() failed, returned %p", (void*)mempool); DEBUG("call to JARXM_MALLOC() failed, returned %p", (void*)mempool);
return 2; return 2;
} }
@ -641,7 +645,7 @@ int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, siz
memset(mempool, 0, bytes_needed); memset(mempool, 0, bytes_needed);
ctx = (*ctxp = (jar_xm_context_t *)mempool); ctx = (*ctxp = (jar_xm_context_t *)mempool);
ctx->allocated_memory = mempool; /* Keep original pointer for free() */ ctx->allocated_memory = mempool; /* Keep original pointer for JARXM_FREE() */
mempool += sizeof(jar_xm_context_t); mempool += sizeof(jar_xm_context_t);
ctx->rate = rate; ctx->rate = rate;
@ -691,7 +695,7 @@ int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, siz
} }
void jar_xm_free_context(jar_xm_context_t* ctx) { void jar_xm_free_context(jar_xm_context_t* ctx) {
free(ctx->allocated_memory); JARXM_FREE(ctx->allocated_memory);
} }
void jar_xm_set_max_loop_count(jar_xm_context_t* ctx, uint8_t loopcnt) { void jar_xm_set_max_loop_count(jar_xm_context_t* ctx, uint8_t loopcnt) {
@ -2620,11 +2624,11 @@ int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const
return 4; return 4;
} }
char* data = malloc(size + 1); char* data = JARXM_MALLOC(size + 1);
if(!data || fread(data, 1, size, xmf) < size) { if(!data || fread(data, 1, size, xmf) < size) {
fclose(xmf); fclose(xmf);
DEBUG_ERR(data ? "fread() failed" : "malloc() failed"); DEBUG_ERR(data ? "fread() failed" : "JARXM_MALLOC() failed");
free(data); JARXM_FREE(data);
*ctx = NULL; *ctx = NULL;
return 5; return 5;
} }
@ -2632,7 +2636,7 @@ int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const
fclose(xmf); fclose(xmf);
ret = jar_xm_create_context_safe(ctx, data, size, rate); ret = jar_xm_create_context_safe(ctx, data, size, rate);
free(data); JARXM_FREE(data);
switch(ret) { switch(ret) {
case 0: case 0: