C++程序  |  172行  |  5.57 KB

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