/*---------------------------------------------------------------------------- * * File: * eas_wtengine.h * * Contents and purpose: * This file defines the interface for wavetable synthesis engine * * Copyright Sonic Network Inc. 2004 * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *---------------------------------------------------------------------------- * Revision Control: * $Revision: 818 $ * $Date: 2007-08-02 15:19:41 -0700 (Thu, 02 Aug 2007) $ *---------------------------------------------------------------------------- */ #ifndef _EAS_WTENGINE_H #define _EAS_WTENGINE_H /* option sanity check */ #if defined(_OPTIMIZED_MONO) && defined(_FILTER_ENABLED) #error "Incompatible build settings: _OPTIMIZED_MONO cannot be used with _FILTER_ENABLED" #endif #if defined(_OPTIMIZED_MONO) && (NUM_OUTPUT_CHANNELS != 1) #error "Incompatible build settings: _OPTIMIZED_MONO can only be used with NUM_OUTPUT_CHANNELS = 1" #endif #include "eas_wt_IPC_frame.h" /*---------------------------------------------------------------------------- * defines *---------------------------------------------------------------------------- */ #define WT_NOISE_GENERATOR 0xffffffff /*---------------------------------------------------------------------------- * typedefs *---------------------------------------------------------------------------- */ /*---------------------------------------------------------------------------- * S_WT_INT_FRAME * * This structure includes S_WT_FRAME plus the bus mixing * parameters for the internal voices. *---------------------------------------------------------------------------- */ typedef struct s_wt_int_frame_tag { S_WT_FRAME frame; EAS_PCM *pAudioBuffer; EAS_I32 *pMixBuffer; EAS_I32 numSamples; EAS_I32 prevGain; } S_WT_INT_FRAME; #if defined(_FILTER_ENABLED) /*---------------------------------------------------------------------------- * S_FILTER_CONTROL data structure *---------------------------------------------------------------------------- */ typedef struct s_filter_control_tag { EAS_I16 z1; /* 1 sample delay state variable */ EAS_I16 z2; /* 2 sample delay state variable */ } S_FILTER_CONTROL; #endif /*------------------------------------ * S_LFO_CONTROL data structure *------------------------------------ */ typedef struct s_lfo_control_tag { EAS_I16 lfoValue; /* LFO current output value */ EAS_I16 lfoPhase; /* LFO current phase */ } S_LFO_CONTROL; /* bit definitions for S_WT_VOICE:flags */ #define WT_FLAGS_ADPCM_NIBBLE 1 /* high/low nibble flag */ #define WT_FLAGS_ADPCM_READY 2 /* first 2 samples are decoded */ #define WT_FLAGS_USE_ADPCM 4 /* sample is ADPCM encoded */ /* eg1State and eg2State */ typedef enum { eEnvelopeStateInit = 0, eEnvelopeStateDelay, eEnvelopeStateAttack, eEnvelopeStateHold, eEnvelopeStateDecay, eEnvelopeStateSustain, eEnvelopeStateRelease, eEnvelopeStateMuting, eEnvelopeStateMuted, eEnvelopeStateInvalid /* should never be in this state! */ } E_ENVELOPE_STATE; #define DEFAULT_EG1_STATE eEnvelopeStateAttack #define DEFAULT_EG1_VALUE 0 #define DEFAULT_EG1_INCREMENT 0 #define DEFAULT_EG2_STATE eEnvelopeStateAttack #define DEFAULT_EG2_VALUE 0 #define DEFAULT_EG2_INCREMENT 0 /*---------------------------------------------------------------------------- * S_WT_VOICE * * This structure contains state data for the wavetable engine *---------------------------------------------------------------------------- */ typedef struct s_wt_voice_tag { EAS_U32 loopEnd; /* points to last PCM sample (not 1 beyond last) */ EAS_U32 loopStart; /* points to first sample at start of loop */ EAS_U32 phaseAccum; /* current sample, integer portion of phase */ EAS_U32 phaseFrac; /* fractional portion of phase */ #if (NUM_OUTPUT_CHANNELS == 2) EAS_I16 gainLeft; /* current gain, left ch */ EAS_I16 gainRight; /* current gain, right ch */ #endif #if defined(_FILTER_ENABLED) S_FILTER_CONTROL filter; /* low pass filter */ #endif S_LFO_CONTROL modLFO; /* modulator LFO */ #ifdef DLS_SYNTHESIZER S_LFO_CONTROL vibLFO; /* vibrato LFO */ #endif /* envelope control */ EAS_I16 eg1Value; EAS_I16 eg2Value; EAS_I16 eg1Increment; EAS_I16 eg2Increment; EAS_U8 eg1State; EAS_U8 eg2State; EAS_U16 artIndex; /* index to articulation params */ } S_WT_VOICE; /*---------------------------------------------------------------------------- * prototypes *---------------------------------------------------------------------------- */ EAS_BOOL WT_CheckSampleEnd (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame, EAS_BOOL update); void WT_ProcessVoice (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame); #ifdef EAS_SPLIT_WT_SYNTH void WTE_ConfigVoice (EAS_I32 voiceNum, S_WT_CONFIG *pWTConfig, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); void WTE_ProcessVoice (EAS_I32 voiceNum, S_WT_FRAME *pWTParams, EAS_FRAME_BUFFER_HANDLE pFrameBuffer); #endif #endif