@*********************************************************** | |
@ 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 | |