Mercurial > hg > dmlib
diff minijss/jssmod.c @ 2278:40ccc09f09be
Implement empty channel removal in xm2jss and make JSSMOD format support
channel remapping for this.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 18 Jun 2019 12:12:51 +0300 |
parents | 2f8506171064 |
children | fc58f62f100c |
line wrap: on
line diff
--- a/minijss/jssmod.c Tue Jun 18 12:11:16 2019 +0300 +++ b/minijss/jssmod.c Tue Jun 18 12:12:51 2019 +0300 @@ -343,7 +343,7 @@ // Check arguments if (nrows <= 0 || nchannels <= 0) - JSSERROR(DMERR_INVALID_ARGS, NULL, "Invalid nrows=%i or nchannels=%i.\n", nrows, nchannels); + JSSERROR(DMERR_INVALID_ARGS, NULL, "Invalid nrows=%d or nchannels=%d.\n", nrows, nchannels); // Allocate a pattern structure if ((pattern = dmMalloc0(sizeof(JSSPattern))) == NULL) @@ -353,14 +353,15 @@ pattern->data = dmMalloc(nrows * nchannels * sizeof(JSSNote)); if (pattern->data == NULL) { - dmFree(pattern); - JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern data (nrows=%i, nchannels=%i).\n", nrows, - nchannels); + jssFreePattern(pattern); + JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern data (nrows=%d, nchannels=%d).\n", + nrows, nchannels); } // Initialize structure pattern->nrows = nrows; pattern->nchannels = nchannels; + pattern->nmap = nchannels; pnote = pattern->data; for (int row = 0; row < nrows; row++) @@ -372,6 +373,19 @@ pnote++; } + // Initialize pattern channel map + pattern->map = dmMalloc(nchannels * sizeof(pattern->map[0])); + pattern->used = dmMalloc(nchannels * sizeof(pattern->used[0])); + if (pattern->map == NULL || pattern->used == NULL) + { + jssFreePattern(pattern); + JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern map (nchannels=%d).\n", + nchannels); + } + + for (int chn = 0; chn < nchannels; chn++) + pattern->map[chn] = chn; + return pattern; } @@ -380,6 +394,8 @@ { if (pattern != NULL) { + dmFree(pattern->used); + dmFree(pattern->map); dmFree(pattern->data); dmFree(pattern); }