17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@***********************************************************
27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Function:    WT_Interpolate
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@	void WT_Interpolate(
107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@		S_WT_VOICE *pWTVoice,
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@		S_WT_FRAME *pWTFrame);
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Copyright Sonic Network Inc. 2004
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Revision Control:
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Revision: 496 $
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   $Date: 2006-12-11 14:33:26 -0800 (Mon, 11 Dec 2006) $
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@   where:
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	S_WT_VOICE *pWTVoice
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r0
237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	S_WT_FRAME *pWTFrame;
257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@	PASSED IN: r1
267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@****************************************************************
277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.include	"ARM_synth_constants_gnu.inc"
297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.arm
317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.text
327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.global	WT_Interpolate
347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Register usage
377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ --------------
387df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpWTVoice	.req	r0
397df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpWTFrame	.req	r1
407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
417df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectnumSamples	.req	r2
427df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectphaseIncrement	.req	r3
437df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpOutputBuffer	.req	r4
447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
457df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp0	.req	r1	@reuse register
467df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp1	.req	r5
477df30109963092559d3760c0661a020f9daf1030The Android Open Source Projecttmp2	.req	r6
487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
497df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpLoopEnd	.req	r7
507df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpLoopStart	.req	r8
517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
527df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectpPhaseAccum	.req	r9
537df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectphaseFrac	.req	r10
547df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectphaseFracMask	.req	r11
557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@SaveRegs	RLIST	{r4-r11,lr}
577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@RestoreRegs	RLIST	{r4-r11,pc}
587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.func	WT_Interpolate
607df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectWT_Interpolate:
617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STMFD	sp!,{r4-r11,lr}
637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@
657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ Fetch parameters from structures
667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@----------------------------------------------------------------
677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		pOutputBuffer, [pWTFrame, #m_pAudioBuffer]
697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		numSamples, [pWTFrame, #m_numSamples]
707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		phaseIncrement, [pWTFrame, #m_phaseIncrement]
727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		pPhaseAccum, [pWTVoice, #m_pPhaseAccum]
737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		phaseFrac, [pWTVoice, #m_phaseFrac]
747df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		phaseFracMask,=PHASE_FRAC_MASK
757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		pLoopStart, [pWTVoice, #m_pLoopStart]
777df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDR		pLoopEnd, [pWTVoice, #m_pLoopEnd]
787df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD		pLoopEnd, pLoopEnd, #1					@ need loop end to equal last sample + 1
797df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
807df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectInterpolationLoop:
817df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUBS	tmp0, pPhaseAccum, pLoopEnd		@ check for loop end
827df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADDGE	pPhaseAccum, pLoopStart, tmp0	@ loop back to start
837df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
847df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.ifdef	SAMPLES_8_BIT
857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSB	tmp0, [pPhaseAccum]				@ tmp0 = x0
867df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSB	tmp1, [pPhaseAccum, #1]			@ tmp1 = x1
877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.else
887df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	tmp0, [pPhaseAccum]				@ tmp0 = x0
897df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDRSH	tmp1, [pPhaseAccum, #2]			@ tmp1 = x1
907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endif
917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
927df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD		tmp2, phaseIncrement, phaseFrac	@ increment pointer here to avoid pipeline stall
937df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUB		tmp1, tmp1, tmp0						@ tmp1 = x1 - x0
957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SMULBB	tmp1, phaseFrac, tmp1			@ tmp1 = phaseFrac * tmp2
967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ This section performs a gain adjustment of -12dB for 16-bit samples
987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ or +36dB for 8-bit samples. For a high quality synthesizer, the output
997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ can be set to full scale, however if the filter is used, it can overflow
1007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ with certain coefficients and signal sources. In this case, either a
1017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ saturation operation should take in the filter before scaling back to
1027df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ 16 bits or the signal path should be increased to 18 bits or more.
1037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.ifdef	SAMPLES_8_BIT
1057df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		tmp0, tmp0, LSL #6							@ boost 8-bit signal by 36dB
1067df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.else
1077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	MOV		tmp0, tmp0, ASR #2							@ reduce 16-bit signal by 12dB
1087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endif
1097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD		tmp1, tmp0, tmp1, ASR #(NUM_EG1_FRAC_BITS-6)	@ tmp1 = tmp0 + (tmp1 >> (15-6))
1117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project															@	   = x0 + f * (x1 - x0) == interpolated result
1127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STRH	tmp1, [pOutputBuffer], #NEXT_OUTPUT_PCM	@ *pOutputBuffer++ = interpolated result
1147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ carry overflow from fraction to integer portion
1167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	ADD	pPhaseAccum, pPhaseAccum, tmp2, LSR #(NUM_PHASE_FRAC_BITS - NEXT_INPUT_PCM_SHIFT)
1177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	AND	phaseFrac, tmp2, phaseFracMask		@ nphaseFrac = frac part
1187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	SUBS	numSamples, numSamples, #1
1207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BGT		InterpolationLoop
1217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project@ update and store phase
1237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STR		pPhaseAccum, [pWTVoice, #m_pPhaseAccum]
1247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	STR		phaseFrac, [pWTVoice, #m_phaseFrac]
1257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	LDMFD	sp!,{r4-r11,lr}
1277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	BX		lr
1287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
1297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.endfunc
1307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project	.end
1317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
132