Changeset 249:7bdaa4c9c454 in mediastreamer2


Ignore:
Timestamp:
Feb 11, 2009 3:30:34 PM (4 years ago)
Author:
aymeric <aymeric@…>
Branch:
default
Message:

Add notification for analysing content of echo state and speex preprocessor.

git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@252 3f6dc0c8-ddfe-455d-9043-3cd528dc4637

Location:
linphone/mediastreamer2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • linphone/mediastreamer2/include/mediastreamer2/msfilter.h

    r241 r249  
    393393#define MS_FILTER_SET_VAD_PROB_CONTINUE MS_FILTER_BASE_METHOD(24,int) 
    394394 
     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*) 
    395397/** @} */ 
    396398 
  • linphone/mediastreamer2/src/msconf.c

    r241 r249  
    8282 
    8383static void channel_init(ConfState *s, Channel *chan, int pos){ 
     84        float f; 
     85        int val; 
    8486        memset(chan, 0, sizeof(Channel)); 
    8587        ms_bufferizer_init(&chan->buff); 
     
    8789        //chan->speex_pp = speex_preprocess_state_init((s->conf_gran/2) *(s->samplerate/8000), s->samplerate); 
    8890        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); 
    120137#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 
    139152#endif 
    140153} 
     
    231244} 
    232245 
    233 static void conf_sum(ConfState *s){ 
     246static void conf_sum(MSFilter *f, ConfState *s){ 
    234247        int i,j; 
    235248        Channel *chan; 
     
    273286                        && ms_bufferizer_get_avail(&chan->buff)> (ms_bufferizer_get_avail(&s->channels[0].buff)+s->conf_gran*6) ) 
    274287                { 
     288#if 0 
     289                        int loudness; 
     290#endif 
     291                        int vad=0; 
    275292                        while (ms_bufferizer_get_avail(&chan->buff)> (ms_bufferizer_get_avail(&s->channels[0].buff)) ) 
    276293                        { 
    277294                                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 
    278298                                /* we want to remove 4 packets (40ms) in a near future: */ 
    279299#ifndef DISABLE_SPEEX 
    280300                                if (chan->speex_pp!=NULL && s->enable_vad==TRUE) 
    281301                                { 
    282                                         int vad; 
    283302                                        vad = speex_preprocess(chan->speex_pp, (short*)chan->input, NULL); 
     303                                        ms_filter_notify(f, MS_CONF_SPEEX_PREPROCESS_MIC, (void*)chan->speex_pp); 
    284304                                        if (vad==1) 
    285305                                                break; /* voice detected: process as usual */ 
     
    296316                        } 
    297317 
    298                         if (s->channels[0].is_speaking<=0) 
     318 
     319                        if (s->enable_halfduplex>0) 
    299320                        { 
    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 
    305352                        chan->stat_processed++; 
    306353                } 
     
    313360                                int vad; 
    314361                                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; 
    315370                                if (s->enable_halfduplex>0) 
    316371                                { 
    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) 
    318382                                        { 
    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; 
    323386                                        } 
    324387                                        else 
    325388                                        { 
    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; 
    329392                                        } 
    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                                } 
    332399                                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 
    350413                        chan->stat_processed++; 
    351414                } else { 
     
    404467                if (f->outputs[i]!=NULL){ 
    405468                        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                        } 
    407480                        ms_queue_put(f->outputs[i],m); 
    408481                } 
     
    434507        /*do the job */ 
    435508        while(should_process(f,s)==TRUE){ 
    436                 conf_sum(s); 
     509                conf_sum(f, s); 
    437510                conf_dispatch(f,s); 
    438511        } 
  • linphone/mediastreamer2/src/speexec.c

    r205 r249  
    150150                speex_echo_cancel(s->ecstate,(short*)in1,(short*)om0->b_rptr,(short*)om1->b_wptr,NULL); 
    151151                speex_preprocess_run(s->den, (short*)om1->b_wptr); 
     152                ms_filter_notify(f, MS_SPEEX_EC_ECHO_STATE, (void*)s->ecstate); 
    152153 
    153154                om1->b_wptr+=nbytes; 
Note: See TracChangeset for help on using the changeset viewer.