/
output.c
129 lines (112 loc) · 2.45 KB
1
2
/*
3
4
5
6
TiMidity -- Experimental MIDI to WAVE converter
Copyright (C) 1995 Tuukka Toivonen <toivonen@clinet.fi>
This program is free software; you can redistribute it and/or modify
7
it under the terms of the Perl Artistic License, available in COPYING.
8
9
10
11
12
output.c
Audio output (to file / device) functions.
*/
13
14
15
#if HAVE_CONFIG_H
# include <config.h>
16
17
#endif
18
#include "SDL.h"
19
20
21
#include "options.h"
#include "output.h"
22
23
24
25
/*****************************************************************/
/* Some functions to convert signed 32-bit data to other formats */
26
void s32tos8(void *dp, Sint32 *lp, Sint32 c)
27
{
28
29
Sint8 *cp=(Sint8 *)(dp);
Sint32 l;
30
31
32
33
34
while (c--)
{
l=(*lp++)>>(32-8-GUARD_BITS);
if (l>127) l=127;
else if (l<-128) l=-128;
35
*cp++ = (Sint8) (l);
36
37
38
}
}
39
void s32tou8(void *dp, Sint32 *lp, Sint32 c)
40
{
41
42
Uint8 *cp=(Uint8 *)(dp);
Sint32 l;
43
44
45
46
47
while (c--)
{
l=(*lp++)>>(32-8-GUARD_BITS);
if (l>127) l=127;
else if (l<-128) l=-128;
48
*cp++ = 0x80 ^ ((Uint8) l);
49
50
51
}
}
52
void s32tos16(void *dp, Sint32 *lp, Sint32 c)
53
{
54
55
Sint16 *sp=(Sint16 *)(dp);
Sint32 l;
56
57
58
59
60
while (c--)
{
l=(*lp++)>>(32-16-GUARD_BITS);
if (l > 32767) l=32767;
else if (l<-32768) l=-32768;
61
*sp++ = (Sint16)(l);
62
63
64
}
}
65
void s32tou16(void *dp, Sint32 *lp, Sint32 c)
66
{
67
68
Uint16 *sp=(Uint16 *)(dp);
Sint32 l;
69
70
71
72
73
while (c--)
{
l=(*lp++)>>(32-16-GUARD_BITS);
if (l > 32767) l=32767;
else if (l<-32768) l=-32768;
74
*sp++ = 0x8000 ^ (Uint16)(l);
75
76
77
}
}
78
void s32tos16x(void *dp, Sint32 *lp, Sint32 c)
79
{
80
81
Sint16 *sp=(Sint16 *)(dp);
Sint32 l;
82
83
84
85
86
while (c--)
{
l=(*lp++)>>(32-16-GUARD_BITS);
if (l > 32767) l=32767;
else if (l<-32768) l=-32768;
87
*sp++ = SDL_Swap16((Sint16)(l));
88
89
90
}
}
91
void s32tou16x(void *dp, Sint32 *lp, Sint32 c)
92
{
93
94
Uint16 *sp=(Uint16 *)(dp);
Sint32 l;
95
96
97
98
99
while (c--)
{
l=(*lp++)>>(32-16-GUARD_BITS);
if (l > 32767) l=32767;
else if (l<-32768) l=-32768;
100
*sp++ = SDL_Swap16(0x8000 ^ (Uint16)(l));
101
102
}
}
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
void s32tof32(void *dp, Sint32 *lp, Sint32 c)
{
float *sp=(float *)(dp);
while (c--)
{
*sp++ = (float)(*lp++) / 2147483647.0f;
}
}
void s32tos32(void *dp, Sint32 *lp, Sint32 c)
{
Sint32 *sp=(Sint32 *)(dp);
while (c--)
{
*sp++ = (*lp++);
}
}
void s32tos32x(void *dp, Sint32 *lp, Sint32 c)
{
Sint32 *sp=(Sint32 *)(dp);
while (c--)
{
*sp++ = SDL_Swap32(*lp++);
}
}