blob: bba7a5eae2bd6f36f4c57fe360682a99827b3bf1 [file] [log] [blame]
/*----------------------------------------------------------------------------
*
* 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