Mercurial > hg > dmlib
annotate minijss/jloadjss.c @ 1167:848a88ce7a57
Use dmMemset().
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Thu, 05 Mar 2015 07:37:35 +0200 |
parents | aa3738b121d1 |
children | aa6c3af36008 |
rev | line source |
---|---|
0 | 1 /* |
2 * miniJSS - JSSMOD module loader | |
3 * Programmed and designed by Matti 'ccr' Hamalainen | |
1163 | 4 * (C) Copyright 2007-2015 Tecnic Software productions (TNSP) |
0 | 5 */ |
6 #include "jssmod.h" | |
7 | |
8 | |
9 #ifdef JM_SUP_PATMODE_ALL | |
282 | 10 # define JM_SUP_PATMODE_1 1 |
11 # define JM_SUP_PATMODE_2 1 | |
12 # define JM_SUP_PATMODE_3 1 | |
13 # define JM_SUP_PATMODE_4 1 | |
14 # define JM_SUP_PATMODE_5 1 | |
0 | 15 #endif |
16 | |
17 | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
18 #define JSGETBUF(XV, XT) if (!dmf_read_str(inFile, XV, sizeof(XT))) return DMERR_OUT_OF_DATA |
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
19 #define JSGETBYTE(XV) if (!dmf_read_byte(inFile, XV)) return DMERR_OUT_OF_DATA |
0 | 20 |
21 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
22 #if defined(JM_SUP_PATMODE_1) || defined(JM_SUP_PATMODE_3) |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
23 static int jssGetConvertedNote(DMResource *inFile, JSSNote *note) |
0 | 24 { |
25 Uint8 tmp; | |
26 | |
27 JSGETBYTE(&tmp); | |
28 | |
29 if (tmp == 127) | |
30 note->note = jsetNoteOff; | |
31 else if (tmp == 0) | |
32 note->note = jsetNotSet; | |
33 else | |
34 note->note = tmp - 1; | |
35 | |
36 JSGETBYTE(&tmp); | |
37 note->instrument = (tmp > 0) ? tmp - 1 : jsetNotSet; | |
38 | |
39 JSGETBYTE(&tmp); | |
40 note->volume = (tmp > 0) ? tmp - 1 : jsetNotSet; | |
41 | |
42 JSGETBYTE(&tmp); | |
43 note->effect = (tmp > 0) ? tmp - 1 : jsetNotSet; | |
44 | |
45 JSGETBYTE(&tmp); | |
46 note->param = (tmp == 0 && note->effect == jsetNotSet) ? jsetNotSet : tmp; | |
47 | |
48 return DMERR_OK; | |
49 } | |
50 #endif | |
51 | |
52 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
53 #if defined(JM_SUP_PATMODE_2) || defined(JM_SUP_PATMODE_4) |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
54 static int jssGetCompressedNote(DMResource *inFile, JSSNote *note) |
0 | 55 { |
56 Uint8 packb, tmp; | |
57 | |
58 JSGETBYTE(&packb); | |
59 if (packb & 0x80) | |
60 { | |
61 if (packb & COMP_NOTE) | |
62 { | |
63 JSGETBYTE(&tmp); | |
64 if (tmp == 127) | |
65 note->note = jsetNoteOff; | |
66 else | |
67 note->note = tmp; | |
68 } | |
69 | |
70 if (packb & COMP_INSTRUMENT) | |
71 { | |
72 JSGETBYTE(&tmp); | |
73 note->instrument = tmp; | |
74 } | |
75 | |
76 if (packb & COMP_VOLUME) | |
77 { | |
78 JSGETBYTE(&tmp); | |
79 note->volume = tmp; | |
80 } | |
81 | |
82 if (packb & COMP_EFFECT) | |
83 { | |
84 JSGETBYTE(&tmp); | |
85 note->effect = tmp; | |
86 note->param = 0; | |
87 } | |
88 | |
89 if (packb & COMP_PARAM) | |
90 { | |
91 JSGETBYTE(&tmp); | |
92 note->param = tmp; | |
93 } | |
94 } | |
95 else | |
96 { | |
97 tmp = packb; | |
98 | |
99 if (tmp == 127) | |
100 note->note = jsetNoteOff; | |
101 else if (tmp == 0) | |
102 note->note = jsetNotSet; | |
103 else | |
104 note->note = tmp - 1; | |
105 | |
106 JSGETBYTE(&tmp); | |
107 note->instrument = (tmp > 0) ? tmp - 1 : jsetNotSet; | |
108 | |
109 JSGETBYTE(&tmp); | |
110 note->volume = (tmp > 0) ? tmp - 1 : jsetNotSet; | |
111 | |
112 JSGETBYTE(&tmp); | |
113 note->effect = (tmp > 0) ? tmp - 1 : jsetNotSet; | |
114 | |
115 JSGETBYTE(&tmp); | |
116 note->param = (tmp == 0 && note->effect == jsetNotSet) ? jsetNotSet : tmp; | |
117 } | |
118 | |
119 return DMERR_OK; | |
120 } | |
121 #endif | |
122 | |
123 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
124 #ifdef JM_SUP_PATMODE_2 |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
125 static int jssGetPatternCompHoriz(DMResource *inFile, JSSPattern *pattern) |
0 | 126 { |
127 int row, channel; | |
128 | |
129 assert(buf != NULL); | |
130 assert(pattern != NULL); | |
131 | |
132 for (row = 0; row < pattern->nrows; row++) | |
133 for (channel = 0; channel < pattern->nchannels; channel++) | |
134 { | |
135 JSSNote *note = &pattern->data[(pattern->nchannels * row) + channel]; | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
136 int res = jssGetCompressedNote(inFile, note); |
0 | 137 if (res != DMERR_OK) |
138 JSSERROR(res, res, "Error uncompressing note on row=%d, chn=%d\n", row, channel); | |
139 } | |
140 | |
141 return DMERR_OK; | |
142 } | |
143 #endif | |
144 | |
145 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
146 #ifdef JM_SUP_PATMODE_4 |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
147 static int jssGetPatternCompVert(DMResource *inFile, JSSPattern *pattern) |
0 | 148 { |
149 int row, channel; | |
150 | |
151 assert(buf != NULL); | |
152 assert(pattern != NULL); | |
153 | |
154 for (channel = 0; channel < pattern->nchannels; channel++) | |
155 for (row = 0; row < pattern->nrows; row++) | |
156 { | |
157 JSSNote *note = &pattern->data[(pattern->nchannels * row) + channel]; | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
158 int res = jssGetCompressedNote(inFile, note); |
0 | 159 if (res != DMERR_OK) |
160 JSSERROR(res, res, "Error uncompressing note on row=%d, chn=%d\n", row, channel); | |
161 } | |
162 | |
163 return DMERR_OK; | |
164 } | |
165 #endif | |
166 | |
167 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
168 #ifdef JM_SUP_PATMODE_1 |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
169 static int jssGetPatternRawHoriz(DMResource *inFile, JSSPattern *pattern) |
0 | 170 { |
171 int row, channel; | |
172 | |
173 assert(buf != NULL); | |
174 assert(pattern != NULL); | |
175 | |
176 for (row = 0; row < pattern->nrows; row++) | |
177 for (channel = 0; channel < pattern->nchannels; channel++) | |
178 { | |
179 JSSNote *note = &pattern->data[(pattern->nchannels * row) + channel]; | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
180 int res = jssGetConvertedNote(inFile, note); |
0 | 181 if (res != DMERR_OK) |
182 JSSERROR(res, res, "Error converting note on row=%d, chn=%d\n", row, channel); | |
183 } | |
184 | |
185 return DMERR_OK; | |
186 } | |
187 #endif | |
188 | |
189 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
190 #ifdef JM_SUP_PATMODE_3 |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
191 static int jssGetPatternRawVert(DMResource *inFile, JSSPattern *pattern) |
0 | 192 { |
193 int row, channel; | |
194 | |
195 assert(buf != NULL); | |
196 assert(pattern != NULL); | |
197 | |
198 for (channel = 0; channel < pattern->nchannels; channel++) | |
199 for (row = 0; row < pattern->nrows; row++) | |
200 { | |
201 JSSNote *note = &pattern->data[(pattern->nchannels * row) + channel]; | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
202 int res = jssGetConvertedNote(inFile, note); |
0 | 203 if (res != DMERR_OK) |
204 JSSERROR(res, res, "Error converting note on row=%d, chn=%d\n", row, channel); | |
205 } | |
206 | |
207 return DMERR_OK; | |
208 } | |
209 #endif | |
210 | |
211 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
212 #ifdef JM_SUP_PATMODE_5 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
213 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
214 #undef JSGETBYTE |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
215 #define JSGETBYTE(XV) if (!dmf_read_byte(inFile, XV)) return DMERR_OUT_OF_DATA |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
216 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
217 #define JSFOREACHNOTE1 \ |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
218 for (channel = 0; channel < pattern->nchannels; channel++) \ |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
219 for (row = 0; row < pattern->nrows; row++) { \ |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
220 JSSNote *note = pattern->data + (pattern->nchannels * row) + channel; |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
221 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
222 #define JSFOREACHNOTE2 } |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
223 |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
224 static int jssGetPatternRawVertElem(DMResource *inFile, JSSPattern *pattern) |
0 | 225 { |
226 int row, channel; | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
227 Uint8 tmp; |
0 | 228 |
229 assert(buf != NULL); | |
230 assert(pattern != NULL); | |
231 | |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
232 JSFOREACHNOTE1 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
233 JSGETBYTE(&tmp); |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
234 if (tmp == 0) |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
235 note->note = jsetNotSet; |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
236 else if (tmp == 127) |
331
c200edce230d
Oops, a silly typo in the JMOD loader.
Matti Hamalainen <ccr@tnsp.org>
parents:
282
diff
changeset
|
237 note->note = jsetNoteOff; |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
238 else |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
239 note->note = tmp - 1; |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
240 JSFOREACHNOTE2 |
1127
e22d4ceb6414
Cosmetics pass, remove excess and trailing whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
1118
diff
changeset
|
241 |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
242 JSFOREACHNOTE1 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
243 JSGETBYTE(&tmp); |
338
cd57ba1130eb
Fixes and improvements in the JMOD saving and loading.
Matti Hamalainen <ccr@tnsp.org>
parents:
331
diff
changeset
|
244 note->instrument = (tmp > 0) ? tmp - 1 : jsetNotSet; |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
245 JSFOREACHNOTE2 |
1127
e22d4ceb6414
Cosmetics pass, remove excess and trailing whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
1118
diff
changeset
|
246 |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
247 JSFOREACHNOTE1 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
248 JSGETBYTE(&tmp); |
338
cd57ba1130eb
Fixes and improvements in the JMOD saving and loading.
Matti Hamalainen <ccr@tnsp.org>
parents:
331
diff
changeset
|
249 note->volume = (tmp > 0) ? tmp - 1 : jsetNotSet; |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
250 JSFOREACHNOTE2 |
1127
e22d4ceb6414
Cosmetics pass, remove excess and trailing whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
1118
diff
changeset
|
251 |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
252 JSFOREACHNOTE1 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
253 JSGETBYTE(&tmp); |
338
cd57ba1130eb
Fixes and improvements in the JMOD saving and loading.
Matti Hamalainen <ccr@tnsp.org>
parents:
331
diff
changeset
|
254 note->effect = (tmp > 0) ? tmp - 1 : jsetNotSet; |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
255 JSFOREACHNOTE2 |
1127
e22d4ceb6414
Cosmetics pass, remove excess and trailing whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents:
1118
diff
changeset
|
256 |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
257 JSFOREACHNOTE1 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
258 JSGETBYTE(&tmp); |
338
cd57ba1130eb
Fixes and improvements in the JMOD saving and loading.
Matti Hamalainen <ccr@tnsp.org>
parents:
331
diff
changeset
|
259 note->param = (tmp == 0 && note->effect == jsetNotSet) ? jsetNotSet : tmp; |
204
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
260 JSFOREACHNOTE2 |
d3a9a3804079
Implement pattern mode 5 in the JMOD jloader.
Matti Hamalainen <ccr@tnsp.org>
parents:
96
diff
changeset
|
261 |
0 | 262 return DMERR_OK; |
263 } | |
264 #endif | |
265 | |
266 | |
267 #undef JSGETBUF | |
268 #undef JSGETBYTE | |
269 #define JSGETBUF(XV, XT) do { \ | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
270 if (!dmf_read_str(inFile, XV, sizeof(XT))) \ |
0 | 271 JSSERROR(DMERR_OUT_OF_DATA, DMERR_OUT_OF_DATA, \ |
272 "Out of data at getting " # XT " (%d bytes)\n", sizeof(XT)); \ | |
273 } while (0) | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
274 #define JSGETBYTE(XV) if (!dmf_read_byte(inFile, XV)) return DMERR_OUT_OF_DATA |
0 | 275 |
276 | |
277 #ifdef JM_SUP_EXT_INSTR | |
278 static void jssCopyEnvelope(JSSEnvelope *e, JSSMODEnvelope *je) | |
279 { | |
280 int i; | |
281 | |
282 e->flags = je->flags; | |
283 e->npoints = je->npoints; | |
284 e->sustain = je->sustain; | |
285 e->loopS = je->loopS; | |
286 e->loopE = je->loopE; | |
287 | |
288 for (i = 0; i < je->npoints; i++) | |
289 { | |
290 e->points[i].frame = je->points[i].frame; | |
291 e->points[i].value = je->points[i].value; | |
292 } | |
293 } | |
294 #endif | |
295 | |
296 | |
796 | 297 int jssLoadJSSMOD(DMResource *inFile, JSSModule **ppModule, BOOL probe) |
0 | 298 { |
299 JSSModule *module; | |
300 JSSMODHeader jssH; | |
301 int index; | |
302 | |
303 *ppModule = NULL; | |
304 | |
305 // Check the JSSMOD header | |
1167 | 306 dmMemset(&jssH, 0, sizeof(jssH)); |
0 | 307 JSGETBUF(&jssH, JSSMODHeader); |
308 | |
309 if (memcmp(jssH.idMagic, "JM", 2) != 0) | |
310 { | |
796 | 311 if (probe) |
312 return DMERR_NOT_SUPPORTED; | |
313 else | |
314 JSSERROR(DMERR_NOT_SUPPORTED, DMERR_NOT_SUPPORTED, | |
315 "Not a JSSMOD file, header signature mismatch!\n"); | |
0 | 316 } |
317 | |
318 if (jssH.idVersion != JSSMOD_VERSION) | |
319 { | |
320 JSSERROR(DMERR_VERSION, DMERR_VERSION, | |
321 "Unsupported version of JSSMOD 0x%4x, this version only supports 0x%4x!\n", | |
322 jssH.idVersion, JSSMOD_VERSION); | |
323 } | |
324 | |
325 // Allocate the module | |
326 module = jssAllocateModule(); | |
327 if (module == NULL) | |
328 { | |
329 JSSERROR(DMERR_MALLOC, DMERR_MALLOC, | |
330 "Could not allocate memory for module structure.\n"); | |
331 } | |
332 *ppModule = module; | |
333 | |
334 // Copy header information | |
335 module->norders = jssH.norders; | |
336 module->npatterns = jssH.npatterns; | |
337 module->nchannels = jssH.nchannels; | |
338 module->nextInstruments = jssH.nextInstruments; | |
339 module->ninstruments = jssH.ninstruments; | |
340 module->defFlags = jssH.defFlags; | |
341 module->intVersion = jssH.intVersion; | |
342 module->defRestartPos = jssH.defRestartPos; | |
343 module->defSpeed = jssH.defSpeed; | |
344 module->defTempo = jssH.defTempo; | |
345 | |
346 // Get the orders list | |
347 for (index = 0; index < module->norders; index++) | |
348 { | |
349 Sint16 order; | |
350 JSGETBUF(&order, Sint16); | |
351 module->orderList[index] = order; | |
352 } | |
353 | |
354 // Parse the patterns | |
355 for (index = 0; index < module->npatterns; index++) | |
356 { | |
357 JSSMODPattern jssP; | |
358 int result = DMERR_INVALID_DATA; | |
359 | |
360 // Get header and check size | |
1167 | 361 dmMemset(&jssP, 0, sizeof(jssP)); |
0 | 362 JSGETBUF(&jssP, JSSMODPattern); |
363 | |
364 // Allocate pattern | |
365 module->patterns[index] = jssAllocatePattern(jssP.nrows, module->nchannels); | |
366 if (module->patterns[index] == NULL) | |
367 { | |
368 JSSERROR(DMERR_MALLOC, DMERR_MALLOC, | |
369 "Could not allocate memory for pattern #%d.\n", index); | |
370 } | |
371 | |
372 // Get pattern data | |
373 switch (jssH.patMode) | |
374 { | |
375 #ifdef JM_SUP_PATMODE_1 | |
376 case PATMODE_RAW_HORIZ: | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
377 result = jssGetPatternRawHoriz(inFile, module->patterns[index]); |
0 | 378 break; |
379 #endif | |
380 #ifdef JM_SUP_PATMODE_2 | |
381 case PATMODE_COMP_HORIZ: | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
382 result = jssGetPatternCompHoriz(inFile, module->patterns[index]); |
0 | 383 break; |
384 #endif | |
385 #ifdef JM_SUP_PATMODE_3 | |
386 case PATMODE_RAW_VERT: | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
387 result = jssGetPatternRawVert(inFile, module->patterns[index]); |
0 | 388 break; |
389 #endif | |
390 #ifdef JM_SUP_PATMODE_4 | |
391 case PATMODE_COMP_VERT: | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
392 result = jssGetPatternCompVert(inFile, module->patterns[index]); |
0 | 393 break; |
394 #endif | |
395 #ifdef JM_SUP_PATMODE_5 | |
396 case PATMODE_RAW_ELEM: | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
397 result = jssGetPatternRawVertElem(inFile, module->patterns[index]); |
0 | 398 break; |
399 #endif | |
400 default: | |
401 JSSERROR(DMERR_INVALID_DATA, DMERR_INVALID_DATA, | |
402 "Unsupported pattern mode %d. Check compilation options.", jssH.patMode); | |
403 break; | |
404 } | |
405 | |
406 if (result != DMERR_OK) | |
407 { | |
408 JSSERROR(result, result, "Error in unpacking pattern #%i data\n", index); | |
409 } | |
410 } | |
411 | |
412 #ifdef JM_SUP_EXT_INSTR | |
413 // Read extended instruments | |
414 for (index = 0; index < module->nextInstruments; index++) | |
415 { | |
416 JSSMODExtInstrument jssE; | |
417 JSSExtInstrument *einst; | |
418 int i; | |
419 | |
1167 | 420 dmMemset(&jssE, 0, sizeof(jssE)); |
0 | 421 JSGETBUF(&jssE, JSSMODExtInstrument); |
422 | |
423 if ((einst = jssAllocateExtInstrument()) == NULL) | |
424 { | |
425 JSSERROR(DMERR_MALLOC, DMERR_MALLOC, | |
426 "Could not allocate extended instrument structure #%i\n", index); | |
427 } | |
428 | |
429 module->extInstruments[index] = einst; | |
430 | |
431 einst->nsamples = jssE.nsamples; | |
432 einst->vibratoType = jssE.vibratoType; | |
433 einst->vibratoSweep = jssE.vibratoSweep; | |
434 einst->vibratoDepth = jssE.vibratoDepth; | |
435 einst->vibratoRate = jssE.vibratoRate; | |
436 einst->fadeOut = jssE.fadeOut; | |
437 | |
438 for (i = 0; i < jsetNNotes; i++) | |
439 { | |
440 int snum = jssE.sNumForNotes[i]; | |
1118
de25e0f2b856
Fix sNumForNotes conversion/handling in JSSMOD loader and xm2jss.
Matti Hamalainen <ccr@tnsp.org>
parents:
796
diff
changeset
|
441 einst->sNumForNotes[i] = (snum > 0) ? snum - 1 : jsetNotSet; |
0 | 442 } |
443 | |
444 jssCopyEnvelope(&(einst->volumeEnv), &jssE.volumeEnv); | |
445 jssCopyEnvelope(&(einst->panningEnv), &jssE.panningEnv); | |
446 } | |
447 | |
448 #ifdef JM_SUP_INSTR | |
449 // Read sample instrument headers | |
450 for (index = 0; index < module->ninstruments; index++) | |
451 { | |
452 JSSMODInstrument jssI; | |
453 JSSInstrument *inst; | |
454 | |
1167 | 455 dmMemset(&jssI, 0, sizeof(jssI)); |
0 | 456 JSGETBUF(&jssI, JSSMODInstrument); |
457 | |
458 if ((inst = jssAllocateInstrument()) == NULL) | |
459 { | |
460 JSSERROR(DMERR_MALLOC, DMERR_MALLOC, | |
461 "Could not allocate instrument structure #%i\n", index); | |
462 } | |
463 | |
464 module->instruments[index] = inst; | |
465 | |
466 inst->size = jssI.size; | |
467 inst->loopS = jssI.loopS; | |
468 inst->loopE = jssI.loopE; | |
469 inst->volume = jssI.volume; | |
470 inst->flags = jssI.flags; | |
471 inst->C4BaseSpeed = jssI.C4BaseSpeed; | |
472 inst->ERelNote = jssI.ERelNote; | |
473 inst->EFineTune = jssI.EFineTune; | |
474 inst->EPanning = jssI.EPanning; | |
475 inst->hasData = jssI.hasData; | |
476 inst->convFlags = jssI.convFlags; | |
477 } | |
478 | |
479 #ifdef JM_SUP_SAMPLES | |
480 // Read sample data | |
481 for (index = 0; index < module->ninstruments; index++) | |
482 { | |
483 JSSInstrument *inst = module->instruments[index]; | |
484 | |
485 if (inst && inst->hasData) | |
486 { | |
1129
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
487 int ret; |
0 | 488 size_t sz; |
489 | |
490 // Calculate data size | |
491 if (inst->flags & jsf16bit) | |
492 sz = inst->size * sizeof(Uint16); | |
493 else | |
494 sz = inst->size * sizeof(Uint8); | |
495 | |
496 // Allocate | |
497 if ((inst->data = dmMalloc(sz)) == NULL) | |
498 { | |
499 JSSERROR(DMERR_MALLOC, DMERR_MALLOC, | |
500 "Could not allocate sample data #%d\n", index); | |
501 } | |
502 | |
503 // Copy data | |
777
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
504 if (!dmf_read_str(inFile, inst->data, sz)) |
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
505 { |
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
506 JSSERROR(DMERR_FREAD, DMERR_FREAD, |
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
507 "Could not read sample data for #%d\n", index); |
ed60a7ee3ebb
Change JSSMOD loader to use DMResources.
Matti Hamalainen <ccr@tnsp.org>
parents:
658
diff
changeset
|
508 } |
0 | 509 |
510 // Convert, if needed | |
511 if (inst->flags & jsf16bit) | |
1129
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
512 ret = jssDecodeSample16(inst->data, inst->size, inst->convFlags); |
0 | 513 else |
1129
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
514 ret = jssDecodeSample8(inst->data, inst->size, inst->convFlags); |
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
515 |
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
516 if (ret != DMERR_OK) |
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
517 { |
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
518 JSSERROR(ret, ret, |
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
519 "Failed to decode sample data for #%d\n", index); |
e466d10dae6d
Change API of jssDecodeSample{8,16}() functions to return dmlib error codes
Matti Hamalainen <ccr@tnsp.org>
parents:
1127
diff
changeset
|
520 } |
0 | 521 } |
522 } | |
523 #else | |
282 | 524 # warning Not including JSSMOD sample loading! |
0 | 525 #endif // JM_SUP_SAMPLES |
526 #else | |
282 | 527 # warning Not including JSSMOD instrument loading! |
0 | 528 #endif // JM_SUP_INSTR |
529 #else | |
282 | 530 # warning Not including JSSMOD ext.instrument loading! |
0 | 531 #endif // JM_SUP_EXT_INSTR |
532 | |
533 return DMERR_OK; | |
534 } |