Skip to content

Latest commit

 

History

History
392 lines (318 loc) · 11.1 KB

SDL_audiotypecvt.c

File metadata and controls

392 lines (318 loc) · 11.1 KB
 
1
2
/*
Simple DirectMedia Layer
Jan 2, 2017
Jan 2, 2017
3
Copyright (C) 1997-2017 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "../SDL_internal.h"
#include "SDL_audio.h"
#include "SDL_audio_c.h"
Nov 5, 2016
Nov 5, 2016
25
#include "SDL_assert.h"
26
27
28
29
30
#define DIVBY127 0.0078740157480315f
#define DIVBY32767 3.05185094759972e-05f
#define DIVBY2147483647 4.6566128752458e-10f
Nov 5, 2016
Nov 5, 2016
31
32
void SDLCALL
SDL_Convert_S8_to_F32(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
34
35
const Uint8 *src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
float *dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;
Nov 5, 2016
Nov 5, 2016
38
LOG_DEBUG_CONVERT("AUDIO_S8", "AUDIO_F32");
39
40
for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
Nov 5, 2016
Nov 5, 2016
41
*dst = (((float) ((Sint8) *src)) * DIVBY127);
42
43
44
45
}
cvt->len_cvt *= 4;
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
46
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
50
51
void SDLCALL
SDL_Convert_U8_to_F32(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
53
54
const Uint8 *src = ((const Uint8 *) (cvt->buf + cvt->len_cvt)) - 1;
float *dst = ((float *) (cvt->buf + cvt->len_cvt * 4)) - 1;
Nov 5, 2016
Nov 5, 2016
57
LOG_DEBUG_CONVERT("AUDIO_U8", "AUDIO_F32");
58
59
for (i = cvt->len_cvt / sizeof (Uint8); i; --i, --src, --dst) {
Nov 5, 2016
Nov 5, 2016
60
*dst = ((((float) *src) * DIVBY127) - 1.0f);
61
62
63
64
}
cvt->len_cvt *= 4;
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
65
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
69
70
void SDLCALL
SDL_Convert_S16_to_F32(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
72
73
const Sint16 *src = ((const Sint16 *) (cvt->buf + cvt->len_cvt)) - 1;
float *dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
Nov 5, 2016
Nov 5, 2016
76
LOG_DEBUG_CONVERT("AUDIO_S16", "AUDIO_F32");
Nov 5, 2016
Nov 5, 2016
78
79
for (i = cvt->len_cvt / sizeof (Sint16); i; --i, --src, --dst) {
*dst = (((float) *src) * DIVBY32767);
80
81
82
83
}
cvt->len_cvt *= 2;
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
84
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
88
89
void SDLCALL
SDL_Convert_U16_to_F32(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
91
92
const Uint16 *src = ((const Uint16 *) (cvt->buf + cvt->len_cvt)) - 1;
float *dst = ((float *) (cvt->buf + cvt->len_cvt * 2)) - 1;
Nov 5, 2016
Nov 5, 2016
95
LOG_DEBUG_CONVERT("AUDIO_U16", "AUDIO_F32");
Nov 5, 2016
Nov 5, 2016
97
98
for (i = cvt->len_cvt / sizeof (Uint16); i; --i, --src, --dst) {
*dst = ((((float) *src) * DIVBY32767) - 1.0f);
99
100
101
102
}
cvt->len_cvt *= 2;
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
103
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
107
108
void SDLCALL
SDL_Convert_S32_to_F32(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
110
111
const Uint32 *src = (const Uint32 *) cvt->buf;
float *dst = (float *) cvt->buf;
Nov 5, 2016
Nov 5, 2016
114
LOG_DEBUG_CONVERT("AUDIO_S32", "AUDIO_F32");
Nov 5, 2016
Nov 5, 2016
116
117
for (i = cvt->len_cvt / sizeof (Sint32); i; --i, ++src, ++dst) {
*dst = (((float) *src) * DIVBY2147483647);
118
119
120
}
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
121
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
125
126
void SDLCALL
SDL_Convert_F32_to_S8(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
128
129
const float *src = (const float *) cvt->buf;
Sint8 *dst = (Sint8 *) cvt->buf;
Nov 5, 2016
Nov 5, 2016
132
LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_S8");
Nov 5, 2016
Nov 5, 2016
134
135
for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {
*dst = (Sint8) (*src * 127.0f);
Nov 5, 2016
Nov 5, 2016
138
cvt->len_cvt /= 4;
139
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
140
cvt->filters[cvt->filter_index](cvt, AUDIO_S8);
Nov 5, 2016
Nov 5, 2016
144
145
void SDLCALL
SDL_Convert_F32_to_U8(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
147
148
const float *src = (const float *) cvt->buf;
Uint8 *dst = (Uint8 *) cvt->buf;
Nov 5, 2016
Nov 5, 2016
151
LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_U8");
Nov 5, 2016
Nov 5, 2016
153
154
for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {
*dst = (Uint8) ((*src + 1.0f) * 127.0f);
Nov 5, 2016
Nov 5, 2016
157
cvt->len_cvt /= 4;
158
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
159
cvt->filters[cvt->filter_index](cvt, AUDIO_U8);
Nov 5, 2016
Nov 5, 2016
163
164
void SDLCALL
SDL_Convert_F32_to_S16(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
166
167
const float *src = (const float *) cvt->buf;
Sint16 *dst = (Sint16 *) cvt->buf;
Nov 5, 2016
Nov 5, 2016
170
LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_S16");
Nov 5, 2016
Nov 5, 2016
172
173
for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {
*dst = (Sint16) (*src * 32767.0f);
Nov 5, 2016
Nov 5, 2016
176
cvt->len_cvt /= 2;
177
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
178
cvt->filters[cvt->filter_index](cvt, AUDIO_S16SYS);
Nov 5, 2016
Nov 5, 2016
182
183
void SDLCALL
SDL_Convert_F32_to_U16(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
185
186
const float *src = (const float *) cvt->buf;
Uint16 *dst = (Uint16 *) cvt->buf;
Nov 5, 2016
Nov 5, 2016
189
LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_U16");
Nov 5, 2016
Nov 5, 2016
191
192
for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {
*dst = (Uint16) ((*src + 1.0f) * 32767.0f);
Nov 5, 2016
Nov 5, 2016
195
cvt->len_cvt /= 2;
196
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
197
cvt->filters[cvt->filter_index](cvt, AUDIO_U16SYS);
Nov 5, 2016
Nov 5, 2016
201
202
void SDLCALL
SDL_Convert_F32_to_S32(SDL_AudioCVT *cvt, SDL_AudioFormat format)
Nov 5, 2016
Nov 5, 2016
204
205
const float *src = (const float *) cvt->buf;
Sint32 *dst = (Sint32 *) cvt->buf;
Nov 5, 2016
Nov 5, 2016
208
LOG_DEBUG_CONVERT("AUDIO_F32", "AUDIO_S32");
Nov 5, 2016
Nov 5, 2016
210
211
for (i = cvt->len_cvt / sizeof (float); i; --i, ++src, ++dst) {
*dst = (Sint32) (*src * 2147483647.0);
212
213
214
}
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
215
cvt->filters[cvt->filter_index](cvt, AUDIO_S32SYS);
Nov 5, 2016
Nov 5, 2016
219
220
void
SDL_Upsample_Arbitrary(SDL_AudioCVT *cvt, const int channels)
Nov 5, 2016
Nov 5, 2016
222
const int srcsize = cvt->len_cvt - (64 * channels);
Jan 6, 2017
Jan 6, 2017
223
const int dstsize = (int) ((((double)(cvt->len_cvt/(channels*4))) * cvt->rate_incr)) * (channels*4);
Nov 5, 2016
Nov 5, 2016
224
register int eps = 0;
Dec 17, 2016
Dec 17, 2016
225
226
float *dst = ((float *) (cvt->buf + dstsize)) - channels;
const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - channels;
Nov 5, 2016
Nov 5, 2016
227
228
229
const float *target = ((const float *) cvt->buf);
const size_t cpy = sizeof (float) * channels;
float sample[8];
Jan 6, 2017
Jan 6, 2017
230
float last_sample[8];
231
232
233
int i;
#if DEBUG_CONVERT
Nov 5, 2016
Nov 5, 2016
234
fprintf(stderr, "Upsample arbitrary (x%f), %d channels.\n", cvt->rate_incr, channels);
Nov 5, 2016
Nov 5, 2016
237
SDL_assert(channels <= 8);
Jan 6, 2017
Jan 6, 2017
239
240
241
for (i = 0; i < channels; i++) {
sample[i] = (float) ((((double) src[i]) + ((double) src[i - channels])) * 0.5);
}
Nov 5, 2016
Nov 5, 2016
242
SDL_memcpy(last_sample, src, cpy);
Nov 13, 2016
Nov 13, 2016
244
while (dst > target) {
Nov 5, 2016
Nov 5, 2016
245
SDL_memcpy(dst, sample, cpy);
Dec 17, 2016
Dec 17, 2016
246
dst -= channels;
Nov 5, 2016
Nov 5, 2016
247
248
eps += srcsize;
if ((eps << 1) >= dstsize) {
Jan 6, 2017
Jan 6, 2017
249
250
251
252
253
254
255
if (src > target) {
src -= channels;
for (i = 0; i < channels; i++) {
sample[i] = (float) ((((double) src[i]) + ((double) last_sample[i])) * 0.5);
}
} else {
Nov 5, 2016
Nov 5, 2016
256
}
Jan 6, 2017
Jan 6, 2017
257
SDL_memcpy(last_sample, src, cpy);
Nov 5, 2016
Nov 5, 2016
258
259
eps -= dstsize;
}
Nov 5, 2016
Nov 5, 2016
262
cvt->len_cvt = dstsize;
263
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
264
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
268
269
void
SDL_Downsample_Arbitrary(SDL_AudioCVT *cvt, const int channels)
Nov 5, 2016
Nov 5, 2016
271
272
273
274
275
276
277
278
279
const int srcsize = cvt->len_cvt - (64 * channels);
const int dstsize = (int) (((double)(cvt->len_cvt/(channels*4))) * cvt->rate_incr) * (channels*4);
register int eps = 0;
float *dst = (float *) cvt->buf;
const float *src = (float *) cvt->buf;
const float *target = (const float *) (cvt->buf + dstsize);
const size_t cpy = sizeof (float) * channels;
float last_sample[8];
float sample[8];
280
281
282
int i;
#if DEBUG_CONVERT
Nov 5, 2016
Nov 5, 2016
283
fprintf(stderr, "Downsample arbitrary (x%f), %d channels.\n", cvt->rate_incr, channels);
Nov 5, 2016
Nov 5, 2016
286
SDL_assert(channels <= 8);
Nov 5, 2016
Nov 5, 2016
288
289
SDL_memcpy(sample, src, cpy);
SDL_memcpy(last_sample, src, cpy);
Nov 5, 2016
Nov 5, 2016
291
while (dst < target) {
Dec 19, 2016
Dec 19, 2016
292
src += channels;
Nov 5, 2016
Nov 5, 2016
293
294
295
eps += dstsize;
if ((eps << 1) >= srcsize) {
SDL_memcpy(dst, sample, cpy);
Dec 19, 2016
Dec 19, 2016
296
dst += channels;
Nov 5, 2016
Nov 5, 2016
297
298
299
for (i = 0; i < channels; i++) {
sample[i] = (float) ((((double) src[i]) + ((double) last_sample[i])) * 0.5);
}
Jan 6, 2017
Jan 6, 2017
300
SDL_memcpy(last_sample, src, cpy);
Nov 5, 2016
Nov 5, 2016
301
302
eps -= srcsize;
}
Nov 5, 2016
Nov 5, 2016
305
cvt->len_cvt = dstsize;
306
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
307
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
311
void
Jan 6, 2017
Jan 6, 2017
312
SDL_Upsample_Multiple(SDL_AudioCVT *cvt, const int channels)
Jan 6, 2017
Jan 6, 2017
314
315
316
317
const int multiple = (int) cvt->rate_incr;
const int dstsize = cvt->len_cvt * multiple;
float *buf = (float *) cvt->buf;
float *dst = ((float *) (cvt->buf + dstsize)) - channels;
Nov 5, 2016
Nov 5, 2016
318
const float *src = ((float *) (cvt->buf + cvt->len_cvt)) - channels;
Jan 6, 2017
Jan 6, 2017
319
const float *target = buf + channels;
Nov 5, 2016
Nov 5, 2016
320
321
const size_t cpy = sizeof (float) * channels;
float last_sample[8];
322
323
324
int i;
#if DEBUG_CONVERT
Jan 6, 2017
Jan 6, 2017
325
fprintf(stderr, "Upsample (x%d), %d channels.\n", multiple, channels);
Nov 5, 2016
Nov 5, 2016
328
SDL_assert(channels <= 8);
Jan 6, 2017
Jan 6, 2017
329
Nov 5, 2016
Nov 5, 2016
330
331
SDL_memcpy(last_sample, src, cpy);
Nov 13, 2016
Nov 13, 2016
332
while (dst > target) {
Jan 6, 2017
Jan 6, 2017
333
334
SDL_assert(src >= buf);
Nov 5, 2016
Nov 5, 2016
335
336
337
338
for (i = 0; i < channels; i++) {
dst[i] = (float) ((((double)src[i]) + ((double)last_sample[i])) * 0.5);
}
dst -= channels;
Jan 6, 2017
Jan 6, 2017
340
341
342
for (i = 1; i < multiple; i++) {
SDL_memcpy(dst, dst + channels, cpy);
dst -= channels;
Nov 5, 2016
Nov 5, 2016
343
}
Jan 6, 2017
Jan 6, 2017
344
Nov 5, 2016
Nov 5, 2016
345
src -= channels;
Jan 6, 2017
Jan 6, 2017
346
347
348
if (src > buf) {
SDL_memcpy(last_sample, src - channels, cpy);
}
Nov 5, 2016
Nov 5, 2016
351
cvt->len_cvt = dstsize;
352
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
353
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
Nov 5, 2016
Nov 5, 2016
357
void
Jan 6, 2017
Jan 6, 2017
358
SDL_Downsample_Multiple(SDL_AudioCVT *cvt, const int channels)
Jan 6, 2017
Jan 6, 2017
360
const int multiple = (int) (1.0 / cvt->rate_incr);
Nov 5, 2016
Nov 5, 2016
361
362
363
364
365
366
const int dstsize = cvt->len_cvt / multiple;
float *dst = (float *) cvt->buf;
const float *src = (float *) cvt->buf;
const float *target = (const float *) (cvt->buf + dstsize);
const size_t cpy = sizeof (float) * channels;
float last_sample[8];
367
368
369
int i;
#if DEBUG_CONVERT
Nov 5, 2016
Nov 5, 2016
370
fprintf(stderr, "Downsample (x%d), %d channels.\n", multiple, channels);
Nov 5, 2016
Nov 5, 2016
373
374
SDL_assert(channels <= 8);
SDL_memcpy(last_sample, src, cpy);
Nov 5, 2016
Nov 5, 2016
376
377
378
379
380
while (dst < target) {
for (i = 0; i < channels; i++) {
dst[i] = (float) ((((double)src[i]) + ((double)last_sample[i])) * 0.5);
}
dst += channels;
Nov 5, 2016
Nov 5, 2016
382
383
SDL_memcpy(last_sample, src, cpy);
src += (channels * multiple);
Nov 5, 2016
Nov 5, 2016
386
cvt->len_cvt = dstsize;
387
if (cvt->filters[++cvt->filter_index]) {
Nov 5, 2016
Nov 5, 2016
388
cvt->filters[cvt->filter_index](cvt, AUDIO_F32SYS);
389
390
391
392
}
}
/* vi: set ts=4 sw=4 expandtab: */