C++程序  |  161行  |  4.72 KB

/*----------------------------------------------------------------------------
 *
 * File: 
 * eas_chorusdata.h
 *
 * Contents and purpose:
 * Contains the prototypes for the Chorus effect.
 *
 *
 * Copyright Sonic Network Inc. 2006

 * 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: 309 $
 *   $Date: 2006-09-12 18:52:45 -0700 (Tue, 12 Sep 2006) $
 *----------------------------------------------------------------------------
*/

#ifndef _EAS_CHORUS_H
#define _EAS_CHORUS_H

#include "eas_types.h"
#include "eas_audioconst.h"

//defines for chorus

#define EAS_CHORUS_BYPASS_DEFAULT	1
#define EAS_CHORUS_PRESET_DEFAULT	0
#define EAS_CHORUS_RATE_DEFAULT		30
#define EAS_CHORUS_DEPTH_DEFAULT	39
#define EAS_CHORUS_LEVEL_DEFAULT	32767

#define EAS_CHORUS_LEVEL_MIN		0
#define EAS_CHORUS_LEVEL_MAX		32767

#define EAS_CHORUS_RATE_MIN			10
#define EAS_CHORUS_RATE_MAX			50

#define EAS_CHORUS_DEPTH_MIN		15
#define EAS_CHORUS_DEPTH_MAX		60

#define CHORUS_SIZE_MS 20
#define CHORUS_L_SIZE ((CHORUS_SIZE_MS*_OUTPUT_SAMPLE_RATE)/1000)
#define CHORUS_R_SIZE CHORUS_L_SIZE
#define CHORUS_SHAPE_SIZE 128
#define CHORUS_DELAY_MS 10

#define CHORUS_MAX_TYPE			4	// any Chorus numbers larger than this are invalid

typedef struct
{
	EAS_I16				m_nRate;
	EAS_I16				m_nDepth;
	EAS_I16				m_nLevel;

} S_CHORUS_PRESET;

typedef struct
{
	S_CHORUS_PRESET		m_sPreset[CHORUS_MAX_TYPE];	//array of presets

} S_CHORUS_PRESET_BANK;

/* parameters for each Chorus */
typedef struct
{
	EAS_I32 lfoLPhase;
	EAS_I32 lfoRPhase;
	EAS_I16 chorusIndexL;
	EAS_I16 chorusIndexR;
	EAS_U16 chorusTapPosition;

	EAS_I16 m_nRate;
	EAS_I16 m_nDepth;
	EAS_I16 m_nLevel;

	//delay lines used by the chorus, longer would sound better
	EAS_PCM chorusDelayL[CHORUS_L_SIZE];
	EAS_PCM chorusDelayR[CHORUS_R_SIZE];

	EAS_BOOL	bypass;
	EAS_I8		preset;

	EAS_I16		m_nCurrentChorus;			// preset number for current Chorus
	EAS_I16		m_nNextChorus;				// preset number for next Chorus

	S_CHORUS_PRESET			pPreset;

	S_CHORUS_PRESET_BANK	m_sPreset;

} S_CHORUS_OBJECT;


/*----------------------------------------------------------------------------
 * WeightedTap()
 *----------------------------------------------------------------------------
 * Purpose: Does fractional array look-up using linear interpolation
 * 
 * first convert indexDesired to actual desired index by taking into account indexReference
 * then do linear interpolation between two actual samples using fractional part
 *
 * Inputs: 
 * array: pointer to array of signed 16 bit values, typically either PCM data or control data
 * indexReference: the circular buffer relative offset
 * indexDesired: the fractional index we are looking up (16 bits index + 16 bits fraction)
 * indexLimit: the total size of the array, used to compute buffer wrap
 * 	
 * Outputs:
 * Value from the input array, linearly interpolated between two actual data values
 *
 *----------------------------------------------------------------------------
*/
static EAS_I16 WeightedTap(const EAS_I16 *array, EAS_I16 indexReference, EAS_I32 indexDesired, EAS_I16 indexLimit);

/*----------------------------------------------------------------------------
 * ChorusReadInPresets()
 *----------------------------------------------------------------------------
 * Purpose: sets global Chorus preset bank to defaults
 * 
 * Inputs: 
 *			
 * Outputs:
 *
 *----------------------------------------------------------------------------
*/
static EAS_RESULT ChorusReadInPresets(S_CHORUS_OBJECT *pChorusData);

/*----------------------------------------------------------------------------
 * ChorusUpdate
 *----------------------------------------------------------------------------
 * Purpose: 
 * Update the Chorus preset parameters as required
 *
 * Inputs: 
 *
 * Outputs:
 * 
 * 
 * Side Effects:
 * - chorus paramters will be changed
 * - m_nCurrentChorus := m_nNextChorus
 *----------------------------------------------------------------------------
*/
static EAS_RESULT ChorusUpdate(S_CHORUS_OBJECT* pChorusData);

#endif /* #ifndef _EAS_CHORUSDATA_H */