Mercurial > hg > dmlib
comparison minijss/jssmod.c @ 2285:25398f2eba64
Merge.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 18 Jun 2019 14:23:02 +0300 |
parents | 167ec99e57a5 |
children | 69a5af2eb1ea |
comparison
equal
deleted
inserted
replaced
2284:519c8726b235 | 2285:25398f2eba64 |
---|---|
1 /* | 1 /* |
2 * miniJSS - Module structure and handling routines | 2 * miniJSS - Module structure and handling routines |
3 * Programmed and designed by Matti 'ccr' Hamalainen | 3 * Programmed and designed by Matti 'ccr' Hamalainen |
4 * (C) Copyright 2006-2015 Tecnic Software productions (TNSP) | 4 * (C) Copyright 2006-2019 Tecnic Software productions (TNSP) |
5 */ | 5 */ |
6 #include "jssmod.h" | 6 #include "jssmod.h" |
7 | 7 |
8 | 8 |
9 #ifndef JSS_LIGHT | 9 #ifndef JSS_LIGHT |
341 JSSPattern *pattern; | 341 JSSPattern *pattern; |
342 JSSNote *pnote; | 342 JSSNote *pnote; |
343 | 343 |
344 // Check arguments | 344 // Check arguments |
345 if (nrows <= 0 || nchannels <= 0) | 345 if (nrows <= 0 || nchannels <= 0) |
346 JSSERROR(DMERR_INVALID_ARGS, NULL, "Invalid nrows=%i or nchannels=%i.\n", nrows, nchannels); | 346 JSSERROR(DMERR_INVALID_ARGS, NULL, "Invalid nrows=%d or nchannels=%d.\n", nrows, nchannels); |
347 | 347 |
348 // Allocate a pattern structure | 348 // Allocate a pattern structure |
349 if ((pattern = dmMalloc0(sizeof(JSSPattern))) == NULL) | 349 if ((pattern = dmMalloc0(sizeof(JSSPattern))) == NULL) |
350 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern structure.\n"); | 350 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern structure.\n"); |
351 | 351 |
352 // Allocate notedata | 352 // Allocate notedata |
353 pattern->data = dmMalloc(nrows * nchannels * sizeof(JSSNote)); | 353 pattern->data = dmMalloc(nrows * nchannels * sizeof(JSSNote)); |
354 if (pattern->data == NULL) | 354 if (pattern->data == NULL) |
355 { | 355 { |
356 dmFree(pattern); | 356 jssFreePattern(pattern); |
357 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern data (nrows=%i, nchannels=%i).\n", nrows, | 357 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern data (nrows=%d, nchannels=%d).\n", |
358 nchannels); | 358 nrows, nchannels); |
359 } | 359 } |
360 | 360 |
361 // Initialize structure | 361 // Initialize structure |
362 pattern->nrows = nrows; | 362 pattern->nrows = nrows; |
363 pattern->nchannels = nchannels; | 363 pattern->nchannels = nchannels; |
364 pattern->nmap = nchannels; | |
364 | 365 |
365 pnote = pattern->data; | 366 pnote = pattern->data; |
366 for (int row = 0; row < nrows; row++) | 367 for (int row = 0; row < nrows; row++) |
367 for (int chn = 0; chn < nchannels; chn++) | 368 for (int chn = 0; chn < nchannels; chn++) |
368 { | 369 { |
370 pnote->effect = pnote->param = jsetNotSet; | 371 pnote->effect = pnote->param = jsetNotSet; |
371 | 372 |
372 pnote++; | 373 pnote++; |
373 } | 374 } |
374 | 375 |
376 // Initialize pattern channel map | |
377 pattern->map = dmMalloc(nchannels * sizeof(pattern->map[0])); | |
378 pattern->used = dmMalloc(nchannels * sizeof(pattern->used[0])); | |
379 if (pattern->map == NULL || pattern->used == NULL) | |
380 { | |
381 jssFreePattern(pattern); | |
382 JSSERROR(DMERR_MALLOC, NULL, "Could not allocate pattern map (nchannels=%d).\n", | |
383 nchannels); | |
384 } | |
385 | |
386 for (int chn = 0; chn < nchannels; chn++) | |
387 { | |
388 pattern->map[chn] = chn; | |
389 pattern->used[chn] = TRUE; | |
390 } | |
391 | |
375 return pattern; | 392 return pattern; |
376 } | 393 } |
377 | 394 |
378 | 395 |
379 void jssFreePattern(JSSPattern *pattern) | 396 void jssFreePattern(JSSPattern *pattern) |
380 { | 397 { |
381 if (pattern != NULL) | 398 if (pattern != NULL) |
382 { | 399 { |
400 dmFree(pattern->used); | |
401 dmFree(pattern->map); | |
383 dmFree(pattern->data); | 402 dmFree(pattern->data); |
384 dmFree(pattern); | 403 dmFree(pattern); |
385 } | 404 } |
386 } | 405 } |
387 | 406 |