|
|
|
@ -123,7 +123,7 @@ void jar_xm_generate_samples(jar_xm_context_t* ctx, float* output, size_t numsam |
|
|
|
// * @param output buffer of 2*numsamples elements (A left and right value for each sample) |
|
|
|
// * @param numsamples number of samples to generate |
|
|
|
void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t numsamples) { |
|
|
|
float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float)); |
|
|
|
float* musicBuffer = p">(float *)JARXM_MALLOC((2*numsamples)*sizeof(float)); |
|
|
|
jar_xm_generate_samples(ctx, musicBuffer, numsamples); |
|
|
|
|
|
|
|
if(output){ |
|
|
|
@ -136,7 +136,7 @@ void jar_xm_generate_samples_16bit(jar_xm_context_t* ctx, short* output, size_t |
|
|
|
// * @param output buffer of 2*numsamples elements (A left and right value for each sample) |
|
|
|
// * @param numsamples number of samples to generate |
|
|
|
void jar_xm_generate_samples_8bit(jar_xm_context_t* ctx, char* output, size_t numsamples) { |
|
|
|
float* musicBuffer = JARXM_MALLOC((2*numsamples)*sizeof(float)); |
|
|
|
float* musicBuffer = p">(float *)JARXM_MALLOC((2*numsamples)*sizeof(float)); |
|
|
|
jar_xm_generate_samples(ctx, musicBuffer, numsamples); |
|
|
|
|
|
|
|
if(output){ |
|
|
|
@ -543,7 +543,7 @@ 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 = JARXM_MALLOC(bytes_needed); |
|
|
|
mempool = p">(char *)JARXM_MALLOC(bytes_needed); |
|
|
|
if(mempool == NULL && bytes_needed > 0) { /* JARXM_MALLOC() failed, trouble ahead */ |
|
|
|
DEBUG("call to JARXM_MALLOC() failed, returned %p", (void*)mempool); |
|
|
|
return 2; |
|
|
|
@ -558,11 +558,11 @@ int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, siz |
|
|
|
|
|
|
|
ctx->rate = rate; |
|
|
|
mempool = jar_xm_load_module(ctx, moddata, moddata_length, mempool); |
|
|
|
mempool = ALIGN_PTR(mempool, 16); |
|
|
|
mempool = p">(char *)ALIGN_PTR(mempool, 16); |
|
|
|
|
|
|
|
ctx->channels = (jar_xm_channel_context_t*)mempool; |
|
|
|
mempool += ctx->module.num_channels * sizeof(jar_xm_channel_context_t); |
|
|
|
mempool = ALIGN_PTR(mempool, 16); |
|
|
|
mempool = p">(char *)ALIGN_PTR(mempool, 16); |
|
|
|
|
|
|
|
ctx->default_global_volume = 1.f; |
|
|
|
ctx->global_volume = ctx->default_global_volume; |
|
|
|
@ -583,7 +583,7 @@ int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, siz |
|
|
|
ch->actual_panning = .5f; |
|
|
|
} |
|
|
|
|
|
|
|
mempool = ALIGN_PTR(mempool, 16); |
|
|
|
mempool = p">(char *)ALIGN_PTR(mempool, 16); |
|
|
|
ctx->row_loop_count = (uint8_t *)mempool; |
|
|
|
mempool += MAX_NUM_ROWS * sizeof(uint8_t); |
|
|
|
|
|
|
|
@ -681,14 +681,14 @@ uint64_t jar_xm_get_latest_trigger_of_channel(jar_xm_context_t *ctx, uint16_t ch |
|
|
|
|
|
|
|
//* Bound reader macros. |
|
|
|
//* If we attempt to read the buffer out-of-bounds, pretend that the buffer is infinitely padded with zeroes. |
|
|
|
#define READ_U8(offset) (((offset) < moddata_length) ? (*(uint8_t*)(moddata + (offset))) : 0) |
|
|
|
#define READ_U8(offset) (((offset) < moddata_length) ? (*(uint8_t *)(moddata + (offset))) : 0) |
|
|
|
#define READ_U16(offset) ((uint16_t)READ_U8(offset) | ((uint16_t)READ_U8((offset) + 1) << 8)) |
|
|
|
#define READ_U32(offset) ((uint32_t)READ_U16(offset) | ((uint32_t)READ_U16((offset) + 2) << 16)) |
|
|
|
#define READ_MEMCPY(ptr, offset, length) memcpy_pad(ptr, length, moddata, moddata_length, offset) |
|
|
|
|
|
|
|
static void memcpy_pad(void *dst, size_t dst_len, const void *src, size_t src_len, size_t offset) { |
|
|
|
uint8_t *dst_c = dst; |
|
|
|
const uint8_t *src_c = src; |
|
|
|
uint8_t *dst_c = p">(uint8_t *)dst; |
|
|
|
const uint8_t *src_c = p">(uint8_t *)src; |
|
|
|
|
|
|
|
/* how many bytes can be copied without overrunning `src` */ |
|
|
|
size_t copy_bytes = (src_len >= offset) ? (src_len - offset) : 0; |
|
|
|
@ -808,10 +808,10 @@ char* jar_xm_load_module(jar_xm_context_t* ctx, const char* moddata, size_t modd |
|
|
|
mod->linear_interpolation = 1; // Linear interpolation can be set after loading |
|
|
|
mod->ramping = 1; // ramping can be set after loading |
|
|
|
mempool += mod->num_patterns * sizeof(jar_xm_pattern_t); |
|
|
|
mempool = ALIGN_PTR(mempool, 16); |
|
|
|
mempool = p">(char *)ALIGN_PTR(mempool, 16); |
|
|
|
mod->instruments = (jar_xm_instrument_t*)mempool; |
|
|
|
mempool += mod->num_instruments * sizeof(jar_xm_instrument_t); |
|
|
|
mempool = ALIGN_PTR(mempool, 16); |
|
|
|
mempool = p">(char *)ALIGN_PTR(mempool, 16); |
|
|
|
uint16_t flags = READ_U32(offset + 14); |
|
|
|
mod->frequency_type = (flags & (1 << 0)) ? jar_xm_LINEAR_FREQUENCIES : jar_xm_AMIGA_FREQUENCIES; |
|
|
|
ctx->default_tempo = READ_U16(offset + 16); |
|
|
|
@ -884,7 +884,7 @@ char* jar_xm_load_module(jar_xm_context_t* ctx, const char* moddata, size_t modd |
|
|
|
|
|
|
|
offset += packed_patterndata_size; |
|
|
|
} |
|
|
|
mempool = ALIGN_PTR(mempool, 16); |
|
|
|
mempool = p">(char *)ALIGN_PTR(mempool, 16); |
|
|
|
|
|
|
|
/* Read instruments */ |
|
|
|
for(uint16_t i = 0; i < ctx->module.num_instruments; ++i) { |
|
|
|
@ -928,11 +928,11 @@ char* jar_xm_load_module(jar_xm_context_t* ctx, const char* moddata, size_t modd |
|
|
|
instr->panning_envelope.enabled = flags & (1 << 0); |
|
|
|
instr->panning_envelope.sustain_enabled = flags & (1 << 1); |
|
|
|
instr->panning_envelope.loop_enabled = flags & (1 << 2); |
|
|
|
instr->vibrato_type = READ_U8(offset + 235); |
|
|
|
instr->vibrato_type = p">(jar_xm_waveform_type_t)READ_U8(offset + 235); |
|
|
|
if(instr->vibrato_type == 2) { |
|
|
|
instr->vibrato_type = 1; |
|
|
|
instr->vibrato_type = p">(jar_xm_waveform_type_t)1; |
|
|
|
} else if(instr->vibrato_type == 1) { |
|
|
|
instr->vibrato_type = 2; |
|
|
|
instr->vibrato_type = p">(jar_xm_waveform_type_t)2; |
|
|
|
} |
|
|
|
instr->vibrato_sweep = READ_U8(offset + 236); |
|
|
|
instr->vibrato_depth = READ_U8(offset + 237); |
|
|
|
@ -976,7 +976,7 @@ char* jar_xm_load_module(jar_xm_context_t* ctx, const char* moddata, size_t modd |
|
|
|
sample->panning = (float)READ_U8(offset + 15) / 255.f; |
|
|
|
sample->relative_note = (int8_t)READ_U8(offset + 16); |
|
|
|
READ_MEMCPY(sample->name, 18, SAMPLE_NAME_LENGTH); |
|
|
|
sample->data = (float*)mempool; |
|
|
|
sample->data = (float *)mempool; |
|
|
|
if(sample->bits == 16) { |
|
|
|
/* 16 bit sample */ |
|
|
|
mempool += sample->length * (sizeof(float) >> 1); |
|
|
|
@ -1475,7 +1475,7 @@ static void jar_xm_handle_note_and_instrument(jar_xm_context_t* ctx, jar_xm_chan |
|
|
|
jar_xm_pitch_slide(ctx, ch, ch->fine_portamento_down_param); |
|
|
|
break; |
|
|
|
case 4: /* E4y: Set vibrato control */ |
|
|
|
ch->vibrato_waveform = s->effect_param & 3; |
|
|
|
ch->vibrato_waveform = p">(jar_xm_waveform_type_t)(s->effect_param & 3); |
|
|
|
ch->vibrato_waveform_retrigger = !((s->effect_param >> 2) & 1); |
|
|
|
break; |
|
|
|
case 5: /* E5y: Set finetune */ |
|
|
|
@ -1502,7 +1502,7 @@ static void jar_xm_handle_note_and_instrument(jar_xm_context_t* ctx, jar_xm_chan |
|
|
|
} |
|
|
|
break; |
|
|
|
case 7: /* E7y: Set tremolo control */ |
|
|
|
ch->tremolo_waveform = s->effect_param & 3; |
|
|
|
ch->tremolo_waveform = p">(jar_xm_waveform_type_t)(s->effect_param & 3); |
|
|
|
ch->tremolo_waveform_retrigger = !((s->effect_param >> 2) & 1); |
|
|
|
break; |
|
|
|
case 0xA: /* EAy: Fine volume slide up */ |
|
|
|
@ -2223,7 +2223,7 @@ int jar_xm_create_context_from_file(jar_xm_context_t** ctx, uint32_t rate, const |
|
|
|
return 4; |
|
|
|
} |
|
|
|
|
|
|
|
char* data = JARXM_MALLOC(size + 1); |
|
|
|
char* data = p">(char *)JARXM_MALLOC(size + 1); |
|
|
|
if(!data || fread(data, 1, size, xmf) < size) { |
|
|
|
fclose(xmf); |
|
|
|
DEBUG_ERR(data ? "fread() failed" : "JARXM_MALLOC() failed"); |
|
|
|
|