Mercurial > hg > dmlib
comparison tools/mod2wav.c @ 2258:c146033f1f6a
Cleanups.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 16 Jun 2019 23:31:58 +0300 |
parents | e3f0eaf23f4f |
children | 647671a9a0b8 |
comparison
equal
deleted
inserted
replaced
2257:c7495fcaffa9 | 2258:c146033f1f6a |
---|---|
86 | 86 |
87 switch (optN) | 87 switch (optN) |
88 { | 88 { |
89 case 0: | 89 case 0: |
90 dmPrintBanner(stdout, dmProgName, | 90 dmPrintBanner(stdout, dmProgName, |
91 "[options] [sourcefile] [destfile]"); | 91 "[options] [sourcefile] [destfile.wav]"); |
92 | 92 |
93 dmArgsPrintHelp(stdout, optList, optListN, 0); | 93 dmArgsPrintHelp(stdout, optList, optListN, 0); |
94 exit(0); | 94 exit(0); |
95 break; | 95 break; |
96 | 96 |
140 } | 140 } |
141 | 141 |
142 | 142 |
143 BOOL argHandleFile(char *currArg) | 143 BOOL argHandleFile(char *currArg) |
144 { | 144 { |
145 if (!optInFilename) | 145 if (optInFilename == NULL) |
146 optInFilename = currArg; | 146 optInFilename = currArg; |
147 else | 147 else |
148 if (!optOutFilename) | 148 if (optOutFilename == NULL) |
149 optOutFilename = currArg; | 149 optOutFilename = currArg; |
150 else | 150 else |
151 { | 151 { |
152 dmErrorMsg("Too many filename arguments (only source and dest needed) '%s'\n", currArg); | 152 dmErrorMsg("Too many filename arguments (only source and dest needed) '%s'\n", currArg); |
153 return FALSE; | 153 return FALSE; |
206 dm_fwrite_le16(outFile, wav.nBlockAlign); | 206 dm_fwrite_le16(outFile, wav.nBlockAlign); |
207 dm_fwrite_le16(outFile, wav.wBitsPerSample); | 207 dm_fwrite_le16(outFile, wav.wBitsPerSample); |
208 | 208 |
209 dmWriteWAVChunk(outFile, &wav.chData); | 209 dmWriteWAVChunk(outFile, &wav.chData); |
210 } | 210 } |
211 | |
212 | |
211 int main(int argc, char *argv[]) | 213 int main(int argc, char *argv[]) |
212 { | 214 { |
213 DMResource *inFile = NULL; | 215 DMResource *inFile = NULL; |
214 FILE *outFile = NULL; | 216 FILE *outFile = NULL; |
215 JSSModule *mod = NULL; | 217 JSSModule *mod = NULL; |
216 JSSMixer *dev = NULL; | 218 JSSMixer *dev = NULL; |
217 JSSPlayer *plr = NULL; | 219 JSSPlayer *plr = NULL; |
220 size_t bufLen = 1024*4, dataTotal, dataWritten, sampSize; | |
221 Uint8 *dataBuf = NULL; | |
218 int result = -1; | 222 int result = -1; |
219 size_t bufLen = 1024*4, dataTotal, dataWritten, sampSize; | |
220 Uint8 *mb = NULL; | |
221 | 223 |
222 dmInitProg("mod2wav", "XM/JSSMOD to WAV renderer", "0.2", NULL, NULL); | 224 dmInitProg("mod2wav", "XM/JSSMOD to WAV renderer", "0.2", NULL, NULL); |
223 dmVerbosity = 1; | 225 dmVerbosity = 1; |
224 | 226 |
225 // Parse arguments | 227 // Parse arguments |
226 if (!dmArgsProcess(argc, argv, optList, optListN, | 228 if (!dmArgsProcess(argc, argv, optList, optListN, |
227 argHandleOpt, argHandleFile, OPTH_BAILOUT)) | 229 argHandleOpt, argHandleFile, OPTH_BAILOUT)) |
228 exit(1); | 230 return 1; |
229 | 231 |
230 // Check arguments | 232 // Check arguments |
231 if (optInFilename == NULL || optOutFilename == NULL) | 233 if (optInFilename == NULL || optOutFilename == NULL) |
232 { | 234 { |
233 dmErrorMsg("Input or output file not specified. Try --help.\n"); | 235 dmErrorMsg("Input or output file not specified. Try --help.\n"); |
240 // Open the source file | 242 // Open the source file |
241 if ((result = dmf_open_stdio(optInFilename, "rb", &inFile)) != DMERR_OK) | 243 if ((result = dmf_open_stdio(optInFilename, "rb", &inFile)) != DMERR_OK) |
242 { | 244 { |
243 dmErrorMsg("Error opening input file '%s', %d: %s\n", | 245 dmErrorMsg("Error opening input file '%s', %d: %s\n", |
244 optInFilename, result, dmErrorStr(result)); | 246 optInFilename, result, dmErrorStr(result)); |
245 return 1; | 247 goto exit; |
246 } | 248 } |
247 | 249 |
248 // Read module file | 250 // Read module file |
249 dmMsg(1, "Reading file: %s\n", optInFilename); | 251 dmMsg(1, "Reading file: %s\n", optInFilename); |
250 #ifdef JSS_SUP_XM | 252 #ifdef JSS_SUP_XM |
271 // Check for errors, we still might have some data tho | 273 // Check for errors, we still might have some data tho |
272 if (result != DMERR_OK) | 274 if (result != DMERR_OK) |
273 { | 275 { |
274 dmErrorMsg("Error loading module file, %d: %s\n", | 276 dmErrorMsg("Error loading module file, %d: %s\n", |
275 result, dmErrorStr(result)); | 277 result, dmErrorStr(result)); |
278 goto exit; | |
276 } | 279 } |
277 | 280 |
278 // Check if we have anything | 281 // Check if we have anything |
279 if (mod == NULL) | 282 if (mod == NULL) |
280 return 3; | 283 goto exit; |
281 | 284 |
282 // Try to convert it | 285 // Try to convert it |
283 if ((result = jssConvertModuleForPlaying(mod)) != DMERR_OK) | 286 if ((result = jssConvertModuleForPlaying(mod)) != DMERR_OK) |
284 { | 287 { |
285 dmErrorMsg("Could not convert module for playing, %d: %s\n", | 288 dmErrorMsg("Could not convert module for playing, %d: %s\n", |
286 result, dmErrorStr(result)); | 289 result, dmErrorStr(result)); |
287 return 3; | 290 goto exit; |
288 } | 291 } |
289 | 292 |
290 // Open mixer | 293 // Open mixer |
291 dev = jvmInit(optOutFormat, optOutChannels, optOutFreq, JMIX_AUTO); | 294 dev = jvmInit(optOutFormat, optOutChannels, optOutFreq, JMIX_AUTO); |
292 if (dev == NULL) | 295 if (dev == NULL) |
293 { | 296 { |
294 dmErrorMsg("jvmInit() returned NULL\n"); | 297 dmErrorMsg("jvmInit() returned NULL\n"); |
295 return 4; | 298 goto exit; |
296 } | 299 } |
297 | 300 |
298 sampSize = jvmGetSampleSize(dev); | 301 sampSize = jvmGetSampleSize(dev); |
299 if ((mb = dmMalloc(bufLen * sampSize)) == NULL) | 302 if ((dataBuf = dmMalloc(bufLen * sampSize)) == NULL) |
300 { | 303 { |
301 dmErrorMsg("Could not allocate mixing buffer\n"); | 304 dmErrorMsg("Could not allocate mixing buffer\n"); |
302 return 5; | 305 return 5; |
303 } | 306 } |
304 | 307 |
308 | 311 |
309 // Initialize player | 312 // Initialize player |
310 if ((plr = jmpInit(dev)) == NULL) | 313 if ((plr = jmpInit(dev)) == NULL) |
311 { | 314 { |
312 dmErrorMsg("jmpInit() returned NULL.\n"); | 315 dmErrorMsg("jmpInit() returned NULL.\n"); |
313 return 6; | 316 goto exit; |
314 } | 317 } |
315 | 318 |
316 // Set callback | 319 // Set callback |
317 jvmSetCallback(dev, jmpExec, plr); | 320 jvmSetCallback(dev, jmpExec, plr); |
318 | 321 |
339 if ((outFile = fopen(optOutFilename, "wb")) == NULL) | 342 if ((outFile = fopen(optOutFilename, "wb")) == NULL) |
340 { | 343 { |
341 int err = dmGetErrno(); | 344 int err = dmGetErrno(); |
342 dmErrorMsg("Error opening output file '%s' #%d: %s.\n", | 345 dmErrorMsg("Error opening output file '%s' #%d: %s.\n", |
343 optInFilename, err, dmErrorStr(err)); | 346 optInFilename, err, dmErrorStr(err)); |
344 return 7; | 347 goto exit; |
345 } | 348 } |
346 | 349 |
347 // Write initial header | 350 // Write initial header |
348 dmWriteWAVHeader(outFile, jvmGetSampleRes(dev), optOutFreq, optOutChannels, 1024); | 351 dmWriteWAVHeader(outFile, jvmGetSampleRes(dev), optOutFreq, optOutChannels, 1024); |
349 | 352 |
362 if (optUsePlayTime && (writeLen + dataTotal) > optPlayTime) | 365 if (optUsePlayTime && (writeLen + dataTotal) > optPlayTime) |
363 writeLen = optPlayTime - dataTotal; | 366 writeLen = optPlayTime - dataTotal; |
364 | 367 |
365 if (writeLen > 0) | 368 if (writeLen > 0) |
366 { | 369 { |
367 jvmRenderAudio(dev, mb, writeLen); | 370 jvmRenderAudio(dev, dataBuf, writeLen); |
368 #if (SDL_BYTEORDER == SDL_BIG_ENDIAN) | 371 #if (SDL_BYTEORDER == SDL_BIG_ENDIAN) |
369 jssEncodeSample16((Uint16 *)mb, writeLen * optOutChannels, jsampSwapEndianess); | 372 jssEncodeSample16((Uint16 *)dataBuf, writeLen * optOutChannels, jsampSwapEndianess); |
370 #endif | 373 #endif |
371 dataWritten = fwrite(mb, sampSize, writeLen, outFile); | 374 dataWritten = fwrite(dataBuf, sampSize, writeLen, outFile); |
372 if (dataWritten < writeLen) | 375 if (dataWritten < writeLen) |
373 { | 376 { |
374 dmErrorMsg("Error writing data!\n"); | 377 dmErrorMsg("Error writing data!\n"); |
375 fclose(outFile); | 378 goto exit; |
376 return 8; | |
377 } | 379 } |
378 dataTotal += dataWritten; | 380 dataTotal += dataWritten; |
379 } | 381 } |
380 | 382 |
381 if (optUsePlayTime && dataTotal >= optPlayTime) | 383 if (optUsePlayTime && dataTotal >= optPlayTime) |
384 | 386 |
385 // Write the correct header | 387 // Write the correct header |
386 if (fseek(outFile, 0L, SEEK_SET) != 0) | 388 if (fseek(outFile, 0L, SEEK_SET) != 0) |
387 { | 389 { |
388 dmErrorMsg("Error rewinding to header position!\n"); | 390 dmErrorMsg("Error rewinding to header position!\n"); |
389 return 9; | 391 goto exit; |
390 } | 392 } |
391 | 393 |
392 dmWriteWAVHeader(outFile, jvmGetSampleRes(dev), optOutFreq, optOutChannels, dataTotal); | 394 dmWriteWAVHeader(outFile, jvmGetSampleRes(dev), optOutFreq, optOutChannels, dataTotal); |
393 | 395 |
394 // Done! | 396 // Done! |
395 fclose(outFile); | 397 dmMsg(1, "OK.\n"); |
396 | 398 |
399 exit: | |
400 if (outFile != NULL) | |
401 fclose(outFile); | |
402 | |
403 dmFree(dataBuf); | |
397 jmpClose(plr); | 404 jmpClose(plr); |
398 jvmClose(dev); | 405 jvmClose(dev); |
399 jssFreeModule(mod); | 406 jssFreeModule(mod); |
400 jssClose(); | 407 jssClose(); |
401 | 408 |
402 dmMsg(1, "OK.\n"); | |
403 return 0; | 409 return 0; |
404 } | 410 } |