Ignore:
Timestamp:
Sep 24, 2008 9:38:55 AM (11 years ago)
Author:
bennylp
Message:

Ticket #642: Discontinuous tone generation (thanks Olle Frimanson for the report)

File:
1 edited

Legend:

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

    r2305 r2313  
    343343#endif 
    344344 
     345enum flags 
     346{ 
     347    PJMEDIA_TONE_INITIALIZED    = 1, 
     348    PJMEDIA_TONE_ENABLE_FADE    = 2 
     349}; 
     350 
    345351struct tonegen 
    346352{ 
     
    350356    unsigned            options; 
    351357    unsigned            playback_options; 
    352     pj_bool_t           has_fading;     /* Enable fade-in and fade-out   */ 
    353358    unsigned            fade_in_len;    /* fade in for this # of samples */ 
    354359    unsigned            fade_out_len;   /* fade out for this # of samples*/ 
     
    439444    tonegen->digit_map = &digit_map; 
    440445 
    441     tonegen->has_fading = PJ_TRUE; 
    442446    tonegen->fade_in_len = PJMEDIA_TONEGEN_FADE_IN_TIME * clock_rate / 1000; 
    443447    tonegen->fade_out_len = PJMEDIA_TONEGEN_FADE_OUT_TIME * clock_rate / 1000; 
     
    596600    } 
    597601 
    598     if (tonegen->cur_digit > tonegen->count) { 
     602    if (tonegen->cur_digit >= tonegen->count) { 
    599603        /* After we're finished with the last digit, we have played all  
    600604         * the digits  
     
    621625 
    622626    while (dst < end) { 
    623         const pjmedia_tone_desc *dig = &tonegen->digits[tonegen->cur_digit]; 
     627        pjmedia_tone_desc *dig = &tonegen->digits[tonegen->cur_digit]; 
    624628        unsigned required, cnt, on_samp, off_samp; 
    625629 
     
    629633 
    630634        /* Init tonegen */ 
    631         if (tonegen->dig_samples == 0) { 
     635        if (tonegen->dig_samples == 0 &&  
     636            (tonegen->count!=1 || !(dig->flags & PJMEDIA_TONE_INITIALIZED))) 
     637        { 
    632638            init_generate_tone(&tonegen->state, port->info.clock_rate, 
    633639                               dig->freq1, dig->freq2, dig->volume); 
     640            dig->flags |= PJMEDIA_TONE_INITIALIZED; 
     641            if (tonegen->cur_digit > 0) { 
     642                /* Clear initialized flag of previous digit */ 
     643                tonegen->digits[tonegen->cur_digit-1].flags &=  
     644                                                (~PJMEDIA_TONE_INITIALIZED); 
     645            } 
    634646        } 
    635647 
     
    646658            required -= cnt; 
    647659 
    648             if (tonegen->has_fading && tonegen->dig_samples == cnt) { 
     660            if ((dig->flags & PJMEDIA_TONE_ENABLE_FADE) &&  
     661                tonegen->dig_samples == cnt)  
     662            { 
    649663                /* Fade in */ 
    650664                short *samp = (dst - cnt); 
     
    663677                    } 
    664678                } 
    665             } else if (tonegen->has_fading && tonegen->dig_samples==on_samp) { 
     679            } else if ((dig->flags & PJMEDIA_TONE_ENABLE_FADE) && 
     680                        tonegen->dig_samples==on_samp)  
     681            { 
    666682                /* Fade out */ 
    667683                if (cnt > tonegen->fade_out_len) 
     
    772788     * wants to play this tone continuously (e.g. dial tone). 
    773789     */ 
    774     tonegen->has_fading = PJ_TRUE; 
    775790    for (i=0; i<count; ++i) { 
    776791        pjmedia_tone_desc *t = &tonegen->digits[i+tonegen->count]; 
     
    779794        else if (t->volume < 0) 
    780795            t->volume = (short) -t->volume; 
    781         if (t->off_msec == 0) 
    782             tonegen->has_fading = PJ_FALSE; 
     796        /* Reset flags */ 
     797        t->flags = 0; 
     798        if (t->off_msec != 0) 
     799            t->flags |= PJMEDIA_TONE_ENABLE_FADE; 
    783800    } 
    784801 
Note: See TracChangeset for help on using the changeset viewer.