3 @ Generic routines for mixing audio samples
4 @ (c) Copyright 2007, Grazvydas "notaz" Ignotas
7 @ this assumes src is word aligned
8 .global mix_16h_to_32 @ int *dest, short *src, int count
18 add r3, r3, r4, asr #1
29 add r4, r4, r12,asr #17 @ we use half volume
31 add r3, r3, r12,asr #17
32 add r6, r6, lr, asr #17
34 add r5, r5, lr, asr #17
44 add r3, r3, r12,asr #17
45 add r4, r4, r5, asr #17
50 ldmeqfd sp!, {r4-r6,pc}
53 add r3, r3, r4, asr #1
61 .global mix_16h_to_32_s1 @ int *dest, short *src, int count
74 add r4, r4, r12,asr #17
76 add r3, r3, r12,asr #17 @ we use half volume
77 add r6, r6, lr, asr #17
79 add r5, r5, lr, asr #17
85 beq m16_32_s1_no_unal2
89 add r3, r3, r12,asr #17
90 add r4, r4, r5, asr #17
95 ldmeqfd sp!, {r4-r6,pc}
98 add r3, r3, r4, asr #1
101 ldmfd sp!, {r4-r6,lr}
106 .global mix_16h_to_32_s2 @ int *dest, short *src, int count
109 stmfd sp!, {r4-r6,lr}
119 add r4, r4, r12,asr #17
121 add r3, r3, r12,asr #17 @ we use half volume
122 add r6, r6, lr, asr #17
124 add r5, r5, lr, asr #17
130 beq m16_32_s2_no_unal2
134 add r3, r3, r12,asr #17
135 add r4, r4, r5, asr #17
140 ldmeqfd sp!, {r4-r6,pc}
143 add r3, r3, r4, asr #1
146 ldmfd sp!, {r4-r6,lr}
152 @ reg=int_sample, lr=1, r3=tmp, kills flags
154 add r3, lr, \reg, asr #15
155 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
161 @ limit and shift up by 16
162 @ reg=int_sample, lr=1, r3=tmp, kills flags
164 @ movs r4, r3, asr #16
166 @ beq c32_16_no_overflow
171 add r3, lr, \reg, asr #15
172 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1
173 moveq \reg, \reg, lsl #16
174 movne \reg, #0x80000000
175 subpl \reg, \reg, #0x00010000
179 @ mix 32bit audio (with 16bits really used, upper bits indicate overflow) with normal 16 bit audio with left channel only
180 @ warning: this function assumes dest is word aligned
181 .global mix_32_to_16l_stereo @ short *dest, int *src, int count
183 mix_32_to_16l_stereo:
184 stmfd sp!, {r4-r8,lr}
197 add r4, r4, r8, asr #16
198 add r5, r5, r8, asr #16
199 add r6, r6, r12,asr #16
200 add r7, r7, r12,asr #16
206 orr r4, r5, r4, lsr #16
207 orr r5, r7, r6, lsr #16
212 @ check for remaining bytes to convert
214 beq m32_16l_st_no_unal2
221 orr r4, r5, r4, lsr #16
225 ldmfd sp!, {r4-r8,lr}
229 @ mix 32bit audio (with 16bits really used, upper bits indicate overflow) with normal 16 bit audio (for mono sound)
230 .global mix_32_to_16_mono @ short *dest, int *src, int count
233 stmfd sp!, {r4-r8,lr}
237 @ check if dest is word aligned
239 beq m32_16_mo_no_unalw
254 add r5, r5, r8, asr #16
256 add r4, r4, r8, asr #16
257 add r7, r7, r12,asr #16
259 add r6, r6, r12,asr #16
265 orr r4, r5, r4, lsr #16
266 orr r5, r7, r6, lsr #16
271 @ check for remaining bytes to convert
273 beq m32_16_mo_no_unal2
276 add r5, r5, r6, asr #16
278 add r4, r4, r6, asr #16
281 orr r4, r5, r4, lsr #16
286 ldmeqfd sp!, {r4-r8,pc}
293 ldmfd sp!, {r4-r8,lr}