/*
 *  OSLEC - A line echo canceller.  This code is being developed
 *          against and partially complies with G168. Using code from SpanDSP
 *
 * Written by Steve Underwood <steveu@coppice.org>
 *         and David Rowe <david_at_rowetel_dot_com>
 *
 * Copyright (C) 2001 Steve Underwood and 2007-2008 David Rowe
 *
 * All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2, as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef __OSLEC_H
#define __OSLEC_H

/* Mask bits for the adaption mode */
#define ECHO_CAN_USE_ADAPTION	0x01
#define ECHO_CAN_USE_NLP	0x02
#define ECHO_CAN_USE_CNG	0x04
#define ECHO_CAN_USE_CLIP	0x08
#define ECHO_CAN_USE_TX_HPF	0x10
#define ECHO_CAN_USE_RX_HPF	0x20
#define ECHO_CAN_DISABLE	0x40

/**
 * oslec_state: G.168 echo canceller descriptor.
 *
 * This defines the working state for a line echo canceller.
 */
struct oslec_state;

/**
 * oslec_create - Create a voice echo canceller context.
 * @len: The length of the canceller, in samples.
 * @return: The new canceller context, or NULL if the canceller could not be
 * created.
 */
struct oslec_state *oslec_create(int len, int adaption_mode);

/**
 * oslec_free - Free a voice echo canceller context.
 * @ec: The echo canceller context.
 */
void oslec_free(struct oslec_state *ec);

/**
 * oslec_flush - Flush (reinitialise) a voice echo canceller context.
 * @ec: The echo canceller context.
 */
void oslec_flush(struct oslec_state *ec);

/**
 * oslec_adaption_mode - set the adaption mode of a voice echo canceller context.
 * @ec The echo canceller context.
 * @adaption_mode: The mode.
 */
void oslec_adaption_mode(struct oslec_state *ec, int adaption_mode);

void oslec_snapshot(struct oslec_state *ec);

/**
 * oslec_update: Process a sample through a voice echo canceller.
 * @ec: The echo canceller context.
 * @tx: The transmitted audio sample.
 * @rx: The received audio sample.
 *
 * The return value is the clean (echo cancelled) received sample.
 */
int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx);

/**
 * oslec_hpf_tx: Process to high pass filter the tx signal.
 * @ec: The echo canceller context.
 * @tx: The transmitted auio sample.
 *
 * The return value is the HP filtered transmit sample, send this to your D/A.
 */
int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx);

#endif /* __OSLEC_H */
