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