| 
				
				
					
						
					
				
				
				 | 
			
			 | 
			
			@ -56,22 +56,22 @@ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#define JAR_XM_DEFENSIVE 1 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#define JAR_XM_RAMPING 1 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			cp">#include <stdio.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <stdlib.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <stdint.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <limits.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <string.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			o">// Allow custom memory allocators | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#ifndef JARXM_MALLOC | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    #define JARXM_MALLOC(sz)    malloc(sz) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#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 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			extern "C" { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#endif | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			struct jar_xm_context_s; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			typedef struct jar_xm_context_s jar_xm_context_t; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			/** Create a XM context. | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			 * | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			 * @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) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float* musicBuffer = malloc((2*numsamples)*sizeof(float)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    jar_xm_generate_samples(ctx, musicBuffer, numsamples); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    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; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    free(musicBuffer); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    JARXM_FREE(musicBuffer); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			/** 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) | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			{ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float* musicBuffer = malloc((2*numsamples)*sizeof(float)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float)); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    jar_xm_generate_samples(ctx, musicBuffer, numsamples); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    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; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    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 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <math.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <stdio.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <stdlib.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <stdint.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <limits.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#include <string.h> | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			#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 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    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) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        /* malloc() failed, trouble ahead */ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        DEBUG("call to malloc() failed, returned %p", (void*)mempool); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        /* JARXM_MALLOC() failed, trouble ahead */ | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        DEBUG("call to JARXM_MALLOC() failed, returned %p", (void*)mempool); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        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); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    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); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    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) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    free(ctx->allocated_memory); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    JARXM_FREE(ctx->allocated_memory); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			} | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			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; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    char* data = malloc(size + 1); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    char* data = JARXM_MALLOC(size + 1); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    if(!data || fread(data, 1, size, xmf) < size) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        fclose(xmf); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        DEBUG_ERR(data ? "fread() failed" : "malloc() failed"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        free(data); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        DEBUG_ERR(data ? "fread() failed" : "JARXM_MALLOC() failed"); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        JARXM_FREE(data); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        *ctx = NULL; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			        return 5; | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    } | 
			
		
		
	
	
		
			
				| 
				
				
				
					
						
					
				
				 | 
			
			 | 
			
			@ -2632,7 +2636,7 @@ int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    fclose(xmf); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    ret = jar_xm_create_context_safe(ctx, data, size, rate); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    free(data); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    JARXM_FREE(data); | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			
 | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    switch(ret) { | 
			
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
			    case 0: | 
			
		
		
	
	
		
			
				| 
				
					
						
					
				
				
				
				 | 
			
			 | 
			
			
 |