@*********************************************************** @ Function: SynthMasterGain @ Processor: ARM-E @ Description: Copies 32-bit synth output to 16-bit buffer @ with saturated gain control @ C-callable. @ @ Usage: @ SynthMasterGain( @ pInputBuffer @ pOutputBuffer, @ nGain, @ nNumLoopSamples @ ); @ @ Copyright Sonic Network Inc. 2004 @**************************************************************** @ Revision Control: @ $Revision: 496 $ @ $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $ @**************************************************************** @ @ where: @ long *pInputBuffer @ PASSED IN: r0 @ @ EAS_PCM *pOutputBuffer @ PASSED IN: r1 @ @ short nGain @ PASSED IN: r2 @ @ EAS_U16 nNumLoopSamples @ PASSED IN: r3 @ @**************************************************************** #include "ARM_synth_constants_gnu.inc" .arm .text .func SynthMasterGain SynthMasterGain: .global SynthMasterGain @ allow other files to use this function @ Stack frame @ ----------- .equ RET_ADDR_SZ, 0 @return address .equ REG_SAVE_SZ, 0 @save-on-entry registers saved .equ FRAME_SZ, (8) @local variables .equ ARG_BLK_SZ, 0 @argument block .equ PARAM_OFFSET, (ARG_BLK_SZ + FRAME_SZ + REG_SAVE_SZ + RET_ADDR_SZ) @ Register usage @ -------------- pnInputBuffer .req r0 pnOutputBuffer .req r1 nGain .req r2 nNumLoopSamples .req r3 STMFD sp!,{r4-r6,r14} @Save any save-on-entry registers that are used LDR r6, =0x7fff @constant for saturation tests loop: LDR r4, [pnInputBuffer], #4 @fetch 1st output sample LDR r5, [pnInputBuffer], #4 @fetch 2nd output sample SMULWB r4, r4, nGain @output = gain * input CMP r4, r6 @check for positive saturation MOVGT r4, r6 @saturate CMN r4, r6 @check for negative saturation MVNLT r4, r6 @saturate SMULWB r5, r5, nGain @output = gain * input STRH r4, [pnOutputBuffer], #NEXT_OUTPUT_PCM @save 1st output sample CMP r5, r6 @check for positive saturation MOVGT r5, r6 @saturate CMN r5, r6 @check for negative saturation MVNLT r5, r6 @saturate STRH r5, [pnOutputBuffer], #NEXT_OUTPUT_PCM @save 2nd output sample SUBS nNumLoopSamples, nNumLoopSamples, #2 BGT loop @ @ Return to calling function @---------------------------------------------------------------- LDMFD sp!,{r4-r6, lr} @ return to calling function BX lr @***************************************************************************** .endfunc @ end of function/procedure .end @ end of assembly code