1 /*
2 
3     TiMidity -- Experimental MIDI to WAVE converter
4     Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
5 
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10 
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15 
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 
20     output.c
21 
22     Audio output (to file / device) functions.
23 */
24 
25 #if HAVE_CONFIG_H
26 #  include <config.h>
27 #endif
28 
29 #include "SDL_sound.h"
30 
31 #define __SDL_SOUND_INTERNAL__
32 #include "SDL_sound_internal.h"
33 
34 #include "options.h"
35 #include "output.h"
36 
37 /*****************************************************************/
38 /* Some functions to convert signed 32-bit data to other formats */
39 
40 void s32tos8(void *dp, Sint32 *lp, Sint32 c)
41 {
42   Sint8 *cp=(Sint8 *)(dp);
43   Sint32 l;
44   while (c--)
45     {
46       l=(*lp++)>>(32-8-GUARD_BITS);
47       if (l>127) l=127;
48       else if (l<-128) l=-128;
49       *cp++ = (Sint8) (l);
50     }
51 }
52 
53 void s32tou8(void *dp, Sint32 *lp, Sint32 c)
54 {
55   Uint8 *cp=(Uint8 *)(dp);
56   Sint32 l;
57   while (c--)
58     {
59       l=(*lp++)>>(32-8-GUARD_BITS);
60       if (l>127) l=127;
61       else if (l<-128) l=-128;
62       *cp++ = 0x80 ^ ((Uint8) l);
63     }
64 }
65 
66 void s32tos16(void *dp, Sint32 *lp, Sint32 c)
67 {
68   Sint16 *sp=(Sint16 *)(dp);
69   Sint32 l;
70   while (c--)
71     {
72       l=(*lp++)>>(32-16-GUARD_BITS);
73       if (l > 32767) l=32767;
74       else if (l<-32768) l=-32768;
75       *sp++ = (Sint16)(l);
76     }
77 }
78 
79 void s32tou16(void *dp, Sint32 *lp, Sint32 c)
80 {
81   Uint16 *sp=(Uint16 *)(dp);
82   Sint32 l;
83   while (c--)
84     {
85       l=(*lp++)>>(32-16-GUARD_BITS);
86       if (l > 32767) l=32767;
87       else if (l<-32768) l=-32768;
88       *sp++ = 0x8000 ^ (Uint16)(l);
89     }
90 }
91 
92 void s32tos16x(void *dp, Sint32 *lp, Sint32 c)
93 {
94   Sint16 *sp=(Sint16 *)(dp);
95   Sint32 l;
96   while (c--)
97     {
98       l=(*lp++)>>(32-16-GUARD_BITS);
99       if (l > 32767) l=32767;
100       else if (l<-32768) l=-32768;
101       *sp++ = SDL_Swap16((Sint16)(l));
102     }
103 }
104 
105 void s32tou16x(void *dp, Sint32 *lp, Sint32 c)
106 {
107   Uint16 *sp=(Uint16 *)(dp);
108   Sint32 l;
109   while (c--)
110     {
111       l=(*lp++)>>(32-16-GUARD_BITS);
112       if (l > 32767) l=32767;
113       else if (l<-32768) l=-32768;
114       *sp++ = SDL_Swap16(0x8000 ^ (Uint16)(l));
115     }
116 }
117