diff options
author | Eduard Hasenleithner <ehasenle@users.sourceforge.net> | 2001-07-22 11:22:00 +0000 |
---|---|---|
committer | Eduard Hasenleithner <ehasenle@users.sourceforge.net> | 2001-07-22 11:22:00 +0000 |
commit | eb2e31af661b9d1d81891f88b6fa8faf648d60d1 (patch) | |
tree | 6b334b09dce27819d3c14604f71543002c1fdef7 /src/audio_out/resample.c | |
parent | 85ceda26b256cd05df927ca6d666e1c765d25ab7 (diff) | |
download | xine-lib-eb2e31af661b9d1d81891f88b6fa8faf648d60d1.tar.gz xine-lib-eb2e31af661b9d1d81891f88b6fa8faf648d60d1.tar.bz2 |
Fixed missing case for 5.1 output.
Added resample bypass (do_resample).
Replaced package drop printf with xprintf.
CVS patchset: 321
CVS date: 2001/07/22 11:22:00
Diffstat (limited to 'src/audio_out/resample.c')
-rw-r--r-- | src/audio_out/resample.c | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/src/audio_out/resample.c b/src/audio_out/resample.c index 158b17c59..8a5419d24 100644 --- a/src/audio_out/resample.c +++ b/src/audio_out/resample.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: resample.c,v 1.2 2001/05/27 23:48:12 guenter Exp $ + * $Id: resample.c,v 1.3 2001/07/22 11:22:00 ehasenle Exp $ */ #ifdef HAVE_CONFIG_H @@ -212,3 +212,71 @@ void audio_out_resample_5channel(int16_t* input_samples, uint32_t in_samples, } +void audio_out_resample_6channel(int16_t* input_samples, uint32_t in_samples, + int16_t* output_samples, uint32_t out_samples) +{ + int osample; + /* 16+16 fixed point math */ + uint32_t isample = 0; + uint32_t istep = (in_samples << 16)/out_samples; + +#ifdef VERBOSE + printf ("Audio : resample %d samples to %d\n", + in_samples, out_samples); +#endif + + for (osample = 0; osample < out_samples - 1; osample++) { + int s1; + int s2; + int16_t os; + uint32_t t = isample&0xffff; + + /* don't "optimize" the (isample >> 16)*2 to (isample >> 15) */ + s1 = input_samples[(isample >> 16)*6]; + s2 = input_samples[(isample >> 16)*6+6]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[osample * 6] = os; + + s1 = input_samples[(isample >> 16)*6+1]; + s2 = input_samples[(isample >> 16)*6+7]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+1] = os; + + s1 = input_samples[(isample >> 16)*6+2]; + s2 = input_samples[(isample >> 16)*6+8]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+2] = os; + + s1 = input_samples[(isample >> 16)*6+3]; + s2 = input_samples[(isample >> 16)*6+9]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+3] = os; + + s1 = input_samples[(isample >> 16)*6+4]; + s2 = input_samples[(isample >> 16)*6+10]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+4] = os; + + s1 = input_samples[(isample >> 16)*6+5]; + s2 = input_samples[(isample >> 16)*6+11]; + + os = (s1 * (0x10000-t)+ s2 * t) >> 16; + output_samples[(osample * 6 )+5] = os; + + isample += istep; + } + + output_samples[out_samples*6-6] = input_samples[in_samples*6-6]; + output_samples[out_samples*6-5] = input_samples[in_samples*6-5]; + output_samples[out_samples*6-4] = input_samples[in_samples*6-4]; + output_samples[out_samples*6-3] = input_samples[in_samples*6-3]; + output_samples[out_samples*6-2] = input_samples[in_samples*6-2]; + output_samples[out_samples*6-1] = input_samples[in_samples*6-1]; +} + + |