@*********************************************************** | |
@ Function: WT_VoiceGain | |
@ Processor: ARM-E | |
@ Description: the main synthesis function when fetching | |
@ wavetable samples. | |
@ C-callable. | |
@ | |
@ Usage: | |
@ Usage: | |
@ WT_VoiceGain( | |
@ S_WT_VOICE *pWTVoice, | |
@ S_WT_FRAME *pWTFrame); | |
@ | |
@ Copyright 2004, 2005 Sonic Network, Inc. | |
@**************************************************************** | |
@ Revision Control: | |
@ $Revision: 814 $ | |
@ $Date: 2007-08-02 10:34:53 -0700 (Thu, 02 Aug 2007) $ | |
@**************************************************************** | |
@ | |
@ where: | |
@ S_WT_VOICE *psVoice | |
@ PASSED IN: r0 | |
@ | |
@ S_WT_FRAME *pWTFrame | |
@ PASSED IN: r1 | |
@**************************************************************** | |
.include "ARM_synth_constants_gnu.inc" | |
.arm | |
.text | |
.global WT_VoiceGain | |
@ Register usage | |
@ -------------- | |
pWTVoice .req r0 | |
pWTFrame .req r1 | |
pInputBuffer .req r2 | |
pMixBuffer .req r3 | |
tmp0 .req r4 | |
tmp1 .req r5 | |
tmp2 .req r1 @ reuse register | |
tmp3 .req r6 | |
numSamples .req r9 | |
.if STEREO_OUTPUT | |
gainIncLeft .req r7 | |
gainIncRight .req r8 | |
gainLeft .req r10 | |
gainRight .req r11 | |
.else | |
gainIncrement .req r7 | |
gain .req r8 | |
.endif | |
@ register context for local variables | |
@SaveRegs RLIST {r4-r11,lr} | |
@RestoreRegs RLIST {r4-r11,pc} | |
.func WT_VoiceGain | |
WT_VoiceGain: | |
STMFD sp!, {r4-r11,lr} | |
LDR pInputBuffer, [pWTFrame, #m_pAudioBuffer] | |
LDR pMixBuffer, [pWTFrame, #m_pMixBuffer] | |
LDR numSamples, [pWTFrame, #m_numSamples] | |
@---------------------------------------------------------------- | |
@ Stereo version | |
@---------------------------------------------------------------- | |
@ NOTE: instructions are reordered to reduce the effect of latency | |
@ due to storage and computational dependencies. | |
@---------------------------------------------------------------- | |
.if STEREO_OUTPUT | |
LDR tmp0, [pWTFrame, #m_prevGain] | |
LDR tmp1, [pWTFrame, #m_gainTarget] | |
LDRSH gainLeft, [pWTVoice, #m_gainLeft] | |
LDRSH gainRight, [pWTVoice, #m_gainRight] | |
MOV gainIncLeft, gainLeft | |
SMULBB gainLeft, tmp0, gainLeft | |
SMULBB gainIncLeft, tmp1, gainIncLeft | |
SUB gainIncLeft, gainIncLeft, gainLeft | |
MOV gainLeft, gainLeft, ASR #(NUM_MIXER_GUARD_BITS - 2) | |
MOV gainIncLeft, gainIncLeft, ASR #(SYNTH_UPDATE_PERIOD_IN_BITS + NUM_MIXER_GUARD_BITS - 2) | |
MOV gainIncRight, gainRight | |
SMULBB gainRight, tmp0, gainRight | |
SMULBB gainIncRight, tmp1, gainIncRight | |
SUB gainIncRight, gainIncRight, gainRight | |
MOV gainRight, gainRight, ASR #(NUM_MIXER_GUARD_BITS - 2) | |
MOV gainIncRight, gainIncRight, ASR #(SYNTH_UPDATE_PERIOD_IN_BITS + NUM_MIXER_GUARD_BITS - 2) | |
LDRSH tmp0, [pInputBuffer], #2 | |
StereoGainLoop: | |
LDR tmp1, [pMixBuffer] | |
ADD gainLeft, gainLeft, gainIncLeft | |
SMLAWB tmp1, gainLeft, tmp0, tmp1 | |
LDR tmp2, [pMixBuffer, #4] | |
ADD gainRight, gainRight, gainIncRight | |
STR tmp1, [pMixBuffer], #4 | |
SMLAWB tmp2, gainRight, tmp0, tmp2 | |
SUBS numSamples, numSamples, #1 | |
LDRGTSH tmp0, [pInputBuffer], #2 | |
STR tmp2, [pMixBuffer], #4 | |
BGT StereoGainLoop | |
@---------------------------------------------------------------- | |
@ Mono version | |
@---------------------------------------------------------------- | |
.else | |
LDR gain, [pWTFrame, #m_prevGain] | |
MOV gain, gain, LSL #(NUM_MIXER_GUARD_BITS + 4) | |
LDR gainIncrement, [pWTFrame, #m_gainTarget] | |
MOV gainIncrement, gainIncrement, LSL #(NUM_MIXER_GUARD_BITS + 4) | |
SUB gainIncrement, gainIncrement, gain | |
MOV gainIncrement, gainIncrement, ASR #SYNTH_UPDATE_PERIOD_IN_BITS | |
MonoGainLoop: | |
LDRSH tmp0, [pInputBuffer], #NEXT_OUTPUT_PCM @ fetch voice output | |
LDR tmp1, [pMixBuffer] @ get left channel output sample | |
ADD gain, gain, gainIncrement @ gain step to eliminate zipper noise | |
SMULWB tmp0, gain, tmp0 @ sample * local gain | |
MOV tmp0, tmp0, ASR #1 @ add 6dB headroom | |
ADD tmp1, tmp0, tmp1 | |
STR tmp1, [pMixBuffer], #4 @ save and bump pointer | |
SUBS numSamples, numSamples, #1 | |
BGT MonoGainLoop | |
.endif @end Mono version | |
LDMFD sp!,{r4-r11,lr} | |
BX lr | |
.endfunc | |
.end | |