| /*---------------------------------------------------------------------------- |
| * |
| * 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 |