diff options
author | Wohlstand <admin@wohlnet.ru> | 2022-10-25 04:57:31 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2022-10-25 04:57:31 +0300 |
commit | 24855412cd0a5e2dcf4ac8b62888d115cd20b3f0 (patch) | |
tree | 89111344f451ab6a94f8340abee10a9c605dcd5d /src/cvt_xmi2mid.hpp | |
parent | d08222efbc76aa734b35bbbe7482f60a5e35a28c (diff) | |
download | libADLMIDI-24855412cd0a5e2dcf4ac8b62888d115cd20b3f0.tar.gz libADLMIDI-24855412cd0a5e2dcf4ac8b62888d115cd20b3f0.tar.bz2 libADLMIDI-24855412cd0a5e2dcf4ac8b62888d115cd20b3f0.zip |
XMI2MIDI: Optimised the algorithm for multiple songs
Diffstat (limited to 'src/cvt_xmi2mid.hpp')
-rw-r--r-- | src/cvt_xmi2mid.hpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/cvt_xmi2mid.hpp b/src/cvt_xmi2mid.hpp index 181c7db..2c7f850 100644 --- a/src/cvt_xmi2mid.hpp +++ b/src/cvt_xmi2mid.hpp @@ -105,6 +105,8 @@ struct xmi2mid_xmi_ctx { int16_t *timing; midi_event *list; midi_event *current; + std::vector<std::vector<uint8_t > > *dyn_out; + std::vector<uint8_t > *dyn_out_cur; }; typedef struct { @@ -178,7 +180,11 @@ static void xmi2mid_copy(struct xmi2mid_xmi_ctx *ctx, char *b, uint32_t len) #define DST_CHUNK 8192 static void xmi2mid_resize_dst(struct xmi2mid_xmi_ctx *ctx) { uint32_t pos = (uint32_t)(ctx->dst_ptr - ctx->dst); - ctx->dst = (uint8_t *)realloc(ctx->dst, ctx->dstsize + DST_CHUNK); + if (ctx->dyn_out && ctx->dyn_out_cur) { + ctx->dyn_out_cur->resize(ctx->dstsize + DST_CHUNK); + ctx->dst = ctx->dyn_out_cur->data(); + } else + ctx->dst = (uint8_t *)realloc(ctx->dst, ctx->dstsize + DST_CHUNK); ctx->dstsize += DST_CHUNK; ctx->dstrem += DST_CHUNK; ctx->dst_ptr = ctx->dst + pos; @@ -593,7 +599,7 @@ _end: /* cleanup */ } static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, - std::vector<uint8_t *> &out, std::vector<uint32_t> &outsize, + std::vector<std::vector<uint8_t > > &out, uint32_t convert_type) { struct xmi2mid_xmi_ctx ctx; @@ -610,6 +616,7 @@ static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, ctx.srcsize = insize; ctx.src_end = ctx.src + insize; ctx.convert_type = convert_type; + ctx.dyn_out = &out; if (xmi2mid_ParseXMI(&ctx) < 0) { /*_WM_GLOBAL_ERROR(__FUNCTION__, __LINE__, WM_ERR_NOT_XMI, NULL, 0);*/ @@ -623,7 +630,10 @@ static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, for (i = 0; i < ctx.info.tracks; i++) { - ctx.dst = (uint8_t*)malloc(DST_CHUNK); + out.push_back(std::vector<uint8_t>()); + ctx.dyn_out_cur = &out.back(); + ctx.dyn_out_cur->resize(DST_CHUNK); + ctx.dst = ctx.dyn_out_cur->data(); ctx.dst_ptr = ctx.dst; ctx.dstsize = DST_CHUNK; ctx.dstrem = DST_CHUNK; @@ -641,21 +651,14 @@ static int Convert_xmi2midi_multi(uint8_t *in, uint32_t insize, xmi2mid_write2(&ctx, ctx.timing[i]);/* write divisions from track0 */ xmi2mid_ConvertListToMTrk(&ctx, ctx.events[i]); - out.push_back(ctx.dst); - outsize.push_back(ctx.dstsize - ctx.dstrem); + ctx.dyn_out_cur->resize(ctx.dstsize - ctx.dstrem); } ret = 0; _end: /* cleanup */ if (ret < 0) { - for(size_t j = 0; j < out.size(); ++j) - { - free(out[j]); - out[j] = NULL; - } out.clear(); - outsize.clear(); } if (ctx.events) { for (i = 0; i < ctx.info.tracks; i++) |