annotate src/audio/SDL_audiocvt.c @ 2658:de29a03cb108 gsoc2008_audio_resampling

IIR filtering now seems to work fine. Fixed point code also seems to be good.
author Aaron Wishnick <schnarf@gmail.com>
date Thu, 19 Jun 2008 20:11:06 +0000
parents 29306e52dab8
children 8da698bc1205
rev   line source
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1 /*
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
2 SDL - Simple DirectMedia Layer
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1011
diff changeset
3 Copyright (C) 1997-2006 Sam Lantinga
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
4
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
5 This library is free software; you can redistribute it and/or
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1011
diff changeset
6 modify it under the terms of the GNU Lesser General Public
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
7 License as published by the Free Software Foundation; either
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1011
diff changeset
8 version 2.1 of the License, or (at your option) any later version.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
9
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
10 This library is distributed in the hope that it will be useful,
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1011
diff changeset
13 Lesser General Public License for more details.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
14
1312
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1011
diff changeset
15 You should have received a copy of the GNU Lesser General Public
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1011
diff changeset
16 License along with this library; if not, write to the Free Software
c9b51268668f Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents: 1011
diff changeset
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
18
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
19 Sam Lantinga
252
e8157fcb3114 Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents: 0
diff changeset
20 slouken@libsdl.org
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
21 */
1402
d910939febfa Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents: 1358
diff changeset
22 #include "SDL_config.h"
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
23 #include <math.h>
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
24
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
25 /* Functions for audio drivers to perform runtime conversion of audio format */
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
26
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
27 #include "SDL_audio.h"
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
28 #include "SDL_audio_c.h"
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
29
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
30 #define DEBUG_CONVERT
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
31
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
32 /* Perform fractional multiplication of two 32-bit integers to produce a 32-bit result. Assumes sizeof(long) = 4 */
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
33 /*#define SDL_FixMpy32(v1, v2, dest) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
34 long a, b, c, d; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
35 long x, y; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
36 a = (v1 >> 16) & 0xffff; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
37 b = v1 & 0xffff; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
38 c = (v2 >> 16); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
39 d = v2 & 0xffff; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
40 x = a * d + c * b; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
41 y = (((b*d) >> 16) & 0xffff) + x; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
42 dest = ((y >> 16) & 0xffff) + (a * c); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
43 }*/
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
44 /* TODO: Check if 64-bit type exists. If not, see http://www.8052.com/mul16.phtml or http://www.cs.uaf.edu/~cs301/notes/Chapter5/node5.html */
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
45
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
46 /* We hope here that the right shift includes sign extension */
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
47 #ifdef SDL_HAS_64BIT_Type
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
48 #define SDL_FixMpy32(a, b) ((((Sint64)a * (Sint64)b) >> 31) & 0xffffffff)
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
49 #else
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
50 /* need to do something more complicated here */
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
51 #define SDL_FixMpy32(a, b) ((((Sint64)a * (Sint64)b) >> 31) & 0xffffffff)
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
52 #endif
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
53 /* Confirmed that SDL_FixMpy16 works, need to check 8 and 32 */
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
54 #define SDL_FixMpy16(a, b) ((((Sint32)a * (Sint32)b) >> 14) & 0xffff)
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
55 #define SDL_FixMpy8(a, b) ((((Sint16)a * (Sint16)b) >> 7) & 0xff)
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
56 /* Everything is signed! */
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
57 #define SDL_Make_1_7(a) (Sint8)(a * 128.0f)
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
58 #define SDL_Make_1_15(a) (Sint16)(a * 32768.0f)
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
59 #define SDL_Make_1_31(a) (Sint32)(a * 2147483648.0f)
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
60 #define SDL_Make_2_6(a) (Sint8)(a * 64.0f)
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
61 #define SDL_Make_2_14(a) (Sint16)(a * 16384.0f)
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
62 #define SDL_Make_2_30(a) (Sint32)(a * 1073741824.0f)
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
63
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
64 /* Effectively mix right and left channels into a single channel */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
65 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
66 SDL_ConvertMono(SDL_AudioCVT * cvt, SDL_AudioFormat format)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
67 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
68 int i;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
69 Sint32 sample;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
70
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
71 #ifdef DEBUG_CONVERT
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
72 fprintf(stderr, "Converting to mono\n");
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
73 #endif
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
74 switch (format & (SDL_AUDIO_MASK_SIGNED | SDL_AUDIO_MASK_BITSIZE)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
75 case AUDIO_U8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
76 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
77 Uint8 *src, *dst;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
78
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
79 src = cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
80 dst = cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
81 for (i = cvt->len_cvt / 2; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
82 sample = src[0] + src[1];
2042
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
83 *dst = (Uint8) (sample / 2);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
84 src += 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
85 dst += 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
86 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
87 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
88 break;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
89
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
90 case AUDIO_S8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
91 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
92 Sint8 *src, *dst;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
93
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
94 src = (Sint8 *) cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
95 dst = (Sint8 *) cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
96 for (i = cvt->len_cvt / 2; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
97 sample = src[0] + src[1];
2042
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
98 *dst = (Sint8) (sample / 2);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
99 src += 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
100 dst += 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
101 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
102 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
103 break;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
104
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
105 case AUDIO_U16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
106 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
107 Uint8 *src, *dst;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
108
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
109 src = cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
110 dst = cvt->buf;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
111 if (SDL_AUDIO_ISBIGENDIAN(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
112 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
113 sample = (Uint16) ((src[0] << 8) | src[1]) +
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
114 (Uint16) ((src[2] << 8) | src[3]);
2042
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
115 sample /= 2;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
116 dst[1] = (sample & 0xFF);
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
117 sample >>= 8;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
118 dst[0] = (sample & 0xFF);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
119 src += 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
120 dst += 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
121 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
122 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
123 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
124 sample = (Uint16) ((src[1] << 8) | src[0]) +
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
125 (Uint16) ((src[3] << 8) | src[2]);
2042
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
126 sample /= 2;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
127 dst[0] = (sample & 0xFF);
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
128 sample >>= 8;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
129 dst[1] = (sample & 0xFF);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
130 src += 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
131 dst += 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
132 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
133 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
134 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
135 break;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
136
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
137 case AUDIO_S16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
138 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
139 Uint8 *src, *dst;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
140
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
141 src = cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
142 dst = cvt->buf;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
143 if (SDL_AUDIO_ISBIGENDIAN(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
144 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
145 sample = (Sint16) ((src[0] << 8) | src[1]) +
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
146 (Sint16) ((src[2] << 8) | src[3]);
2042
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
147 sample /= 2;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
148 dst[1] = (sample & 0xFF);
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
149 sample >>= 8;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
150 dst[0] = (sample & 0xFF);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
151 src += 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
152 dst += 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
153 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
154 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
155 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
156 sample = (Sint16) ((src[1] << 8) | src[0]) +
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
157 (Sint16) ((src[3] << 8) | src[2]);
2042
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
158 sample /= 2;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
159 dst[0] = (sample & 0xFF);
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
160 sample >>= 8;
3908e1f808e1 Fixed bug #292
Sam Lantinga <slouken@libsdl.org>
parents: 2014
diff changeset
161 dst[1] = (sample & 0xFF);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
162 src += 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
163 dst += 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
164 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
165 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
166 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
167 break;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
168
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
169 case AUDIO_S32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
170 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
171 const Uint32 *src = (const Uint32 *) cvt->buf;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
172 Uint32 *dst = (Uint32 *) cvt->buf;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
173 if (SDL_AUDIO_ISBIGENDIAN(format)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
174 for (i = cvt->len_cvt / 8; i; --i, src += 2) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
175 const Sint64 added =
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
176 (((Sint64) (Sint32) SDL_SwapBE32(src[0])) +
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
177 ((Sint64) (Sint32) SDL_SwapBE32(src[1])));
2078
f932ac47a331 Apparently it's possible that MSVC will want to call a built-in function to
Ryan C. Gordon <icculus@icculus.org>
parents: 2049
diff changeset
178 *(dst++) = SDL_SwapBE32((Uint32) ((Sint32) (added / 2)));
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
179 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
180 } else {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
181 for (i = cvt->len_cvt / 8; i; --i, src += 2) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
182 const Sint64 added =
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
183 (((Sint64) (Sint32) SDL_SwapLE32(src[0])) +
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
184 ((Sint64) (Sint32) SDL_SwapLE32(src[1])));
2078
f932ac47a331 Apparently it's possible that MSVC will want to call a built-in function to
Ryan C. Gordon <icculus@icculus.org>
parents: 2049
diff changeset
185 *(dst++) = SDL_SwapLE32((Uint32) ((Sint32) (added / 2)));
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
186 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
187 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
188 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
189 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
190
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
191 case AUDIO_F32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
192 {
2014
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
193 const float *src = (const float *) cvt->buf;
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
194 float *dst = (float *) cvt->buf;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
195 if (SDL_AUDIO_ISBIGENDIAN(format)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
196 for (i = cvt->len_cvt / 8; i; --i, src += 2) {
2049
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
197 const float src1 = SDL_SwapFloatBE(src[0]);
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
198 const float src2 = SDL_SwapFloatBE(src[1]);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
199 const double added = ((double) src1) + ((double) src2);
2049
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
200 const float halved = (float) (added * 0.5);
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
201 *(dst++) = SDL_SwapFloatBE(halved);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
202 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
203 } else {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
204 for (i = cvt->len_cvt / 8; i; --i, src += 2) {
2049
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
205 const float src1 = SDL_SwapFloatLE(src[0]);
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
206 const float src2 = SDL_SwapFloatLE(src[1]);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
207 const double added = ((double) src1) + ((double) src2);
2049
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
208 const float halved = (float) (added * 0.5);
5f6550e5184f Merged SDL-ryan-multiple-audio-device branch r2803:2871 into the trunk.
Ryan C. Gordon <icculus@icculus.org>
parents: 2042
diff changeset
209 *(dst++) = SDL_SwapFloatLE(halved);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
210 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
211 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
212 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
213 break;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
214 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
215
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
216 cvt->len_cvt /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
217 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
218 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
219 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
220 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
221
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
222
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
223 /* Discard top 4 channels */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
224 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
225 SDL_ConvertStrip(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
226 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
227 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
228
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
229 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
230 fprintf(stderr, "Converting down from 6 channels to stereo\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
231 #endif
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
232
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
233 #define strip_chans_6_to_2(type) \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
234 { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
235 const type *src = (const type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
236 type *dst = (type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
237 for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
238 dst[0] = src[0]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
239 dst[1] = src[1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
240 src += 6; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
241 dst += 2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
242 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
243 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
244
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
245 /* this function only cares about typesize, and data as a block of bits. */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
246 switch (SDL_AUDIO_BITSIZE(format)) {
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
247 case 8:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
248 strip_chans_6_to_2(Uint8);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
249 break;
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
250 case 16:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
251 strip_chans_6_to_2(Uint16);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
252 break;
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
253 case 32:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
254 strip_chans_6_to_2(Uint32);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
255 break;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
256 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
257
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
258 #undef strip_chans_6_to_2
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
259
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
260 cvt->len_cvt /= 3;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
261 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
262 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
263 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
264 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
265
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
266
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
267 /* Discard top 2 channels of 6 */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
268 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
269 SDL_ConvertStrip_2(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
270 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
271 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
272
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
273 #ifdef DEBUG_CONVERT
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
274 fprintf(stderr, "Converting 6 down to quad\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
275 #endif
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
276
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
277 #define strip_chans_6_to_4(type) \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
278 { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
279 const type *src = (const type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
280 type *dst = (type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
281 for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
282 dst[0] = src[0]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
283 dst[1] = src[1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
284 dst[2] = src[2]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
285 dst[3] = src[3]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
286 src += 6; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
287 dst += 4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
288 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
289 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
290
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
291 /* this function only cares about typesize, and data as a block of bits. */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
292 switch (SDL_AUDIO_BITSIZE(format)) {
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
293 case 8:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
294 strip_chans_6_to_4(Uint8);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
295 break;
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
296 case 16:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
297 strip_chans_6_to_4(Uint16);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
298 break;
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
299 case 32:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
300 strip_chans_6_to_4(Uint32);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
301 break;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
302 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
303
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
304 #undef strip_chans_6_to_4
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
305
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
306 cvt->len_cvt /= 6;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
307 cvt->len_cvt *= 4;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
308 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
309 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
310 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
311 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
312
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
313 /* Duplicate a mono channel to both stereo channels */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
314 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
315 SDL_ConvertStereo(SDL_AudioCVT * cvt, SDL_AudioFormat format)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
316 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
317 int i;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
318
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
319 #ifdef DEBUG_CONVERT
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
320 fprintf(stderr, "Converting to stereo\n");
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
321 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
322
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
323 #define dup_chans_1_to_2(type) \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
324 { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
325 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
326 type *dst = (type *) (cvt->buf + cvt->len_cvt * 2); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
327 for (i = cvt->len_cvt / 2; i; --i, --src) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
328 const type val = *src; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
329 dst -= 2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
330 dst[0] = dst[1] = val; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
331 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
332 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
333
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
334 /* this function only cares about typesize, and data as a block of bits. */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
335 switch (SDL_AUDIO_BITSIZE(format)) {
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
336 case 8:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
337 dup_chans_1_to_2(Uint8);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
338 break;
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
339 case 16:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
340 dup_chans_1_to_2(Uint16);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
341 break;
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
342 case 32:
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
343 dup_chans_1_to_2(Uint32);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
344 break;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
345 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
346
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
347 #undef dup_chans_1_to_2
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
348
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
349 cvt->len_cvt *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
350 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
351 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
352 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
353 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
354
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
355
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
356 /* Duplicate a stereo channel to a pseudo-5.1 stream */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
357 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
358 SDL_ConvertSurround(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
359 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
360 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
361
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
362 #ifdef DEBUG_CONVERT
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
363 fprintf(stderr, "Converting stereo to surround\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
364 #endif
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
365
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
366 switch (format & (SDL_AUDIO_MASK_SIGNED | SDL_AUDIO_MASK_BITSIZE)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
367 case AUDIO_U8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
368 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
369 Uint8 *src, *dst, lf, rf, ce;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
370
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
371 src = (Uint8 *) (cvt->buf + cvt->len_cvt);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
372 dst = (Uint8 *) (cvt->buf + cvt->len_cvt * 3);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
373 for (i = cvt->len_cvt; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
374 dst -= 6;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
375 src -= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
376 lf = src[0];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
377 rf = src[1];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
378 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
379 dst[0] = lf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
380 dst[1] = rf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
381 dst[2] = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
382 dst[3] = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
383 dst[4] = ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
384 dst[5] = ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
385 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
386 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
387 break;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
388
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
389 case AUDIO_S8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
390 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
391 Sint8 *src, *dst, lf, rf, ce;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
392
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
393 src = (Sint8 *) cvt->buf + cvt->len_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
394 dst = (Sint8 *) cvt->buf + cvt->len_cvt * 3;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
395 for (i = cvt->len_cvt; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
396 dst -= 6;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
397 src -= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
398 lf = src[0];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
399 rf = src[1];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
400 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
401 dst[0] = lf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
402 dst[1] = rf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
403 dst[2] = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
404 dst[3] = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
405 dst[4] = ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
406 dst[5] = ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
407 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
408 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
409 break;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
410
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
411 case AUDIO_U16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
412 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
413 Uint8 *src, *dst;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
414 Uint16 lf, rf, ce, lr, rr;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
415
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
416 src = cvt->buf + cvt->len_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
417 dst = cvt->buf + cvt->len_cvt * 3;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
418
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
419 if (SDL_AUDIO_ISBIGENDIAN(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
420 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
421 dst -= 12;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
422 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
423 lf = (Uint16) ((src[0] << 8) | src[1]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
424 rf = (Uint16) ((src[2] << 8) | src[3]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
425 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
426 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
427 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
428 dst[1] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
429 dst[0] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
430 dst[3] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
431 dst[2] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
432
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
433 dst[1 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
434 dst[0 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
435 dst[3 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
436 dst[2 + 4] = ((rr >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
437
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
438 dst[1 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
439 dst[0 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
440 dst[3 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
441 dst[2 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
442 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
443 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
444 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
445 dst -= 12;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
446 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
447 lf = (Uint16) ((src[1] << 8) | src[0]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
448 rf = (Uint16) ((src[3] << 8) | src[2]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
449 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
450 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
451 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
452 dst[0] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
453 dst[1] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
454 dst[2] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
455 dst[3] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
456
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
457 dst[0 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
458 dst[1 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
459 dst[2 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
460 dst[3 + 4] = ((rr >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
461
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
462 dst[0 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
463 dst[1 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
464 dst[2 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
465 dst[3 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
466 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
467 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
468 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
469 break;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
470
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
471 case AUDIO_S16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
472 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
473 Uint8 *src, *dst;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
474 Sint16 lf, rf, ce, lr, rr;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
475
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
476 src = cvt->buf + cvt->len_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
477 dst = cvt->buf + cvt->len_cvt * 3;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
478
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
479 if (SDL_AUDIO_ISBIGENDIAN(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
480 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
481 dst -= 12;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
482 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
483 lf = (Sint16) ((src[0] << 8) | src[1]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
484 rf = (Sint16) ((src[2] << 8) | src[3]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
485 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
486 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
487 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
488 dst[1] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
489 dst[0] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
490 dst[3] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
491 dst[2] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
492
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
493 dst[1 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
494 dst[0 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
495 dst[3 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
496 dst[2 + 4] = ((rr >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
497
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
498 dst[1 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
499 dst[0 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
500 dst[3 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
501 dst[2 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
502 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
503 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
504 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
505 dst -= 12;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
506 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
507 lf = (Sint16) ((src[1] << 8) | src[0]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
508 rf = (Sint16) ((src[3] << 8) | src[2]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
509 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
510 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
511 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
512 dst[0] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
513 dst[1] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
514 dst[2] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
515 dst[3] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
516
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
517 dst[0 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
518 dst[1 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
519 dst[2 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
520 dst[3 + 4] = ((rr >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
521
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
522 dst[0 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
523 dst[1 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
524 dst[2 + 8] = (ce & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
525 dst[3 + 8] = ((ce >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
526 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
527 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
528 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
529 break;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
530
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
531 case AUDIO_S32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
532 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
533 Sint32 lf, rf, ce;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
534 const Uint32 *src = (const Uint32 *) cvt->buf + cvt->len_cvt;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
535 Uint32 *dst = (Uint32 *) cvt->buf + cvt->len_cvt * 3;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
536
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
537 if (SDL_AUDIO_ISBIGENDIAN(format)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
538 for (i = cvt->len_cvt / 8; i; --i) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
539 dst -= 6;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
540 src -= 2;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
541 lf = (Sint32) SDL_SwapBE32(src[0]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
542 rf = (Sint32) SDL_SwapBE32(src[1]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
543 ce = (lf / 2) + (rf / 2);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
544 dst[0] = SDL_SwapBE32((Uint32) lf);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
545 dst[1] = SDL_SwapBE32((Uint32) rf);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
546 dst[2] = SDL_SwapBE32((Uint32) (lf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
547 dst[3] = SDL_SwapBE32((Uint32) (rf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
548 dst[4] = SDL_SwapBE32((Uint32) ce);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
549 dst[5] = SDL_SwapBE32((Uint32) ce);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
550 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
551 } else {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
552 for (i = cvt->len_cvt / 8; i; --i) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
553 dst -= 6;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
554 src -= 2;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
555 lf = (Sint32) SDL_SwapLE32(src[0]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
556 rf = (Sint32) SDL_SwapLE32(src[1]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
557 ce = (lf / 2) + (rf / 2);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
558 dst[0] = src[0];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
559 dst[1] = src[1];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
560 dst[2] = SDL_SwapLE32((Uint32) (lf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
561 dst[3] = SDL_SwapLE32((Uint32) (rf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
562 dst[4] = SDL_SwapLE32((Uint32) ce);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
563 dst[5] = SDL_SwapLE32((Uint32) ce);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
564 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
565 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
566 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
567 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
568
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
569 case AUDIO_F32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
570 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
571 float lf, rf, ce;
2014
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
572 const float *src = (const float *) cvt->buf + cvt->len_cvt;
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
573 float *dst = (float *) cvt->buf + cvt->len_cvt * 3;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
574
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
575 if (SDL_AUDIO_ISBIGENDIAN(format)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
576 for (i = cvt->len_cvt / 8; i; --i) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
577 dst -= 6;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
578 src -= 2;
2014
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
579 lf = SDL_SwapFloatBE(src[0]);
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
580 rf = SDL_SwapFloatBE(src[1]);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
581 ce = (lf * 0.5f) + (rf * 0.5f);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
582 dst[0] = src[0];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
583 dst[1] = src[1];
2014
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
584 dst[2] = SDL_SwapFloatBE(lf - ce);
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
585 dst[3] = SDL_SwapFloatBE(rf - ce);
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
586 dst[4] = dst[5] = SDL_SwapFloatBE(ce);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
587 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
588 } else {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
589 for (i = cvt->len_cvt / 8; i; --i) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
590 dst -= 6;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
591 src -= 2;
2014
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
592 lf = SDL_SwapFloatLE(src[0]);
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
593 rf = SDL_SwapFloatLE(src[1]);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
594 ce = (lf * 0.5f) + (rf * 0.5f);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
595 dst[0] = src[0];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
596 dst[1] = src[1];
2014
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
597 dst[2] = SDL_SwapFloatLE(lf - ce);
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
598 dst[3] = SDL_SwapFloatLE(rf - ce);
7abe37467fa5 Replaced unions with calls to SDL_SwapFloat...
Ryan C. Gordon <icculus@icculus.org>
parents: 1985
diff changeset
599 dst[4] = dst[5] = SDL_SwapFloatLE(ce);
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
600 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
601 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
602 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
603 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
604
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
605 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
606 cvt->len_cvt *= 3;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
607 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
608 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
609 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
610 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
611
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
612
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
613 /* Duplicate a stereo channel to a pseudo-4.0 stream */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
614 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
615 SDL_ConvertSurround_4(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
616 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
617 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
618
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
619 #ifdef DEBUG_CONVERT
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
620 fprintf(stderr, "Converting stereo to quad\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
621 #endif
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
622
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
623 switch (format & (SDL_AUDIO_MASK_SIGNED | SDL_AUDIO_MASK_BITSIZE)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
624 case AUDIO_U8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
625 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
626 Uint8 *src, *dst, lf, rf, ce;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
627
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
628 src = (Uint8 *) (cvt->buf + cvt->len_cvt);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
629 dst = (Uint8 *) (cvt->buf + cvt->len_cvt * 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
630 for (i = cvt->len_cvt; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
631 dst -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
632 src -= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
633 lf = src[0];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
634 rf = src[1];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
635 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
636 dst[0] = lf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
637 dst[1] = rf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
638 dst[2] = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
639 dst[3] = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
640 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
641 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
642 break;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
643
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
644 case AUDIO_S8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
645 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
646 Sint8 *src, *dst, lf, rf, ce;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
647
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
648 src = (Sint8 *) cvt->buf + cvt->len_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
649 dst = (Sint8 *) cvt->buf + cvt->len_cvt * 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
650 for (i = cvt->len_cvt; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
651 dst -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
652 src -= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
653 lf = src[0];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
654 rf = src[1];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
655 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
656 dst[0] = lf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
657 dst[1] = rf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
658 dst[2] = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
659 dst[3] = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
660 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
661 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
662 break;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
663
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
664 case AUDIO_U16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
665 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
666 Uint8 *src, *dst;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
667 Uint16 lf, rf, ce, lr, rr;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
668
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
669 src = cvt->buf + cvt->len_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
670 dst = cvt->buf + cvt->len_cvt * 2;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
671
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
672 if (SDL_AUDIO_ISBIGENDIAN(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
673 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
674 dst -= 8;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
675 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
676 lf = (Uint16) ((src[0] << 8) | src[1]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
677 rf = (Uint16) ((src[2] << 8) | src[3]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
678 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
679 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
680 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
681 dst[1] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
682 dst[0] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
683 dst[3] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
684 dst[2] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
685
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
686 dst[1 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
687 dst[0 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
688 dst[3 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
689 dst[2 + 4] = ((rr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
690 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
691 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
692 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
693 dst -= 8;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
694 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
695 lf = (Uint16) ((src[1] << 8) | src[0]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
696 rf = (Uint16) ((src[3] << 8) | src[2]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
697 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
698 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
699 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
700 dst[0] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
701 dst[1] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
702 dst[2] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
703 dst[3] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
704
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
705 dst[0 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
706 dst[1 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
707 dst[2 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
708 dst[3 + 4] = ((rr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
709 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
710 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
711 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
712 break;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
713
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
714 case AUDIO_S16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
715 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
716 Uint8 *src, *dst;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
717 Sint16 lf, rf, ce, lr, rr;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
718
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
719 src = cvt->buf + cvt->len_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
720 dst = cvt->buf + cvt->len_cvt * 2;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
721
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
722 if (SDL_AUDIO_ISBIGENDIAN(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
723 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
724 dst -= 8;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
725 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
726 lf = (Sint16) ((src[0] << 8) | src[1]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
727 rf = (Sint16) ((src[2] << 8) | src[3]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
728 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
729 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
730 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
731 dst[1] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
732 dst[0] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
733 dst[3] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
734 dst[2] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
735
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
736 dst[1 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
737 dst[0 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
738 dst[3 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
739 dst[2 + 4] = ((rr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
740 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
741 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
742 for (i = cvt->len_cvt / 4; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
743 dst -= 8;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
744 src -= 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
745 lf = (Sint16) ((src[1] << 8) | src[0]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
746 rf = (Sint16) ((src[3] << 8) | src[2]);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
747 ce = (lf / 2) + (rf / 2);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
748 rr = lf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
749 lr = rf - ce;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
750 dst[0] = (lf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
751 dst[1] = ((lf >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
752 dst[2] = (rf & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
753 dst[3] = ((rf >> 8) & 0xFF);
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
754
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
755 dst[0 + 4] = (lr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
756 dst[1 + 4] = ((lr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
757 dst[2 + 4] = (rr & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
758 dst[3 + 4] = ((rr >> 8) & 0xFF);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
759 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
760 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
761 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
762 break;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
763
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
764 case AUDIO_S32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
765 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
766 const Uint32 *src = (const Uint32 *) (cvt->buf + cvt->len_cvt);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
767 Uint32 *dst = (Uint32 *) (cvt->buf + cvt->len_cvt * 2);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
768 Sint32 lf, rf, ce;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
769
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
770 if (SDL_AUDIO_ISBIGENDIAN(format)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
771 for (i = cvt->len_cvt / 8; i; --i) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
772 dst -= 4;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
773 src -= 2;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
774 lf = (Sint32) SDL_SwapBE32(src[0]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
775 rf = (Sint32) SDL_SwapBE32(src[1]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
776 ce = (lf / 2) + (rf / 2);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
777 dst[0] = src[0];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
778 dst[1] = src[1];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
779 dst[2] = SDL_SwapBE32((Uint32) (lf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
780 dst[3] = SDL_SwapBE32((Uint32) (rf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
781 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
782 } else {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
783 for (i = cvt->len_cvt / 8; i; --i) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
784 dst -= 4;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
785 src -= 2;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
786 lf = (Sint32) SDL_SwapLE32(src[0]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
787 rf = (Sint32) SDL_SwapLE32(src[1]);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
788 ce = (lf / 2) + (rf / 2);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
789 dst[0] = src[0];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
790 dst[1] = src[1];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
791 dst[2] = SDL_SwapLE32((Uint32) (lf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
792 dst[3] = SDL_SwapLE32((Uint32) (rf - ce));
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
793 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
794 }
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
795 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
796 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
797 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
798 cvt->len_cvt *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
799 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
800 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
801 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
802 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
803
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
804 /* Convert rate up by multiple of 2 */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
805 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
806 SDL_RateMUL2(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
807 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
808 int i;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
809
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
810 #ifdef DEBUG_CONVERT
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
811 fprintf(stderr, "Converting audio rate * 2 (mono)\n");
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
812 #endif
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
813
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
814 #define mul2_mono(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
815 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
816 type *dst = (type *) (cvt->buf + (cvt->len_cvt * 2)); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
817 for (i = cvt->len_cvt / sizeof (type); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
818 src--; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
819 dst[-1] = dst[-2] = src[0]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
820 dst -= 2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
821 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
822 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
823
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
824 switch (SDL_AUDIO_BITSIZE(format)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
825 case 8:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
826 mul2_mono(Uint8);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
827 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
828 case 16:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
829 mul2_mono(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
830 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
831 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
832 mul2_mono(Uint32);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
833 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
834 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
835
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
836 #undef mul2_mono
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
837
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
838 cvt->len_cvt *= 2;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
839 if (cvt->filters[++cvt->filter_index]) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
840 cvt->filters[cvt->filter_index] (cvt, format);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
841 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
842 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
843
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
844
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
845 /* Convert rate up by multiple of 2, for stereo */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
846 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
847 SDL_RateMUL2_c2(SDL_AudioCVT * cvt, SDL_AudioFormat format)
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
848 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
849 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
850
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
851 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
852 fprintf(stderr, "Converting audio rate * 2 (stereo)\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
853 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
854
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
855 #define mul2_stereo(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
856 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
857 type *dst = (type *) (cvt->buf + (cvt->len_cvt * 2)); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
858 for (i = cvt->len_cvt / (sizeof (type) * 2); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
859 const type r = src[-1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
860 const type l = src[-2]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
861 src -= 2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
862 dst[-1] = r; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
863 dst[-2] = l; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
864 dst[-3] = r; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
865 dst[-4] = l; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
866 dst -= 4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
867 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
868 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
869
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
870 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
871 case 8:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
872 mul2_stereo(Uint8);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
873 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
874 case 16:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
875 mul2_stereo(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
876 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
877 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
878 mul2_stereo(Uint32);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
879 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
880 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
881
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
882 #undef mul2_stereo
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
883
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
884 cvt->len_cvt *= 2;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
885 if (cvt->filters[++cvt->filter_index]) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
886 cvt->filters[cvt->filter_index] (cvt, format);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
887 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
888 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
889
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
890 /* Convert rate up by multiple of 2, for quad */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
891 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
892 SDL_RateMUL2_c4(SDL_AudioCVT * cvt, SDL_AudioFormat format)
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
893 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
894 int i;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
895
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
896 #ifdef DEBUG_CONVERT
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
897 fprintf(stderr, "Converting audio rate * 2 (quad)\n");
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
898 #endif
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
899
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
900 #define mul2_quad(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
901 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
902 type *dst = (type *) (cvt->buf + (cvt->len_cvt * 2)); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
903 for (i = cvt->len_cvt / (sizeof (type) * 4); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
904 const type c1 = src[-1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
905 const type c2 = src[-2]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
906 const type c3 = src[-3]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
907 const type c4 = src[-4]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
908 src -= 4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
909 dst[-1] = c1; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
910 dst[-2] = c2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
911 dst[-3] = c3; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
912 dst[-4] = c4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
913 dst[-5] = c1; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
914 dst[-6] = c2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
915 dst[-7] = c3; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
916 dst[-8] = c4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
917 dst -= 8; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
918 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
919 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
920
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
921 switch (SDL_AUDIO_BITSIZE(format)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
922 case 8:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
923 mul2_quad(Uint8);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
924 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
925 case 16:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
926 mul2_quad(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
927 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
928 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
929 mul2_quad(Uint32);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
930 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
931 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
932
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
933 #undef mul2_quad
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
934
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
935 cvt->len_cvt *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
936 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
937 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
938 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
939 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
940
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
941
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
942 /* Convert rate up by multiple of 2, for 5.1 */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
943 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
944 SDL_RateMUL2_c6(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
945 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
946 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
947
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
948 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
949 fprintf(stderr, "Converting audio rate * 2 (six channels)\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
950 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
951
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
952 #define mul2_chansix(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
953 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
954 type *dst = (type *) (cvt->buf + (cvt->len_cvt * 2)); \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
955 for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
956 const type c1 = src[-1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
957 const type c2 = src[-2]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
958 const type c3 = src[-3]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
959 const type c4 = src[-4]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
960 const type c5 = src[-5]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
961 const type c6 = src[-6]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
962 src -= 6; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
963 dst[-1] = c1; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
964 dst[-2] = c2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
965 dst[-3] = c3; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
966 dst[-4] = c4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
967 dst[-5] = c5; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
968 dst[-6] = c6; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
969 dst[-7] = c1; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
970 dst[-8] = c2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
971 dst[-9] = c3; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
972 dst[-10] = c4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
973 dst[-11] = c5; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
974 dst[-12] = c6; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
975 dst -= 12; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
976 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
977 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
978
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
979 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
980 case 8:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
981 mul2_chansix(Uint8);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
982 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
983 case 16:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
984 mul2_chansix(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
985 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
986 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
987 mul2_chansix(Uint32);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
988 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
989 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
990
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
991 #undef mul2_chansix
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
992
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
993 cvt->len_cvt *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
994 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
995 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
996 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
997 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
998
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
999 /* Convert rate down by multiple of 2 */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1000 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1001 SDL_RateDIV2(SDL_AudioCVT * cvt, SDL_AudioFormat format)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1002 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1003 int i;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1004
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1005 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1006 fprintf(stderr, "Converting audio rate / 2 (mono)\n");
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1007 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1008
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1009 #define div2_mono(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1010 const type *src = (const type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1011 type *dst = (type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1012 for (i = cvt->len_cvt / (sizeof (type) * 2); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1013 dst[0] = src[0]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1014 src += 2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1015 dst++; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1016 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1017 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1018
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1019 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1020 case 8:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1021 div2_mono(Uint8);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1022 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1023 case 16:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1024 div2_mono(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1025 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1026 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1027 div2_mono(Uint32);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1028 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1029 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1030
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1031 #undef div2_mono
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1032
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1033 cvt->len_cvt /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1034 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1035 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1036 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1037 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1038
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1039
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1040 /* Convert rate down by multiple of 2, for stereo */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1041 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1042 SDL_RateDIV2_c2(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1043 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1044 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1045
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1046 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1047 fprintf(stderr, "Converting audio rate / 2 (stereo)\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1048 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1049
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1050 #define div2_stereo(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1051 const type *src = (const type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1052 type *dst = (type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1053 for (i = cvt->len_cvt / (sizeof (type) * 4); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1054 dst[0] = src[0]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1055 dst[1] = src[1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1056 src += 4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1057 dst += 2; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1058 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1059 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1060
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1061 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1062 case 8:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1063 div2_stereo(Uint8);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1064 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1065 case 16:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1066 div2_stereo(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1067 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1068 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1069 div2_stereo(Uint32);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1070 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1071 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1072
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1073 #undef div2_stereo
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1074
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1075 cvt->len_cvt /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1076 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1077 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1078 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1079 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1080
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1081
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1082 /* Convert rate down by multiple of 2, for quad */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1083 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1084 SDL_RateDIV2_c4(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1085 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1086 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1087
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1088 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1089 fprintf(stderr, "Converting audio rate / 2 (quad)\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1090 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1091
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1092 #define div2_quad(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1093 const type *src = (const type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1094 type *dst = (type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1095 for (i = cvt->len_cvt / (sizeof (type) * 8); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1096 dst[0] = src[0]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1097 dst[1] = src[1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1098 dst[2] = src[2]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1099 dst[3] = src[3]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1100 src += 8; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1101 dst += 4; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1102 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1103 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1104
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1105 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1106 case 8:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1107 div2_quad(Uint8);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1108 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1109 case 16:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1110 div2_quad(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1111 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1112 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1113 div2_quad(Uint32);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1114 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1115 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1116
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1117 #undef div2_quad
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1118
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1119 cvt->len_cvt /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1120 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1121 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1122 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1123 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1124
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1125 /* Convert rate down by multiple of 2, for 5.1 */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1126 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1127 SDL_RateDIV2_c6(SDL_AudioCVT * cvt, SDL_AudioFormat format)
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1128 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1129 int i;
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1130
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1131 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1132 fprintf(stderr, "Converting audio rate / 2 (six channels)\n");
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1133 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1134
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1135 #define div2_chansix(type) { \
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1136 const type *src = (const type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1137 type *dst = (type *) cvt->buf; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1138 for (i = cvt->len_cvt / (sizeof (type) * 12); i; --i) { \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1139 dst[0] = src[0]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1140 dst[1] = src[1]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1141 dst[2] = src[2]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1142 dst[3] = src[3]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1143 dst[4] = src[4]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1144 dst[5] = src[5]; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1145 src += 12; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1146 dst += 6; \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1147 } \
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1148 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1149
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1150 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1151 case 8:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1152 div2_chansix(Uint8);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1153 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1154 case 16:
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1155 div2_chansix(Uint16);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1156 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1157 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1158 div2_chansix(Uint32);
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1159 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1160 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1161
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1162 #undef div_chansix
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1163
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1164 cvt->len_cvt /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1165 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1166 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1167 }
942
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1168 }
41a59de7f2ed Here are patches for SDL12 and SDL_mixer for 4 or 6 channel
Sam Lantinga <slouken@libsdl.org>
parents: 769
diff changeset
1169
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1170 /* Very slow rate conversion routine */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1171 static void SDLCALL
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1172 SDL_RateSLOW(SDL_AudioCVT * cvt, SDL_AudioFormat format)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1173 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1174 double ipos;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1175 int i, clen;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1176
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1177 #ifdef DEBUG_CONVERT
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1178 fprintf(stderr, "Converting audio rate * %4.4f\n", 1.0 / cvt->rate_incr);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1179 #endif
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1180 clen = (int) ((double) cvt->len_cvt / cvt->rate_incr);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1181 if (cvt->rate_incr > 1.0) {
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1182 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1183 case 8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1184 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1185 Uint8 *output;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1186
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1187 output = cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1188 ipos = 0.0;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1189 for (i = clen; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1190 *output = cvt->buf[(int) ipos];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1191 ipos += cvt->rate_incr;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1192 output += 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1193 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1194 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1195 break;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1196
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1197 case 16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1198 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1199 Uint16 *output;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1200
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1201 clen &= ~1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1202 output = (Uint16 *) cvt->buf;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1203 ipos = 0.0;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1204 for (i = clen / 2; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1205 *output = ((Uint16 *) cvt->buf)[(int) ipos];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1206 ipos += cvt->rate_incr;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1207 output += 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1208 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1209 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1210 break;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1211
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1212 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1213 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1214 /* !!! FIXME: need 32-bit converter here! */
2130
3ee59c43d784 Fixes for compiling with Visual C++ 8.0 Express Edition
Sam Lantinga <slouken@libsdl.org>
parents: 2078
diff changeset
1215 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1216 fprintf(stderr, "FIXME: need 32-bit converter here!\n");
2130
3ee59c43d784 Fixes for compiling with Visual C++ 8.0 Express Edition
Sam Lantinga <slouken@libsdl.org>
parents: 2078
diff changeset
1217 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1218 }
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1219 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1220 } else {
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1221 switch (SDL_AUDIO_BITSIZE(format)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1222 case 8:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1223 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1224 Uint8 *output;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1225
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1226 output = cvt->buf + clen;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1227 ipos = (double) cvt->len_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1228 for (i = clen; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1229 ipos -= cvt->rate_incr;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1230 output -= 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1231 *output = cvt->buf[(int) ipos];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1232 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1233 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1234 break;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1235
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1236 case 16:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1237 {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1238 Uint16 *output;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1239
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1240 clen &= ~1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1241 output = (Uint16 *) (cvt->buf + clen);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1242 ipos = (double) cvt->len_cvt / 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1243 for (i = clen / 2; i; --i) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1244 ipos -= cvt->rate_incr;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1245 output -= 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1246 *output = ((Uint16 *) cvt->buf)[(int) ipos];
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1247 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1248 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1249 break;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1250
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1251 case 32:
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1252 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1253 /* !!! FIXME: need 32-bit converter here! */
2130
3ee59c43d784 Fixes for compiling with Visual C++ 8.0 Express Edition
Sam Lantinga <slouken@libsdl.org>
parents: 2078
diff changeset
1254 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1255 fprintf(stderr, "FIXME: need 32-bit converter here!\n");
2130
3ee59c43d784 Fixes for compiling with Visual C++ 8.0 Express Edition
Sam Lantinga <slouken@libsdl.org>
parents: 2078
diff changeset
1256 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1257 }
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1258 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1259 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1260
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1261 cvt->len_cvt = clen;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1262 if (cvt->filters[++cvt->filter_index]) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1263 cvt->filters[cvt->filter_index] (cvt, format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1264 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1265 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1266
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1267 int
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1268 SDL_ConvertAudio(SDL_AudioCVT * cvt)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1269 {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1270 /* Make sure there's data to convert */
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1271 if (cvt->buf == NULL) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1272 SDL_SetError("No buffer allocated for conversion");
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1273 return (-1);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1274 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1275 /* Return okay if no conversion is necessary */
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1276 cvt->len_cvt = cvt->len;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1277 if (cvt->filters[0] == NULL) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1278 return (0);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1279 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1280
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1281 /* Set up the conversion and go! */
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1282 cvt->filter_index = 0;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1283 cvt->filters[0] (cvt, cvt->src_format);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1284 return (0);
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1285 }
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1286
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1287
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1288 static SDL_AudioFilter
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1289 SDL_HandTunedTypeCVT(SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1290 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1291 /*
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1292 * Fill in any future conversions that are specialized to a
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1293 * processor, platform, compiler, or library here.
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1294 */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1295
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1296 return NULL; /* no specialized converter code available. */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1297 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1298
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1299
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1300 /*
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1301 * Find a converter between two data types. We try to select a hand-tuned
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1302 * asm/vectorized/optimized function first, and then fallback to an
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1303 * autogenerated function that is customized to convert between two
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1304 * specific data types.
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1305 */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1306 static int
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1307 SDL_BuildAudioTypeCVT(SDL_AudioCVT * cvt,
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1308 SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1309 {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1310 if (src_fmt != dst_fmt) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1311 const Uint16 src_bitsize = SDL_AUDIO_BITSIZE(src_fmt);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1312 const Uint16 dst_bitsize = SDL_AUDIO_BITSIZE(dst_fmt);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1313 SDL_AudioFilter filter = SDL_HandTunedTypeCVT(src_fmt, dst_fmt);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1314
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1315 /* No hand-tuned converter? Try the autogenerated ones. */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1316 if (filter == NULL) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1317 int i;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1318 for (i = 0; sdl_audio_type_filters[i].filter != NULL; i++) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1319 const SDL_AudioTypeFilters *filt = &sdl_audio_type_filters[i];
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1320 if ((filt->src_fmt == src_fmt) && (filt->dst_fmt == dst_fmt)) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1321 filter = filt->filter;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1322 break;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1323 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1324 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1325
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1326 if (filter == NULL) {
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1327 return -1; /* Still no matching converter?! */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1328 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1329 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1330
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1331 /* Update (cvt) with filter details... */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1332 cvt->filters[cvt->filter_index++] = filter;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1333 if (src_bitsize < dst_bitsize) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1334 const int mult = (dst_bitsize / src_bitsize);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1335 cvt->len_mult *= mult;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1336 cvt->len_ratio *= mult;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1337 } else if (src_bitsize > dst_bitsize) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1338 cvt->len_ratio /= (src_bitsize / dst_bitsize);
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1339 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1340
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1341 return 1; /* added a converter. */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1342 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1343
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1344 return 0; /* no conversion necessary. */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1345 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1346
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1347 /* Generate the necessary IIR lowpass coefficients for resampling.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1348 Assume that the SDL_AudioCVT struct is already set up with
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1349 the correct values for len_mult and len_div, and use the
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1350 type of dst_format. Also assume the buffer is allocated.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1351 Note the buffer needs to be 6 units long.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1352 For now, use RBJ's cookbook coefficients. It might be more
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1353 optimal to create a Butterworth filter, but this is more difficult.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1354 */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1355 int SDL_BuildIIRLowpass(SDL_AudioCVT * cvt, SDL_AudioFormat format) {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1356 float fc; /* cutoff frequency */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1357 float coeff[6]; /* floating point iir coefficients b0, b1, b2, a0, a1, a2 */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1358 float scale;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1359 float w0, alpha, cosw0;
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1360 int i;
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1361
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1362 /* The higher Q is, the higher CUTOFF can be. Need to find a good balance to avoid aliasing */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1363 static const float Q = 5.0f;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1364 static const float CUTOFF = 0.4f;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1365
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1366 fc = (cvt->len_mult > cvt->len_div) ? CUTOFF / (float)cvt->len_mult : CUTOFF / (float)cvt->len_div;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1367
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1368 w0 = 2.0f * M_PI * fc;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1369 cosw0 = cosf(w0);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1370 alpha = sin(w0) / (2.0f * Q);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1371
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1372 /* Compute coefficients, normalizing by a0 */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1373 scale = 1.0f / (1.0f + alpha);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1374
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1375 coeff[0] = (1.0f - cosw0) / 2.0f * scale;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1376 coeff[1] = (1.0f - cosw0) * scale;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1377 coeff[2] = coeff[0];
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1378
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1379 coeff[3] = 1.0f; /* a0 is normalized to 1 */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1380 coeff[4] = -2.0f * cosw0 * scale;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1381 coeff[5] = (1.0f - alpha) * scale;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1382
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1383 /* Copy the coefficients to the struct. If necessary, convert coefficients to fixed point, using the range (-2.0, 2.0) */
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1384 #define convert_fixed(type, fix) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1385 type *cvt_coeff = (type *)cvt->coeff; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1386 for(i = 0; i < 6; ++i) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1387 cvt_coeff[i] = fix(coeff[i]); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1388 } \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1389 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1390
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1391 if(SDL_AUDIO_ISFLOAT(format) && SDL_AUDIO_BITSIZE(format) == 32) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1392 float *cvt_coeff = (float *)cvt->coeff;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1393 for(i = 0; i < 6; ++i) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1394 cvt_coeff[i] = coeff[i];
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1395 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1396 } else {
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1397 switch(SDL_AUDIO_BITSIZE(format)) {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1398 case 8:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1399 convert_fixed(Uint8, SDL_Make_2_6);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1400 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1401 case 16:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1402 convert_fixed(Uint16, SDL_Make_2_14);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1403 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1404 case 32:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1405 convert_fixed(Uint32, SDL_Make_2_30);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1406 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1407 }
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1408 }
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1409
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1410 #ifdef DEBUG_CONVERT
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1411 #define debug_iir(type) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1412 type *cvt_coeff = (type *)cvt->coeff; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1413 for(i = 0; i < 6; ++i) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1414 printf("coeff[%u] = %f = 0x%x\n", i, coeff[i], cvt_coeff[i]); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1415 } \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1416 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1417 if(SDL_AUDIO_ISFLOAT(format) && SDL_AUDIO_BITSIZE(format) == 32) {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1418 float *cvt_coeff = (float *)cvt->coeff;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1419 for(i = 0; i < 6; ++i) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1420 printf("coeff[%u] = %f = %f\n", i, coeff[i], cvt_coeff[i]); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1421 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1422 } else {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1423 switch(SDL_AUDIO_BITSIZE(format)) {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1424 case 8:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1425 debug_iir(Uint8);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1426 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1427 case 16:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1428 debug_iir(Uint16);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1429 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1430 case 32:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1431 debug_iir(Uint32);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1432 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1433 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1434 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1435 #undef debug_iir
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1436 #endif
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1437
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1438 /* Initialize the state buffer to all zeroes, and set initial position */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1439 memset(cvt->state_buf, 0, 4 * SDL_AUDIO_BITSIZE(format) / 4);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1440 cvt->state_pos = 0;
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1441 #undef convert_fixed
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1442 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1443
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1444 /* Apply the lowpass IIR filter to the given SDL_AudioCVT struct */
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1445 static void SDL_FilterIIR(SDL_AudioCVT * cvt, SDL_AudioFormat format) {
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1446 Uint32 i, n;
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1447
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1448 /* TODO: Check that n is calculated right */
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1449 n = 8 * cvt->len_cvt / SDL_AUDIO_BITSIZE(format);
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1450
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1451 /* Note that the coefficients are 2_x and the input is 1_x. Do we need to shift left at the end here? The right shift temp = buf[n] >> 1 needs to depend on whether the type is signed or not for sign extension.*/
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1452 /* cvt->state_pos = 1: state[0] = x_n-1, state[1] = x_n-2, state[2] = y_n-1, state[3] - y_n-2 */
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1453 #define iir_fix(type, mult) {\
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1454 type *coeff = (type *)cvt->coeff; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1455 type *state = (type *)cvt->state_buf; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1456 type *buf = (type *)cvt->buf; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1457 type temp; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1458 for(i = 0; i < n; ++i) { \
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1459 temp = buf[i] >> 1; \
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1460 if(cvt->state_pos) { \
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1461 buf[i] = mult(coeff[0], temp) + mult(coeff[1], state[0]) + mult(coeff[2], state[1]) - mult(coeff[4], state[2]) - mult(coeff[5], state[3]); \
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1462 state[1] = temp; \
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1463 state[3] = buf[i]; \
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1464 cvt->state_pos = 0; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1465 } else { \
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1466 buf[i] = mult(coeff[0], temp) + mult(coeff[1], state[1]) + mult(coeff[2], state[0]) - mult(coeff[4], state[3]) - mult(coeff[5], state[2]); \
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1467 state[0] = temp; \
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1468 state[2] = buf[i]; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1469 cvt->state_pos = 1; \
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1470 } \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1471 } \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1472 }
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1473 /* Need to test to see if the previous method or this one is faster */
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1474 /*#define iir_fix(type, mult) {\
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1475 type *coeff = (type *)cvt->coeff; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1476 type *state = (type *)cvt->state_buf; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1477 type *buf = (type *)cvt->buf; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1478 type temp; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1479 for(i = 0; i < n; ++i) { \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1480 temp = buf[i] >> 1; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1481 buf[i] = mult(coeff[0], temp) + mult(coeff[1], state[0]) + mult(coeff[2], state[1]) - mult(coeff[4], state[2]) - mult(coeff[5], state[3]); \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1482 state[1] = state[0]; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1483 state[0] = temp; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1484 state[3] = state[2]; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1485 state[2] = buf[i]; \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1486 } \
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1487 }*/
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1488
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1489 if(SDL_AUDIO_ISFLOAT(format) && SDL_AUDIO_BITSIZE(format) == 32) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1490 float *coeff = (float *)cvt->coeff;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1491 float *state = (float *)cvt->state_buf;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1492 float *buf = (float *)cvt->buf;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1493 float temp;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1494
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1495 for(i = 0; i < n; ++i) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1496 /* y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a[2] * y[n-2] */
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1497 temp = buf[i];
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1498 if(cvt->state_pos) {
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1499 buf[i] = coeff[0] * buf[n] + coeff[1] * state[0] + coeff[2] * state[1] - coeff[4] * state[2] - coeff[5] * state[3];
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1500 state[1] = temp;
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1501 state[3] = buf[i];
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1502 cvt->state_pos = 0;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1503 } else {
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1504 buf[i] = coeff[0] * buf[n] + coeff[1] * state[1] + coeff[2] * state[0] - coeff[4] * state[3] - coeff[5] * state[2];
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1505 state[0] = temp;
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1506 state[2] = buf[i];
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1507 cvt->state_pos = 1;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1508 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1509 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1510 } else {
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1511 /* Treat everything as signed! */
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1512 switch(SDL_AUDIO_BITSIZE(format)) {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1513 case 8:
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1514 iir_fix(Sint8, SDL_FixMpy8);
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1515 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1516 case 16:
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1517 iir_fix(Sint16, SDL_FixMpy16);
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1518 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1519 case 32:
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1520 iir_fix(Sint32, SDL_FixMpy32);
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1521 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1522 }
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1523 }
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1524 #undef iir_fix
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1525 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1526
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1527 /* Apply the windowed sinc FIR filter to the given SDL_AudioCVT struct */
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1528 static void SDL_FilterFIR(SDL_AudioCVT * cvt, SDL_AudioFormat format) {
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1529 int n = cvt->len_cvt / (SDL_AUDIO_BITSIZE(format) / 4);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1530 int m = cvt->len_sinc;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1531 int i, j;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1532
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1533 /* Note: this makes use of the symmetry of the sinc filter.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1534 We can also make a big optimization here by taking advantage
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1535 of the fact that the signal is zero stuffed, so we can do
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1536 significantly fewer multiplications and additions.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1537 */
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1538 #define filter_sinc(type, mult) { \
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1539 type *sinc = (type *)cvt->coeff; \
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1540 type *state = (type *)cvt->state_buf; \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1541 type *buf = (type *)cvt->buf; \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1542 for(i = 0; i < n; ++i) { \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1543 if(cvt->state_pos == m) cvt->state_pos = 0; \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1544 buf[i] = 0; \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1545 for(j = 0; j < m; ++j) { \
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1546 buf[i] += mult(state[j], sinc[j]); \
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1547 } \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1548 } \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1549 }
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1550
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1551 /* If it's floating point, we don't need to do any shifting */
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1552 if(SDL_AUDIO_ISFLOAT(format) && SDL_AUDIO_BITSIZE(format) == 32) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1553 float *sinc = (float *)cvt->coeff;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1554 float *state = (float *)cvt->state_buf;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1555 float *buf = (float *)cvt->buf;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1556
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1557 for(i = 0; i < n; ++i) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1558 state[cvt->state_pos++] = buf[i];
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1559 if(cvt->state_pos == m) cvt->state_pos = 0;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1560 buf[i] = 0.0f;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1561 for(j = 0; j < m; ++j) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1562 buf[i] += state[j] * sinc[j];
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1563 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1564 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1565 } else {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1566 switch (SDL_AUDIO_BITSIZE(format)) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1567 case 8:
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1568 filter_sinc(Sint8, SDL_FixMpy8);
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1569 break;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1570 case 16:
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1571 filter_sinc(Sint16, SDL_FixMpy16);
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1572 break;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1573 case 32:
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1574 filter_sinc(Sint32, SDL_FixMpy32);
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1575 break;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1576 }
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1577 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1578
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1579 #undef filter_sinc
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1580
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1581 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1582
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1583 /* Generate the necessary windowed sinc filter for resampling.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1584 Assume that the SDL_AudioCVT struct is already set up with
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1585 the correct values for len_mult and len_div, and use the
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1586 type of dst_format. Also assume the buffer is allocated.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1587 Note the buffer needs to be m+1 units long.
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1588 */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1589 int
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1590 SDL_BuildWindowedSinc(SDL_AudioCVT * cvt, SDL_AudioFormat format, unsigned int m) {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1591 float fScale; /* scale factor for fixed point */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1592 float *fSinc; /* floating point sinc buffer, to be converted to fixed point */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1593 float fc; /* cutoff frequency */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1594 float two_pi_fc, two_pi_over_m, four_pi_over_m, m_over_two;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1595 float norm_sum, norm_fact;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1596 unsigned int i;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1597
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1598 /* Check that the buffer is allocated */
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1599 if( cvt->coeff == NULL ) {
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1600 return -1;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1601 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1602
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1603 /* Set the length */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1604 cvt->len_sinc = m;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1605
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1606 /* Allocate the floating point windowed sinc. */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1607 fSinc = (float *)malloc(m * sizeof(float));
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1608 if( fSinc == NULL ) {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1609 return -1;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1610 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1611
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1612 /* Set up the filter parameters */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1613 fc = (cvt->len_mult > cvt->len_div) ? 0.5f / (float)cvt->len_mult : 0.5f / (float)cvt->len_div;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1614 two_pi_fc = 2.0f * M_PI * fc;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1615 two_pi_over_m = 2.0f * M_PI / (float)m;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1616 four_pi_over_m = 2.0f * two_pi_over_m;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1617 m_over_two = (float)m / 2.0f;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1618 norm_sum = 0.0f;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1619
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1620 for(i = 0; i <= m; ++i ) {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1621 if( i == m/2 ) {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1622 fSinc[i] = two_pi_fc;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1623 } else {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1624 fSinc[i] = sinf(two_pi_fc * ((float)i - m_over_two)) / ((float)i - m_over_two);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1625 /* Apply blackman window */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1626 fSinc[i] *= 0.42f - 0.5f * cosf(two_pi_over_m * (float)i) + 0.08f * cosf(four_pi_over_m * (float)i);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1627 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1628 norm_sum += abs(fSinc[i]);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1629 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1630
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1631 /* Now normalize and convert to fixed point. We scale everything to half the precision
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1632 of whatever datatype we're using, for example, 16 bit data means we use 8 bits */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1633
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1634 #define convert_fixed(type, fix) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1635 norm_fact = 1.0f / norm_sum; \
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1636 type *dst = (type *)cvt->coeff; \
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1637 for( i = 0; i <= m; ++i ) { \
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1638 dst[i] = fix(fSinc[i] * norm_fact); \
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1639 } \
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1640 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1641
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1642 /* If we're using floating point, we only need to normalize */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1643 if(SDL_AUDIO_ISFLOAT(format) && SDL_AUDIO_BITSIZE(format) == 32) {
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1644 float *fDest = (float *)cvt->coeff;
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1645 norm_fact = 1.0f / norm_sum;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1646 for(i = 0; i <= m; ++i) {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1647 fDest[i] = fSinc[i] * norm_fact;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1648 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1649 } else {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1650 switch (SDL_AUDIO_BITSIZE(format)) {
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1651 case 8:
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1652 convert_fixed(Uint8, SDL_Make_1_7);
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1653 break;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1654 case 16:
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1655 convert_fixed(Uint16, SDL_Make_1_15);
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1656 break;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1657 case 32:
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1658 convert_fixed(Uint32, SDL_Make_1_31);
2655
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1659 break;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1660 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1661 }
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1662
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1663 /* Initialize the state buffer to all zeroes, and set initial position */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1664 memset(cvt->state_buf, 0, cvt->len_sinc * SDL_AUDIO_BITSIZE(format) / 4);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1665 cvt->state_pos = 0;
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1666
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1667 /* Clean up */
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1668 #undef convert_fixed
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1669 free(fSinc);
b8e736c8a5a8 Added beginnings of resampling code.
Aaron Wishnick <schnarf@gmail.com>
parents: 2130
diff changeset
1670 }
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1671
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1672 /* This is used to reduce the resampling ratio */
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1673 inline int SDL_GCD(int a, int b) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1674 int temp;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1675 while(b != 0) {
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1676 temp = a % b;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1677 a = b;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1678 b = temp;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1679 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1680 return a;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1681 }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1682
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1683 /* Perform proper resampling */
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1684 static void SDLCALL
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1685 SDL_Resample(SDL_AudioCVT * cvt, SDL_AudioFormat format)
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1686 {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1687 int i, j;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1688
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1689 #ifdef DEBUG_CONVERT
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1690 printf("Converting audio rate via proper resampling (mono)\n");
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1691 #endif
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1692
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1693 #define zerostuff_mono(type) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1694 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1695 type *dst = (type *) (cvt->buf + (cvt->len_cvt * cvt->len_mult)); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1696 for (i = cvt->len_cvt / sizeof (type); i; --i) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1697 src--; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1698 dst[-1] = src[0]; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1699 for( j = -cvt->len_mult; j < -1; ++j ) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1700 dst[j] = 0; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1701 } \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1702 dst -= cvt->len_mult; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1703 } \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1704 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1705
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1706 #define discard_mono(type) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1707 const type *src = (const type *) (cvt->buf); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1708 type *dst = (type *) (cvt->buf); \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1709 for (i = 0; i < cvt->len_cvt / cvt->len_div / sizeof (type); ++i) { \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1710 dst[0] = src[0]; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1711 src += cvt->len_div; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1712 ++dst; \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1713 } \
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1714 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1715
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1716 // Step 1: Zero stuff the conversion buffer
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1717 #ifdef DEBUG_CONVERT
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1718 printf("Zero-stuffing by a factor of %u\n", cvt->len_mult);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1719 #endif
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1720 switch (SDL_AUDIO_BITSIZE(format)) {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1721 case 8:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1722 zerostuff_mono(Uint8);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1723 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1724 case 16:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1725 zerostuff_mono(Uint16);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1726 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1727 case 32:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1728 zerostuff_mono(Uint32);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1729 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1730 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1731
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1732 cvt->len_cvt *= cvt->len_mult;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1733
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1734 // Step 2: Use either a windowed sinc FIR filter or IIR lowpass filter to remove all alias frequencies
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1735 SDL_FilterIIR( cvt, format );
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1736
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1737 // Step 3: Discard unnecessary samples
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1738 #ifdef DEBUG_CONVERT
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1739 printf("Discarding samples by a factor of %u\n", cvt->len_div);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1740 #endif
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1741 switch (SDL_AUDIO_BITSIZE(format)) {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1742 case 8:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1743 discard_mono(Uint8);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1744 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1745 case 16:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1746 discard_mono(Uint16);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1747 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1748 case 32:
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1749 discard_mono(Uint32);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1750 break;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1751 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1752
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1753 #undef zerostuff_mono
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1754 #undef discard_mono
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1755
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1756 cvt->len_cvt /= cvt->len_div;
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1757
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1758 if (cvt->filters[++cvt->filter_index]) {
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1759 cvt->filters[cvt->filter_index] (cvt, format);
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1760 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1761 }
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1762
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1763
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1764 /* Creates a set of audio filters to convert from one format to another.
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1765 Returns -1 if the format conversion is not supported, 0 if there's
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1766 no conversion needed, or 1 if the audio filter is set up.
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1767 */
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1768
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1769 int
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1770 SDL_BuildAudioCVT(SDL_AudioCVT * cvt,
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1771 SDL_AudioFormat src_fmt, Uint8 src_channels, int src_rate,
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1772 SDL_AudioFormat dst_fmt, Uint8 dst_channels, int dst_rate)
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1773 {
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1774 /* there are no unsigned types over 16 bits, so catch this upfront. */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1775 if ((SDL_AUDIO_BITSIZE(src_fmt) > 16) && (!SDL_AUDIO_ISSIGNED(src_fmt))) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1776 return -1;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1777 }
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1778 if ((SDL_AUDIO_BITSIZE(dst_fmt) > 16) && (!SDL_AUDIO_ISSIGNED(dst_fmt))) {
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1779 return -1;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1780 }
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1781 #ifdef DEBUG_CONVERT
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1782 printf("Build format %04x->%04x, channels %u->%u, rate %d->%d\n",
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1783 src_fmt, dst_fmt, src_channels, dst_channels, src_rate, dst_rate);
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1784 #endif
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1785
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1786 /* Start off with no conversion necessary */
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1787
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1788 cvt->src_format = src_fmt;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1789 cvt->dst_format = dst_fmt;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1790 cvt->needed = 0;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1791 cvt->filter_index = 0;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1792 cvt->filters[0] = NULL;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1793 cvt->len_mult = 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1794 cvt->len_ratio = 1.0;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1795
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1796 /* Convert data types, if necessary. Updates (cvt). */
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1797 if (SDL_BuildAudioTypeCVT(cvt, src_fmt, dst_fmt) == -1)
1985
8055185ae4ed Added source color and alpha modulation support.
Sam Lantinga <slouken@libsdl.org>
parents: 1982
diff changeset
1798 return -1; /* shouldn't happen, but just in case... */
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1799
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1800 /* Channel conversion */
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1801 if (src_channels != dst_channels) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1802 if ((src_channels == 1) && (dst_channels > 1)) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1803 cvt->filters[cvt->filter_index++] = SDL_ConvertStereo;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1804 cvt->len_mult *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1805 src_channels = 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1806 cvt->len_ratio *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1807 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1808 if ((src_channels == 2) && (dst_channels == 6)) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1809 cvt->filters[cvt->filter_index++] = SDL_ConvertSurround;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1810 src_channels = 6;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1811 cvt->len_mult *= 3;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1812 cvt->len_ratio *= 3;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1813 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1814 if ((src_channels == 2) && (dst_channels == 4)) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1815 cvt->filters[cvt->filter_index++] = SDL_ConvertSurround_4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1816 src_channels = 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1817 cvt->len_mult *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1818 cvt->len_ratio *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1819 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1820 while ((src_channels * 2) <= dst_channels) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1821 cvt->filters[cvt->filter_index++] = SDL_ConvertStereo;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1822 cvt->len_mult *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1823 src_channels *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1824 cvt->len_ratio *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1825 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1826 if ((src_channels == 6) && (dst_channels <= 2)) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1827 cvt->filters[cvt->filter_index++] = SDL_ConvertStrip;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1828 src_channels = 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1829 cvt->len_ratio /= 3;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1830 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1831 if ((src_channels == 6) && (dst_channels == 4)) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1832 cvt->filters[cvt->filter_index++] = SDL_ConvertStrip_2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1833 src_channels = 4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1834 cvt->len_ratio /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1835 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1836 /* This assumes that 4 channel audio is in the format:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1837 Left {front/back} + Right {front/back}
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1838 so converting to L/R stereo works properly.
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1839 */
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1840 while (((src_channels % 2) == 0) &&
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1841 ((src_channels / 2) >= dst_channels)) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1842 cvt->filters[cvt->filter_index++] = SDL_ConvertMono;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1843 src_channels /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1844 cvt->len_ratio /= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1845 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1846 if (src_channels != dst_channels) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1847 /* Uh oh.. */ ;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1848 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1849 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1850
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1851 /* Do rate conversion */
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1852 int rate_gcd;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1853 rate_gcd = SDL_GCD(src_rate, dst_rate);
2658
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1854 cvt->len_mult = dst_rate / rate_gcd;
de29a03cb108 IIR filtering now seems to work fine. Fixed point code also seems to be good.
Aaron Wishnick <schnarf@gmail.com>
parents: 2657
diff changeset
1855 cvt->len_div = src_rate / rate_gcd;
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1856 cvt->len_ratio = (double)cvt->len_mult / (double)cvt->len_div;
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1857 cvt->filters[cvt->filter_index++] = SDL_Resample;
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1858 SDL_BuildIIRLowpass(cvt, dst_fmt);
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1859
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1860 /*cvt->rate_incr = 0.0;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1861 if ((src_rate / 100) != (dst_rate / 100)) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1862 Uint32 hi_rate, lo_rate;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1863 int len_mult;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1864 double len_ratio;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1865 SDL_AudioFilter rate_cvt = NULL;
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1866
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1867 if (src_rate > dst_rate) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1868 hi_rate = src_rate;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1869 lo_rate = dst_rate;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1870 switch (src_channels) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1871 case 1:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1872 rate_cvt = SDL_RateDIV2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1873 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1874 case 2:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1875 rate_cvt = SDL_RateDIV2_c2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1876 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1877 case 4:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1878 rate_cvt = SDL_RateDIV2_c4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1879 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1880 case 6:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1881 rate_cvt = SDL_RateDIV2_c6;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1882 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1883 default:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1884 return -1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1885 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1886 len_mult = 1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1887 len_ratio = 0.5;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1888 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1889 hi_rate = dst_rate;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1890 lo_rate = src_rate;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1891 switch (src_channels) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1892 case 1:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1893 rate_cvt = SDL_RateMUL2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1894 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1895 case 2:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1896 rate_cvt = SDL_RateMUL2_c2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1897 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1898 case 4:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1899 rate_cvt = SDL_RateMUL2_c4;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1900 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1901 case 6:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1902 rate_cvt = SDL_RateMUL2_c6;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1903 break;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1904 default:
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1905 return -1;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1906 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1907 len_mult = 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1908 len_ratio = 2.0;
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1909 }*/
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1910 /* If hi_rate = lo_rate*2^x then conversion is easy */
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1911 /*while (((lo_rate * 2) / 100) <= (hi_rate / 100)) {
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1912 cvt->filters[cvt->filter_index++] = rate_cvt;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1913 cvt->len_mult *= len_mult;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1914 lo_rate *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1915 cvt->len_ratio *= len_ratio;
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1916 }*/
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1917 /* We may need a slow conversion here to finish up */
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1918 /*if ((lo_rate / 100) != (hi_rate / 100)) {*/
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1919 #if 1
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1920 /* The problem with this is that if the input buffer is
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1921 say 1K, and the conversion rate is say 1.1, then the
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1922 output buffer is 1.1K, which may not be an acceptable
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1923 buffer size for the audio driver (not a power of 2)
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1924 */
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1925 /* For now, punt and hope the rate distortion isn't great.
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1926 */
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1927 #else
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1928 if (src_rate < dst_rate) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1929 cvt->rate_incr = (double) lo_rate / hi_rate;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1930 cvt->len_mult *= 2;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1931 cvt->len_ratio /= cvt->rate_incr;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1932 } else {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1933 cvt->rate_incr = (double) hi_rate / lo_rate;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1934 cvt->len_ratio *= cvt->rate_incr;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1935 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1936 cvt->filters[cvt->filter_index++] = SDL_RateSLOW;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1937 #endif
2656
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1938 /* }
dd74182b3c3c Began implementing IIR and FIR filters, and got zero stuffing and sample discarding working.
Aaron Wishnick <schnarf@gmail.com>
parents: 2655
diff changeset
1939 }*/
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1940
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1941 /* Set up the filter information */
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1942 if (cvt->filter_index != 0) {
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1943 cvt->needed = 1;
1982
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1944 cvt->src_format = src_fmt;
3b4ce57c6215 First shot at new audio data types (int32 and float32).
Ryan C. Gordon <icculus@icculus.org>
parents: 1895
diff changeset
1945 cvt->dst_format = dst_fmt;
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1946 cvt->len = 0;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1947 cvt->buf = NULL;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1948 cvt->filters[cvt->filter_index] = NULL;
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1949 }
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1950 return (cvt->needed);
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1951 }
0
74212992fb08 Initial revision
Sam Lantinga <slouken@lokigames.com>
parents:
diff changeset
1952
2657
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1953 #undef SDL_FixMpy8
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1954 #undef SDL_FixMpy16
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1955 #undef SDL_FixMpy32
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1956 #undef SDL_Make_1_7
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1957 #undef SDL_Make_1_15
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1958 #undef SDL_Make_1_31
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1959 #undef SDL_Make_2_6
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1960 #undef SDL_Make_2_14
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1961 #undef SDL_Make_2_30
29306e52dab8 Implemented a lot of fixed point code for the filters. The SDL_FixMpy functions currently don't work properly -- there are some issues with signed vs unsigned.
Aaron Wishnick <schnarf@gmail.com>
parents: 2656
diff changeset
1962
1895
c121d94672cb SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents: 1769
diff changeset
1963 /* vi: set ts=4 sw=4 expandtab: */