annotate mod2wav.c @ 49:033c660c25f5

Restructure module playing, removing 8bit sample mixing (output can still be 8bit, but samples are internally upconverted to 16bit after module loading.) Also prepare for floating point mixing support.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 01 Oct 2012 02:51:41 +0300
parents 281b080e8c44
children 182e5fac93f5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * mod2wav - Render XM/JSSMOD module to WAV waveform file
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * Programmed and designed by Matti 'ccr' Hamalainen
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 * (C) Copyright 2007 Tecnic Software productions (TNSP)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 *
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 * Please read file 'COPYING' for information on license and distribution.
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 */
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 #include <stdio.h>
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9 #include <string.h>
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10 #include <stdlib.h>
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
11 #include <errno.h>
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12 #include "jss.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13 #include "jssmod.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14 #include "jssmix.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
15 #include "jssplr.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
16 #include "dmlib.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
17 #include "dmargs.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
18 #include "dmfile.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
19
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
20
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
21 #define JSS_WAVE_FORMAT_PCM (1)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
22 #define JSS_WAVE_RIFF_ID "RIFF"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
23 #define JSS_WAVE_WAVE_ID "WAVE"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
24 #define JSS_WAVE_FMT_ID "fmt "
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
25 #define JSS_WAVE_DATA_ID "data"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
26
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
27
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
28 typedef struct
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
29 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
30 Uint8 chunkID[4];
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
31 Uint32 chunkSize;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
32 } JSSWaveChunk;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
33
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
34
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
35 typedef struct
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
37 Uint8 riffID[4];
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
38 Uint32 fileSize;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
39 Uint8 riffType[4];
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
40
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
41 JSSWaveChunk chFormat;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
42
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
43 Uint16 wFormatTag;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
44 Uint16 nChannels;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
45 Uint32 nSamplesPerSec;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
46 Uint32 nAvgBytesPerSec;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
47 Uint16 nBlockAlign;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
48 Uint16 wBitsPerSample;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
49
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
50 JSSWaveChunk chData;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
51 // Data follows here
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
52 } JSSWaveFile;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
53
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
54
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
55 char *srcFilename = NULL, *destFilename = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
56 int optOutFormat = JSS_AUDIO_S16,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
57 optOutChannels = 2,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
58 optOutFreq = 44100,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
59 optMuteOChannels = -1,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
60 optStartOrder = -1;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
61 BOOL optUsePlayTime = FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
62 size_t optPlayTime;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
63
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
65 DMOptArg optList[] =
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
66 {
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
67 { 0, '?', "help", "Show this help", OPT_NONE },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
68 { 2, 'v', "verbose", "Be more verbose", OPT_NONE },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
69 { 3, '1', "16bit", "16-bit output", OPT_NONE },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
70 { 4, '8', "8bit", "8-bit output", OPT_NONE },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
71 { 5, 'm', "mono", "Mono output", OPT_NONE },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
72 { 6, 's', "stereo", "Stereo output", OPT_NONE },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
73 { 7, 'f', "freq", "Output frequency", OPT_ARGREQ },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
74 { 8, 'M', "mute", "Mute other channels than #", OPT_ARGREQ },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
75 { 9, 'o', "order", "Start from order #", OPT_ARGREQ },
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
76 { 10, 't', "time", "Play for # seconds", OPT_ARGREQ },
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
77 // {10, 'l', "loop", "Loop for # times", OPT_ARGREQ },
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
78 };
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
79
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
80 const int optListN = sizeof(optList) / sizeof(optList[0]);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
81
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
82
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
83 BOOL argHandleOpt(const int optN, char *optArg, char *currArg)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
84 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
85 (void) optArg;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
86
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
87 switch (optN)
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
88 {
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
89 case 0:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
90 dmPrintBanner(stdout, dmProgName,
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
91 "[options] [sourcefile] [destfile]");
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
92
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
93 dmArgsPrintHelp(stdout, optList, optListN);
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
94 exit(0);
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
95 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
96
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
97 case 2:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
98 dmVerbosity++;
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
99 break;
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
100
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
101 case 3:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
102 optOutFormat = JSS_AUDIO_S16;
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
103 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
104
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
105 case 4:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
106 optOutFormat = JSS_AUDIO_U8;
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
107 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
108
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
109 case 5:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
110 optOutChannels = JSS_AUDIO_MONO;
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
111 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
112
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
113 case 6:
38
8b04b0b51edc Oops, fix a stupid bug in -s option .. it was setting the wrong variable. :|
Matti Hamalainen <ccr@tnsp.org>
parents: 37
diff changeset
114 optOutChannels = JSS_AUDIO_STEREO;
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
115 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
116
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
117 case 7:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
118 optOutFreq = atoi(optArg);
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
119 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
120
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
121 case 8:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
122 optMuteOChannels = atoi(optArg);
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
123 break;
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
124
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
125 case 9:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
126 optStartOrder = atoi(optArg);
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
127 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
128
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
129 case 10:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
130 optPlayTime = atoi(optArg);
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
131 optUsePlayTime = TRUE;
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
132 break;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
134 default:
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
135 dmError("Unknown argument '%s'.\n", currArg);
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
136 return FALSE;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
137 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139 return TRUE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
143 BOOL argHandleFile(char *currArg)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
144 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
145 if (!srcFilename)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146 srcFilename = currArg;
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
147 else
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
148 if (!destFilename)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
149 destFilename = currArg;
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
150 else
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
151 {
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
152 dmError("Too many filename arguments (only source and dest needed) '%s'\n", currArg);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153 return FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
155
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
156 return TRUE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
157 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
158
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
159
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
160 BOOL jssWriteChunk(FILE * f, JSSWaveChunk *ch)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
161 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 if (!dm_fwrite_str(f, ch->chunkID, 4)) return FALSE;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
163 return dm_fwrite_le32(f, ch->chunkSize);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
164 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
165
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
166
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
167 void jssMakeChunk(JSSWaveChunk *ch, const char *chunkID, const Uint32 chunkSize)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
168 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
169 memcpy(&(ch->chunkID), (const void *) chunkID, 4);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
170 ch->chunkSize = chunkSize;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
171 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
172
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
173
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
174 void jssWriteWAVHeader(FILE *outFile, int sampBits, int sampFreq, int sampChn, size_t sampLen)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
175 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
176 JSSWaveFile wav;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
178 // PCM WAVE chunk
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
179 jssMakeChunk(&wav.chFormat, JSS_WAVE_FMT_ID, (2 + 2 + 4 + 4 + 2 + 2));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
180
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
181 wav.wFormatTag = JSS_WAVE_FORMAT_PCM;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
182 wav.nChannels = sampChn;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
183 wav.nSamplesPerSec = sampFreq;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
184 wav.nAvgBytesPerSec = (sampBits * sampChn * sampFreq) / 8;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
185 wav.nBlockAlign = (sampBits * sampChn) / 8;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
186 wav.wBitsPerSample = sampBits;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
187
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
188 // Data chunk
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
189 jssMakeChunk(&wav.chData, JSS_WAVE_DATA_ID, (sampLen * wav.nBlockAlign));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
190
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
191 // RIFF header
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
192 memcpy(&wav.riffID, (const void *) JSS_WAVE_RIFF_ID, 4);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
193 memcpy(&wav.riffType, (const void *) JSS_WAVE_WAVE_ID, 4);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
194 wav.fileSize = ((4 + 4 + 4) + wav.chFormat.chunkSize + wav.chData.chunkSize);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
195
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
196 // Write header
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
197 dm_fwrite_str(outFile, wav.riffID, sizeof(wav.riffID));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
198 dm_fwrite_le32(outFile, wav.fileSize);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
199
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
200 dm_fwrite_str(outFile, wav.riffType, sizeof(wav.riffType));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
201 jssWriteChunk(outFile, &wav.chFormat);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
202
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
203 dm_fwrite_le16(outFile, wav.wFormatTag);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
204 dm_fwrite_le16(outFile, wav.nChannels);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
205 dm_fwrite_le32(outFile, wav.nSamplesPerSec);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
206 dm_fwrite_le32(outFile, wav.nAvgBytesPerSec);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
207 dm_fwrite_le16(outFile, wav.nBlockAlign);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
208 dm_fwrite_le16(outFile, wav.wBitsPerSample);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
209
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
210 jssWriteChunk(outFile, &wav.chData);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
211 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
212
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
213
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
214 int main(int argc, char *argv[])
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
215 {
15
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
216 DMResource *inFile = NULL;
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
217 FILE *outFile = NULL;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218 JSSModule *m = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
219 JSSMixer *d = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
220 JSSPlayer *p = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
221 int result = -1;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
222 size_t bufLen = 1024*4, dataTotal, dataWritten, sampSize;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
223 Uint8 *mb = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
224
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
225 dmInitProg("mod2wav", "XM/JSSMOD to WAV renderer", "0.2", NULL, NULL);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
226 dmVerbosity = 1;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
227
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
228 // Parse arguments
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
229 if (!dmArgsProcess(argc, argv, optList, optListN,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
230 argHandleOpt, argHandleFile, TRUE))
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
231 exit(1);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
232
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
233 // Check arguments
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
234 if (!srcFilename || !destFilename)
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
235 {
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
236 dmError("Input or output file not specified!\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
237 return 1;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
238 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
239
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
240 // Initialize miniJSS
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
241 jssInit();
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
242
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
243 // Open the source file
15
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
244 if ((inFile = dmf_create_stdio(srcFilename)) == NULL)
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
245 {
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
246 fprintf(stderr, "Error opening input file '%s'. (%s)\n", srcFilename, strerror(errno));
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
247 return 1;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
248 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
249
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
250 // Read module file
15
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
251 fprintf(stderr, "Reading file: %s\n", srcFilename);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
252 #ifdef JSS_SUP_XM
15
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
253 fprintf(stderr, "* Trying XM...\n");
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
254 result = jssLoadXM(inFile, &m);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
255 #endif
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
256 #ifdef JSS_SUP_JSSMOD
15
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
257 if (result != 0)
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
258 {
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
259 size_t bufgot, bufsize = dmfsize(inFile);
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
260 Uint8 *buf = dmMalloc(bufsize);
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
261 dmfseek(inFile, 0L, SEEK_SET);
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
262 fprintf(stderr, "* Trying JSSMOD (%d bytes, %p)...\n", bufsize, buf);
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
263 if ((bufgot = dmfread(buf, 1, bufsize, inFile)) != bufsize)
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
264 {
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
265 fprintf(stderr, "Error reading file (not enough data %d), #%d: %s\n",
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
266 bufgot, dmferror(inFile), dmErrorStr(dmferror(inFile)));
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 return 2;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269 result = jssLoadJSSMOD(buf, bufsize, &m);
15
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
270 dmFree(buf);
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
271 }
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
272 #endif
15
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
273 dmf_close(inFile);
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
274 if (result != DMERR_OK)
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
275 {
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
276 fprintf(stderr, "Error loading module file, %d: %s\n",
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
277 result, dmErrorStr(result));
feec43a3497c Fix input file reading of mod2wav utility.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
278 return 3;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
279 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
280
49
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
281 // Try to convert it
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
282 if ((result = jssConvertModuleForPlaying(m)) != DMERR_OK)
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
283 {
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
284 fprintf(stderr, "Could not convert module for playing, %d: %s\n",
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
285 result, dmErrorStr(result));
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
286 return 3;
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
287 }
033c660c25f5 Restructure module playing, removing 8bit sample mixing (output can still be
Matti Hamalainen <ccr@tnsp.org>
parents: 39
diff changeset
288
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
289 // Open mixer
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
290 d = jvmInit(optOutFormat, optOutChannels, optOutFreq, JMIX_AUTO);
39
281b080e8c44 More cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 38
diff changeset
291 if (!d)
281b080e8c44 More cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 38
diff changeset
292 {
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
293 fprintf(stderr, "jvmInit() returned NULL\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
294 return 4;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
295 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
296
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
297 sampSize = jvmGetSampleSize(d);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
298 mb = dmMalloc(bufLen * sampSize);
39
281b080e8c44 More cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 38
diff changeset
299 if (!mb)
281b080e8c44 More cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 38
diff changeset
300 {
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
301 fprintf(stderr, "Could not allocate mixing buffer\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
302 return 5;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
303 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
304
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
305 dmMsg(1, "Using fmt=%d, bits=%d, channels=%d, freq=%d [%d / sample]\n",
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
306 optOutFormat, jvmGetSampleRes(d), optOutChannels, optOutFreq,
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
307 sampSize);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
308
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
309 // Initialize player
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
310 p = jmpInit(d);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
311 if (!p) {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
312 fprintf(stderr, "jmpInit() returned NULL\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
313 return 6;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
314 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
315
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
316 // Set callback
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
317 jvmSetCallback(d, jmpExec, p);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
318
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
319 // Initialize playing
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
320 jmpSetModule(p, m);
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
321 if (optStartOrder >= 0)
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
322 {
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
323 dmMsg(1, "Starting from song order #%d\n", optStartOrder);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
324 } else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
325 optStartOrder = 0;
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
326
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
327 jmpPlayOrder(p, optStartOrder);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
328 jvmSetGlobalVol(d, 50);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
329
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
330 if (optMuteOChannels > 0 && optMuteOChannels <= m->nchannels)
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
331 {
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
332 int i;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
333 for (i = 0; i < m->nchannels; i++)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
334 jvmMute(d, i, TRUE);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
335 jvmMute(d, optMuteOChannels - 1, FALSE);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
336 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
337
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
338 // Open output file
37
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
339 if ((outFile = fopen(destFilename, "wb")) == NULL)
cec910d02b26 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 15
diff changeset
340 {
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
341 dmError("Error opening output file '%s'. (%s)\n", srcFilename, strerror(errno));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
342 return 7;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
343 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
344
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
345 // Write initial header
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
346 jssWriteWAVHeader(outFile, jvmGetSampleRes(d), optOutFreq, optOutChannels, 1024);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
347
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
348 // Render audio data and output to file
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
349 if (optUsePlayTime)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
350 dmMsg(1, "Rendering module (%d seconds) ...\n", optPlayTime);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
351 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
352 dmMsg(1, "Rendering module ...\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
353
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
354 optPlayTime *= optOutFreq;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
355 dataTotal = 0;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
356 dataWritten = 1;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
357 while (p->isPlaying && dataWritten > 0)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
358 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
359 size_t writeLen = bufLen;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
360 if (optUsePlayTime && (writeLen + dataTotal) > optPlayTime)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
361 writeLen = optPlayTime - dataTotal;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
362
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
363 if (writeLen > 0)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
364 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
365 jvmRenderAudio(d, mb, writeLen);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
366 #if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
367 jssEncodeSample16((Uint16 *)mb, writeLen * optOutChannels, jsampSwapEndianess);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
368 #endif
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
369 dataWritten = fwrite(mb, sampSize, writeLen, outFile);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
370 if (dataWritten < writeLen)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
371 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
372 dmError("Error writing data!\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
373 fclose(outFile);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
374 return 8;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
375 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
376 dataTotal += dataWritten;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
377 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
378
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
379 if (optUsePlayTime && dataTotal >= optPlayTime)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
380 break;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
381 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
382
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
383 // Write the correct header
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
384 if (fseek(outFile, 0L, SEEK_SET) != 0)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
385 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
386 dmError("Error rewinding to header position!\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
387 return 9;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
388 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
389
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
390 jssWriteWAVHeader(outFile, jvmGetSampleRes(d), optOutFreq, optOutChannels, dataTotal);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
391
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
392 // Done!
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
393 fclose(outFile);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
394 jssFreeModule(m);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
395 dmMsg(1, "OK.\n");
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
396 return 0;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
397 }