From 675ed65251ae402c2a4ae1cdd44bf5238cc322a0 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 17 Dec 2015 17:09:02 +0100 Subject: [PATCH] Use LSB or MSB audio mixing based on machine endian NOTE: only tested on LSB machine --- libsound/sound_handler.cpp | 69 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/libsound/sound_handler.cpp b/libsound/sound_handler.cpp index a39cb6eb3..454a03ef3 100644 --- a/libsound/sound_handler.cpp +++ b/libsound/sound_handler.cpp @@ -82,29 +82,62 @@ mixAudio(std::uint8_t *dst, const std::uint8_t *src, std::uint32_t len, int volu { if ( volume == 0 ) return; - // AUDIO_S16LSB + union { + int16_t i; + char c[2]; + } isbig; + isbig.i = 1; + + int lsb = ( isbig.c[0] == 1 ); + std::int16_t src1, src2; int dst_sample; const int max_audioval = ((1<<(16-1))-1); const int min_audioval = -(1<<(16-1)); - len /= 2; - while ( len-- ) { - src1 = ((src[1])<<8|src[0]); - ADJUST_VOLUME(src1, volume); - src2 = ((dst[1])<<8|dst[0]); - src += 2; - dst_sample = src1+src2; - if ( dst_sample > max_audioval ) { - dst_sample = max_audioval; - } else - if ( dst_sample < min_audioval ) { - dst_sample = min_audioval; - } - dst[0] = dst_sample&0xFF; - dst_sample >>= 8; - dst[1] = dst_sample&0xFF; - dst += 2; + if ( lsb ) + { + // AUDIO_S16LSB + len /= 2; + while ( len-- ) { + src1 = ((src[1])<<8|src[0]); + ADJUST_VOLUME(src1, volume); + src2 = ((dst[1])<<8|dst[0]); + src += 2; + dst_sample = src1+src2; + if ( dst_sample > max_audioval ) { + dst_sample = max_audioval; + } else + if ( dst_sample < min_audioval ) { + dst_sample = min_audioval; + } + dst[0] = dst_sample&0xFF; + dst_sample >>= 8; + dst[1] = dst_sample&0xFF; + dst += 2; + } + } + else + { + // AUDIO_S16MSB + len /= 2; + while ( len-- ) { + src1 = ((src[0])<<8|src[1]); + ADJUST_VOLUME(src1, volume); + src2 = ((dst[0])<<8|dst[1]); + src += 2; + dst_sample = src1+src2; + if ( dst_sample > max_audioval ) { + dst_sample = max_audioval; + } else + if ( dst_sample < min_audioval ) { + dst_sample = min_audioval; + } + dst[1] = dst_sample&0xFF; + dst_sample >>= 8; + dst[0] = dst_sample&0xFF; + dst += 2; + } } } -- 2.11.4.GIT