1*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 2*f81fb7c4SAndroid Build Coastguard Worker * 3*f81fb7c4SAndroid Build Coastguard Worker * File: 4*f81fb7c4SAndroid Build Coastguard Worker * eas_wtengine.h 5*f81fb7c4SAndroid Build Coastguard Worker * 6*f81fb7c4SAndroid Build Coastguard Worker * Contents and purpose: 7*f81fb7c4SAndroid Build Coastguard Worker * This file defines the interface for wavetable synthesis engine 8*f81fb7c4SAndroid Build Coastguard Worker * 9*f81fb7c4SAndroid Build Coastguard Worker * Copyright Sonic Network Inc. 2004 10*f81fb7c4SAndroid Build Coastguard Worker 11*f81fb7c4SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 12*f81fb7c4SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 13*f81fb7c4SAndroid Build Coastguard Worker * You may obtain a copy of the License at 14*f81fb7c4SAndroid Build Coastguard Worker * 15*f81fb7c4SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 16*f81fb7c4SAndroid Build Coastguard Worker * 17*f81fb7c4SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 18*f81fb7c4SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 19*f81fb7c4SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20*f81fb7c4SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 21*f81fb7c4SAndroid Build Coastguard Worker * limitations under the License. 22*f81fb7c4SAndroid Build Coastguard Worker * 23*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 24*f81fb7c4SAndroid Build Coastguard Worker * Revision Control: 25*f81fb7c4SAndroid Build Coastguard Worker * $Revision: 818 $ 26*f81fb7c4SAndroid Build Coastguard Worker * $Date: 2007-08-02 15:19:41 -0700 (Thu, 02 Aug 2007) $ 27*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 28*f81fb7c4SAndroid Build Coastguard Worker */ 29*f81fb7c4SAndroid Build Coastguard Worker 30*f81fb7c4SAndroid Build Coastguard Worker #ifndef _EAS_WTENGINE_H 31*f81fb7c4SAndroid Build Coastguard Worker #define _EAS_WTENGINE_H 32*f81fb7c4SAndroid Build Coastguard Worker 33*f81fb7c4SAndroid Build Coastguard Worker /* option sanity check */ 34*f81fb7c4SAndroid Build Coastguard Worker #if defined(_OPTIMIZED_MONO) && defined(_FILTER_ENABLED) 35*f81fb7c4SAndroid Build Coastguard Worker #error "Incompatible build settings: _OPTIMIZED_MONO cannot be used with _FILTER_ENABLED" 36*f81fb7c4SAndroid Build Coastguard Worker #endif 37*f81fb7c4SAndroid Build Coastguard Worker 38*f81fb7c4SAndroid Build Coastguard Worker #if defined(_OPTIMIZED_MONO) && (NUM_OUTPUT_CHANNELS != 1) 39*f81fb7c4SAndroid Build Coastguard Worker #error "Incompatible build settings: _OPTIMIZED_MONO can only be used with NUM_OUTPUT_CHANNELS = 1" 40*f81fb7c4SAndroid Build Coastguard Worker #endif 41*f81fb7c4SAndroid Build Coastguard Worker 42*f81fb7c4SAndroid Build Coastguard Worker #include "eas_wt_IPC_frame.h" 43*f81fb7c4SAndroid Build Coastguard Worker 44*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 45*f81fb7c4SAndroid Build Coastguard Worker * defines 46*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 47*f81fb7c4SAndroid Build Coastguard Worker */ 48*f81fb7c4SAndroid Build Coastguard Worker #define WT_NOISE_GENERATOR 0xffffffff 49*f81fb7c4SAndroid Build Coastguard Worker 50*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 51*f81fb7c4SAndroid Build Coastguard Worker * typedefs 52*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 53*f81fb7c4SAndroid Build Coastguard Worker */ 54*f81fb7c4SAndroid Build Coastguard Worker 55*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 56*f81fb7c4SAndroid Build Coastguard Worker * S_WT_INT_FRAME 57*f81fb7c4SAndroid Build Coastguard Worker * 58*f81fb7c4SAndroid Build Coastguard Worker * This structure includes S_WT_FRAME plus the bus mixing 59*f81fb7c4SAndroid Build Coastguard Worker * parameters for the internal voices. 60*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 61*f81fb7c4SAndroid Build Coastguard Worker */ 62*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_wt_int_frame_tag 63*f81fb7c4SAndroid Build Coastguard Worker { 64*f81fb7c4SAndroid Build Coastguard Worker S_WT_FRAME frame; 65*f81fb7c4SAndroid Build Coastguard Worker EAS_PCM *pAudioBuffer; 66*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 *pMixBuffer; 67*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 numSamples; 68*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 prevGain; 69*f81fb7c4SAndroid Build Coastguard Worker } S_WT_INT_FRAME; 70*f81fb7c4SAndroid Build Coastguard Worker 71*f81fb7c4SAndroid Build Coastguard Worker #if defined(_FILTER_ENABLED) 72*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 73*f81fb7c4SAndroid Build Coastguard Worker * S_FILTER_CONTROL data structure 74*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 75*f81fb7c4SAndroid Build Coastguard Worker */ 76*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_filter_control_tag 77*f81fb7c4SAndroid Build Coastguard Worker { 78*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 z1; /* 1 sample delay state variable */ 79*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 z2; /* 2 sample delay state variable */ 80*f81fb7c4SAndroid Build Coastguard Worker } S_FILTER_CONTROL; 81*f81fb7c4SAndroid Build Coastguard Worker #endif 82*f81fb7c4SAndroid Build Coastguard Worker 83*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------ 84*f81fb7c4SAndroid Build Coastguard Worker * S_LFO_CONTROL data structure 85*f81fb7c4SAndroid Build Coastguard Worker *------------------------------------ 86*f81fb7c4SAndroid Build Coastguard Worker */ 87*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_lfo_control_tag 88*f81fb7c4SAndroid Build Coastguard Worker { 89*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 lfoValue; /* LFO current output value */ 90*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 lfoPhase; /* LFO current phase */ 91*f81fb7c4SAndroid Build Coastguard Worker } S_LFO_CONTROL; 92*f81fb7c4SAndroid Build Coastguard Worker 93*f81fb7c4SAndroid Build Coastguard Worker /* bit definitions for S_WT_VOICE:flags */ 94*f81fb7c4SAndroid Build Coastguard Worker #define WT_FLAGS_ADPCM_NIBBLE 1 /* high/low nibble flag */ 95*f81fb7c4SAndroid Build Coastguard Worker #define WT_FLAGS_ADPCM_READY 2 /* first 2 samples are decoded */ 96*f81fb7c4SAndroid Build Coastguard Worker #define WT_FLAGS_USE_ADPCM 4 /* sample is ADPCM encoded */ 97*f81fb7c4SAndroid Build Coastguard Worker 98*f81fb7c4SAndroid Build Coastguard Worker /* eg1State and eg2State */ 99*f81fb7c4SAndroid Build Coastguard Worker typedef enum { 100*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateInit = 0, 101*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateDelay, 102*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateAttack, 103*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateHold, 104*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateDecay, 105*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateSustain, 106*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateRelease, 107*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateMuting, 108*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateMuted, 109*f81fb7c4SAndroid Build Coastguard Worker eEnvelopeStateInvalid /* should never be in this state! */ 110*f81fb7c4SAndroid Build Coastguard Worker } E_ENVELOPE_STATE; 111*f81fb7c4SAndroid Build Coastguard Worker 112*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG1_STATE eEnvelopeStateAttack 113*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG1_VALUE 0 114*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG1_INCREMENT 0 115*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG2_STATE eEnvelopeStateAttack 116*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG2_VALUE 0 117*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG2_INCREMENT 0 118*f81fb7c4SAndroid Build Coastguard Worker 119*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 120*f81fb7c4SAndroid Build Coastguard Worker * S_WT_VOICE 121*f81fb7c4SAndroid Build Coastguard Worker * 122*f81fb7c4SAndroid Build Coastguard Worker * This structure contains state data for the wavetable engine 123*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 124*f81fb7c4SAndroid Build Coastguard Worker */ 125*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_wt_voice_tag 126*f81fb7c4SAndroid Build Coastguard Worker { 127*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 loopEnd; /* points to last PCM sample (not 1 beyond last) */ 128*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 loopStart; /* points to first sample at start of loop */ 129*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 phaseAccum; /* current sample, integer portion of phase */ 130*f81fb7c4SAndroid Build Coastguard Worker EAS_U32 phaseFrac; /* fractional portion of phase */ 131*f81fb7c4SAndroid Build Coastguard Worker 132*f81fb7c4SAndroid Build Coastguard Worker #if (NUM_OUTPUT_CHANNELS == 2) 133*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 gainLeft; /* current gain, left ch */ 134*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 gainRight; /* current gain, right ch */ 135*f81fb7c4SAndroid Build Coastguard Worker #endif 136*f81fb7c4SAndroid Build Coastguard Worker 137*f81fb7c4SAndroid Build Coastguard Worker #if defined(_FILTER_ENABLED) 138*f81fb7c4SAndroid Build Coastguard Worker S_FILTER_CONTROL filter; /* low pass filter */ 139*f81fb7c4SAndroid Build Coastguard Worker #endif 140*f81fb7c4SAndroid Build Coastguard Worker 141*f81fb7c4SAndroid Build Coastguard Worker S_LFO_CONTROL modLFO; /* modulator LFO */ 142*f81fb7c4SAndroid Build Coastguard Worker 143*f81fb7c4SAndroid Build Coastguard Worker #ifdef DLS_SYNTHESIZER 144*f81fb7c4SAndroid Build Coastguard Worker S_LFO_CONTROL vibLFO; /* vibrato LFO */ 145*f81fb7c4SAndroid Build Coastguard Worker #endif 146*f81fb7c4SAndroid Build Coastguard Worker 147*f81fb7c4SAndroid Build Coastguard Worker /* envelope control */ 148*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 eg1Value; 149*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 eg2Value; 150*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 eg1Increment; 151*f81fb7c4SAndroid Build Coastguard Worker EAS_I16 eg2Increment; 152*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 eg1State; 153*f81fb7c4SAndroid Build Coastguard Worker EAS_U8 eg2State; 154*f81fb7c4SAndroid Build Coastguard Worker 155*f81fb7c4SAndroid Build Coastguard Worker EAS_U16 artIndex; /* index to articulation params */ 156*f81fb7c4SAndroid Build Coastguard Worker 157*f81fb7c4SAndroid Build Coastguard Worker } S_WT_VOICE; 158*f81fb7c4SAndroid Build Coastguard Worker 159*f81fb7c4SAndroid Build Coastguard Worker /*---------------------------------------------------------------------------- 160*f81fb7c4SAndroid Build Coastguard Worker * prototypes 161*f81fb7c4SAndroid Build Coastguard Worker *---------------------------------------------------------------------------- 162*f81fb7c4SAndroid Build Coastguard Worker */ 163*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL WT_CheckSampleEnd (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame, EAS_BOOL update); 164*f81fb7c4SAndroid Build Coastguard Worker void WT_ProcessVoice (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); 165*f81fb7c4SAndroid Build Coastguard Worker 166*f81fb7c4SAndroid Build Coastguard Worker #ifdef EAS_SPLIT_WT_SYNTH 167*f81fb7c4SAndroid Build Coastguard Worker void WTE_ConfigVoice (EAS_I32 voiceNum, S_WT_CONFIG *pWTConfig, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); 168*f81fb7c4SAndroid Build Coastguard Worker void WTE_ProcessVoice (EAS_I32 voiceNum, S_WT_FRAME *pWTParams, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); 169*f81fb7c4SAndroid Build Coastguard Worker #endif 170*f81fb7c4SAndroid Build Coastguard Worker 171*f81fb7c4SAndroid Build Coastguard Worker #endif 172