17df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 27df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File: 47df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * eas_wtengine.c 57df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 67df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Contents and purpose: 77df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This file contains the critical synthesizer components that need to 87df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * be optimized for best performance. 956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Copyright Sonic Network Inc. 2004-2005 117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License. 147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at 157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and 227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License. 237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Revision Control: 267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * $Revision: 844 $ 277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * $Date: 2007-08-23 14:33:32 -0700 (Thu, 23 Aug 2007) $ 287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 297df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*------------------------------------ 327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * includes 337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *------------------------------------ 347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 357df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_types.h" 367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_math.h" 377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_audioconst.h" 387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_sndlib.h" 397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_wtengine.h" 407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#include "eas_mixer.h" 417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * prototypes 447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 467df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern void WT_NoiseGenerator (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); 477df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern void WT_VoiceGain (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); 487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_OPTIMIZED_MONO) 507df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern void WT_InterpolateMono (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); 517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#else 527df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern void WT_InterpolateNoLoop (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); 537df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern void WT_Interpolate (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); 547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_FILTER_ENABLED) 577df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectextern void WT_VoiceFilter (S_FILTER_CONTROL*pFilter, S_WT_INT_FRAME *pWTIntFrame); 5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_OPTIMIZED_MONO) || !defined(NATIVE_EAS_KERNEL) 617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_VoiceGain 637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Output gain for individual voice 6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*lint -esym(715, pWTVoice) reserved for future use */ 747df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid WT_VoiceGain (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame) 757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 *pMixBuffer; 7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM *pInputBuffer; 7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 gain; 7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 gainIncrement; 8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp0; 8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp1; 8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp2; 8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 numSamples; 8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if (NUM_OUTPUT_CHANNELS == 2) 8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 gainLeft, gainRight; 877df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some local variables */ 9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks numSamples = pWTIntFrame->numSamples; 9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pMixBuffer = pWTIntFrame->pMixBuffer; 9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pInputBuffer = pWTIntFrame->pAudioBuffer; 9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{703} <avoid multiply for performance>*/ 9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncrement = (pWTIntFrame->frame.gainTarget - pWTIntFrame->prevGain) << (16 - SYNTH_UPDATE_PERIOD_IN_BITS); 9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (gainIncrement < 0) 9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncrement++; 9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{703} <avoid multiply for performance>*/ 9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gain = pWTIntFrame->prevGain << 16; 10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if (NUM_OUTPUT_CHANNELS == 2) 10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainLeft = pWTVoice->gainLeft; 10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainRight = pWTVoice->gainRight; 1047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (numSamples--) { 10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* incremental gain step to prevent zipper noise */ 10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = *pInputBuffer++; 11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gain += gainIncrement; 11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 = gain >> 16; 11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* scale sample by gain */ 11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 *= tmp0; 11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* stereo output */ 11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if (NUM_OUTPUT_CHANNELS == 2) 12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 = tmp2 >> 14; 12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the current sample in the final mix buffer */ 12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = *pMixBuffer; 12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* left channel */ 12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = tmp2 * gainLeft; 12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = tmp0 >> NUM_MIXER_GUARD_BITS; 13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 += tmp0; 13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pMixBuffer++ = tmp1; 13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the current sample in the final mix buffer */ 13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = *pMixBuffer; 13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* right channel */ 13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = tmp2 * gainRight; 13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = tmp0 >> NUM_MIXER_GUARD_BITS; 14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 += tmp0; 14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pMixBuffer++ = tmp1; 14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* mono output */ 1447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#else 1457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get the current sample in the final mix buffer */ 14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = *pMixBuffer; 14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 = tmp2 >> (NUM_MIXER_GUARD_BITS - 1); 15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 += tmp2; 15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pMixBuffer++ = tmp1; 1527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 1537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 1557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 1567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 1577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 1587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifndef NATIVE_EAS_KERNEL 1597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 1607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_Interpolate 1617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 1637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Interpolation engine for wavetable synth 16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 1677df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 1687df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 1697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 1707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 1717df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid WT_Interpolate (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame) 1727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM *pOutputBuffer; 17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 phaseInc; 17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 phaseFrac; 17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 acc0; 17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const EAS_SAMPLE *pSamples; 17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const EAS_SAMPLE *loopEnd; 17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 samp1; 18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 samp2; 18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 numSamples; 18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some local variables */ 18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks numSamples = pWTIntFrame->numSamples; 18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pOutputBuffer = pWTIntFrame->pAudioBuffer; 18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks loopEnd = (const EAS_SAMPLE*) pWTVoice->loopEnd + 1; 18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSamples = (const EAS_SAMPLE*) pWTVoice->phaseAccum; 18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{713} truncation is OK */ 19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseFrac = pWTVoice->phaseFrac; 19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseInc = pWTIntFrame->frame.phaseIncrement; 19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* fetch adjacent samples */ 1947df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_8_BIT_SAMPLES) 19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0] << 8; 19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1] << 8; 19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0]; 20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1]; 20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (numSamples--) { 20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* linear interpolation */ 20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = samp2 - samp1; 20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = acc0 * phaseFrac; 20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = samp1 + (acc0 >> NUM_PHASE_FRAC_BITS); 21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save new output sample in buffer */ 21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pOutputBuffer++ = (EAS_I16)(acc0 >> 2); 21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* increment phase */ 21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseFrac += phaseInc; 21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = phaseFrac >> NUM_PHASE_FRAC_BITS; 22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* next sample */ 22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (acc0 > 0) { 22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* advance sample pointer */ 22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSamples += acc0; 22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseFrac = (EAS_I32)((EAS_U32)phaseFrac & PHASE_FRAC_MASK); 22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* check for loop end */ 22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = (EAS_I32) (pSamples - loopEnd); 23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (acc0 >= 0) 23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSamples = (const EAS_SAMPLE*) pWTVoice->loopStart + acc0; 23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* fetch new samples */ 2347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_8_BIT_SAMPLES) 23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0] << 8; 23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1] << 8; 23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0]; 24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1]; 24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save pointer and phase */ 24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseAccum = (EAS_U32) pSamples; 24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseFrac = (EAS_U32) phaseFrac; 24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} 2507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 2517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 2527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifndef NATIVE_EAS_KERNEL 2537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 2547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_InterpolateNoLoop 2557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 2577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Interpolation engine for wavetable synth 25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 2617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 2627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 2637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 2647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 2657df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid WT_InterpolateNoLoop (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame) 2667df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM *pOutputBuffer; 26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 phaseInc; 26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 phaseFrac; 27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 acc0; 27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const EAS_SAMPLE *pSamples; 27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 samp1; 27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 samp2; 27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 numSamples; 27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some local variables */ 27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks numSamples = pWTIntFrame->numSamples; 27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pOutputBuffer = pWTIntFrame->pAudioBuffer; 27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseInc = pWTIntFrame->frame.phaseIncrement; 28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSamples = (const EAS_SAMPLE*) pWTVoice->phaseAccum; 28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseFrac = (EAS_I32)pWTVoice->phaseFrac; 28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* fetch adjacent samples */ 2857df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_8_BIT_SAMPLES) 28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0] << 8; 28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1] << 8; 29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0]; 29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1]; 29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (numSamples--) { 29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* linear interpolation */ 29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = samp2 - samp1; 30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = acc0 * phaseFrac; 30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = samp1 + (acc0 >> NUM_PHASE_FRAC_BITS); 30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save new output sample in buffer */ 30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pOutputBuffer++ = (EAS_I16)(acc0 >> 2); 30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* increment phase */ 30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseFrac += phaseInc; 31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide>*/ 31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = phaseFrac >> NUM_PHASE_FRAC_BITS; 31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* next sample */ 31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (acc0 > 0) { 31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* advance sample pointer */ 31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pSamples += acc0; 31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseFrac = (EAS_I32)((EAS_U32)phaseFrac & PHASE_FRAC_MASK); 31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* fetch new samples */ 3217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_8_BIT_SAMPLES) 32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0] << 8; 32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{701} <avoid multiply for performance>*/ 32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1] << 8; 32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp1 = pSamples[0]; 32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks samp2 = pSamples[1]; 32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save pointer and phase */ 33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseAccum = (EAS_U32) pSamples; 33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseFrac = (EAS_U32) phaseFrac; 3367df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 3377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 3387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 3397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_FILTER_ENABLED) && !defined(NATIVE_EAS_KERNEL) 3407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 3417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_VoiceFilter 3427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 3447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Implements a 2-pole filter 34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 3487df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 3497df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 3507df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 3517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 3527df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid WT_VoiceFilter (S_FILTER_CONTROL *pFilter, S_WT_INT_FRAME *pWTIntFrame) 3537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM *pAudioBuffer; 35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 k; 35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 b1; 35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 b2; 35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 z1; 35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 z2; 36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 acc0; 36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 acc1; 36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 numSamples; 36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some local variables */ 36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks numSamples = pWTIntFrame->numSamples; 36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pAudioBuffer = pWTIntFrame->pAudioBuffer; 36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks z1 = pFilter->z1; 36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks z2 = pFilter->z2; 37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks b1 = -pWTIntFrame->frame.b1; 37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{702} <avoid divide> */ 37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks b2 = -pWTIntFrame->frame.b2 >> 1; 37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{702} <avoid divide> */ 37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks k = pWTIntFrame->frame.k >> 1; 37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (numSamples--) 37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* do filter calculations */ 38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = *pAudioBuffer; 38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc1 = z1 * b1; 38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc1 += z2 * b2; 38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks acc0 = acc1 + k * acc0; 38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks z2 = z1; 38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{702} <avoid divide> */ 38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks z1 = acc0 >> 14; 39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pAudioBuffer++ = (EAS_I16) z1; 39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* save delay values */ 39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pFilter->z1 = (EAS_I16) z1; 39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pFilter->z2 = (EAS_I16) z2; 3967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 3977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 3987df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 3997df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 4007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_NoiseGenerator 4017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 4037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Generate pseudo-white noise using PRNG and interpolation engine 40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 4077df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 4087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4097df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Notes: 4107df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This output is scaled -12dB to prevent saturation in the filter. For a 4117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * high quality synthesizer, the output can be set to full scale, however 4127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * if the filter is used, it can overflow with certain coefficients. In this 4137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * case, either a saturation operation should take in the filter before 4147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * scaling back to 16 bits or the signal path should be increased to 18 bits 4157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * or more. 4167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 4177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 4187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project void WT_NoiseGenerator (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame) 4197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project { 42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_PCM *pOutputBuffer; 42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 phaseInc; 42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp0; 42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp1; 42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 nInterpolatedSample; 42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 numSamples; 42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* initialize some local variables */ 42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks numSamples = pWTIntFrame->numSamples; 42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pOutputBuffer = pWTIntFrame->pAudioBuffer; 43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseInc = pWTIntFrame->frame.phaseIncrement; 43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* get last two samples generated */ 43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide for performance>*/ 43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = (EAS_I32) (pWTVoice->phaseAccum) >> 18; 43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{704} <avoid divide for performance>*/ 43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = (EAS_I32) (pWTVoice->loopEnd) >> 18; 43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* generate a buffer of noise */ 43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks while (numSamples--) { 44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks nInterpolatedSample = MULT_AUDIO_COEF( tmp0, (PHASE_ONE - pWTVoice->phaseFrac)); 44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks nInterpolatedSample += MULT_AUDIO_COEF( tmp1, pWTVoice->phaseFrac); 44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pOutputBuffer++ = (EAS_PCM) nInterpolatedSample; 44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* update PRNG */ 44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseFrac += (EAS_U32) phaseInc; 44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (GET_PHASE_INT_PART(pWTVoice->phaseFrac)) { 44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = tmp1; 44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseAccum = pWTVoice->loopEnd; 44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->loopEnd = (5 * pWTVoice->loopEnd + 1); 45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = (EAS_I32) (pWTVoice->loopEnd) >> 18; 45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseFrac = GET_PHASE_FRAC_PART(pWTVoice->phaseFrac); 45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 4557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 4567df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 4577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifndef _OPTIMIZED_MONO 4587df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 4597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_ProcessVoice 4607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 4627df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This routine does the block processing for one voice. It is isolated 4637df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * from the main synth code to allow for various implementation-specific 4647df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * optimizations. It calls the interpolator, filter, and gain routines 4657df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * appropriate for a particular configuration. 46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 4697df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 4707df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 4717df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Notes: 4727df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 4737df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 4747df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid WT_ProcessVoice (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame) 4757df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 4767df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* use noise generator */ 47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pWTVoice->loopStart == WT_NOISE_GENERATOR) 47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_NoiseGenerator(pWTVoice, pWTIntFrame); 4807df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* generate interpolated samples for looped waves */ 48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else if (pWTVoice->loopStart != pWTVoice->loopEnd) 48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_Interpolate(pWTVoice, pWTIntFrame); 48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* generate interpolated samples for unlooped waves */ 48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_InterpolateNoLoop(pWTVoice, pWTIntFrame); 48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 4907df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 4917df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef _FILTER_ENABLED 49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pWTIntFrame->frame.k != 0) 49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_VoiceFilter(&pWTVoice->filter, pWTIntFrame); 49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif 4957df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 4967df30109963092559d3760c0661a020f9daf1030The Android Open Source Project//2 TEST NEW MIXER FUNCTION 4977df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef UNIFIED_MIXER 49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 gainLeft, gainIncLeft; 5007df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 5017df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if (NUM_OUTPUT_CHANNELS == 2) 50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 gainRight, gainIncRight; 5037df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 5047df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainLeft = (pWTIntFrame->prevGain * pWTVoice->gainLeft) << 1; 50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncLeft = (((pWTIntFrame->frame.gainTarget * pWTVoice->gainLeft) << 1) - gainLeft) >> SYNTH_UPDATE_PERIOD_IN_BITS; 50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5087df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if (NUM_OUTPUT_CHANNELS == 2) 50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainRight = (pWTIntFrame->prevGain * pWTVoice->gainRight) << 1; 51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncRight = (((pWTIntFrame->frame.gainTarget * pWTVoice->gainRight) << 1) - gainRight) >> SYNTH_UPDATE_PERIOD_IN_BITS; 51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_MixStream( 51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTIntFrame->pAudioBuffer, 51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTIntFrame->pMixBuffer, 51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTIntFrame->numSamples, 51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainLeft, 51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainRight, 51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncLeft, 51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncRight, 51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks MIX_FLAGS_STEREO_OUTPUT); 52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else 52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_MixStream( 52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTIntFrame->pAudioBuffer, 52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTIntFrame->pMixBuffer, 52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTIntFrame->numSamples, 52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainLeft, 52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 0, 52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncLeft, 52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 0, 53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 0); 5317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 5337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 5347df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#else 53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* apply gain, and left and right gain */ 53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_VoiceGain(pWTVoice, pWTIntFrame); 5377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 5387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 5397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 5407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 5417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#if defined(_OPTIMIZED_MONO) && !defined(NATIVE_EAS_KERNEL) 5427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 5437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_InterpolateMono 5447df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 5467df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * A C version of the sample interpolation + gain routine, optimized for mono. 5477df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * It's not pretty, but it matches the assembly code exactly. 54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 5517df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 5527df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 5537df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Notes: 5547df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 5557df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 5567df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid WT_InterpolateMono (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame) 5577df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 *pMixBuffer; 55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const EAS_I8 *pLoopEnd; 56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks const EAS_I8 *pCurrentPhaseInt; 56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 numSamples; 56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 gain; 56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 gainIncrement; 56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 currentPhaseFrac; 56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 phaseInc; 56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp0; 56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp1; 56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I32 tmp2; 56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks EAS_I8 *pLoopStart; 57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks numSamples = pWTIntFrame->numSamples; 57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pMixBuffer = pWTIntFrame->pMixBuffer; 57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* calculate gain increment */ 57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncrement = (pWTIntFrame->gainTarget - pWTIntFrame->prevGain) << (16 - SYNTH_UPDATE_PERIOD_IN_BITS); 57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (gainIncrement < 0) 57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gainIncrement++; 57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gain = pWTIntFrame->prevGain << 16; 57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pCurrentPhaseInt = pWTVoice->pPhaseAccum; 58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks currentPhaseFrac = pWTVoice->phaseFrac; 58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks phaseInc = pWTIntFrame->phaseIncrement; 58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pLoopStart = pWTVoice->pLoopStart; 58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pLoopEnd = pWTVoice->pLoopEnd + 1; 58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 5877df30109963092559d3760c0661a020f9daf1030The Android Open Source ProjectInterpolationLoop: 58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = (EAS_I32)(pCurrentPhaseInt - pLoopEnd); 58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (tmp0 >= 0) 59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pCurrentPhaseInt = pLoopStart + tmp0; 59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = *pCurrentPhaseInt; 59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = *(pCurrentPhaseInt + 1); 59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 = phaseInc + currentPhaseFrac; 59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = tmp1 - tmp0; 59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = tmp1 * currentPhaseFrac; 59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp1 = tmp0 + (tmp1 >> NUM_EG1_FRAC_BITS); 60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pCurrentPhaseInt += (tmp2 >> NUM_PHASE_FRAC_BITS); 60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks currentPhaseFrac = tmp2 & PHASE_FRAC_MASK; 60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks gain += gainIncrement; 60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 = (gain >> SYNTH_UPDATE_PERIOD_IN_BITS); 60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = *pMixBuffer; 60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 = tmp1 * tmp2; 61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp2 = (tmp2 >> 9); 61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks tmp0 = tmp2 + tmp0; 61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *pMixBuffer++ = tmp0; 61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks numSamples--; 61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (numSamples > 0) 61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks goto InterpolationLoop; 61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->pPhaseAccum = pCurrentPhaseInt; 61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->phaseFrac = currentPhaseFrac; 62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /*lint -e{702} <avoid divide>*/ 62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks pWTVoice->gain = (EAS_I16)(gain >> SYNTH_UPDATE_PERIOD_IN_BITS); 6227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 6237df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 6247df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 6257df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#ifdef _OPTIMIZED_MONO 6267df30109963092559d3760c0661a020f9daf1030The Android Open Source Project/*---------------------------------------------------------------------------- 6277df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WT_ProcessVoice 6287df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: 6307df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This routine does the block processing for one voice. It is isolated 6317df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * from the main synth code to allow for various implementation-specific 6327df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * optimizations. It calls the interpolator, filter, and gain routines 6337df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * appropriate for a particular configuration. 63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs: 63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * 6377df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Outputs: 6387df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * 6397df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Notes: 6407df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * This special version works handles an optimized mono-only signal 6417df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * without filters 6427df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *---------------------------------------------------------------------------- 6437df30109963092559d3760c0661a020f9daf1030The Android Open Source Project*/ 6447df30109963092559d3760c0661a020f9daf1030The Android Open Source Projectvoid WT_ProcessVoice (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame) 6457df30109963092559d3760c0661a020f9daf1030The Android Open Source Project{ 64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* use noise generator */ 64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks if (pWTVoice->loopStart== WT_NOISE_GENERATOR) 64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_NoiseGenerator(pWTVoice, pWTIntFrame); 65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_VoiceGain(pWTVoice, pWTIntFrame); 65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks 65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks /* or generate interpolated samples */ 65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks else 65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks { 65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks WT_InterpolateMono(pWTVoice, pWTIntFrame); 65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks } 6597df30109963092559d3760c0661a020f9daf1030The Android Open Source Project} 6607df30109963092559d3760c0661a020f9daf1030The Android Open Source Project#endif 6617df30109963092559d3760c0661a020f9daf1030The Android Open Source Project 662