Home | History | Annotate | Download | only in lib_src
      1 @***********************************************************
      2 @ Function:    SynthMasterGain
      3 @ Processor:   ARM-E
      4 @ Description: Copies 32-bit synth output to 16-bit buffer
      5 @              with saturated gain control
      6 @              C-callable.
      7 @
      8 @ Usage:
      9 @	SynthMasterGain(
     10 @			pInputBuffer
     11 @			pOutputBuffer,
     12 @			nGain,
     13 @			nNumLoopSamples
     14 @	);
     15 @
     16 @ Copyright Sonic Network Inc. 2004
     17 @****************************************************************
     18 @ Revision Control:
     19 @   $Revision: 496 $
     20 @   $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $
     21 @****************************************************************
     22 @
     23 @   where:
     24 @	long *pInputBuffer
     25 @	PASSED IN: r0
     26 @
     27 @	EAS_PCM *pOutputBuffer
     28 @	PASSED IN: r1
     29 @
     30 @	short nGain
     31 @	PASSED IN: r2
     32 @
     33 @	EAS_U16	nNumLoopSamples
     34 @	PASSED IN: r3
     35 @
     36 @****************************************************************
     37 
     38 	#include	"ARM_synth_constants_gnu.inc"
     39 
     40 	.arm
     41 	.text
     42 
     43 	.func	SynthMasterGain
     44 SynthMasterGain:
     45 
     46 	.global	SynthMasterGain	@ allow other files to use this function
     47 
     48 
     49 
     50 
     51 
     52 @ Stack frame
     53 @ -----------
     54 	.equ	RET_ADDR_SZ, 0			@return address
     55 	.equ	REG_SAVE_SZ, 0			@save-on-entry registers saved
     56 	.equ	FRAME_SZ, (8)			@local variables
     57 	.equ	ARG_BLK_SZ, 0			@argument block
     58 
     59 	.equ	PARAM_OFFSET, (ARG_BLK_SZ + FRAME_SZ + REG_SAVE_SZ + RET_ADDR_SZ)
     60 
     61 @ Register usage
     62 @ --------------
     63 pnInputBuffer	.req	r0
     64 pnOutputBuffer	.req	r1
     65 nGain	.req	r2
     66 nNumLoopSamples	.req	r3
     67 
     68 	STMFD	sp!,{r4-r6,r14}					@Save any save-on-entry registers that are used
     69 
     70 	LDR		r6, =0x7fff						@constant for saturation tests
     71 
     72 loop:
     73 	LDR		r4, [pnInputBuffer], #4			@fetch 1st output sample
     74 
     75 	LDR		r5, [pnInputBuffer], #4			@fetch 2nd output sample
     76 
     77 	SMULWB	r4, r4, nGain					@output = gain * input
     78 
     79 	CMP		r4, r6							@check for positive saturation
     80 	MOVGT	r4, r6							@saturate
     81 	CMN		r4, r6							@check for negative saturation
     82 	MVNLT	r4, r6							@saturate
     83 
     84 	SMULWB	r5, r5, nGain					@output = gain * input
     85 
     86 	STRH	r4, [pnOutputBuffer], #NEXT_OUTPUT_PCM	@save 1st output sample
     87 
     88 	CMP		r5, r6							@check for positive saturation
     89 	MOVGT	r5, r6							@saturate
     90 	CMN		r5, r6							@check for negative saturation
     91 	MVNLT	r5, r6							@saturate
     92 	STRH	r5, [pnOutputBuffer], #NEXT_OUTPUT_PCM	@save 2nd output sample
     93 
     94 	SUBS	nNumLoopSamples, nNumLoopSamples, #2
     95 	BGT		loop
     96 
     97 @
     98 @ Return to calling function
     99 @----------------------------------------------------------------
    100 
    101 	LDMFD	sp!,{r4-r6, lr}				@ return to calling function
    102 	BX		lr
    103 
    104 @*****************************************************************************
    105 
    106 	.endfunc		@ end of function/procedure
    107 
    108 	.end		@ end of assembly code
    109 
    110