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*/ 62typedef 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*/ 76typedef 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*/ 87typedef 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 */ 99typedef 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*/ 125typedef 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*/ 163EAS_BOOL WT_CheckSampleEnd (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame, EAS_BOOL update); 164void WT_ProcessVoice (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); 165 166#ifdef EAS_SPLIT_WT_SYNTH 167void WTE_ConfigVoice (EAS_I32 voiceNum, S_WT_CONFIG *pWTConfig, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); 168void WTE_ProcessVoice (EAS_I32 voiceNum, S_WT_FRAME *pWTParams, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); 169#endif 170 171#endif 172