- Timestamp:
- Sep 16, 2008 2:33:16 PM (16 years ago)
- Location:
- pjproject/trunk/pjmedia
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/include/pjmedia/config.h
r2215 r2281 542 542 * more CPU load. This is only applied to floating point enabled machines. 543 543 * 544 * By default it is enabled. 544 * By default it is enabled when PJ_HAS_FLOATING_POINT is set. 545 * 546 * @see PJMEDIA_TONEGEN_FORCE_FLOAT 545 547 */ 546 548 #ifndef PJMEDIA_USE_HIGH_QUALITY_TONEGEN 547 # define PJMEDIA_USE_HIGH_QUALITY_TONEGEN 1 549 # define PJMEDIA_USE_HIGH_QUALITY_TONEGEN PJ_HAS_FLOATING_POINT 550 #endif 551 552 553 /** 554 * Force the tone generation to use floating point computation, even when 555 * PJ_HAS_FLOATING_POINT is disabled. This may be necessary if the tone 556 * generator is used to produce DTMF to be sent inband, since the fixed 557 * point algorithm may not have the correct frequency accuracy. 558 * 559 * This option, combined with PJ_HAS_FLOATING_POINT will produce the 560 * following selection of tone generator algorithm: 561 * - if both PJ_HAS_FLOATING_POINT and PJMEDIA_USE_HIGH_QUALITY_TONEGEN 562 * are set, the standard sin() function will be used. This will produce 563 * the highest quality tones, at the expense of more processing power. 564 * - if PJ_HAS_FLOATING_POINT is not set: 565 * - if both PJMEDIA_USE_HIGH_QUALITY_TONEGEN and 566 * PJMEDIA_TONEGEN_FORCE_FLOAT are set, sin() based algorithm will 567 * be used (similar as above). 568 * - if PJMEDIA_USE_HIGH_QUALITY_TONEGEN is not set but the 569 * PJMEDIA_TONEGEN_FORCE_FLOAT is set, a floating point approximation 570 * algorithm will be used. This should produce good enough tone 571 * for most uses, and the performance is faster than using pure 572 * sin() based algorithm. Note that linking to math library may 573 * still be needed. 574 * - if both are not set, the fixed point approximation algorithm 575 * will be used. 576 * 577 * Default: 1 578 */ 579 #ifndef PJMEDIA_TONEGEN_FORCE_FLOAT 580 # define PJMEDIA_TONEGEN_FORCE_FLOAT 1 581 #endif 582 583 584 /** 585 * Fade-in duration for the tone, in milliseconds. Set to zero to disable 586 * this feature. 587 * 588 * Default: 1 (msec) 589 */ 590 #ifndef PJMEDIA_TONEGEN_FADE_IN_TIME 591 # define PJMEDIA_TONEGEN_FADE_IN_TIME 1 592 #endif 593 594 595 /** 596 * Fade-out duration for the tone, in milliseconds. Set to zero to disable 597 * this feature. 598 * 599 * Default: 2 (msec) 600 */ 601 #ifndef PJMEDIA_TONEGEN_FADE_OUT_TIME 602 # define PJMEDIA_TONEGEN_FADE_OUT_TIME 2 548 603 #endif 549 604 -
pjproject/trunk/pjmedia/src/pjmedia/tonegen.c
r2039 r2281 39 39 40 40 41 #if defined(PJ_HAS_FLOATING_POINT) && PJ_HAS_FLOATING_POINT!=0 41 #if (defined(PJ_HAS_FLOATING_POINT) && PJ_HAS_FLOATING_POINT!=0) || \ 42 (defined(PJMEDIA_TONEGEN_FORCE_FLOAT) && PJMEDIA_TONEGEN_FORCE_FLOAT != 0) 42 43 # include <math.h> 43 44 … … 250 251 unsigned options; 251 252 unsigned playback_options; 253 unsigned fade_in_len; /* fade in for this # of samples */ 254 unsigned fade_out_len; /* fade out for this # of samples*/ 252 255 253 256 /* lock */ … … 336 339 tonegen->digit_map = &digit_map; 337 340 341 tonegen->fade_in_len = PJMEDIA_TONEGEN_FADE_IN_TIME * clock_rate / 1000; 342 tonegen->fade_out_len = PJMEDIA_TONEGEN_FADE_OUT_TIME * clock_rate / 1000; 343 338 344 /* Lock */ 339 345 if (options & PJMEDIA_TONEGEN_NO_LOCK) { … … 534 540 generate_tone(&tonegen->state, port->info.channel_count, 535 541 cnt, dst); 542 536 543 dst += cnt; 537 544 tonegen->dig_samples += cnt; 538 545 required -= cnt; 546 547 if (tonegen->dig_samples == cnt) { 548 /* Fade in */ 549 short *samp = (dst - cnt); 550 short *end; 551 552 if (cnt > tonegen->fade_in_len) 553 cnt = tonegen->fade_in_len; 554 end = samp + cnt; 555 if (cnt) { 556 const unsigned step = 0xFFFF / cnt; 557 unsigned scale = 0; 558 559 for (; samp < end; ++samp) { 560 (*samp) = (short)(((*samp) * scale) >> 16); 561 scale += step; 562 } 563 } 564 } else if (tonegen->dig_samples == on_samp) { 565 /* Fade out */ 566 if (cnt > tonegen->fade_out_len) 567 cnt = tonegen->fade_out_len; 568 if (cnt) { 569 short *samp = (dst - cnt); 570 const unsigned step = 0xFFFF / cnt; 571 unsigned scale = 0xFFFF - step; 572 573 for (; samp < dst; ++samp) { 574 (*samp) = (short)(((*samp) * scale) >> 16); 575 scale -= step; 576 } 577 } 578 } 539 579 540 580 if (dst == end)
Note: See TracChangeset
for help on using the changeset viewer.