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 }