1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * OSLEC - A line echo canceller. This code is being developed 4*4882a593Smuzhiyun * against and partially complies with G168. Using code from SpanDSP 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Written by Steve Underwood <steveu@coppice.org> 7*4882a593Smuzhiyun * and David Rowe <david_at_rowetel_dot_com> 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Copyright (C) 2001 Steve Underwood and 2007-2008 David Rowe 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * All rights reserved. 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef __OSLEC_H 15*4882a593Smuzhiyun #define __OSLEC_H 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* Mask bits for the adaption mode */ 18*4882a593Smuzhiyun #define ECHO_CAN_USE_ADAPTION 0x01 19*4882a593Smuzhiyun #define ECHO_CAN_USE_NLP 0x02 20*4882a593Smuzhiyun #define ECHO_CAN_USE_CNG 0x04 21*4882a593Smuzhiyun #define ECHO_CAN_USE_CLIP 0x08 22*4882a593Smuzhiyun #define ECHO_CAN_USE_TX_HPF 0x10 23*4882a593Smuzhiyun #define ECHO_CAN_USE_RX_HPF 0x20 24*4882a593Smuzhiyun #define ECHO_CAN_DISABLE 0x40 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /** 27*4882a593Smuzhiyun * oslec_state: G.168 echo canceller descriptor. 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * This defines the working state for a line echo canceller. 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun struct oslec_state; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /** 34*4882a593Smuzhiyun * oslec_create - Create a voice echo canceller context. 35*4882a593Smuzhiyun * @len: The length of the canceller, in samples. 36*4882a593Smuzhiyun * @return: The new canceller context, or NULL if the canceller could not be 37*4882a593Smuzhiyun * created. 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun struct oslec_state *oslec_create(int len, int adaption_mode); 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /** 42*4882a593Smuzhiyun * oslec_free - Free a voice echo canceller context. 43*4882a593Smuzhiyun * @ec: The echo canceller context. 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun void oslec_free(struct oslec_state *ec); 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /** 48*4882a593Smuzhiyun * oslec_flush - Flush (reinitialise) a voice echo canceller context. 49*4882a593Smuzhiyun * @ec: The echo canceller context. 50*4882a593Smuzhiyun */ 51*4882a593Smuzhiyun void oslec_flush(struct oslec_state *ec); 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /** 54*4882a593Smuzhiyun * oslec_adaption_mode - set the adaption mode of a voice echo canceller context. 55*4882a593Smuzhiyun * @ec The echo canceller context. 56*4882a593Smuzhiyun * @adaption_mode: The mode. 57*4882a593Smuzhiyun */ 58*4882a593Smuzhiyun void oslec_adaption_mode(struct oslec_state *ec, int adaption_mode); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun void oslec_snapshot(struct oslec_state *ec); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /** 63*4882a593Smuzhiyun * oslec_update: Process a sample through a voice echo canceller. 64*4882a593Smuzhiyun * @ec: The echo canceller context. 65*4882a593Smuzhiyun * @tx: The transmitted audio sample. 66*4882a593Smuzhiyun * @rx: The received audio sample. 67*4882a593Smuzhiyun * 68*4882a593Smuzhiyun * The return value is the clean (echo cancelled) received sample. 69*4882a593Smuzhiyun */ 70*4882a593Smuzhiyun int16_t oslec_update(struct oslec_state *ec, int16_t tx, int16_t rx); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun /** 73*4882a593Smuzhiyun * oslec_hpf_tx: Process to high pass filter the tx signal. 74*4882a593Smuzhiyun * @ec: The echo canceller context. 75*4882a593Smuzhiyun * @tx: The transmitted auio sample. 76*4882a593Smuzhiyun * 77*4882a593Smuzhiyun * The return value is the HP filtered transmit sample, send this to your D/A. 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun int16_t oslec_hpf_tx(struct oslec_state *ec, int16_t tx); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #endif /* __OSLEC_H */ 82