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