mirror of
https://github.com/id-Software/DOOM-IOS2.git
synced 2026-03-20 08:59:35 +01:00
Initial Commit
This commit is contained in:
166
common/embeddedaudiosynthesis/arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s
Executable file
166
common/embeddedaudiosynthesis/arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s
Executable file
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user