lowercasing filenames, part3
[picodrive.git] / pico / sound / mix.c
diff --git a/pico/sound/mix.c b/pico/sound/mix.c
new file mode 100644 (file)
index 0000000..c344fba
--- /dev/null
@@ -0,0 +1,74 @@
+// some code for sample mixing
+// (c) Copyright 2006-2007, Grazvydas "notaz" Ignotas
+
+#define MAXOUT         (+32767)
+#define MINOUT         (-32768)
+
+/* limitter */
+#define Limit(val, max,min) { \
+       if ( val > max )      val = max; \
+       else if ( val < min ) val = min; \
+}
+
+
+void mix_32_to_16l_stereo(short *dest, int *src, int count)
+{
+       int l, r;
+
+       for (; count > 0; count--)
+       {
+               l = r = *dest;
+               l += *src++;
+               r += *src++;
+               Limit( l, MAXOUT, MINOUT );
+               Limit( r, MAXOUT, MINOUT );
+               *dest++ = l;
+               *dest++ = r;
+       }
+}
+
+
+void mix_32_to_16_mono(short *dest, int *src, int count)
+{
+       int l;
+
+       for (; count > 0; count--)
+       {
+               l = *dest;
+               l += *src++;
+               Limit( l, MAXOUT, MINOUT );
+               *dest++ = l;
+       }
+}
+
+
+void mix_16h_to_32(int *dest_buf, short *mp3_buf, int count)
+{
+       while (count--)
+       {
+               *dest_buf++ += *mp3_buf++ >> 1;
+       }
+}
+
+void mix_16h_to_32_s1(int *dest_buf, short *mp3_buf, int count)
+{
+       count >>= 1;
+       while (count--)
+       {
+               *dest_buf++ += *mp3_buf++ >> 1;
+               *dest_buf++ += *mp3_buf++ >> 1;
+               mp3_buf += 1*2;
+       }
+}
+
+void mix_16h_to_32_s2(int *dest_buf, short *mp3_buf, int count)
+{
+       count >>= 1;
+       while (count--)
+       {
+               *dest_buf++ += *mp3_buf++ >> 1;
+               *dest_buf++ += *mp3_buf++ >> 1;
+               mp3_buf += 3*2;
+       }
+}
+