diff options
| author | Ray <raysan5@gmail.com> | 2018-02-25 00:04:50 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-02-25 00:04:50 +0100 |
| commit | c5f78636898d3f988cecc0bf876763252c484317 (patch) | |
| tree | bdf0709f9a75a25a805845997b0e356b6580bcfd /src/external | |
| parent | 6026ed61a5eaa43df4b2a91c8c47c8f2661d47de (diff) | |
| parent | 1430d0190684c6f78e1bce759eae240c94fba61c (diff) | |
| download | raylib-c5f78636898d3f988cecc0bf876763252c484317.tar.gz raylib-c5f78636898d3f988cecc0bf876763252c484317.zip | |
Merge pull request #492 from a3f/raylib-master
jar_xm: Workaround for unaligned pointer accesses
Diffstat (limited to 'src/external')
| -rw-r--r-- | src/external/jar_xm.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/external/jar_xm.h b/src/external/jar_xm.h index 15b31fd0..df199e06 100644 --- a/src/external/jar_xm.h +++ b/src/external/jar_xm.h @@ -612,6 +612,8 @@ int jar_xm_create_context(jar_xm_context_t** ctxp, const char* moddata, uint32_t return jar_xm_create_context_safe(ctxp, moddata, SIZE_MAX, rate); } +#define ALIGN(x, b) (((x) + ((b) - 1)) & ~((b) - 1)) +#define ALIGN_PTR(x, b) (void*)(((uintptr_t)(x) + ((b) - 1)) & ~((b) - 1)) int jar_xm_create_context_safe(jar_xm_context_t** ctxp, const char* moddata, size_t moddata_length, uint32_t rate) { #if JAR_XM_DEFENSIVE int ret; @@ -644,9 +646,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); ctx->channels = (jar_xm_channel_context_t*)mempool; mempool += ctx->module.num_channels * sizeof(jar_xm_channel_context_t); + mempool = ALIGN_PTR(mempool, 16); ctx->global_volume = 1.f; ctx->amplification = .25f; /* XXX: some bad modules may still clip. Find out something better. */ @@ -671,6 +675,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); ctx->row_loop_count = (uint8_t*)mempool; mempool += MAX_NUM_ROWS * sizeof(uint8_t); @@ -856,9 +861,11 @@ size_t jar_xm_get_memory_needed_for_context(const char* moddata, size_t moddata_ num_patterns = READ_U16(offset + 10); memory_needed += num_patterns * sizeof(jar_xm_pattern_t); + memory_needed = ALIGN(memory_needed, 16); num_instruments = READ_U16(offset + 12); memory_needed += num_instruments * sizeof(jar_xm_instrument_t); + memory_needed = ALIGN(memory_needed, 16); memory_needed += MAX_NUM_ROWS * READ_U16(offset + 4) * sizeof(uint8_t); /* Module length */ @@ -875,6 +882,7 @@ size_t jar_xm_get_memory_needed_for_context(const char* moddata, size_t moddata_ /* Pattern header length + packed pattern data size */ offset += READ_U32(offset) + READ_U16(offset + 7); } + memory_needed = ALIGN(memory_needed, 16); /* Read instrument headers */ for(uint16_t i = 0; i < num_instruments; ++i) { @@ -940,9 +948,11 @@ char* jar_xm_load_module(jar_xm_context_t* ctx, const char* moddata, size_t modd mod->patterns = (jar_xm_pattern_t*)mempool; mempool += mod->num_patterns * sizeof(jar_xm_pattern_t); + mempool = 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); uint16_t flags = READ_U32(offset + 14); mod->frequency_type = (flags & (1 << 0)) ? jar_xm_LINEAR_FREQUENCIES : jar_xm_AMIGA_FREQUENCIES; @@ -1032,6 +1042,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); /* Read instruments */ for(uint16_t i = 0; i < ctx->module.num_instruments; ++i) { |
