40 fprintf(stderr,
"Converting to mono\n");
49 for (i = cvt->
len_cvt / 2; i; --i) {
50 sample = src[0] + src[1];
51 *dst = (
Uint8) (sample / 2);
64 for (i = cvt->
len_cvt / 2; i; --i) {
65 sample = src[0] + src[1];
66 *dst = (
Sint8) (sample / 2);
80 for (i = cvt->
len_cvt / 4; i; --i) {
81 sample = (
Uint16) ((src[0] << 8) | src[1]) +
82 (
Uint16) ((src[2] << 8) | src[3]);
84 dst[1] = (sample & 0xFF);
86 dst[0] = (sample & 0xFF);
91 for (i = cvt->
len_cvt / 4; i; --i) {
92 sample = (
Uint16) ((src[1] << 8) | src[0]) +
93 (
Uint16) ((src[3] << 8) | src[2]);
95 dst[0] = (sample & 0xFF);
97 dst[1] = (sample & 0xFF);
112 for (i = cvt->
len_cvt / 4; i; --i) {
113 sample = (
Sint16) ((src[0] << 8) | src[1]) +
114 (
Sint16) ((src[2] << 8) | src[3]);
116 dst[1] = (sample & 0xFF);
118 dst[0] = (sample & 0xFF);
123 for (i = cvt->
len_cvt / 4; i; --i) {
124 sample = (
Sint16) ((src[1] << 8) | src[0]) +
125 (
Sint16) ((src[3] << 8) | src[2]);
127 dst[0] = (sample & 0xFF);
129 dst[1] = (sample & 0xFF);
142 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
149 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
161 const float *
src = (
const float *) cvt->
buf;
162 float *
dst = (
float *) cvt->
buf;
164 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
167 const double added = ((double) src1) + ((double) src2);
168 const float halved = (float) (added * 0.5);
172 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
175 const double added = ((double) src1) + ((double) src2);
176 const float halved = (float) (added * 0.5);
198 fprintf(stderr,
"Converting down from 6 channels to stereo\n");
201 #define strip_chans_6_to_2(type) \
203 const type *src = (const type *) cvt->buf; \
204 type *dst = (type *) cvt->buf; \
205 for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \
226 #undef strip_chans_6_to_2
242 fprintf(stderr,
"Converting 6 down to quad\n");
245 #define strip_chans_6_to_4(type) \
247 const type *src = (const type *) cvt->buf; \
248 type *dst = (type *) cvt->buf; \
249 for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \
272 #undef strip_chans_6_to_4
288 fprintf(stderr,
"Converting to stereo\n");
291 #define dup_chans_1_to_2(type) \
293 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \
294 type *dst = (type *) (cvt->buf + cvt->len_cvt * 2); \
295 for (i = cvt->len_cvt / sizeof(type); i; --i) { \
298 dst[0] = dst[1] = *src; \
315 #undef dup_chans_1_to_2
331 fprintf(stderr,
"Converting stereo to surround\n");
341 for (i = cvt->
len_cvt; i; --i) {
346 ce = (lf / 2) + (rf / 2);
363 for (i = cvt->
len_cvt; i; --i) {
368 ce = (lf / 2) + (rf / 2);
382 Uint16 lf, rf, ce, lr, rr;
388 for (i = cvt->
len_cvt / 4; i; --i) {
391 lf = (
Uint16) ((src[0] << 8) | src[1]);
392 rf = (
Uint16) ((src[2] << 8) | src[3]);
393 ce = (lf / 2) + (rf / 2);
396 dst[1] = (lf & 0xFF);
397 dst[0] = ((lf >> 8) & 0xFF);
398 dst[3] = (rf & 0xFF);
399 dst[2] = ((rf >> 8) & 0xFF);
401 dst[1 + 4] = (lr & 0xFF);
402 dst[0 + 4] = ((lr >> 8) & 0xFF);
403 dst[3 + 4] = (rr & 0xFF);
404 dst[2 + 4] = ((rr >> 8) & 0xFF);
406 dst[1 + 8] = (ce & 0xFF);
407 dst[0 + 8] = ((ce >> 8) & 0xFF);
408 dst[3 + 8] = (ce & 0xFF);
409 dst[2 + 8] = ((ce >> 8) & 0xFF);
412 for (i = cvt->
len_cvt / 4; i; --i) {
415 lf = (
Uint16) ((src[1] << 8) | src[0]);
416 rf = (
Uint16) ((src[3] << 8) | src[2]);
417 ce = (lf / 2) + (rf / 2);
420 dst[0] = (lf & 0xFF);
421 dst[1] = ((lf >> 8) & 0xFF);
422 dst[2] = (rf & 0xFF);
423 dst[3] = ((rf >> 8) & 0xFF);
425 dst[0 + 4] = (lr & 0xFF);
426 dst[1 + 4] = ((lr >> 8) & 0xFF);
427 dst[2 + 4] = (rr & 0xFF);
428 dst[3 + 4] = ((rr >> 8) & 0xFF);
430 dst[0 + 8] = (ce & 0xFF);
431 dst[1 + 8] = ((ce >> 8) & 0xFF);
432 dst[2 + 8] = (ce & 0xFF);
433 dst[3 + 8] = ((ce >> 8) & 0xFF);
442 Sint16 lf, rf, ce, lr, rr;
448 for (i = cvt->
len_cvt / 4; i; --i) {
451 lf = (
Sint16) ((src[0] << 8) | src[1]);
452 rf = (
Sint16) ((src[2] << 8) | src[3]);
453 ce = (lf / 2) + (rf / 2);
456 dst[1] = (lf & 0xFF);
457 dst[0] = ((lf >> 8) & 0xFF);
458 dst[3] = (rf & 0xFF);
459 dst[2] = ((rf >> 8) & 0xFF);
461 dst[1 + 4] = (lr & 0xFF);
462 dst[0 + 4] = ((lr >> 8) & 0xFF);
463 dst[3 + 4] = (rr & 0xFF);
464 dst[2 + 4] = ((rr >> 8) & 0xFF);
466 dst[1 + 8] = (ce & 0xFF);
467 dst[0 + 8] = ((ce >> 8) & 0xFF);
468 dst[3 + 8] = (ce & 0xFF);
469 dst[2 + 8] = ((ce >> 8) & 0xFF);
472 for (i = cvt->
len_cvt / 4; i; --i) {
475 lf = (
Sint16) ((src[1] << 8) | src[0]);
476 rf = (
Sint16) ((src[3] << 8) | src[2]);
477 ce = (lf / 2) + (rf / 2);
480 dst[0] = (lf & 0xFF);
481 dst[1] = ((lf >> 8) & 0xFF);
482 dst[2] = (rf & 0xFF);
483 dst[3] = ((rf >> 8) & 0xFF);
485 dst[0 + 4] = (lr & 0xFF);
486 dst[1 + 4] = ((lr >> 8) & 0xFF);
487 dst[2 + 4] = (rr & 0xFF);
488 dst[3 + 4] = ((rr >> 8) & 0xFF);
490 dst[0 + 8] = (ce & 0xFF);
491 dst[1 + 8] = ((ce >> 8) & 0xFF);
492 dst[2 + 8] = (ce & 0xFF);
493 dst[3 + 8] = ((ce >> 8) & 0xFF);
506 for (i = cvt->
len_cvt / 8; i; --i) {
511 ce = (lf / 2) + (rf / 2);
520 for (i = cvt->
len_cvt / 8; i; --i) {
525 ce = (lf / 2) + (rf / 2);
544 for (i = cvt->
len_cvt / 8; i; --i) {
549 ce = (lf * 0.5f) + (rf * 0.5
f);
557 for (i = cvt->
len_cvt / 8; i; --i) {
562 ce = (lf * 0.5f) + (rf * 0.5
f);
588 fprintf(stderr,
"Converting stereo to quad\n");
598 for (i = cvt->
len_cvt; i; --i) {
603 ce = (lf / 2) + (rf / 2);
618 for (i = cvt->
len_cvt; i; --i) {
623 ce = (lf / 2) + (rf / 2);
635 Uint16 lf, rf, ce, lr, rr;
641 for (i = cvt->
len_cvt / 4; i; --i) {
644 lf = (
Uint16) ((src[0] << 8) | src[1]);
645 rf = (
Uint16) ((src[2] << 8) | src[3]);
646 ce = (lf / 2) + (rf / 2);
649 dst[1] = (lf & 0xFF);
650 dst[0] = ((lf >> 8) & 0xFF);
651 dst[3] = (rf & 0xFF);
652 dst[2] = ((rf >> 8) & 0xFF);
654 dst[1 + 4] = (lr & 0xFF);
655 dst[0 + 4] = ((lr >> 8) & 0xFF);
656 dst[3 + 4] = (rr & 0xFF);
657 dst[2 + 4] = ((rr >> 8) & 0xFF);
660 for (i = cvt->
len_cvt / 4; i; --i) {
663 lf = (
Uint16) ((src[1] << 8) | src[0]);
664 rf = (
Uint16) ((src[3] << 8) | src[2]);
665 ce = (lf / 2) + (rf / 2);
668 dst[0] = (lf & 0xFF);
669 dst[1] = ((lf >> 8) & 0xFF);
670 dst[2] = (rf & 0xFF);
671 dst[3] = ((rf >> 8) & 0xFF);
673 dst[0 + 4] = (lr & 0xFF);
674 dst[1 + 4] = ((lr >> 8) & 0xFF);
675 dst[2 + 4] = (rr & 0xFF);
676 dst[3 + 4] = ((rr >> 8) & 0xFF);
685 Sint16 lf, rf, ce, lr, rr;
691 for (i = cvt->
len_cvt / 4; i; --i) {
694 lf = (
Sint16) ((src[0] << 8) | src[1]);
695 rf = (
Sint16) ((src[2] << 8) | src[3]);
696 ce = (lf / 2) + (rf / 2);
699 dst[1] = (lf & 0xFF);
700 dst[0] = ((lf >> 8) & 0xFF);
701 dst[3] = (rf & 0xFF);
702 dst[2] = ((rf >> 8) & 0xFF);
704 dst[1 + 4] = (lr & 0xFF);
705 dst[0 + 4] = ((lr >> 8) & 0xFF);
706 dst[3 + 4] = (rr & 0xFF);
707 dst[2 + 4] = ((rr >> 8) & 0xFF);
710 for (i = cvt->
len_cvt / 4; i; --i) {
713 lf = (
Sint16) ((src[1] << 8) | src[0]);
714 rf = (
Sint16) ((src[3] << 8) | src[2]);
715 ce = (lf / 2) + (rf / 2);
718 dst[0] = (lf & 0xFF);
719 dst[1] = ((lf >> 8) & 0xFF);
720 dst[2] = (rf & 0xFF);
721 dst[3] = ((rf >> 8) & 0xFF);
723 dst[0 + 4] = (lr & 0xFF);
724 dst[1 + 4] = ((lr >> 8) & 0xFF);
725 dst[2 + 4] = (rr & 0xFF);
726 dst[3 + 4] = ((rr >> 8) & 0xFF);
739 for (i = cvt->
len_cvt / 8; i; --i) {
744 ce = (lf / 2) + (rf / 2);
751 for (i = cvt->
len_cvt / 8; i; --i) {
756 ce = (lf / 2) + (rf / 2);
797 static SDL_AudioFilter
819 if (src_fmt != dst_fmt) {
825 if (filter ==
NULL) {
835 if (filter ==
NULL) {
836 SDL_SetError(
"No conversion available for these formats");
843 if (src_bitsize < dst_bitsize) {
844 const int mult = (dst_bitsize / src_bitsize);
847 }
else if (src_bitsize > dst_bitsize) {
848 cvt->
len_ratio /= (src_bitsize / dst_bitsize);
858 static SDL_AudioFilter
860 int src_rate,
int dst_rate)
884 if (src_rate < dst_rate) {
897 retval = ((div == 2) || (div == 4)) ? div : 0;
905 int src_rate,
int dst_rate)
907 if (src_rate != dst_rate) {
912 if (filter ==
NULL) {
914 const int upsample = (src_rate < dst_rate) ? 1 : 0;
929 if (filter ==
NULL) {
930 SDL_SetError(
"No conversion available for these rates");
937 if (src_rate < dst_rate) {
938 const double mult = ((double) dst_rate) / ((double) src_rate);
942 cvt->
len_ratio /= ((double) src_rate) / ((double) dst_rate);
984 if ((src_channels == 0) || (dst_channels == 0)) {
985 return SDL_SetError(
"Source or destination channels is zero");
987 if ((src_rate == 0) || (dst_rate == 0)) {
988 return SDL_SetError(
"Source or destination rate is zero");
991 printf(
"Build format %04x->%04x, channels %u->%u, rate %d->%d\n",
992 src_fmt, dst_fmt, src_channels, dst_channels, src_rate, dst_rate);
1004 cvt->
rate_incr = ((double) dst_rate) / ((double) src_rate);
1012 if (src_channels != dst_channels) {
1013 if ((src_channels == 1) && (dst_channels > 1)) {
1019 if ((src_channels == 2) && (dst_channels == 6)) {
1025 if ((src_channels == 2) && (dst_channels == 4)) {
1031 while ((src_channels * 2) <= dst_channels) {
1037 if ((src_channels == 6) && (dst_channels <= 2)) {
1042 if ((src_channels == 6) && (dst_channels == 4)) {
1051 while (((src_channels % 2) == 0) &&
1052 ((src_channels / 2) >= dst_channels)) {
1057 if (src_channels != dst_channels) {
#define SDL_SwapFloatBE(X)
static void SDLCALL SDL_ConvertMono(SDL_AudioCVT *cvt, SDL_AudioFormat format)
int32_t Sint32
A signed 32-bit integer type.
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
#define SDL_AUDIO_ISBIGENDIAN(x)
#define strip_chans_6_to_4(type)
#define dup_chans_1_to_2(type)
static void SDLCALL SDL_ConvertStrip(SDL_AudioCVT *cvt, SDL_AudioFormat format)
#define SDL_AUDIO_ISSIGNED(x)
Uint16 SDL_AudioFormat
Audio format flags.
const SDL_AudioTypeFilters sdl_audio_type_filters[]
#define SDL_SwapFloatLE(X)
static void SDLCALL SDL_ConvertStereo(SDL_AudioCVT *cvt, SDL_AudioFormat format)
#define SDL_InvalidParamError(param)
static SDL_AudioFilter SDL_HandTunedTypeCVT(SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)
static void SDLCALL SDL_ConvertSurround(SDL_AudioCVT *cvt, SDL_AudioFormat format)
DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT *cvt, SDL_AudioFormat src_format, Uint8 src_channels, int src_rate, SDL_AudioFormat dst_format, Uint8 dst_channels, int dst_rate)
uint32_t Uint32
An unsigned 32-bit integer type.
static int SDL_BuildAudioResampleCVT(SDL_AudioCVT *cvt, int dst_channels, int src_rate, int dst_rate)
static void SDLCALL SDL_ConvertStrip_2(SDL_AudioCVT *cvt, SDL_AudioFormat format)
SDL_AudioFilter filters[10]
#define SDL_AUDIO_BITSIZE(x)
GLint GLenum GLsizei GLsizei GLsizei GLint GLenum format
DECLSPEC int SDLCALL SDL_SetError(const char *fmt,...)
static void SDLCALL SDL_ConvertSurround_4(SDL_AudioCVT *cvt, SDL_AudioFormat format)
SDL_AudioFormat src_format
#define SDL_AUDIO_MASK_SIGNED
#define SDL_assert(condition)
static int SDL_FindFrequencyMultiple(const int src_rate, const int dst_rate)
SDL_AudioFormat dst_format
uint8_t Uint8
An unsigned 8-bit integer type.
int16_t Sint16
A signed 16-bit integer type.
const SDL_AudioRateFilters sdl_audio_rate_filters[]
DECLSPEC double SDLCALL SDL_ceil(double x)
uint16_t Uint16
An unsigned 16-bit integer type.
#define SDL_AUDIO_MASK_BITSIZE
int64_t Sint64
A signed 64-bit integer type.
int8_t Sint8
A signed 8-bit integer type.
DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT *cvt)
static int SDL_BuildAudioTypeCVT(SDL_AudioCVT *cvt, SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)
#define strip_chans_6_to_2(type)
static SDL_AudioFilter SDL_HandTunedResampleCVT(SDL_AudioCVT *cvt, int dst_channels, int src_rate, int dst_rate)