1 /*
2     Based on timidity/output.c
3 */
4 
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif /* HAVE_CONFIG_H */
8 #ifdef STDC_HEADERS
9 #include <string.h>
10 #include <ctype.h>
11 #elif HAVE_STRINGS_H
12 #include <strings.h>
13 #endif
14 #include "timidity.h"
15 #include "common.h"
16 #include "output.h"
17 #include "tables.h"
18 #include "controls.h"
19 #include "audio_cnv.h"
20 
21 int audio_buffer_bits = DEFAULT_AUDIO_BUFFER_BITS;
22 
23 /*****************************************************************/
24 /* Some functions to convert signed 32-bit data to other formats */
25 
26 void s32tos8(int32 *lp, int32 c)
27 {
28     int8 *cp=(int8 *)(lp);
29     int32 l, i;
30 
31     for(i = 0; i < c; i++)
32     {
33 	l=(lp[i])>>(32-8-GUARD_BITS);
34 	if (l>127) l=127;
35 	else if (l<-128) l=-128;
36 	cp[i] = (int8)(l);
37     }
38 }
39 
40 void s32tou8(int32 *lp, int32 c)
41 {
42     uint8 *cp=(uint8 *)(lp);
43     int32 l, i;
44 
45     for(i = 0; i < c; i++)
46     {
47 	l=(lp[i])>>(32-8-GUARD_BITS);
48 	if (l>127) l=127;
49 	else if (l<-128) l=-128;
50 	cp[i] = 0x80 ^ ((uint8) l);
51     }
52 }
53 
54 void s32tos16(int32 *lp, int32 c)
55 {
56   int16 *sp=(int16 *)(lp);
57   int32 l, i;
58 
59   for(i = 0; i < c; i++)
60     {
61       l=(lp[i])>>(32-16-GUARD_BITS);
62       if (l > 32767) l=32767;
63       else if (l<-32768) l=-32768;
64       sp[i] = (int16)(l);
65     }
66 }
67 
68 void s32tou16(int32 *lp, int32 c)
69 {
70   uint16 *sp=(uint16 *)(lp);
71   int32 l, i;
72 
73   for(i = 0; i < c; i++)
74     {
75       l=(lp[i])>>(32-16-GUARD_BITS);
76       if (l > 32767) l=32767;
77       else if (l<-32768) l=-32768;
78       sp[i] = 0x8000 ^ (uint16)(l);
79     }
80 }
81 
82 void s32tos16x(int32 *lp, int32 c)
83 {
84   int16 *sp=(int16 *)(lp);
85   int32 l, i;
86 
87   for(i = 0; i < c; i++)
88     {
89       l=(lp[i])>>(32-16-GUARD_BITS);
90       if (l > 32767) l=32767;
91       else if (l<-32768) l=-32768;
92       sp[i] = XCHG_SHORT((int16)(l));
93     }
94 }
95 
96 void s32tou16x(int32 *lp, int32 c)
97 {
98   uint16 *sp=(uint16 *)(lp);
99   int32 l, i;
100 
101   for(i = 0; i < c; i++)
102     {
103       l=(lp[i])>>(32-16-GUARD_BITS);
104       if (l > 32767) l=32767;
105       else if (l<-32768) l=-32768;
106       sp[i] = XCHG_SHORT(0x8000 ^ (uint16)(l));
107     }
108 }
109 
110 #define MAX_24BIT_SIGNED (8388607)
111 #define MIN_24BIT_SIGNED (-8388608)
112 
113 #define STORE_S24_LE(cp, l) *cp++ = l & 0xFF, *cp++ = l >> 8 & 0xFF, *cp++ = l >> 16
114 #define STORE_S24_BE(cp, l) *cp++ = l >> 16, *cp++ = l >> 8 & 0xFF, *cp++ = l & 0xFF
115 #define STORE_U24_LE(cp, l) *cp++ = l & 0xFF, *cp++ = l >> 8 & 0xFF, *cp++ = l >> 16 ^ 0x80
116 #define STORE_U24_BE(cp, l) *cp++ = l >> 16 ^ 0x80, *cp++ = l >> 8 & 0xFF, *cp++ = l & 0xFF
117 
118 #ifdef LITTLE_ENDIAN
119   #define STORE_S24  STORE_S24_LE
120   #define STORE_S24X STORE_S24_BE
121   #define STORE_U24  STORE_U24_LE
122   #define STORE_U24X STORE_U24_BE
123 #else
124   #define STORE_S24  STORE_S24_BE
125   #define STORE_S24X STORE_S24_LE
126   #define STORE_U24  STORE_U24_BE
127   #define STORE_U24X STORE_U24_LE
128 #endif
129 
130 void s32tos24(int32 *lp, int32 c)
131 {
132 	uint8 *cp = (uint8 *)(lp);
133 	int32 l, i;
134 
135 	for(i = 0; i < c; i++)
136 	{
137 		l = (lp[i]) >> (32 - 24 - GUARD_BITS);
138 		l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED
139 				: (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l;
140 		STORE_S24(cp, l);
141 	}
142 }
143 
144 void s32tou24(int32 *lp, int32 c)
145 {
146 	uint8 *cp = (uint8 *)(lp);
147 	int32 l, i;
148 
149 	for(i = 0; i < c; i++)
150 	{
151 		l = (lp[i]) >> (32 - 24 - GUARD_BITS);
152 		l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED
153 				: (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l;
154 		STORE_U24(cp, l);
155 	}
156 }
157 
158 void s32tos24x(int32 *lp, int32 c)
159 {
160 	uint8 *cp = (uint8 *)(lp);
161 	int32 l, i;
162 
163 	for(i = 0; i < c; i++)
164 	{
165 		l = (lp[i]) >> (32 - 24 - GUARD_BITS);
166 		l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED
167 				: (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l;
168 		STORE_S24X(cp, l);
169 	}
170 }
171 
172 void s32tou24x(int32 *lp, int32 c)
173 {
174 	uint8 *cp = (uint8 *)(lp);
175 	int32 l, i;
176 
177 	for(i = 0; i < c; i++)
178 	{
179 		l = (lp[i]) >> (32 - 24 - GUARD_BITS);
180 		l = (l > MAX_24BIT_SIGNED) ? MAX_24BIT_SIGNED
181 				: (l < MIN_24BIT_SIGNED) ? MIN_24BIT_SIGNED : l;
182 		STORE_U24X(cp, l);
183 	}
184 }
185 
186 void s32toulaw(int32 *lp, int32 c)
187 {
188     int8 *up=(int8 *)(lp);
189     int32 l, i;
190 
191     for(i = 0; i < c; i++)
192     {
193 	l=(lp[i])>>(32-16-GUARD_BITS);
194 	if (l > 32767) l=32767;
195 	else if (l<-32768) l=-32768;
196 	up[i] = AUDIO_S2U(l);
197     }
198 }
199 
200 void s32toalaw(int32 *lp, int32 c)
201 {
202     int8 *up=(int8 *)(lp);
203     int32 l, i;
204 
205     for(i = 0; i < c; i++)
206     {
207 	l=(lp[i])>>(32-16-GUARD_BITS);
208 	if (l > 32767) l=32767;
209 	else if (l<-32768) l=-32768;
210 	up[i] = AUDIO_S2A(l);
211     }
212 }
213 
214 /* return: number of bytes */
215 int32 general_output_convert(int32 *buf, int32 count)
216 {
217     int32 bytes;
218 
219     if(!(play_mode->encoding & PE_MONO))
220 	count *= 2; /* Stereo samples */
221     bytes = count;
222     if(play_mode->encoding & PE_16BIT)
223     {
224 	bytes *= 2;
225 	if(play_mode->encoding & PE_BYTESWAP)
226 	{
227 	    if(play_mode->encoding & PE_SIGNED)
228 		s32tos16x(buf, count);
229 	    else
230 		s32tou16x(buf, count);
231 	}
232 	else if(play_mode->encoding & PE_SIGNED)
233 	    s32tos16(buf, count);
234 	else
235 	    s32tou16(buf, count);
236     }
237 	else if(play_mode->encoding & PE_24BIT) {
238 		bytes *= 3;
239 		if(play_mode->encoding & PE_BYTESWAP)
240 		{
241 			if(play_mode->encoding & PE_SIGNED)
242 			s32tos24x(buf, count);
243 			else
244 			s32tou24x(buf, count);
245 		} else if(play_mode->encoding & PE_SIGNED)
246 			s32tos24(buf, count);
247 		else
248 			s32tou24(buf, count);
249     }
250 	else if(play_mode->encoding & PE_ULAW)
251 	s32toulaw(buf, count);
252     else if(play_mode->encoding & PE_ALAW)
253 	s32toalaw(buf, count);
254     else if(play_mode->encoding & PE_SIGNED)
255 	s32tos8(buf, count);
256     else
257 	s32tou8(buf, count);
258     return bytes;
259 }
260 
261 int validate_encoding(int enc, int include_enc, int exclude_enc)
262 {
263     const char *orig_enc_name, *enc_name;
264 
265     orig_enc_name = output_encoding_string(enc);
266     enc |= include_enc;
267     enc &= ~exclude_enc;
268     if(enc & (PE_ULAW|PE_ALAW))
269 	enc &= ~(PE_24BIT|PE_16BIT|PE_SIGNED|PE_BYTESWAP);
270     if(!(enc & PE_16BIT || enc & PE_24BIT))
271 	enc &= ~PE_BYTESWAP;
272     if(enc & PE_24BIT)
273 	enc &= ~PE_16BIT;	/* 24bit overrides 16bit */
274     enc_name = output_encoding_string(enc);
275     if(strcmp(orig_enc_name, enc_name) != 0)
276 	ctl->cmsg(CMSG_WARNING, VERB_NOISY,
277 		  "Notice: Audio encoding is changed `%s' to `%s'",
278 		  orig_enc_name, enc_name);
279     return enc;
280 }
281 
282 int32 apply_encoding(int32 old_enc, int32 new_enc)
283 {
284 	const int32 mutex_flags[] = {
285 		PE_16BIT | PE_24BIT | PE_ULAW | PE_ALAW,
286 		PE_BYTESWAP | PE_ULAW | PE_ALAW,
287 		PE_SIGNED | PE_ULAW | PE_ALAW,
288 	};
289 	int i;
290 
291 	for (i = 0; i < sizeof mutex_flags / sizeof mutex_flags[0]; i++) {
292 		if (new_enc & mutex_flags[i])
293 			old_enc &= ~mutex_flags[i];
294 	}
295 	return old_enc | new_enc;
296 }
297 
298 const char *output_encoding_string(int enc)
299 {
300     if(enc & PE_MONO)
301     {
302 	if(enc & PE_16BIT)
303 	{
304 	    if(enc & PE_SIGNED)
305 		return "16bit (mono)";
306 	    else
307 		return "unsigned 16bit (mono)";
308 	}
309 	else if(enc & PE_24BIT)
310 	{
311 	    if(enc & PE_SIGNED)
312 		return "24bit (mono)";
313 	    else
314 		return "unsigned 24bit (mono)";
315 	}
316 	else
317 	{
318 	    if(enc & PE_ULAW)
319 		return "U-law (mono)";
320 	    else if(enc & PE_ALAW)
321 		return "A-law (mono)";
322 	    else if(enc & PE_SIGNED)
323 		return "8bit (mono)";
324 	    else
325 		return "unsigned 8bit (mono)";
326 	}
327     }
328     else if(enc & PE_16BIT)
329     {
330 	if(enc & PE_BYTESWAP)
331 	{
332 	    if(enc & PE_SIGNED)
333 		return "16bit (swap)";
334 	    else
335 		return "unsigned 16bit (swap)";
336 	}
337 	else if(enc & PE_SIGNED)
338 	    return "16bit";
339 	else
340 	    return "unsigned 16bit";
341     }
342     else if(enc & PE_24BIT)
343     {
344 	if(enc & PE_SIGNED)
345 	    return "24bit";
346 	else
347 	    return "unsigned 24bit";
348     }
349     else
350 	if(enc & PE_ULAW)
351 	    return "U-law";
352 	else if(enc & PE_ALAW)
353 	    return "A-law";
354 	else if(enc & PE_SIGNED)
355 	    return "8bit";
356 	else
357 	    return "unsigned 8bit";
358     /*NOTREACHED*/
359 }
360 
361 int get_encoding_sample_size(int32 enc)
362 {
363 	int size = (enc & PE_MONO) ? 1 : 2;
364 
365 	if (enc & PE_24BIT)
366 		size *= 3;
367 	else if (enc & PE_16BIT)
368 		size *= 2;
369 	return size;
370 }
371