summaryrefslogtreecommitdiffstats
path: root/arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s')
-rw-r--r--arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s166
1 files changed, 166 insertions, 0 deletions
diff --git a/arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s b/arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s
new file mode 100644
index 0000000..4517a3d
--- /dev/null
+++ b/arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s
@@ -0,0 +1,166 @@
+@***********************************************************
+@ 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
+