21 #include "../SDL_internal.h" 40 fprintf(stderr,
"Converting to mono\n");
51 for (i = cvt->
len_cvt / 2; i; --i) {
52 sample = src[0] + src[1];
53 *dst = (
Uint8) (sample / 2);
66 for (i = cvt->
len_cvt / 2; i; --i) {
67 sample = src[0] + src[1];
68 *dst = (
Sint8) (sample / 2);
82 for (i = cvt->
len_cvt / 4; i; --i) {
83 sample = (
Uint16) ((src[0] << 8) | src[1]) +
84 (
Uint16) ((src[2] << 8) | src[3]);
86 dst[1] = (sample & 0xFF);
88 dst[0] = (sample & 0xFF);
93 for (i = cvt->
len_cvt / 4; i; --i) {
94 sample = (
Uint16) ((src[1] << 8) | src[0]) +
95 (
Uint16) ((src[3] << 8) | src[2]);
97 dst[0] = (sample & 0xFF);
99 dst[1] = (sample & 0xFF);
114 for (i = cvt->
len_cvt / 4; i; --i) {
115 sample = (
Sint16) ((src[0] << 8) | src[1]) +
116 (
Sint16) ((src[2] << 8) | src[3]);
118 dst[1] = (sample & 0xFF);
120 dst[0] = (sample & 0xFF);
125 for (i = cvt->
len_cvt / 4; i; --i) {
126 sample = (
Sint16) ((src[1] << 8) | src[0]) +
127 (
Sint16) ((src[3] << 8) | src[2]);
129 dst[0] = (sample & 0xFF);
131 dst[1] = (sample & 0xFF);
144 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
151 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
163 const float *
src = (
const float *) cvt->
buf;
164 float *
dst = (
float *) cvt->
buf;
166 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
169 const double added = ((double) src1) + ((double) src2);
170 const float halved = (float) (added * 0.5);
174 for (i = cvt->
len_cvt / 8; i; --i, src += 2) {
177 const double added = ((double) src1) + ((double) src2);
178 const float halved = (float) (added * 0.5);
200 fprintf(stderr,
"Converting down from 6 channels to stereo\n");
203 #define strip_chans_6_to_2(type) \ 205 const type *src = (const type *) cvt->buf; \ 206 type *dst = (type *) cvt->buf; \ 207 for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \ 228 #undef strip_chans_6_to_2 244 fprintf(stderr,
"Converting 6 down to quad\n");
247 #define strip_chans_6_to_4(type) \ 249 const type *src = (const type *) cvt->buf; \ 250 type *dst = (type *) cvt->buf; \ 251 for (i = cvt->len_cvt / (sizeof (type) * 6); i; --i) { \ 274 #undef strip_chans_6_to_4 290 fprintf(stderr,
"Converting to stereo\n");
293 #define dup_chans_1_to_2(type) \ 295 const type *src = (const type *) (cvt->buf + cvt->len_cvt); \ 296 type *dst = (type *) (cvt->buf + cvt->len_cvt * 2); \ 297 for (i = cvt->len_cvt / sizeof(type); i; --i) { \ 300 dst[0] = dst[1] = *src; \ 317 #undef dup_chans_1_to_2 333 fprintf(stderr,
"Converting stereo to surround\n");
345 for (i = cvt->
len_cvt; i; --i) {
350 ce = (lf / 2) + (rf / 2);
367 for (i = cvt->
len_cvt; i; --i) {
372 ce = (lf / 2) + (rf / 2);
386 Uint16 lf, rf, ce, lr, rr;
392 for (i = cvt->
len_cvt / 4; i; --i) {
395 lf = (
Uint16) ((src[0] << 8) | src[1]);
396 rf = (
Uint16) ((src[2] << 8) | src[3]);
397 ce = (lf / 2) + (rf / 2);
400 dst[1] = (lf & 0xFF);
401 dst[0] = ((lf >> 8) & 0xFF);
402 dst[3] = (rf & 0xFF);
403 dst[2] = ((rf >> 8) & 0xFF);
405 dst[1 + 4] = (lr & 0xFF);
406 dst[0 + 4] = ((lr >> 8) & 0xFF);
407 dst[3 + 4] = (rr & 0xFF);
408 dst[2 + 4] = ((rr >> 8) & 0xFF);
410 dst[1 + 8] = (ce & 0xFF);
411 dst[0 + 8] = ((ce >> 8) & 0xFF);
412 dst[3 + 8] = (ce & 0xFF);
413 dst[2 + 8] = ((ce >> 8) & 0xFF);
416 for (i = cvt->
len_cvt / 4; i; --i) {
419 lf = (
Uint16) ((src[1] << 8) | src[0]);
420 rf = (
Uint16) ((src[3] << 8) | src[2]);
421 ce = (lf / 2) + (rf / 2);
424 dst[0] = (lf & 0xFF);
425 dst[1] = ((lf >> 8) & 0xFF);
426 dst[2] = (rf & 0xFF);
427 dst[3] = ((rf >> 8) & 0xFF);
429 dst[0 + 4] = (lr & 0xFF);
430 dst[1 + 4] = ((lr >> 8) & 0xFF);
431 dst[2 + 4] = (rr & 0xFF);
432 dst[3 + 4] = ((rr >> 8) & 0xFF);
434 dst[0 + 8] = (ce & 0xFF);
435 dst[1 + 8] = ((ce >> 8) & 0xFF);
436 dst[2 + 8] = (ce & 0xFF);
437 dst[3 + 8] = ((ce >> 8) & 0xFF);
446 Sint16 lf, rf, ce, lr, rr;
452 for (i = cvt->
len_cvt / 4; i; --i) {
455 lf = (
Sint16) ((src[0] << 8) | src[1]);
456 rf = (
Sint16) ((src[2] << 8) | src[3]);
457 ce = (lf / 2) + (rf / 2);
460 dst[1] = (lf & 0xFF);
461 dst[0] = ((lf >> 8) & 0xFF);
462 dst[3] = (rf & 0xFF);
463 dst[2] = ((rf >> 8) & 0xFF);
465 dst[1 + 4] = (lr & 0xFF);
466 dst[0 + 4] = ((lr >> 8) & 0xFF);
467 dst[3 + 4] = (rr & 0xFF);
468 dst[2 + 4] = ((rr >> 8) & 0xFF);
470 dst[1 + 8] = (ce & 0xFF);
471 dst[0 + 8] = ((ce >> 8) & 0xFF);
472 dst[3 + 8] = (ce & 0xFF);
473 dst[2 + 8] = ((ce >> 8) & 0xFF);
476 for (i = cvt->
len_cvt / 4; i; --i) {
479 lf = (
Sint16) ((src[1] << 8) | src[0]);
480 rf = (
Sint16) ((src[3] << 8) | src[2]);
481 ce = (lf / 2) + (rf / 2);
484 dst[0] = (lf & 0xFF);
485 dst[1] = ((lf >> 8) & 0xFF);
486 dst[2] = (rf & 0xFF);
487 dst[3] = ((rf >> 8) & 0xFF);
489 dst[0 + 4] = (lr & 0xFF);
490 dst[1 + 4] = ((lr >> 8) & 0xFF);
491 dst[2 + 4] = (rr & 0xFF);
492 dst[3 + 4] = ((rr >> 8) & 0xFF);
494 dst[0 + 8] = (ce & 0xFF);
495 dst[1 + 8] = ((ce >> 8) & 0xFF);
496 dst[2 + 8] = (ce & 0xFF);
497 dst[3 + 8] = ((ce >> 8) & 0xFF);
510 for (i = cvt->
len_cvt / 8; i; --i) {
515 ce = (lf / 2) + (rf / 2);
524 for (i = cvt->
len_cvt / 8; i; --i) {
529 ce = (lf / 2) + (rf / 2);
544 const float *
src = (
const float *) (cvt->
buf + cvt->
len_cvt);
548 for (i = cvt->
len_cvt / 8; i; --i) {
553 ce = (lf * 0.5f) + (rf * 0.5
f);
561 for (i = cvt->
len_cvt / 8; i; --i) {
566 ce = (lf * 0.5f) + (rf * 0.5
f);
592 fprintf(stderr,
"Converting stereo to quad\n");
604 for (i = cvt->
len_cvt; i; --i) {
609 ce = (lf / 2) + (rf / 2);
624 for (i = cvt->
len_cvt; i; --i) {
629 ce = (lf / 2) + (rf / 2);
641 Uint16 lf, rf, ce, lr, rr;
647 for (i = cvt->
len_cvt / 4; i; --i) {
650 lf = (
Uint16) ((src[0] << 8) | src[1]);
651 rf = (
Uint16) ((src[2] << 8) | src[3]);
652 ce = (lf / 2) + (rf / 2);
655 dst[1] = (lf & 0xFF);
656 dst[0] = ((lf >> 8) & 0xFF);
657 dst[3] = (rf & 0xFF);
658 dst[2] = ((rf >> 8) & 0xFF);
660 dst[1 + 4] = (lr & 0xFF);
661 dst[0 + 4] = ((lr >> 8) & 0xFF);
662 dst[3 + 4] = (rr & 0xFF);
663 dst[2 + 4] = ((rr >> 8) & 0xFF);
666 for (i = cvt->
len_cvt / 4; i; --i) {
669 lf = (
Uint16) ((src[1] << 8) | src[0]);
670 rf = (
Uint16) ((src[3] << 8) | src[2]);
671 ce = (lf / 2) + (rf / 2);
674 dst[0] = (lf & 0xFF);
675 dst[1] = ((lf >> 8) & 0xFF);
676 dst[2] = (rf & 0xFF);
677 dst[3] = ((rf >> 8) & 0xFF);
679 dst[0 + 4] = (lr & 0xFF);
680 dst[1 + 4] = ((lr >> 8) & 0xFF);
681 dst[2 + 4] = (rr & 0xFF);
682 dst[3 + 4] = ((rr >> 8) & 0xFF);
691 Sint16 lf, rf, ce, lr, rr;
697 for (i = cvt->
len_cvt / 4; i; --i) {
700 lf = (
Sint16) ((src[0] << 8) | src[1]);
701 rf = (
Sint16) ((src[2] << 8) | src[3]);
702 ce = (lf / 2) + (rf / 2);
705 dst[1] = (lf & 0xFF);
706 dst[0] = ((lf >> 8) & 0xFF);
707 dst[3] = (rf & 0xFF);
708 dst[2] = ((rf >> 8) & 0xFF);
710 dst[1 + 4] = (lr & 0xFF);
711 dst[0 + 4] = ((lr >> 8) & 0xFF);
712 dst[3 + 4] = (rr & 0xFF);
713 dst[2 + 4] = ((rr >> 8) & 0xFF);
716 for (i = cvt->
len_cvt / 4; i; --i) {
719 lf = (
Sint16) ((src[1] << 8) | src[0]);
720 rf = (
Sint16) ((src[3] << 8) | src[2]);
721 ce = (lf / 2) + (rf / 2);
724 dst[0] = (lf & 0xFF);
725 dst[1] = ((lf >> 8) & 0xFF);
726 dst[2] = (rf & 0xFF);
727 dst[3] = ((rf >> 8) & 0xFF);
729 dst[0 + 4] = (lr & 0xFF);
730 dst[1 + 4] = ((lr >> 8) & 0xFF);
731 dst[2 + 4] = (rr & 0xFF);
732 dst[3 + 4] = ((rr >> 8) & 0xFF);
745 for (i = cvt->
len_cvt / 8; i; --i) {
750 ce = (lf / 2) + (rf / 2);
757 for (i = cvt->
len_cvt / 8; i; --i) {
762 ce = (lf / 2) + (rf / 2);
774 const float *
src = (
const float *) (cvt->
buf + cvt->
len_cvt);
779 for (i = cvt->
len_cvt / 8; i; --i) {
784 ce = (lf / 2) + (rf / 2);
791 for (i = cvt->
len_cvt / 8; i; --i) {
796 ce = (lf / 2) + (rf / 2);
859 if (src_fmt != dst_fmt) {
865 if (filter ==
NULL) {
875 if (filter ==
NULL) {
876 SDL_SetError(
"No conversion available for these formats");
883 if (src_bitsize < dst_bitsize) {
884 const int mult = (dst_bitsize / src_bitsize);
887 }
else if (src_bitsize > dst_bitsize) {
888 cvt->
len_ratio /= (src_bitsize / dst_bitsize);
900 int src_rate,
int dst_rate)
924 if (src_rate < dst_rate) {
937 retval = ((div == 2) || (div == 4)) ? div : 0;
945 int src_rate,
int dst_rate)
947 if (src_rate != dst_rate) {
952 if (filter ==
NULL) {
954 const int upsample = (src_rate < dst_rate) ? 1 : 0;
969 if (filter ==
NULL) {
970 SDL_SetError(
"No conversion available for these rates");
977 if (src_rate < dst_rate) {
978 const double mult = ((double) dst_rate) / ((double) src_rate);
982 cvt->
len_ratio /= ((double) src_rate) / ((double) dst_rate);
1024 if ((src_channels == 0) || (dst_channels == 0)) {
1025 return SDL_SetError(
"Source or destination channels is zero");
1027 if ((src_rate == 0) || (dst_rate == 0)) {
1028 return SDL_SetError(
"Source or destination rate is zero");
1030 #ifdef DEBUG_CONVERT 1031 printf(
"Build format %04x->%04x, channels %u->%u, rate %d->%d\n",
1032 src_fmt, dst_fmt, src_channels, dst_channels, src_rate, dst_rate);
1044 cvt->
rate_incr = ((double) dst_rate) / ((double) src_rate);
1052 if (src_channels != dst_channels) {
1053 if ((src_channels == 1) && (dst_channels > 1)) {
1059 if ((src_channels == 2) && (dst_channels == 6)) {
1065 if ((src_channels == 2) && (dst_channels == 4)) {
1071 while ((src_channels * 2) <= dst_channels) {
1077 if ((src_channels == 6) && (dst_channels <= 2)) {
1082 if ((src_channels == 6) && (dst_channels == 4)) {
1091 while (((src_channels % 2) == 0) &&
1092 ((src_channels / 2) >= dst_channels)) {
1097 if (src_channels != dst_channels) {
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
#define SDL_SwapFloatBE(X)
uint32_t Uint32
An unsigned 32-bit integer type.
#define SDL_AUDIO_ISBIGENDIAN(x)
#define strip_chans_6_to_4(type)
#define dup_chans_1_to_2(type)
#define SDL_AUDIO_ISSIGNED(x)
Uint16 SDL_AudioFormat
Audio format flags.
const SDL_AudioTypeFilters sdl_audio_type_filters[]
#define SDL_SwapFloatLE(X)
#define SDL_InvalidParamError(param)
static SDL_AudioFilter SDL_HandTunedTypeCVT(SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)
static int SDL_BuildAudioResampleCVT(SDL_AudioCVT *cvt, int dst_channels, int src_rate, int dst_rate)
static void SDL_ConvertStrip_2(SDL_AudioCVT *cvt, SDL_AudioFormat format)
SDL_AudioFilter filters[10]
int8_t Sint8
A signed 8-bit integer type.
uint8_t Uint8
An unsigned 8-bit integer type.
#define SDL_AUDIO_BITSIZE(x)
#define SDL_AUDIO_MASK_DATATYPE
int SDL_ConvertAudio(SDL_AudioCVT *cvt)
int32_t Sint32
A signed 32-bit integer type.
SDL_AudioFormat src_format
#define SDL_AUDIO_MASK_SIGNED
void(* SDL_AudioFilter)(struct SDL_AudioCVT *cvt, SDL_AudioFormat format)
int SDL_BuildAudioCVT(SDL_AudioCVT *cvt, SDL_AudioFormat src_fmt, Uint8 src_channels, int src_rate, SDL_AudioFormat dst_fmt, Uint8 dst_channels, int dst_rate)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
#define SDL_assert(condition)
static int SDL_FindFrequencyMultiple(const int src_rate, const int dst_rate)
static void SDL_ConvertSurround(SDL_AudioCVT *cvt, SDL_AudioFormat format)
static void SDL_ConvertStereo(SDL_AudioCVT *cvt, SDL_AudioFormat format)
SDL_AudioFormat dst_format
static void SDL_ConvertSurround_4(SDL_AudioCVT *cvt, SDL_AudioFormat format)
const SDL_AudioRateFilters sdl_audio_rate_filters[]
uint16_t Uint16
An unsigned 16-bit integer type.
static void SDL_ConvertMono(SDL_AudioCVT *cvt, SDL_AudioFormat format)
static void SDL_ConvertStrip(SDL_AudioCVT *cvt, SDL_AudioFormat format)
int64_t Sint64
A signed 64-bit integer type.
#define SDL_AUDIO_MASK_BITSIZE
static int SDL_BuildAudioTypeCVT(SDL_AudioCVT *cvt, SDL_AudioFormat src_fmt, SDL_AudioFormat dst_fmt)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
int16_t Sint16
A signed 16-bit integer type.
#define strip_chans_6_to_2(type)
static SDL_AudioFilter SDL_HandTunedResampleCVT(SDL_AudioCVT *cvt, int dst_channels, int src_rate, int dst_rate)