/*
** Copyright (c) 2007-2010 by Silicon Laboratories
**
** $Id: si_voice.h 3119 2011-10-07 20:28:41Z cdp $
**
** si_voice.h
**
** Author(s):
** laj
**
** Distributed by:
** Silicon Laboratories, Inc
**
** This file contains proprietary information.
** No dissemination allowed without prior written permission from
** Silicon Laboratories, Inc.
**
** File Description:
** This is the header file for the ProSLIC driver.
**
** Dependancies:
** si_voice_datatypes.h
**
*/

#ifndef SI_VOICE_H
#define SI_VOICE_H

#include "../proslic_api_config.h"
#include "si_voice_ctrl.h"
#include "si_voice_timer_intf.h"



/** @defgroup SIVOICE SiVoice definitions

 * @{
 */
/*****************************************************************************/
/** @defgroup CHIPFAM Chip family definitions
 * @{
 */
#define SI321X_TYPE 0    /**< Single channel legacy chipsets - SI3210, SI3215, SI3216 */
#define SI324X_TYPE 1    /**< Quad channel chipset */
#define SI3220_TYPE 2    /**< Dual Channel chipset */
#define SI3226_TYPE 3    /**< Dual channel chipset */
#define SI3217X_TYPE 4   /**< Single channel chipset*/
#define SI3226X_TYPE 5   /**< Dual channel chipset */
#define SI3050_TYPE 20   /**< Single channel FXO chipset */

/** @} CHIPFAM */
/*****************************************************************************/


/*
* Workaroud for building on windows systems
*/

#ifdef RC_NONE
#undef RC_NONE
#endif

#define SIVOICE_RC_NONE RC_NONE

/**
* This is the main Silicon Labs control interface object. do not access directly!
*/
typedef struct	{
		void *hCtrl;                                /**< user provided SPI/GCI structure */
		ctrl_Reset_fptr Reset_fptr;                 /**< user provided reset function */
		ctrl_WriteRegister_fptr WriteRegister_fptr; /**< user provided SPI/GCI write register function */
		ctrl_ReadRegister_fptr ReadRegister_fptr;   /**< user provided SPI/GI read register function */
		ctrl_WriteRAM_fptr WriteRAM_fptr;           /**< ProSLIC only - user provided SPI/GCI read RAM/Indirect register function */
		ctrl_ReadRAM_fptr ReadRAM_fptr; /**< ProSLIC only*/
		ctrl_Semaphore_fptr Semaphore_fptr; /**< ProSLIC only*/
		void *hTimer;/**< user provided Timer data structure */
		system_delay_fptr Delay_fptr; /**< user supplied mSec delay function */
		system_timeElapsed_fptr timeElapsed_fptr; /**< user provided mSec time elapsed function */
		system_getTime_fptr getTime_fptr; /**< user provided timestamp function */
		int usermodeStatus; /**< ProSLIC only*/
} SiVoiceControlInterfaceType;


typedef enum {
	SI3210,
	SI3215,
	SI3216,
	SI3211,
	SI3212,
 	SI3210M,
 	SI3215M,
 	SI3216M,
	SI3240,
	SI3241,
	SI3242,
	SI3243,
	SI3245,
	SI3244,
	SI3246,
	SI3247,
	SI3220,
	SI3225,
	SI3226,
	SI3227,
	SI32171,
	SI32172,
	SI32174,
	SI32175,
	SI32176,
	SI32177,
	SI32178,
	SI32179,
    SI32260,
    SI32261,
    SI32262,
    SI32263,
    SI32264,
    SI32265,
    SI32266,
    SI32267,
    SI32268,
    SI32269,
    SI32360,
    SI32361,
    SI3050 = 100,
	UNSUPPORTED_PART_NUM = 255
}partNumberType;

/**
* Chip revision definition for easier readability in the source code
*/
typedef enum {
	A,
	B,
	C,
	D,
	E,
	F,
	G
}revisionType ;


typedef enum {
    UNKNOWN, /**< Channel type has not been initalized or is still unknown */
	PROSLIC, /**< Channel type is a ProSLIC/FXS */
	DAA      /**< Channel type is a DAA/FXO */
} channelTypeType;

/**
* These are the error codes for ProSLIC failures
*/
typedef enum {
    RC_IGNORE = 0,
    RC_NONE= 0,           /**< Means the function did not encounter an error */
	RC_TEST_PASSED = 0,
	RC_TEST_FAILED = 1,
    RC_COMPLETE_NO_ERR = 1,   /**< A test completed, no error detected */
    RC_POWER_ALARM_Q1,
    RC_POWER_ALARM_Q2,
    RC_POWER_ALARM_Q3,
    RC_POWER_ALARM_Q4,
    RC_POWER_ALARM_Q5,
    RC_POWER_ALARM_Q6,
    RC_SPI_FAIL,         /**< SPI Communications failure */
    RC_POWER_LEAK,
    RC_VBAT_UP_TIMEOUT,
    RC_VBAT_OUT_OF_RANGE,
    RC_VBAT_DOWN_TIMEOUT,
    RC_TG_RG_SHORT,
    RC_CM_CAL_ERR,
    RC_RING_FAIL_INT,
    RC_CAL_TIMEOUT,
    RC_PATCH_ERR,
    RC_BROADCAST_FAIL,           /**< Broadcast unavailable for requested operation */
    RC_UNSUPPORTED_FEATURE,      /**< Feature is not supported by the chipset*/
    RC_CHANNEL_TYPE_ERR,         /**< Channel type does not support called function */
    RC_GAIN_DELTA_TOO_LARGE,     /**< Requested gain delta too large */
    RC_GAIN_OUT_OF_RANGE,        /**< Gain requested exceeds range */
    RC_POWER_ALARM_HVIC,         /**< Power alarm on HVIC */
    RC_POWER_ALARM_OFFLD,        /**< Power alarm on offload transistor */
    RC_THERMAL_ALARM_HVIC,       /**< Thermal alarm detected */
    RC_NO_MEM,                   /**< Out of memory */
    RC_INVALID_GEN_PARAM,        /**< Invalid general parameter */
    RC_LINE_IN_USE,              /**< Line is in use (LCS detected) */
    RC_RING_V_LIMITED,           /**< Ringer voltage limited - signal may be clipped */
    RC_PSTN_CHECK_SINGLE_FAIL,   /**< PSTN detect single current exceeds limit */
    RC_PSTN_CHECK_AVG_FAIL,      /**< PSTN detect average current exceeds limit */
    RC_VDAA_ILOOP_OVLD,          /**< Overload detected */
    RC_UNSUPPORTED_OPTION,       /**< Function parameter is not supported at this time */
    RC_FDT_TIMEOUT,              /**< Timeout waiting for valid frame detect */
    RC_PSTN_OPEN_FEMF,           /**< Detected FEMF, device left in open state */
    RC_VDAA_PAR_HANDSET_DET,     /**< Parallel handset detected */
    RC_VDAA_PAR_HANDSET_NOT_DET,/**< Parallel handset not detected */
    RC_PATCH_RAM_VERIFY_FAIL,  /**< Patch RAM verification failure */
    RC_PATCH_ENTRY_VERIFY_FAIL,/**< Patch entry table verification failure */
    RC_UNSUPPORTED_DEVICE_REV, /**< Device revision not supported */
	RC_INVALID_PATCH,          /**< No patch for selected options */
	RC_INVALID_PRESET,         /**< Invalid Preset value */
	RC_TEST_DISABLED,          /**< Test Not enabled */
	RC_RING_START_FAIL,        /**< Ringing failed to start */
    RC_REINIT_REQUIRED = 255   /**< Soft Reset Required */
} errorCodeType;


/**
* Generic BOM option tags - please refer to your PCB design
* for which design you're using.
*/
typedef enum {
	DEFAULT,                /**< Default design */
	SI321X_HV,              /**< SI321x High voltage */
    BO_DCDC_FLYBACK,        /**< DC power supply: flyback design */
    BO_DCDC_QCUK,           /**< DC power supply: quasi-cuk design */
    BO_DCDC_BUCK_BOOST,     /**< DC power supply: buck boost design */
    BO_DCDC_LCQCUK,         /**< DC power supply: low-cost quasi-cuk design */
	BO_DCDC_P_BUCK_BOOST_5V, /**< DC power supply:  pmos buck-boost 5v design */
	BO_DCDC_P_BUCK_BOOST_12V, /**< DC power supply: pmos buck-boost 12v design */
    BO_DCDC_P_BUCK_BOOST_12V_HV, /**< DC power supply: higher voltage version of BO_DCDC_P_BUCK_BOOST_12V */
	BO_DCDC_CUK              /**< DC power supply:  full cuk design */
} bomOptionsType;

/**
* Initialization options to allow init flow and/or content to be
* altered at runtime
*/
typedef enum {
	INIT_NO_OPT,	     /**<  No initialization option */
	INIT_REINIT,         /**<  Reinitialization option */
	INIT_NO_CAL,         /**<  Skip calibration only */
	INIT_NO_PATCH_LOAD   /**<  Skip patch load */
} initOptionsType;

/**
** This is the main Voice device object
*/
typedef struct	{
		SiVoiceControlInterfaceType *ctrlInterface; /**< How do we talk to the system? User supplied functions are connected here */
		revisionType chipRev; /**< What revision is the chip? */
		partNumberType chipType; /**< What member of the particular family is this chip? */
		uInt8 lsRev; /**< DAA: what rev is the line side chip? */
		uInt8 lsType; /**< DAA: what type is the line side chip */
		int usermodeStatus; /**< Used for patch code */
} SiVoiceDeviceType;

typedef SiVoiceDeviceType *SiVoiceDeviceType_ptr; /**< Shortcut typedef */


/**
** This is the main ProSLIC channel object
*/
typedef struct	{
		SiVoiceDeviceType_ptr deviceId; /**< Information about the device associated with this channel */
		uInt8 channel; /**< Which channel is this device? This is a system parameter meaning if you have 2 dual channel devices in your system, this number would then typically go from 0-3 */
		channelTypeType channelType; /**< Is this a ProSLIC or a DAA */
		errorCodeType error;  /**< Storage for the current error state - used only for APIs that don't return back an error */
		int debugMode; /**< Are we debugging on this channel? */
		int channelEnable; /**<  is the channel enabled or not? If not, this channel is not initialized */
		bomOptionsType bomOption; /**< Device/PCB specific */
} SiVoiceChanType;


typedef SiVoiceChanType *SiVoiceChanType_ptr;

/*****************************************************************************/
/** @defgroup SIVOICE_IF_CFG  SiVoice System control interface functions
 *
 * These functions are used by the ProSLIC API to access system resources
 * such as SPI/GCI access, memory allocation/deallocation and timers.
 *
 * @{
 */
/*****************************************************************************/
/** @defgroup SIVOICE_MEMORY_IF SiVoice Memory allocation/deallocation
 *
 * These functions dynamically allocate and deallocate memory for the given
 * structures. malloc() and memset() are called for allocation and free() is
 * called for deallocation.  These functions are typically called during
 * initialization of the API and at the tear down of the API.  If customers
 * prefer to use statically allocated structures, then they must ensure that
 * the strucutre elements are zero'ed out.
 *
 * @{
 */

/**
 @brief
 *  Allocate memory and initialize the given structure.
 *
 * @param[in,out] pCtrlIntf - the structure to initialize
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_createControlInterface (SiVoiceControlInterfaceType **pCtrlIntf);

/**
 @brief
 *  Destroys the given structure and deallocates memory.
 *
 * @param[in,out] pCtrlIntf  - the structure to destroy/deallocate
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_destroyControlInterface (SiVoiceControlInterfaceType **pCtrlIntf);

/**
 @brief
 *  Allocate memory and initialize the given structure.
 *
 * @param[in,out] pDev - the structure to initialize
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_createDevice (SiVoiceDeviceType **pDev);

/**
 @brief
 *  Destroys the given structure and deallocates memory.
 *
 * @param[in,out] pDev - the structure to destroy/deallocate
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_destroyDevice (SiVoiceDeviceType **pDev);

/**
 @brief
 *  Allocate memory and initialize the given structure.
 *
 * @param[in,out] pChan - the structure to initialize
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_createChannel (SiVoiceChanType_ptr *pChan);

/**
 @brief
 *  Destroys the given structure and deallocates memory.
 *
 * @param[in,out] pChan - the structure to destroy/deallocate
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_destroyChannel (SiVoiceChanType_ptr *pChan);
/** @} SIVOICE_MEMORY_IF */

/*****************************************************************************/
/** @defgroup SIVOICE_IO SiVoice SPI/GCI access routines
 * This group of functions are used to associcate the transport mechanism (SPI, GCI) functions with the API.  The actual
 * functions being references are normally implemented by the customer for their particualr OS and platform.
 *
 * @{
 */

/**
 @brief
 *  Associate a interface object with a user supplied datastructure.  This
 *  structure is passed to all the I/O routines that the ProSLIC API calls.
 *
 * @param[in,out] pCtrlIntf - which interface to associate
 *                the user supplied structure with.
 * @param[in] *hCtrl - the user supplied structure that is passed to the IO functions.
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_setControlInterfaceCtrlObj (SiVoiceControlInterfaceType *pCtrlIntf, void *hCtrl);

/**
 @brief
 *  Associate a interface object with the reset function.
 *
 * @param[in,out] pCtrlIntf - which interface to associate
 *                the user supplied function with.
 * @param[in] Reset_fptr - the reset function pointer
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_setControlInterfaceReset (SiVoiceControlInterfaceType *pCtrlIntf, ctrl_Reset_fptr Reset_fptr);

/**
 @brief
 *  Associate a interface object with the register write function.
 *
 * @param[in,out] pCtrlIntf - which interface to associate
 *                the user supplied function with.
 * @param[in] WriteRegister_fptr - the register write function pointer
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_setControlInterfaceWriteRegister (SiVoiceControlInterfaceType *pCtrlIntf, ctrl_WriteRegister_fptr WriteRegister_fptr);

/**
 @brief
 *  Associate a interface object with the register read function.
 *
 * @param[in,out] pCtrlIntf - which interface to associate
 *                the user supplied function with.
 * @param[in] ReadRegister_fptr- the register read function pointer
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_setControlInterfaceReadRegister (SiVoiceControlInterfaceType *pCtrlIntf, ctrl_ReadRegister_fptr ReadRegister_fptr);

/**
 @brief
 *  Associate a interface object with the write RAM function.
 *
 * @param[in,out] pCtrlIntf - which interface to associate
 *                the user supplied function with.
 * @param[in] WriteRAM_fptr - the reset function pointer
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_setControlInterfaceWriteRAM (SiVoiceControlInterfaceType *pCtrlIntf, ctrl_WriteRAM_fptr WriteRAM_fptr);

/**
 @brief
 *  Associate a interface object with the read RAM function.
 *
 * @param[in,out] pCtrlIntf - which interface to associate
 *                the user supplied function with.
 * @param[in]  ReadRAM_fptr - the read RAM function pointer
 *
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_setControlInterfaceReadRAM (SiVoiceControlInterfaceType *pCtrlIntf, ctrl_ReadRAM_fptr ReadRAM_fptr);
/** @} SIVOICE_IO */

/*****************************************************************************/
/** @defgroup SIVOICE_TIMER SiVoice Timer functions
 *
 * This group of functions associates the customer supplied timer routines with
 * the ProSLIC API. Please note, for most applications, only the delay routine
 * is required.  The other routines are needed for the pulse digit API.
 * @{
 */

/**
 @brief
 *  This function associates a timer object - which is user defined, but it is
 *  used with ALL channels of the particular control interface.
 *
 *  @param[in] pCtrlIntf which control interface to associate the given timer object with.
 *  @param[in] *hTimer - the timer ojbect that is passed to all timer functions.
 *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 *  @sa SiVoice_setControlInterfaceDelay SiVoice_setControlInterfaceTimeElapsed SiVoice_setControlInterfaceGetTime PROSLIC_TIMER
 */

int SiVoice_setControlInterfaceTimerObj (SiVoiceControlInterfaceType *pCtrlIntf, void *hTimer);

/**
 @brief
 *  Associate a timer delay function with a given control interface.  The
 *  delay function takes in an argument of the timer object and the time in mSec
 *  and delays the thread/task for at least the time requested.
 *
 * @param[in] pCtrlIntf - which control interface to associate the function with.
 * @param[in] Delay_fptr - the pointer to the delay function.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 *  @sa SiVoice_setControlInterfaceTimerObj SiVoice_setControlInterfaceTimeElapsed SiVoice_setControlInterfaceGetTime PROSLIC_TIMER
 */

int SiVoice_setControlInterfaceDelay (SiVoiceControlInterfaceType *pCtrlIntf, system_delay_fptr Delay_fptr);

/**
 *  Description:
 *   Associate a time elapsed function with a given control interface.  The
 *   time elapsed function uses the values from the function specified in
 *   @ref SiVoice_setControlInterfaceGetTime and computes the delta time
 *   in mSec.
 *  @param[in] pCtrlIntf - which control interface to associate the function with.
 *  @param[in] timeElapsed_fptr - the pointer to the elapsed time function.
 *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *  @sa SiVoice_setControlInterfaceTimerObj SiVoice_setControlInterfaceGetTime SiVoice_setControlInterfaceDelay PROSLIC_TIMER
 */

int SiVoice_setControlInterfaceTimeElapsed (SiVoiceControlInterfaceType *pCtrlIntf, system_timeElapsed_fptr timeElapsed_fptr);

/**
 *  Description:
 *   Associate a time get function with a given control interface.  The
 *   time get function returns a value in a form of a void pointer that
 *   is suitable to be used with the function specified in @ref SiVoice_setControlInterfaceTimeElapsed .
 *   This is typically used as a timestamp of when an event started. The resolution needs to be in terms
 *   of mSec.
 *
 *  @param[in] pCtrlIntf - which control interface to associate the function with.
 *  @param[in] getTime_fptr -  the pointer to the get time function.
 *  @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *  @sa SiVoice_setControlInterfaceTimerObj SiVoice_setControlInterfaceTimeElapsed SiVoice_setControlInterfaceDelay PROSLIC_TIMER
 */

int SiVoice_setControlInterfaceGetTime (SiVoiceControlInterfaceType *pCtrlIntf, system_getTime_fptr getTime_fptr);

/** @} SIVOICE_TIMER */

/*****************************************************************************/
/** @defgroup SIVOICE_PROC_CONTROL SiVoice Process control
 * @{
 */

/**
 @brief
 *  This function assoicates a user defined semaphore/critical section
 *  function with the given interface.
 *
 * @param[in,out] pCtrlIntf the interface to assoicate the function with.
 * @param[in] semaphore_fptr - the function pointer for semaphore control.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 */

int SiVoice_setControlInterfaceSemaphore (SiVoiceControlInterfaceType *pCtrlIntf, ctrl_Semaphore_fptr semaphore_fptr);

/** @} SIVOICE_PROC_CONTROL */
/*****************************************************************************/
/** @} SIVOICE_IF_CFG*/
/*****************************************************************************/
/** @defgroup SIVOICE_INIT Initialization routines
 * @{
 */

/**
 @brief
 *  This function initializes the various channel structure elements.
 *  This function does not access the chipset directly, so SPI/GCI
 *  does not need to be up during this function call.
 *
 * @param[in,out] hProslic - which channel to initialize.
 * @param[in] channel - Which channel index is this.  For example, for a 4 channel system, this would typically range from 0 to 3.
 * @param[in] chipType - chipset family type for example @ref SI321X_TYPE or @ref SI3217X_TYPE
 * @param[in] pDeviceObj - Device structure pointer associated with this channel
 * @param[in] pCtrlIntf - Control interface associated with this channel
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 * @sa ProSLIC_SWInitChan
 */

int SiVoice_SWInitChan (SiVoiceChanType_ptr hProslic,int channel,int chipType, SiVoiceDeviceType *pDeviceObj, SiVoiceControlInterfaceType *pCtrlIntf);

/**
 @brief
 * This function calls the user supplied reset function to put and take out the channel from reset. This is
 * typically done during initialization and may be assumed to be a "global" reset - that is 1 reset per
 * daisychain vs. 1 per device.
 *
 * @note This function can take more than 500 mSec to complete.
 *
 * @param[in] pChan - which channel to reset, if a "global reset", then any channel on the daisy chain is sufficient.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 */

int SiVoice_Reset (SiVoiceChanType_ptr pChan);

/** @} SIVOICE_INIT */

/*****************************************************************************/
/** @defgroup SIVOICE_DEBUG Debug
 * @{
 */

/**
 @brief
 * This function enables or disables the debug mode, assuming @ref ENABLE_DEBUG is set in the configuration file.
 *
 * @param[in] pChan - which channel to set the debug flag.
 * @param[in] debugEn - 0 = Not set, 1 = set.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 */

int SiVoice_setSWDebugMode (SiVoiceChanType_ptr pChan, int debugEn);

/** @} SIVOICE_DEBUG */

/*****************************************************************************/
/** @defgroup SIVOICE_ERROR Return code functions
 * @{
 */

/**
 @brief
 * This function returns the error flag that may be set by some function in where
 * @ref errorCodeType is not returned.
 *
 * @note For functions that DO return errorCodeType, the return value here is undefined.
 *
 * @param[in] pChan - which channel to clear the error flag
 * @param[in,out] *error - The current value of error flag.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 * @sa SiVoice_clearErrorFlag
 */

int SiVoice_getErrorFlag (SiVoiceChanType_ptr pChan, int *error);

/**
 @brief
 *  This function clears the error flag that may be set by some function in where
 *  @ref errorCodeType is not returned.
 *
 * @param[in,out] pChan - which channel to clear the error flag
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 * @sa SiVoice_getErrorFlag
 */

int SiVoice_clearErrorFlag (SiVoiceChanType_ptr pChan);

/** @} SIVOICE_ERROR */

/*****************************************************************************/
/** @defgroup SIVOICE_ENABLE Enable/disable channels (for init)
 * @{
 */
/**
 @brief
 *  This function sets the channel enable status.  If NOT set, then when
 *  the various initialization routines such as @ref SiVoice_SWInitChan is called,
 *  then this particular channel will NOT be initialized.
 *
 *  This function does not access the chipset directly, so SPI/GCI
 *  does not need to be up during this function call.
 *
 * @param[in,out] pChan - which channel to return the status.
 * @param[in] chanEn - The new value of the channel enable field. 0 = NOT enabled, 1 = enabled.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 * @sa SiVoice_getChannelEnable
 */

int SiVoice_setChannelEnable (SiVoiceChanType_ptr pChan, int chanEn);

/**
 @brief
 *  This function returns back if the channel is enabled or not.
 *  This function does not access the chipset directly, so SPI/GCI
 *  does not need to be up during this function call.
 *
 * @param[in] pChan - which channel to return the status.
 * @param[in,out] chanEn* - The current value of if the channel is enabled. 0 = NOT enabled, 1 = enabled.
 * @retval int - error from @ref errorCodeType  @ref RC_NONE indicates no error.
 *
 * @sa SiVoice_setChannelEnable
 */

int SiVoice_getChannelEnable (SiVoiceChanType_ptr pChan, int* chanEn);

/** @} SIVOICE_ENABLE */
/*****************************************************************************/
/** @} SIVOICE */
#endif

