Changeset 655


Ignore:
Timestamp:
Aug 6, 2006 2:15:47 PM (18 years ago)
Author:
bennylp
Message:

Change the silence suppressor to use the adaptive silence detector.

Location:
pjproject/trunk/pjmedia
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/include/pjmedia/conference.h

    r633 r655  
    294294 
    295295/** 
     296 * Get total number of ports connections currently set up in the bridge. 
     297 *  
     298 * @param conf          The conference bridge. 
     299 * 
     300 * @return              PJ_SUCCESS on success. 
     301 */ 
     302PJ_DECL(unsigned) pjmedia_conf_get_connect_count(pjmedia_conf *conf); 
     303 
     304 
     305/** 
    296306 * Remove the specified port from the conference bridge. 
    297307 * 
  • pjproject/trunk/pjmedia/include/pjmedia/silencedet.h

    r518 r655  
    7171                                                 unsigned samples_per_frame, 
    7272                                                 pjmedia_silence_det **p_sd ); 
     73 
     74 
     75/** 
     76 * Set silence detector name to identify the particular silence detector 
     77 * instance in the log. 
     78 * 
     79 * @param sd                The silence detector. 
     80 * @param name              Name. 
     81 * 
     82 * @return                  PJ_SUCCESS on success. 
     83 */ 
     84PJ_DECL(pj_status_t) pjmedia_silence_det_set_name(pjmedia_silence_det *sd, 
     85                                                  const char *name); 
    7386 
    7487 
     
    110123 *                          signal is reported. If -1 is specified, then 
    111124 *                          the default value will be used. The default is 
    112  *                          one frame. 
     125 *                          equal to one frame. 
    113126 * @param recalc_time       The interval to recalculate signal and silence 
    114127 *                          proportion and to readjust the silence threshold 
     
    145158 *                      of the input samples. 
    146159 * 
    147  * @return              PJ_SUCCESS on success. 
     160 * @return              Non zero if signal is silence. 
    148161 */ 
    149162PJ_DECL(pj_bool_t) pjmedia_silence_det_detect( pjmedia_silence_det *sd, 
     
    174187 * @param level         Signal level. 
    175188 * 
    176  * @return              PJ_SUCCESS on success. 
     189 * @return              Non zero if signal is silence. 
    177190 */ 
    178191PJ_DECL(pj_bool_t) pjmedia_silence_det_apply( pjmedia_silence_det *sd, 
  • pjproject/trunk/pjmedia/src/pjmedia/conference.c

    r635 r655  
    222222 
    223223    /* Set name */ 
    224     pj_strdup(pool, &conf_port->name, name); 
     224    pj_strdup_with_null(pool, &conf_port->name, name); 
    225225 
    226226    /* Default has tx and rx enabled. */ 
     
    259259    pjmedia_silence_det_set_fixed(conf_port->vad, 2); 
    260260 
     261    /* Set VAD name */ 
     262    pjmedia_silence_det_set_name(conf_port->vad, conf_port->name.ptr); 
    261263 
    262264    /* If port's clock rate is different than conference's clock rate, 
     
    895897 
    896898    return PJ_SUCCESS; 
     899} 
     900 
     901 
     902/* 
     903 * Get total number of ports connections currently set up in the bridge. 
     904 */ 
     905PJ_DECL(unsigned) pjmedia_conf_get_connect_count(pjmedia_conf *conf) 
     906{ 
     907    return conf->connect_cnt; 
    897908} 
    898909 
  • pjproject/trunk/pjmedia/src/pjmedia/echo_common.c

    r653 r655  
    119119 
    120120#else 
    121 static struct ec_operations aec_op = echo_supp_op; 
     121#define aec_op echo_supp_op 
    122122#endif 
    123123 
  • pjproject/trunk/pjmedia/src/pjmedia/echo_suppress.c

    r653 r655  
    2828 
    2929#define THIS_FILE                           "echo_suppress.c" 
    30 #define PJMEDIA_ECHO_SUPPRESS_THRESHOLD     20 
     30#define PJMEDIA_ECHO_SUPPRESS_THRESHOLD     PJMEDIA_SILENCE_DET_THRESHOLD 
    3131 
    3232 
     
    3636typedef struct echo_supp 
    3737{ 
    38     unsigned    threshold; 
    39     pj_bool_t   suppressing; 
    40     pj_time_val last_signal; 
    41     unsigned    samples_per_frame; 
    42     unsigned    tail_ms; 
     38    pj_bool_t            suppressing; 
     39    pjmedia_silence_det *sd; 
     40    pj_time_val          last_signal; 
     41    unsigned             samples_per_frame; 
     42    unsigned             tail_ms; 
    4343} echo_supp; 
    4444 
     
    7979{ 
    8080    echo_supp *ec; 
     81    pj_status_t status; 
    8182 
    8283    PJ_UNUSED_ARG(clock_rate); 
     
    8485 
    8586    ec = pj_pool_zalloc(pool, sizeof(struct echo_supp)); 
    86     ec->threshold = PJMEDIA_ECHO_SUPPRESS_THRESHOLD; 
    8787    ec->samples_per_frame = samples_per_frame; 
    8888    ec->tail_ms = tail_ms; 
     89 
     90    status = pjmedia_silence_det_create(pool, clock_rate, samples_per_frame, 
     91                                        &ec->sd); 
     92    if (status != PJ_SUCCESS) 
     93        return status; 
     94 
     95    pjmedia_silence_det_set_name(ec->sd, "ecsu%p"); 
     96    pjmedia_silence_det_set_adaptive(ec->sd, PJMEDIA_ECHO_SUPPRESS_THRESHOLD); 
     97    pjmedia_silence_det_set_params(ec->sd, 0, 500, 3000); 
    8998 
    9099    *p_state = ec; 
     
    110119{ 
    111120    echo_supp *ec = state; 
     121    pj_bool_t silence; 
    112122    pj_bool_t last_suppressing = ec->suppressing; 
    113     unsigned level; 
    114123 
    115     level = pjmedia_calc_avg_signal(play_frm, ec->samples_per_frame); 
    116     level = linear2ulaw(level) ^ 0xff; 
     124    silence = pjmedia_silence_det_detect(ec->sd, play_frm, 
     125                                         ec->samples_per_frame, NULL); 
    117126 
    118     if (level >= ec->threshold) { 
     127    ec->suppressing = !silence; 
     128 
     129    if (ec->suppressing) { 
    119130        pj_gettimeofday(&ec->last_signal); 
    120         ec->suppressing = 1; 
    121     } else { 
    122         ec->suppressing = 0; 
    123131    } 
    124132 
     
    169177{ 
    170178    echo_supp *ec = state; 
    171     unsigned level; 
     179    pj_bool_t silence; 
    172180 
    173181    PJ_UNUSED_ARG(options); 
    174182    PJ_UNUSED_ARG(reserved); 
    175183 
    176     level = pjmedia_calc_avg_signal(play_frm, ec->samples_per_frame); 
    177     level = linear2ulaw(level) ^ 0xff; 
     184    silence = pjmedia_silence_det_detect(ec->sd, play_frm,  
     185                                         ec->samples_per_frame, NULL); 
    178186 
    179     if (level >= ec->threshold) { 
     187    if (!silence) { 
    180188        pjmedia_zero_samples(rec_frm, ec->samples_per_frame); 
    181189    } 
  • pjproject/trunk/pjmedia/src/pjmedia/silencedet.c

    r465 r655  
    3939struct pjmedia_silence_det 
    4040{ 
     41    char      objname[PJ_MAX_OBJ_NAME]; /**< VAD name.                      */ 
     42 
    4143    int       mode;             /**< VAD mode.                              */ 
    4244    unsigned  ptime;            /**< Frame time, in msec.                   */ 
     
    7173    sd = pj_pool_zalloc(pool, sizeof(struct pjmedia_silence_det)); 
    7274 
     75    pj_ansi_strncpy(sd->objname, THIS_FILE, PJ_MAX_OBJ_NAME); 
     76    sd->objname[PJ_MAX_OBJ_NAME-1] = '\0'; 
     77 
    7378    sd->ptime = samples_per_frame * 1000 / clock_rate; 
    7479    sd->signal_cnt = 0; 
     
    8792    return PJ_SUCCESS; 
    8893} 
     94 
     95 
     96PJ_DEF(pj_status_t) pjmedia_silence_det_set_name( pjmedia_silence_det *sd, 
     97                                                  const char *name) 
     98{ 
     99    PJ_ASSERT_RETURN(sd && name, PJ_EINVAL); 
     100 
     101    pj_ansi_snprintf(sd->objname, PJ_MAX_OBJ_NAME, name, sd); 
     102    sd->objname[PJ_MAX_OBJ_NAME-1] = '\0'; 
     103    return PJ_SUCCESS; 
     104} 
     105 
    89106 
    90107PJ_DEF(pj_status_t) pjmedia_silence_det_set_adaptive(pjmedia_silence_det *sd, 
     
    234251        if (sd->mode == VAD_MODE_ADAPTIVE) { 
    235252            pj_bool_t updated = PJ_TRUE; 
    236             unsigned pct_signal; 
     253            unsigned pct_signal, new_threshold = sd->cur_threshold; 
    237254 
    238255            /* Get percentage of signal */ 
     
    242259            /* Adjust according to signal/silence proportions. */ 
    243260            if (pct_signal > 95) { 
    244                 sd->cur_threshold += (sd->weakest_signal - sd->cur_threshold)/4; 
     261                new_threshold += (sd->weakest_signal - sd->cur_threshold)/4; 
    245262            } else if (pct_signal < 5) { 
    246                 sd->cur_threshold = (sd->cur_threshold+sd->loudest_silence)/2+1; 
     263                new_threshold = (sd->cur_threshold+sd->loudest_silence)/2+1; 
    247264            } else if (pct_signal > 90) { 
    248                 sd->cur_threshold++; 
     265                new_threshold++; 
    249266            } else if (pct_signal < 10) { 
    250                 sd->cur_threshold--; 
     267                new_threshold--; 
    251268            } else { 
    252269                updated = PJ_FALSE; 
    253270            } 
    254271 
    255             if (updated) { 
    256                 PJ_LOG(5,(THIS_FILE, "Vad cur_threshold updated to %d", 
     272            if (updated && sd->cur_threshold != new_threshold) { 
     273                sd->cur_threshold = new_threshold; 
     274                PJ_LOG(5,(sd->objname, "Vad cur_threshold updated to %d", 
    257275                          sd->cur_threshold)); 
    258276            } 
Note: See TracChangeset for help on using the changeset viewer.