Changeset 457 for pjproject/trunk/pjmedia/src/pjmedia/silencedet.c
- Timestamp:
- May 19, 2006 3:58:13 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia/silencedet.c
r229 r457 33 33 34 34 35 35 36 /** 36 37 * This structure holds the silence detector state. … … 39 40 { 40 41 int mode; /**< VAD mode. */ 41 unsigned frame_size; /**< Samples per frame. */ 42 42 unsigned ptime; /**< Frame time, in msec. */ 43 43 44 44 unsigned min_signal_cnt; /**< # of signal frames.before talk burst */ … … 61 61 62 62 PJ_DEF(pj_status_t) pjmedia_silence_det_create( pj_pool_t *pool, 63 unsigned clock_rate, 64 unsigned samples_per_frame, 63 65 pjmedia_silence_det **p_sd) 64 66 { … … 69 71 sd = pj_pool_zalloc(pool, sizeof(struct pjmedia_silence_det)); 70 72 73 sd->ptime = samples_per_frame * 1000 / clock_rate; 74 sd->signal_cnt = 0; 75 sd->silence_cnt = 0; 71 76 sd->weakest_signal = 0xFFFFFFFFUL; 72 77 sd->loudest_silence = 0; 73 sd->signal_cnt = 0; 74 sd->silence_cnt = 0; 75 76 /* Restart in adaptive, silent mode */ 78 79 /* Default settings */ 80 pjmedia_silence_det_set_params(sd, -1, -1, -1); 81 82 /* Restart in fixed, silent mode */ 77 83 sd->in_talk = PJ_FALSE; 78 pjmedia_silence_det_set_adaptive( sd, 160);84 pjmedia_silence_det_set_adaptive( sd, -1 ); 79 85 80 86 *p_sd = sd; … … 82 88 } 83 89 84 PJ_DEF(pj_status_t) pjmedia_silence_det_set_adaptive( pjmedia_silence_det *sd, 85 unsigned frame_size) 86 { 87 PJ_ASSERT_RETURN(sd && frame_size, PJ_EINVAL); 88 89 sd->frame_size = frame_size; 90 PJ_DEF(pj_status_t) pjmedia_silence_det_set_adaptive(pjmedia_silence_det *sd, 91 int threshold) 92 { 93 PJ_ASSERT_RETURN(sd, PJ_EINVAL); 94 95 if (threshold < 0) 96 threshold = PJMEDIA_SILENCE_DET_THRESHOLD; 97 90 98 sd->mode = VAD_MODE_ADAPTIVE; 91 sd->min_signal_cnt = 10; 92 sd->min_silence_cnt = 64; 93 sd->recalc_cnt = 250; 94 sd->cur_threshold = 20; 99 sd->cur_threshold = threshold; 95 100 96 101 return PJ_SUCCESS; … … 98 103 99 104 PJ_DEF(pj_status_t) pjmedia_silence_det_set_fixed( pjmedia_silence_det *sd, 100 unsigned frame_size, 101 unsigned threshold ) 102 { 103 PJ_ASSERT_RETURN(sd && frame_size, PJ_EINVAL); 105 int threshold ) 106 { 107 PJ_ASSERT_RETURN(sd, PJ_EINVAL); 108 109 if (threshold < 0) 110 threshold = PJMEDIA_SILENCE_DET_THRESHOLD; 104 111 105 112 sd->mode = VAD_MODE_FIXED; 106 sd->frame_size = frame_size;107 113 sd->cur_threshold = threshold; 108 114 109 115 return PJ_SUCCESS; 110 116 } 117 118 PJ_DEF(pj_status_t) pjmedia_silence_det_set_params( pjmedia_silence_det *sd, 119 int min_silence, 120 int min_signal, 121 int recalc_time) 122 { 123 PJ_ASSERT_RETURN(sd, PJ_EINVAL); 124 125 if (min_silence == -1) 126 min_silence = 500; 127 if (min_signal < 0) 128 min_signal = sd->ptime; 129 if (recalc_time < 0) 130 recalc_time = 5000; 131 132 sd->min_signal_cnt = min_signal / sd->ptime; 133 sd->min_silence_cnt = min_silence / sd->ptime; 134 sd->recalc_cnt = recalc_time / sd->ptime; 135 136 return PJ_SUCCESS; 137 } 138 111 139 112 140 PJ_DEF(pj_status_t) pjmedia_silence_det_disable( pjmedia_silence_det *sd ) … … 185 213 } 186 214 187 /* For fixed threshold sd, everything is done. */188 if (sd->mode == VAD_MODE_FIXED) {189 return !sd->in_talk;190 }191 192 215 193 216 /* Count the number of silent and signal frames and calculate min/max */ … … 208 231 if ((sd->signal_cnt + sd->silence_cnt) > sd->recalc_cnt) { 209 232 210 /* Adjust silence threshold by looking at the proportions of 211 * signal and silence frames. 212 */ 213 if (sd->signal_cnt >= sd->recalc_cnt) { 214 /* All frames where signal frames. 215 * Increase silence threshold. 216 */ 217 sd->cur_threshold += (sd->weakest_signal - sd->cur_threshold)/4; 218 PJ_LOG(6,(THIS_FILE, "Vad cur_threshold increased to %d", 219 sd->cur_threshold)); 220 } 221 else if (sd->silence_cnt >= sd->recalc_cnt) { 222 /* All frames where silence frames. 223 * Decrease silence threshold. 224 */ 225 sd->cur_threshold = (sd->cur_threshold+sd->loudest_silence)/2+1; 226 PJ_LOG(6,(THIS_FILE, "Vad cur_threshold decreased to %d", 227 sd->cur_threshold)); 228 } 229 else { 233 if (sd->mode == VAD_MODE_ADAPTIVE) { 230 234 pj_bool_t updated = PJ_TRUE; 235 unsigned pct_signal; 236 237 /* Get percentage of signal */ 238 pct_signal = sd->signal_cnt * 100 / 239 (sd->signal_cnt + sd->silence_cnt); 231 240 232 241 /* Adjust according to signal/silence proportions. */ 233 if (sd->signal_cnt > sd->silence_cnt * 2) 242 if (pct_signal > 95) { 243 sd->cur_threshold += (sd->weakest_signal - sd->cur_threshold)/4; 244 } else if (pct_signal < 5) { 245 sd->cur_threshold = (sd->cur_threshold+sd->loudest_silence)/2+1; 246 } else if (pct_signal > 90) { 234 247 sd->cur_threshold++; 235 else if (sd->silence_cnt > sd->signal_cnt* 2)248 } else if (pct_signal < 10) { 236 249 sd->cur_threshold--; 237 else250 } else { 238 251 updated = PJ_FALSE; 252 } 239 253 240 254 if (updated) { 241 PJ_LOG(6,(THIS_FILE, 242 "Vad cur_threshold updated to %d", 255 PJ_LOG(5,(THIS_FILE, "Vad cur_threshold updated to %d", 243 256 sd->cur_threshold)); 244 257 }
Note: See TracChangeset
for help on using the changeset viewer.