From cedeaec6e1f22463dc1e13e3dee467fc4dcd4019 Mon Sep 17 00:00:00 2001 From: Benny Prijono Date: Tue, 11 Mar 2008 20:50:46 +0000 Subject: Ticket #494: Configuration option to use high quality tone generation git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1859 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/config.h | 11 ++++++ pjmedia/src/pjmedia/tonegen.c | 81 +++++++++++++++++++++------------------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h index 93be70d3..0640b184 100644 --- a/pjmedia/include/pjmedia/config.h +++ b/pjmedia/include/pjmedia/config.h @@ -484,6 +484,17 @@ #endif +/** + * Enable high quality of tone generation, the better quality will cost + * more CPU load. This is only applied to floating point enabled machines. + * + * By default it is enabled. + */ +#ifndef PJMEDIA_USE_HIGH_QUALITY_TONEGEN +# define PJMEDIA_USE_HIGH_QUALITY_TONEGEN 1 +#endif + + /** * Enable support for SRTP media transport. This will require linking * with libsrtp from the third_party directory. diff --git a/pjmedia/src/pjmedia/tonegen.c b/pjmedia/src/pjmedia/tonegen.c index 549f0a63..68d6634b 100644 --- a/pjmedia/src/pjmedia/tonegen.c +++ b/pjmedia/src/pjmedia/tonegen.c @@ -39,29 +39,52 @@ #if defined(PJ_HAS_FLOATING_POINT) && PJ_HAS_FLOATING_POINT!=0 - /* - * Default floating-point based tone generation using sine wave - * generation from: - * http://www.musicdsp.org/showone.php?id=10. - * This produces good quality tone in relatively faster time than - * the normal sin() generator. - * Speed = 40.6 cycles per sample. - */ # include - struct gen - { - DATA a, s0, s1; - }; -# define GEN_INIT(var,R,F,A) var.a = (DATA) (2.0 * sin(M_PI * F / R)); \ - var.s0 = A; \ - var.s1 = 0 -# define GEN_SAMP(val,var) var.s0 = var.s0 - var.a * var.s1; \ - var.s1 = var.s1 + var.a * var.s0; \ - val = (short) var.s0 +# if defined(PJMEDIA_USE_HIGH_QUALITY_TONEGEN) && \ + PJMEDIA_USE_HIGH_QUALITY_TONEGEN!=0 + + /* + * This is the good old tone generator using sin(). + * Speed = 222.5 cycles per sample. + */ + struct gen + { + DATA add; + DATA c; + DATA vol; + }; + +# define GEN_INIT(var,R,F,A) var.add = ((DATA)F)/R, var.c=0, var.vol=A +# define GEN_SAMP(val,var) val = (short)(sin(var.c * 2 * M_PI) * \ + var.vol); \ + var.c += var.add + +# else + + /* + * Default floating-point based tone generation using sine wave + * generation from: + * http://www.musicdsp.org/showone.php?id=10. + * This produces good quality tone in relatively faster time than + * the normal sin() generator. + * Speed = 40.6 cycles per sample. + */ + struct gen + { + DATA a, s0, s1; + }; + +# define GEN_INIT(var,R,F,A) var.a = (DATA) (2.0 * sin(M_PI * F / R)); \ + var.s0 = A; \ + var.s1 = 0 +# define GEN_SAMP(val,var) var.s0 = var.s0 - var.a * var.s1; \ + var.s1 = var.s1 + var.a * var.s0; \ + val = (short) var.s0 +# endif +#else -#elif !defined(PJ_HAS_FLOATING_POINT) || PJ_HAS_FLOATING_POINT==0 /* * Fallback algorithm when floating point is disabled. * This is a very fast fixed point tone generation using sine wave @@ -99,26 +122,6 @@ # define GEN_SAMP(val,var) val = (short) VOL(var,SIN(var.c)>>16);\ var.c += var.add - -#else -# error "Should never get to this part" -# include - /* - * Should never really reach here, but anyway it's provided for reference. - * This is the good old tone generator using sin(). - * Speed = 222.5 cycles per sample. - */ - struct gen - { - DATA add; - DATA c; - DATA vol; - }; - -# define GEN_INIT(var,R,F,A) var.add = ((DATA)F)/R, var.c=0, var.vol=A -# define GEN_SAMP(val,var) val = (short)(sin(var.c * 2 * M_PI) * var.vol);\ - var.c += var.add - #endif struct gen_state -- cgit v1.2.3