17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@***********************************************************
27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Function:    WT_VoiceGain
37df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Processor:   ARM-E
47df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Description: the main synthesis function when fetching
57df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@			   wavetable samples.
67df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@              C-callable.
77df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
87df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Usage:
97df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Usage:
107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	WT_VoiceGain(
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@			S_WT_VOICE *pWTVoice,
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@			S_WT_FRAME *pWTFrame);
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Copyright 2004, 2005 Sonic Network, Inc.
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Revision Control:
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Revision: 814 $
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Date: 2007-08-02 10:34:53 -0700 (Thu, 02 Aug 2007) $
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   where:
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	S_WT_VOICE *psVoice
237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r0
247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	S_WT_FRAME *pWTFrame
267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r1
277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.include	"ARM_synth_constants_gnu.inc"
327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.arm
347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.text
357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.global	WT_VoiceGain
377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Register usage
397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ --------------
407df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpWTVoice	.req	r0
417df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpWTFrame	.req	r1
427df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpInputBuffer	.req	r2
437df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpMixBuffer	.req	r3
447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
457df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp0	.req	r4
467df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp1	.req	r5
477df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp2	.req	r1	@ reuse register
487df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp3	.req	r6
497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
507df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectnumSamples	.req	r9
517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.if	STEREO_OUTPUT
537df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectgainIncLeft	.req	r7
547df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectgainIncRight	.req	r8
557df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectgainLeft	.req	r10
567df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectgainRight	.req	r11
577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.else
587df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectgainIncrement	.req	r7
597df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectgain	.req	r8
607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endif
617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ register context for local variables
647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@SaveRegs	RLIST	{r4-r11,lr}
657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@RestoreRegs	RLIST	{r4-r11,pc}
667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.func	WT_VoiceGain
687df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectWT_VoiceGain:
697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STMFD	sp!, {r4-r11,lr}
717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		pInputBuffer, [pWTFrame, #m_pAudioBuffer]
737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		pMixBuffer, [pWTFrame, #m_pMixBuffer]
747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		numSamples, [pWTFrame, #m_numSamples]
757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Stereo version
787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ NOTE: instructions are reordered to reduce the effect of latency
807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ due to storage and computational dependencies.
817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.if	STEREO_OUTPUT
847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		tmp0, [pWTFrame, #m_prevGain]
867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		tmp1, [pWTFrame, #m_gainTarget]
877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	gainLeft, [pWTVoice, #m_gainLeft]
897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	gainRight, [pWTVoice, #m_gainRight]
907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainIncLeft, gainLeft
927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULBB	gainLeft, tmp0, gainLeft
937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULBB	gainIncLeft, tmp1, gainIncLeft
957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUB		gainIncLeft, gainIncLeft, gainLeft
967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainLeft, gainLeft, ASR #(NUM_MIXER_GUARD_BITS - 2)
977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainIncLeft, gainIncLeft, ASR #(SYNTH_UPDATE_PERIOD_IN_BITS + NUM_MIXER_GUARD_BITS - 2)
987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainIncRight, gainRight
1007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULBB	gainRight, tmp0, gainRight
1017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULBB	gainIncRight, tmp1, gainIncRight
1037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUB		gainIncRight, gainIncRight, gainRight
1047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainRight, gainRight, ASR #(NUM_MIXER_GUARD_BITS - 2)
1057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainIncRight, gainIncRight, ASR #(SYNTH_UPDATE_PERIOD_IN_BITS + NUM_MIXER_GUARD_BITS - 2)
1067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH		tmp0, [pInputBuffer], #2
1087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1097df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectStereoGainLoop:
1107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		tmp1, [pMixBuffer]
1117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD		gainLeft, gainLeft, gainIncLeft
1137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMLAWB	tmp1, gainLeft, tmp0, tmp1
1157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		tmp2, [pMixBuffer, #4]
1177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD		gainRight, gainRight, gainIncRight
1197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STR		tmp1, [pMixBuffer], #4
1217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMLAWB	tmp2, gainRight, tmp0, tmp2
1237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUBS	numSamples, numSamples, #1
1257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRGTSH	tmp0, [pInputBuffer], #2
1277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STR		tmp2, [pMixBuffer], #4
1297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BGT		StereoGainLoop
1317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
1337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Mono version
1347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
1357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.else
1367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		gain, [pWTFrame, #m_prevGain]
1387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gain, gain, LSL #(NUM_MIXER_GUARD_BITS + 4)
1397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		gainIncrement, [pWTFrame, #m_gainTarget]
1407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainIncrement, gainIncrement, LSL #(NUM_MIXER_GUARD_BITS + 4)
1417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUB		gainIncrement, gainIncrement, gain
1427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		gainIncrement, gainIncrement, ASR #SYNTH_UPDATE_PERIOD_IN_BITS
1437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1447df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectMonoGainLoop:
1457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	tmp0, [pInputBuffer], #NEXT_OUTPUT_PCM	@ fetch voice output
1477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		tmp1, [pMixBuffer]						@ get left channel output sample
1497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD		gain, gain, gainIncrement				@ gain step to eliminate zipper noise
1507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULWB	tmp0, gain, tmp0 						@ sample * local gain
1517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		tmp0, tmp0, ASR #1						@ add 6dB headroom
1537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD 	tmp1, tmp0, tmp1
1547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STR		tmp1, [pMixBuffer], #4					@ save and bump pointer
1557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUBS	numSamples, numSamples, #1
1577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BGT		MonoGainLoop
1587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endif	@end Mono version
1607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDMFD	sp!,{r4-r11,lr}
1627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BX		lr
1637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endfunc
1657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.end
1667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
167