Changeset 249:7bdaa4c9c454 in mediastreamer2
- Timestamp:
- Feb 11, 2009 3:30:34 PM (4 years ago)
- Branch:
- default
- Location:
- linphone/mediastreamer2
- Files:
-
- 3 edited
-
include/mediastreamer2/msfilter.h (modified) (1 diff)
-
src/msconf.c (modified) (8 diffs)
-
src/speexec.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
linphone/mediastreamer2/include/mediastreamer2/msfilter.h
r241 r249 393 393 #define MS_FILTER_SET_VAD_PROB_CONTINUE MS_FILTER_BASE_METHOD(24,int) 394 394 395 #define MS_CONF_SPEEX_PREPROCESS_MIC MS_FILTER_EVENT(MS_CONF_ID, 1, void*) 396 #define MS_SPEEX_EC_ECHO_STATE MS_FILTER_EVENT(MS_SPEEX_EC_ID, 1, void*) 395 397 /** @} */ 396 398 -
linphone/mediastreamer2/src/msconf.c
r241 r249 82 82 83 83 static void channel_init(ConfState *s, Channel *chan, int pos){ 84 float f; 85 int val; 84 86 memset(chan, 0, sizeof(Channel)); 85 87 ms_bufferizer_init(&chan->buff); … … 87 89 //chan->speex_pp = speex_preprocess_state_init((s->conf_gran/2) *(s->samplerate/8000), s->samplerate); 88 90 chan->speex_pp = speex_preprocess_state_init(s->conf_gran/2, s->samplerate); 89 if (chan->speex_pp!=NULL) { 90 float f; 91 int val; 92 if (pos==0) 93 val=1; 94 else 95 val=0; 96 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DENOISE, &val); 97 /* enable VAD only on incoming RTP stream */ 98 if (pos%2==1) 99 { 100 val=1; 101 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_VAD, &val); 102 } 103 else if (pos==0 && s->enable_halfduplex>0) 104 { 105 val=1; 106 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_VAD, &val); 107 val = s->vad_prob_start; // xx% 108 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_PROB_START, &val); 109 val = s->vad_prob_continue; // xx% 110 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_PROB_CONTINUE, &val); 111 } 112 113 /* enable AGC only on local soundcard */ 114 if (s->agc_level>0 && pos==0) 115 { 116 val=1; 117 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC, &val); 118 f=s->agc_level; 119 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC_LEVEL, &f); 91 if (chan->speex_pp==NULL) 92 return; 93 94 /* configure sound card input on pin 0 */ 95 val=0; 96 if (pos==0) 97 val=1; 98 99 if (s->enable_halfduplex>0 && pos%2==1) 100 val=1; 101 102 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DENOISE, &val); 103 val = -30; 104 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_NOISE_SUPPRESS, &val); 105 106 /* enable VAD only on incoming RTP stream */ 107 val=0; 108 if (pos%2==1 || (pos==0 && s->enable_halfduplex>0)) 109 { 110 val=1; 111 } 112 113 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_VAD, &val); 114 if (s->vad_prob_start>0 && s->vad_prob_continue>0) 115 { 116 val = s->vad_prob_start; // xx% 117 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_PROB_START, &val); 118 val = s->vad_prob_continue; // xx% 119 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_PROB_CONTINUE, &val); 120 } 121 122 /* enable AGC only on local soundcard */ 123 val=0; 124 f=8000; 125 if (s->agc_level>0 && pos==0) 126 val=1; 127 else if (pos==0 && s->enable_halfduplex>0) 128 val=1; 129 else if ( pos%2==1 && s->enable_halfduplex>0) 130 val=1; 131 if (s->agc_level>0) 132 f=s->agc_level; 133 134 135 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC, &val); 136 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC_LEVEL, &f); 120 137 #if 0 121 val=40; 122 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC_MAX_GAIN, &val); 123 #endif 124 } 125 else 126 { 127 val=0; 128 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC, &val); 129 f=8000; 130 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC_LEVEL, &f); 131 } 132 val=0; 133 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DEREVERB, &val); 134 f=.4; 135 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &f); 136 f=.3; 137 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f); 138 } 138 val=15; 139 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_AGC_MAX_GAIN, &val); 140 #endif 141 142 val=0; 143 #if 0 144 val=1; // do more testing 145 #endif 146 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DEREVERB, &val); 147 f=.4; 148 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &f); 149 f=.3; 150 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f); 151 139 152 #endif 140 153 } … … 231 244 } 232 245 233 static void conf_sum( ConfState *s){246 static void conf_sum(MSFilter *f, ConfState *s){ 234 247 int i,j; 235 248 Channel *chan; … … 273 286 && ms_bufferizer_get_avail(&chan->buff)> (ms_bufferizer_get_avail(&s->channels[0].buff)+s->conf_gran*6) ) 274 287 { 288 #if 0 289 int loudness; 290 #endif 291 int vad=0; 275 292 while (ms_bufferizer_get_avail(&chan->buff)> (ms_bufferizer_get_avail(&s->channels[0].buff)) ) 276 293 { 277 294 ms_bufferizer_read(&chan->buff,(uint8_t*)chan->input,s->conf_gran); 295 #if 0 296 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_GET_AGC_LOUDNESS, &loudness); 297 #endif 278 298 /* we want to remove 4 packets (40ms) in a near future: */ 279 299 #ifndef DISABLE_SPEEX 280 300 if (chan->speex_pp!=NULL && s->enable_vad==TRUE) 281 301 { 282 int vad;283 302 vad = speex_preprocess(chan->speex_pp, (short*)chan->input, NULL); 303 ms_filter_notify(f, MS_CONF_SPEEX_PREPROCESS_MIC, (void*)chan->speex_pp); 284 304 if (vad==1) 285 305 break; /* voice detected: process as usual */ … … 296 316 } 297 317 298 if (s->channels[0].is_speaking<=0) 318 319 if (s->enable_halfduplex>0) 299 320 { 300 for(j=0;j<s->conf_nsamples;++j){ 301 s->sum[j]+=chan->input[j]; 302 } 303 chan->has_contributed=TRUE; 304 } 321 #if 0 322 ms_message("prob=%i", loudness); 323 #endif 324 // LIMITATION: 325 // HALF DUPLEX MODE IS TO BE USED WITH ONLY 326 // ONE SOUND CARD AND ONE RTP STREAM. 327 if (vad>0) // && loudness>20) 328 { 329 /* speech detected */ 330 s->channels[0].is_speaking++; 331 if (s->channels[0].is_speaking>2) 332 s->channels[0].is_speaking=2; 333 } 334 else 335 { 336 s->channels[0].is_speaking--; 337 if (s->channels[0].is_speaking<-2) 338 s->channels[0].is_speaking=-2; 339 } 340 341 if (s->channels[0].is_speaking<=0) 342 ms_message("silence on! (%i)", s->channels[0].is_speaking); 343 else 344 ms_message("speech on! (%i)", s->channels[0].is_speaking); 345 } 346 347 for(j=0;j<s->conf_nsamples;++j){ 348 s->sum[j]+=chan->input[j]; 349 } 350 chan->has_contributed=TRUE; 351 305 352 chan->stat_processed++; 306 353 } … … 313 360 int vad; 314 361 vad = speex_preprocess(chan->speex_pp, (short*)chan->input, NULL); 362 //ms_filter_notify(f, MS_CONF_SPEEX_PREPROCESS_MIC, (void*)chan->speex_pp); 363 } 364 else if (chan->speex_pp!=NULL && s->enable_vad==TRUE) 365 { 366 #if 0 367 int loudness; 368 #endif 369 int vad; 315 370 if (s->enable_halfduplex>0) 316 371 { 317 if (vad>0) 372 vad = speex_preprocess(chan->speex_pp, (short*)chan->input, NULL); 373 ms_filter_notify(f, MS_CONF_SPEEX_PREPROCESS_MIC, (void*)chan->speex_pp); 374 #if 0 375 speex_preprocess_ctl(chan->speex_pp, SPEEX_PREPROCESS_GET_AGC_LOUDNESS, &loudness); 376 ms_message("prob=%i", loudness); 377 #endif 378 // LIMITATION: 379 // HALF DUPLEX MODE IS TO BE USED WITH ONLY 380 // ONE SOUND CARD AND ONE RTP STREAM. 381 if (vad>0) //&& loudness>20) 318 382 { 319 /* speech detected */ 320 chan->is_speaking++; 321 if (chan->is_speaking>5) 322 chan->is_speaking=5; 383 s->channels[0].is_speaking++; 384 if (s->channels[0].is_speaking>2) 385 s->channels[0].is_speaking=2; 323 386 } 324 387 else 325 388 { 326 chan->is_speaking--;327 if ( chan->is_speaking<-5)328 chan->is_speaking=-5;389 s->channels[0].is_speaking--; 390 if (s->channels[0].is_speaking<-2) 391 s->channels[0].is_speaking=-2; 329 392 } 330 if (chan->is_speaking<=0) 331 ms_message("silence on! (%i)", chan->is_speaking); 393 394 if (s->channels[0].is_speaking<=0) 395 ms_message("silence on! (%i)", s->channels[0].is_speaking); 396 else 397 ms_message("speech on! (%i)", s->channels[0].is_speaking); 398 } 332 399 else 333 ms_message("speech on! (%i)", chan->is_speaking); 334 } 335 } 336 else if (chan->speex_pp!=NULL && s->enable_vad==TRUE) 337 { 338 speex_preprocess_estimate_update(chan->speex_pp, (short*)chan->input); 339 } 340 #endif 341 342 if (i==0 343 || s->channels[0].is_speaking<=0) 344 { 345 for(j=0;j<s->conf_nsamples;++j){ 346 s->sum[j]+=chan->input[j]; 347 } 348 chan->has_contributed=TRUE; 349 } 400 { 401 vad = speex_preprocess(chan->speex_pp, (short*)chan->input, NULL); 402 //speex_preprocess_estimate_update(chan->speex_pp, (short*)chan->input); 403 ms_filter_notify(f, MS_CONF_SPEEX_PREPROCESS_MIC, (void*)chan->speex_pp); 404 } 405 } 406 #endif 407 408 for(j=0;j<s->conf_nsamples;++j){ 409 s->sum[j]+=chan->input[j]; 410 } 411 chan->has_contributed=TRUE; 412 350 413 chan->stat_processed++; 351 414 } else { … … 404 467 if (f->outputs[i]!=NULL){ 405 468 chan=&s->channels[i]; 406 m=conf_output(s,chan); 469 if (s->channels[0].is_speaking<=0 || i%2==0) // RTP is silent, work as usual 470 m=conf_output(s,chan); 471 else 472 { 473 m=allocb(s->conf_gran,0); 474 int k; 475 for (k=0;k<s->conf_nsamples;++k){ 476 *((int16_t*)m->b_wptr)=0; 477 m->b_wptr+=2; 478 } 479 } 407 480 ms_queue_put(f->outputs[i],m); 408 481 } … … 434 507 /*do the job */ 435 508 while(should_process(f,s)==TRUE){ 436 conf_sum( s);509 conf_sum(f, s); 437 510 conf_dispatch(f,s); 438 511 } -
linphone/mediastreamer2/src/speexec.c
r205 r249 150 150 speex_echo_cancel(s->ecstate,(short*)in1,(short*)om0->b_rptr,(short*)om1->b_wptr,NULL); 151 151 speex_preprocess_run(s->den, (short*)om1->b_wptr); 152 ms_filter_notify(f, MS_SPEEX_EC_ECHO_STATE, (void*)s->ecstate); 152 153 153 154 om1->b_wptr+=nbytes;
Note: See TracChangeset
for help on using the changeset viewer.
