menu: add reset hotkey
[picodrive.git] / pico / sound / mix.c
1 /*
2  * some code for sample mixing
3  * (C) notaz, 2006,2007
4  *
5  * This work is licensed under the terms of MAME license.
6  * See COPYING file in the top-level directory.
7  */
8
9 #define MAXOUT          (+32767)
10 #define MINOUT          (-32768)
11
12 /* limitter */
13 #define Limit(val, max,min) { \
14         if ( val > max )      val = max; \
15         else if ( val < min ) val = min; \
16 }
17
18
19 void mix_32_to_16l_stereo(short *dest, int *src, int count)
20 {
21         int l, r;
22
23         for (; count > 0; count--)
24         {
25                 l = r = *dest;
26                 l += *src++;
27                 r += *src++;
28                 Limit( l, MAXOUT, MINOUT );
29                 Limit( r, MAXOUT, MINOUT );
30                 *dest++ = l;
31                 *dest++ = r;
32         }
33 }
34
35
36 void mix_32_to_16_mono(short *dest, int *src, int count)
37 {
38         int l;
39
40         for (; count > 0; count--)
41         {
42                 l = *dest;
43                 l += *src++;
44                 Limit( l, MAXOUT, MINOUT );
45                 *dest++ = l;
46         }
47 }
48
49
50 void mix_16h_to_32(int *dest_buf, short *mp3_buf, int count)
51 {
52         while (count--)
53         {
54                 *dest_buf++ += *mp3_buf++ >> 1;
55         }
56 }
57
58 void mix_16h_to_32_s1(int *dest_buf, short *mp3_buf, int count)
59 {
60         count >>= 1;
61         while (count--)
62         {
63                 *dest_buf++ += *mp3_buf++ >> 1;
64                 *dest_buf++ += *mp3_buf++ >> 1;
65                 mp3_buf += 1*2;
66         }
67 }
68
69 void mix_16h_to_32_s2(int *dest_buf, short *mp3_buf, int count)
70 {
71         count >>= 1;
72         while (count--)
73         {
74                 *dest_buf++ += *mp3_buf++ >> 1;
75                 *dest_buf++ += *mp3_buf++ >> 1;
76                 mp3_buf += 3*2;
77         }
78 }
79