Ignore:
Timestamp:
Aug 6, 2006 12:07:13 PM (18 years ago)
Author:
bennylp
Message:

Change AEC into generic echo canceller framework with either AEC or simple echo suppressor backend can be selected during runtime.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia/echo_port.c

    r652 r653  
    1717 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  
    1818 */ 
    19 #include <pjmedia/aec_port.h> 
    20 #include <pjmedia/aec.h> 
     19#include <pjmedia/echo_port.h> 
     20#include <pjmedia/echo.h> 
    2121#include <pjmedia/errno.h> 
    2222#include <pj/assert.h> 
     
    2525 
    2626 
    27 #define THIS_FILE   "aec_port.c" 
    28 #define SIGNATURE   PJMEDIA_PORT_SIGNATURE('A', 'E', 'C', ' ') 
     27#define THIS_FILE   "ec_port.c" 
     28#define SIGNATURE   PJMEDIA_PORT_SIGNATURE('E', 'C', 'H', 'O') 
    2929#define BUF_COUNT   32 
    3030 
    31 struct aec 
     31struct ec 
    3232{ 
    33     pjmedia_port    base; 
    34     pjmedia_port    *dn_port; 
    35     pjmedia_aec     *aec; 
     33    pjmedia_port        base; 
     34    pjmedia_port        *dn_port; 
     35    pjmedia_echo_state  *ec; 
    3636}; 
    3737 
    3838 
    39 static pj_status_t aec_put_frame(pjmedia_port *this_port,  
    40                                  const pjmedia_frame *frame); 
    41 static pj_status_t aec_get_frame(pjmedia_port *this_port,  
    42                                   pjmedia_frame *frame); 
    43 static pj_status_t aec_on_destroy(pjmedia_port *this_port); 
     39static pj_status_t ec_put_frame(pjmedia_port *this_port,  
     40                                const pjmedia_frame *frame); 
     41static pj_status_t ec_get_frame(pjmedia_port *this_port,  
     42                                pjmedia_frame *frame); 
     43static pj_status_t ec_on_destroy(pjmedia_port *this_port); 
    4444 
    4545 
    46 PJ_DEF(pj_status_t) pjmedia_aec_port_create( pj_pool_t *pool, 
     46PJ_DEF(pj_status_t) pjmedia_echo_port_create(pj_pool_t *pool, 
    4747                                             pjmedia_port *dn_port, 
    4848                                             unsigned tail_ms, 
     49                                             unsigned options, 
    4950                                             pjmedia_port **p_port ) 
    5051{ 
    51     const pj_str_t AEC = { "AEC", 3 }; 
    52     struct aec *aec; 
     52    const pj_str_t AEC = { "EC", 2 }; 
     53    struct ec *ec; 
    5354    pj_status_t status; 
    5455 
     
    5859 
    5960    /* Create the port and the AEC itself */ 
    60     aec = pj_pool_zalloc(pool, sizeof(struct aec)); 
     61    ec = pj_pool_zalloc(pool, sizeof(struct ec)); 
    6162     
    62     pjmedia_port_info_init(&aec->base.info, &AEC, SIGNATURE, 
     63    pjmedia_port_info_init(&ec->base.info, &AEC, SIGNATURE, 
    6364                           dn_port->info.clock_rate,  
    6465                           dn_port->info.channel_count,  
     
    6667                           dn_port->info.samples_per_frame); 
    6768 
    68     status = pjmedia_aec_create(pool, dn_port->info.clock_rate,  
    69                                 dn_port->info.samples_per_frame, 
    70                                 tail_ms, 0, &aec->aec); 
     69    status = pjmedia_echo_create(pool, dn_port->info.clock_rate,  
     70                                 dn_port->info.samples_per_frame, 
     71                                 tail_ms, options, &ec->ec); 
    7172    if (status != PJ_SUCCESS) 
    7273        return status; 
    7374 
    7475    /* More init */ 
    75     aec->dn_port = dn_port; 
    76     aec->base.get_frame = &aec_get_frame; 
    77     aec->base.put_frame = &aec_put_frame; 
    78     aec->base.on_destroy = &aec_on_destroy; 
     76    ec->dn_port = dn_port; 
     77    ec->base.get_frame = &ec_get_frame; 
     78    ec->base.put_frame = &ec_put_frame; 
     79    ec->base.on_destroy = &ec_on_destroy; 
    7980 
    8081    /* Done */ 
    81     *p_port = &aec->base; 
     82    *p_port = &ec->base; 
    8283 
    8384    return PJ_SUCCESS; 
     
    8586 
    8687 
    87 static pj_status_t aec_put_frame(pjmedia_port *this_port,  
     88static pj_status_t ec_put_frame( pjmedia_port *this_port,  
    8889                                 const pjmedia_frame *frame) 
    8990{ 
    90     struct aec *aec = (struct aec*)this_port; 
     91    struct ec *ec = (struct ec*)this_port; 
    9192 
    9293    PJ_ASSERT_RETURN(this_port->info.signature == SIGNATURE, PJ_EINVAL); 
    9394 
    9495    if (frame->type == PJMEDIA_FRAME_TYPE_NONE ) { 
    95         return pjmedia_port_put_frame(aec->dn_port, frame); 
     96        return pjmedia_port_put_frame(ec->dn_port, frame); 
    9697    } 
    9798 
     
    99100                     PJ_EINVAL); 
    100101 
    101     pjmedia_aec_capture(aec->aec, frame->buf, 0); 
     102    pjmedia_echo_capture(ec->ec, frame->buf, 0); 
    102103 
    103     return pjmedia_port_put_frame(aec->dn_port, frame); 
     104    return pjmedia_port_put_frame(ec->dn_port, frame); 
    104105} 
    105106 
    106107 
    107 static pj_status_t aec_get_frame( pjmedia_port *this_port,  
    108                                   pjmedia_frame *frame) 
     108static pj_status_t ec_get_frame( pjmedia_port *this_port,  
     109                                 pjmedia_frame *frame) 
    109110{ 
    110     struct aec *aec = (struct aec*)this_port; 
     111    struct ec *ec = (struct ec*)this_port; 
    111112    pj_status_t status; 
    112113 
    113114    PJ_ASSERT_RETURN(this_port->info.signature == SIGNATURE, PJ_EINVAL); 
    114115 
    115     status = pjmedia_port_get_frame(aec->dn_port, frame); 
     116    status = pjmedia_port_get_frame(ec->dn_port, frame); 
    116117    if (status!=PJ_SUCCESS || frame->type!=PJMEDIA_FRAME_TYPE_AUDIO) { 
    117118        pjmedia_zero_samples(frame->buf, this_port->info.samples_per_frame); 
    118119    } 
    119120 
    120     pjmedia_aec_playback(aec->aec, frame->buf); 
     121    pjmedia_echo_playback(ec->ec, frame->buf); 
    121122 
    122123    return status; 
     
    124125 
    125126 
    126 static pj_status_t aec_on_destroy(pjmedia_port *this_port) 
     127static pj_status_t ec_on_destroy(pjmedia_port *this_port) 
    127128{ 
    128     struct aec *aec = (struct aec*)this_port; 
     129    struct ec *ec = (struct ec*)this_port; 
    129130 
    130131    PJ_ASSERT_RETURN(this_port->info.signature == SIGNATURE, PJ_EINVAL); 
    131132 
    132     pjmedia_aec_destroy(aec->aec); 
     133    pjmedia_echo_destroy(ec->ec); 
    133134 
    134135    return PJ_SUCCESS; 
Note: See TracChangeset for help on using the changeset viewer.