summaryrefslogtreecommitdiff
path: root/src/audio_out/resample.c
diff options
context:
space:
mode:
authorEduard Hasenleithner <ehasenle@users.sourceforge.net>2001-07-22 11:22:00 +0000
committerEduard Hasenleithner <ehasenle@users.sourceforge.net>2001-07-22 11:22:00 +0000
commiteb2e31af661b9d1d81891f88b6fa8faf648d60d1 (patch)
tree6b334b09dce27819d3c14604f71543002c1fdef7 /src/audio_out/resample.c
parent85ceda26b256cd05df927ca6d666e1c765d25ab7 (diff)
downloadxine-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.c70
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];
+}
+
+