blob: b4e905be79622936d24155227fa3224e361371fd [file] [log] [blame]
@***********************************************************
@ 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