1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2011 by Michael Sevakis
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #define MIXER_OPTIMIZED_MIX_SAMPLES
22 #define MIXER_OPTIMIZED_WRITE_SAMPLES
24 /* Mix channels' samples and apply gain factors */
25 static FORCE_INLINE
void mix_samples(void *out
,
34 if (src0_amp
== MIX_AMP_UNITY
&& src1_amp
== MIX_AMP_UNITY
)
36 /* Both are unity amplitude */
42 "qadd16 %5, %5, %4 \n"
45 : "+r"(out
), "+r"(src0
), "+r"(src1
), "+r"(size
),
46 "=&r"(s0
), "=&r"(s1
));
50 /* One or neither are unity amplitude */
57 "smulwb %6, %7, %4 \n"
58 "smulwt %4, %7, %4 \n"
59 "smlawb %6, %8, %5, %6 \n"
60 "smlawt %4, %8, %5, %4 \n"
63 "pkhbt %6, %6, %4, asl #16 \n"
66 : "+r"(out
), "+r"(src0
), "+r"(src1
), "+r"(size
),
67 "=&r"(s0
), "=&r"(s1
), "=&r"(tmp
)
68 : "r"(src0_amp
), "r"(src1_amp
));
72 /* Write channel's samples and apply gain factor */
73 static FORCE_INLINE
void write_samples(void *out
,
78 if (LIKELY(amp
== MIX_AMP_UNITY
))
80 /* Channel is unity amplitude */
82 "ands r1, %2, #0x1f \n"
89 "bics %2, %2, #0x1f \n"
92 "ldmia %1!, { r0-r7 } \n"
94 "stmia %0!, { r0-r7 } \n"
97 : "+r"(out
), "+r"(src
), "+r"(size
)
99 : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7");
103 /* Channel needs amplitude cut */
107 "ldr %3, [%1], #4 \n"
109 "smulwt %4, %5, %3 \n"
110 "smulwb %3, %5, %3 \n"
111 "pkhbt %4, %3, %4, asl #16 \n"
112 "str %4, [%0], #4 \n"
114 : "+r"(out
), "+r"(src
), "+r"(size
),