xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_wtengine.h (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker  *
3*f81fb7c4SAndroid Build Coastguard Worker  * File:
4*f81fb7c4SAndroid Build Coastguard Worker  * eas_wtengine.h
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * This file defines the interface for wavetable synthesis engine
8*f81fb7c4SAndroid Build Coastguard Worker  *
9*f81fb7c4SAndroid Build Coastguard Worker  * Copyright Sonic Network Inc. 2004
10*f81fb7c4SAndroid Build Coastguard Worker 
11*f81fb7c4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
12*f81fb7c4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
13*f81fb7c4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
14*f81fb7c4SAndroid Build Coastguard Worker  *
15*f81fb7c4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
16*f81fb7c4SAndroid Build Coastguard Worker  *
17*f81fb7c4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
18*f81fb7c4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
19*f81fb7c4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20*f81fb7c4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
21*f81fb7c4SAndroid Build Coastguard Worker  * limitations under the License.
22*f81fb7c4SAndroid Build Coastguard Worker  *
23*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
24*f81fb7c4SAndroid Build Coastguard Worker  * Revision Control:
25*f81fb7c4SAndroid Build Coastguard Worker  *   $Revision: 818 $
26*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2007-08-02 15:19:41 -0700 (Thu, 02 Aug 2007) $
27*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
28*f81fb7c4SAndroid Build Coastguard Worker */
29*f81fb7c4SAndroid Build Coastguard Worker 
30*f81fb7c4SAndroid Build Coastguard Worker #ifndef _EAS_WTENGINE_H
31*f81fb7c4SAndroid Build Coastguard Worker #define _EAS_WTENGINE_H
32*f81fb7c4SAndroid Build Coastguard Worker 
33*f81fb7c4SAndroid Build Coastguard Worker /* option sanity check */
34*f81fb7c4SAndroid Build Coastguard Worker #if defined(_OPTIMIZED_MONO) && defined(_FILTER_ENABLED)
35*f81fb7c4SAndroid Build Coastguard Worker #error "Incompatible build settings: _OPTIMIZED_MONO cannot be used with _FILTER_ENABLED"
36*f81fb7c4SAndroid Build Coastguard Worker #endif
37*f81fb7c4SAndroid Build Coastguard Worker 
38*f81fb7c4SAndroid Build Coastguard Worker #if defined(_OPTIMIZED_MONO) && (NUM_OUTPUT_CHANNELS != 1)
39*f81fb7c4SAndroid Build Coastguard Worker #error "Incompatible build settings: _OPTIMIZED_MONO can only be used with NUM_OUTPUT_CHANNELS = 1"
40*f81fb7c4SAndroid Build Coastguard Worker #endif
41*f81fb7c4SAndroid Build Coastguard Worker 
42*f81fb7c4SAndroid Build Coastguard Worker #include "eas_wt_IPC_frame.h"
43*f81fb7c4SAndroid Build Coastguard Worker 
44*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
45*f81fb7c4SAndroid Build Coastguard Worker  * defines
46*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
47*f81fb7c4SAndroid Build Coastguard Worker */
48*f81fb7c4SAndroid Build Coastguard Worker #define WT_NOISE_GENERATOR                  0xffffffff
49*f81fb7c4SAndroid Build Coastguard Worker 
50*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
51*f81fb7c4SAndroid Build Coastguard Worker  * typedefs
52*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
53*f81fb7c4SAndroid Build Coastguard Worker */
54*f81fb7c4SAndroid Build Coastguard Worker 
55*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
56*f81fb7c4SAndroid Build Coastguard Worker  * S_WT_INT_FRAME
57*f81fb7c4SAndroid Build Coastguard Worker  *
58*f81fb7c4SAndroid Build Coastguard Worker  * This structure includes S_WT_FRAME plus the bus mixing
59*f81fb7c4SAndroid Build Coastguard Worker  * parameters for the internal voices.
60*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
61*f81fb7c4SAndroid Build Coastguard Worker */
62*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_wt_int_frame_tag
63*f81fb7c4SAndroid Build Coastguard Worker {
64*f81fb7c4SAndroid Build Coastguard Worker     S_WT_FRAME      frame;
65*f81fb7c4SAndroid Build Coastguard Worker     EAS_PCM         *pAudioBuffer;
66*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32         *pMixBuffer;
67*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32         numSamples;
68*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32         prevGain;
69*f81fb7c4SAndroid Build Coastguard Worker } S_WT_INT_FRAME;
70*f81fb7c4SAndroid Build Coastguard Worker 
71*f81fb7c4SAndroid Build Coastguard Worker #if defined(_FILTER_ENABLED)
72*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
73*f81fb7c4SAndroid Build Coastguard Worker  * S_FILTER_CONTROL data structure
74*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
75*f81fb7c4SAndroid Build Coastguard Worker */
76*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_filter_control_tag
77*f81fb7c4SAndroid Build Coastguard Worker {
78*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16     z1;                             /* 1 sample delay state variable */
79*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16     z2;                             /* 2 sample delay state variable */
80*f81fb7c4SAndroid Build Coastguard Worker } S_FILTER_CONTROL;
81*f81fb7c4SAndroid Build Coastguard Worker #endif
82*f81fb7c4SAndroid Build Coastguard Worker 
83*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
84*f81fb7c4SAndroid Build Coastguard Worker  * S_LFO_CONTROL data structure
85*f81fb7c4SAndroid Build Coastguard Worker  *------------------------------------
86*f81fb7c4SAndroid Build Coastguard Worker */
87*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_lfo_control_tag
88*f81fb7c4SAndroid Build Coastguard Worker {
89*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16     lfoValue;           /* LFO current output value */
90*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16     lfoPhase;           /* LFO current phase */
91*f81fb7c4SAndroid Build Coastguard Worker } S_LFO_CONTROL;
92*f81fb7c4SAndroid Build Coastguard Worker 
93*f81fb7c4SAndroid Build Coastguard Worker /* bit definitions for S_WT_VOICE:flags */
94*f81fb7c4SAndroid Build Coastguard Worker #define WT_FLAGS_ADPCM_NIBBLE           1       /* high/low nibble flag */
95*f81fb7c4SAndroid Build Coastguard Worker #define WT_FLAGS_ADPCM_READY            2       /* first 2 samples are decoded */
96*f81fb7c4SAndroid Build Coastguard Worker #define WT_FLAGS_USE_ADPCM              4       /* sample is ADPCM encoded */
97*f81fb7c4SAndroid Build Coastguard Worker 
98*f81fb7c4SAndroid Build Coastguard Worker /* eg1State and eg2State */
99*f81fb7c4SAndroid Build Coastguard Worker typedef enum {
100*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateInit = 0,
101*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateDelay,
102*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateAttack,
103*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateHold,
104*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateDecay,
105*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateSustain,
106*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateRelease,
107*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateMuting,
108*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateMuted,
109*f81fb7c4SAndroid Build Coastguard Worker     eEnvelopeStateInvalid           /* should never be in this state! */
110*f81fb7c4SAndroid Build Coastguard Worker } E_ENVELOPE_STATE;
111*f81fb7c4SAndroid Build Coastguard Worker 
112*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG1_STATE       eEnvelopeStateAttack
113*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG1_VALUE       0
114*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG1_INCREMENT   0
115*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG2_STATE       eEnvelopeStateAttack
116*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG2_VALUE       0
117*f81fb7c4SAndroid Build Coastguard Worker #define DEFAULT_EG2_INCREMENT   0
118*f81fb7c4SAndroid Build Coastguard Worker 
119*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
120*f81fb7c4SAndroid Build Coastguard Worker  * S_WT_VOICE
121*f81fb7c4SAndroid Build Coastguard Worker  *
122*f81fb7c4SAndroid Build Coastguard Worker  * This structure contains state data for the wavetable engine
123*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
124*f81fb7c4SAndroid Build Coastguard Worker */
125*f81fb7c4SAndroid Build Coastguard Worker typedef struct s_wt_voice_tag
126*f81fb7c4SAndroid Build Coastguard Worker {
127*f81fb7c4SAndroid Build Coastguard Worker     EAS_U32             loopEnd;                /* points to last PCM sample (not 1 beyond last) */
128*f81fb7c4SAndroid Build Coastguard Worker     EAS_U32             loopStart;              /* points to first sample at start of loop */
129*f81fb7c4SAndroid Build Coastguard Worker     EAS_U32             phaseAccum;             /* current sample, integer portion of phase */
130*f81fb7c4SAndroid Build Coastguard Worker     EAS_U32             phaseFrac;              /* fractional portion of phase */
131*f81fb7c4SAndroid Build Coastguard Worker 
132*f81fb7c4SAndroid Build Coastguard Worker #if (NUM_OUTPUT_CHANNELS == 2)
133*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             gainLeft;               /* current gain, left ch  */
134*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             gainRight;              /* current gain, right ch */
135*f81fb7c4SAndroid Build Coastguard Worker #endif
136*f81fb7c4SAndroid Build Coastguard Worker 
137*f81fb7c4SAndroid Build Coastguard Worker #if defined(_FILTER_ENABLED)
138*f81fb7c4SAndroid Build Coastguard Worker     S_FILTER_CONTROL    filter;                 /* low pass filter */
139*f81fb7c4SAndroid Build Coastguard Worker #endif
140*f81fb7c4SAndroid Build Coastguard Worker 
141*f81fb7c4SAndroid Build Coastguard Worker     S_LFO_CONTROL       modLFO;                 /* modulator LFO */
142*f81fb7c4SAndroid Build Coastguard Worker 
143*f81fb7c4SAndroid Build Coastguard Worker #ifdef DLS_SYNTHESIZER
144*f81fb7c4SAndroid Build Coastguard Worker     S_LFO_CONTROL       vibLFO;                 /* vibrato LFO */
145*f81fb7c4SAndroid Build Coastguard Worker #endif
146*f81fb7c4SAndroid Build Coastguard Worker 
147*f81fb7c4SAndroid Build Coastguard Worker     /* envelope control */
148*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             eg1Value;
149*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             eg2Value;
150*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             eg1Increment;
151*f81fb7c4SAndroid Build Coastguard Worker     EAS_I16             eg2Increment;
152*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8              eg1State;
153*f81fb7c4SAndroid Build Coastguard Worker     EAS_U8              eg2State;
154*f81fb7c4SAndroid Build Coastguard Worker 
155*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16             artIndex;               /* index to articulation params */
156*f81fb7c4SAndroid Build Coastguard Worker 
157*f81fb7c4SAndroid Build Coastguard Worker } S_WT_VOICE;
158*f81fb7c4SAndroid Build Coastguard Worker 
159*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
160*f81fb7c4SAndroid Build Coastguard Worker  * prototypes
161*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
162*f81fb7c4SAndroid Build Coastguard Worker */
163*f81fb7c4SAndroid Build Coastguard Worker EAS_BOOL WT_CheckSampleEnd (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame, EAS_BOOL update);
164*f81fb7c4SAndroid Build Coastguard Worker void WT_ProcessVoice (S_WT_VOICE *pWTVoice, S_WT_INT_FRAME *pWTIntFrame);
165*f81fb7c4SAndroid Build Coastguard Worker 
166*f81fb7c4SAndroid Build Coastguard Worker #ifdef EAS_SPLIT_WT_SYNTH
167*f81fb7c4SAndroid Build Coastguard Worker void WTE_ConfigVoice (EAS_I32 voiceNum, S_WT_CONFIG *pWTConfig, EAS_FRAME_BUFFER_HANDLE pFrameBuffer);
168*f81fb7c4SAndroid Build Coastguard Worker void WTE_ProcessVoice (EAS_I32 voiceNum, S_WT_FRAME *pWTParams, EAS_FRAME_BUFFER_HANDLE pFrameBuffer);
169*f81fb7c4SAndroid Build Coastguard Worker #endif
170*f81fb7c4SAndroid Build Coastguard Worker 
171*f81fb7c4SAndroid Build Coastguard Worker #endif
172