17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@***********************************************************
27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Function:    SynthMasterGain
37df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Processor:   ARM-E
47df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Description: Copies 32-bit synth output to 16-bit buffer
57df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@              with saturated gain control
67df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@              C-callable.
77df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
87df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Usage:
97df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	SynthMasterGain(
107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@			pInputBuffer
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@			pOutputBuffer,
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@			nGain,
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@			nNumLoopSamples
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	);
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Copyright Sonic Network Inc. 2004
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Revision Control:
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Revision: 496 $
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   where:
247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	long *pInputBuffer
257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r0
267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	EAS_PCM *pOutputBuffer
287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r1
297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	short nGain
317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r2
327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	EAS_U16	nNumLoopSamples
347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r3
357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.include	"ARM_synth_constants_gnu.inc"
397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.arm
417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.text
427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.func	SynthMasterGain
447df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectSynthMasterGain:
457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.global	SynthMasterGain	@ allow other files to use this function
477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Stack frame
537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ -----------
547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.equ	RET_ADDR_SZ, 0			@return address
557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.equ	REG_SAVE_SZ, 0			@save-on-entry registers saved
567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.equ	FRAME_SZ, (8)			@local variables
577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.equ	ARG_BLK_SZ, 0			@argument block
587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.equ	PARAM_OFFSET, (ARG_BLK_SZ + FRAME_SZ + REG_SAVE_SZ + RET_ADDR_SZ)
607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Register usage
627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ --------------
637df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpnInputBuffer	.req	r0
647df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpnOutputBuffer	.req	r1
657df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectnGain	.req	r2
667df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectnNumLoopSamples	.req	r3
677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STMFD	sp!,{r4-r6,r14}					@Save any save-on-entry registers that are used
697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		r6, =0x7fff						@constant for saturation tests
717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
727df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectloop:
737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		r4, [pnInputBuffer], #4			@fetch 1st output sample
747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		r5, [pnInputBuffer], #4			@fetch 2nd output sample
767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULWB	r4, r4, nGain					@output = gain * input
787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	CMP		r4, r6							@check for positive saturation
807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOVGT	r4, r6							@saturate
817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	CMN		r4, r6							@check for negative saturation
827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MVNLT	r4, r6							@saturate
837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULWB	r5, r5, nGain					@output = gain * input
857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STRH	r4, [pnOutputBuffer], #NEXT_OUTPUT_PCM	@save 1st output sample
877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	CMP		r5, r6							@check for positive saturation
897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOVGT	r5, r6							@saturate
907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	CMN		r5, r6							@check for negative saturation
917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MVNLT	r5, r6							@saturate
927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STRH	r5, [pnOutputBuffer], #NEXT_OUTPUT_PCM	@save 2nd output sample
937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUBS	nNumLoopSamples, nNumLoopSamples, #2
957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BGT		loop
967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Return to calling function
997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
1007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDMFD	sp!,{r4-r6, lr}				@ return to calling function
1027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BX		lr
1037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@*****************************************************************************
1057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endfunc		@ end of function/procedure
1077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.end		@ end of assembly code
1097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
110