eas_wtengine.h revision 7df30109963092559d3760c0661a020f9daf1030
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