[nas] patch: output gain scaling
Jon Trulson
jon at radscan.com
Mon Jul 24 19:42:56 MDT 2006
On Mon, 24 Jul 2006, Paul Fox wrote:
> i have a response composed for erik, but just got both of jon's
> replies, so i need to think some more. :-)
>
hehe, sorry...
> in the meantime, here's my support for limiting output gain, via
> a percentage scale factor specified in the config file.
>
> when i started implementing this, i was surprised that a) so much
> fo the config i've taken for granted as being applicable to all
> platforms is voxware only, and b) that someone already started
Yes... Alot more voxware users, than say... SGI and HPUX :) Sun
has thier own wierd API, but I suspect they will be getting rid of
that in future Solais releases (11+).
> implementing a maximum gain feature in the device independent
> layer: search for AuSetMaxOutputGain() in server/dia/auprocess.c,
> and observe that it's never called by anyone. but since there's
> currently no real config capability for that layer, this patch
> doesn't use that code, or modifiy it.
Not sure what that is/was supposed to do.
>
> this patch also doesn't apply to input -- it affects output only.
>
Since this could be useful for input in the future, could we
call it something like gainoscale and gainiscale (or something
different) so that we can add input scaling in the future
without risking a name collision?
> paul
>
> Index: server/nasd.conf.man
> ===================================================================
> --- server/nasd.conf.man (revision 162)
> +++ server/nasd.conf.man (working copy)
> @@ -53,12 +53,17 @@
> .B gain number
> Specifies the default volume (0-100). The default is 50.
> .PP
> +.B gainscale number
> +This factor (expressed as a percentage) is applied to all volume-setting
> +requests. This lets the server transparently limit the actual
> +maximum volume that can be set by clients.
> +.PP
> .B maxrate number
> -the maximum number of samples per second that we'll drive the
> +The maximum number of samples per second that we'll drive the
> card at.
> .PP
> .B minrate number
> -the minimum number of samples per second that the card will be driven
> +The minimum number of samples per second that the card will be driven
> at.
> .PP
> .B maxfrags number
> Index: server/dda/voxware/auvoxware.c
> ===================================================================
> --- server/dda/voxware/auvoxware.c (revision 162)
> +++ server/dda/voxware/auvoxware.c (working copy)
> @@ -265,7 +265,8 @@
> 1, /* autoOpen */
> 0, /* forceRate */
> 0, /* isPCSpeaker */
> - 50 /* default gain */
> + 50, /* default gain */
> + 100 /* gain reduction factor */
> }, sndStatOut =
> {
> -1, /* fd */
> @@ -287,7 +288,8 @@
> 1, /* autoOpen */
> 0, /* forceRate */
> 0, /* isPCSpeaker */
> - 50 /* default gain */
> + 50, /* default gain */
> + 100 /* gain reduction factor */
> };
>
> #define auDefaultInputGain AuFixedPointFromSum(sndStatIn.gain, 0)
> @@ -956,6 +958,12 @@
> if (g < 0)
> g = 0;
> lastPhysicalOutputGain = g;
> +
> + if (sndStatOut.gainScale ) {
> + g *= sndStatOut.gainScale;
> + g /= 100;
> + }
> +
> gusvolume = g | (g << 8);
> if (mixerfd != -1)
> if (ioctl(mixerfd, MIXER_WRITE(SOUND_MIXER_PCM), &gusvolume) == -1)
> Index: server/dda/voxware/config.c
> ===================================================================
> --- server/dda/voxware/config.c (revision 162)
> +++ server/dda/voxware/config.c (working copy)
> @@ -43,6 +43,14 @@
> confStat->forceRate = num ;
> break;
>
> + case GAINSCALE :
> + num = (int) value;
> + if (num < 0 || num > 100)
> + osLogMsg("config: gain scaling must be within the range 0-100\n");
> + else
> + confStat->gainScale = num ;
> + break;
> +
> case GAIN :
> num = (int) value;
> /* the default is 50, so if it's just out of range, don't
> Index: server/dda/voxware/config.h
> ===================================================================
> --- server/dda/voxware/config.h (revision 162)
> +++ server/dda/voxware/config.h (working copy)
> @@ -25,7 +25,8 @@
> int autoOpen ;
> int forceRate ;
> int isPCSpeaker;
> - int gain; /* default gain */
> + int gain; /* default gain */
> + int gainScale; /* percentage by which gain is always reduced */
> } SndStat;
>
>
> Index: server/dia/lex.l
> ===================================================================
> --- server/dia/lex.l (revision 162)
> +++ server/dia/lex.l (working copy)
> @@ -21,6 +21,7 @@
> [Oo][Uu][Tt][Pp][Uu][Tt][Ss][Ee][Cc][Tt][Ii][Oo][Nn] { return OUTPUTSECTION; }
> [Ee][Nn][Dd] { return ENDSECTION; }
> [Gg][Aa][Ii][Nn] { return GAIN; }
> +[Gg][Aa][Ii][Nn][Ss][Cc][Aa][Ll][Ee] { return GAINSCALE; }
> [Ww][Oo][Rr][Dd][Ss][Ii][Zz][Ee] { return WORDSIZE; }
> [Ff][Rr][Aa][Gg][Ss][Ii][Zz][Ee] { return FRAGSIZE; }
> [Mm][Ii][Nn][Ff][Rr][Aa][Gg][Ss] { return MINFRAGS; }
> Index: server/dia/gram.y
> ===================================================================
> --- server/dia/gram.y (revision 162)
> +++ server/dia/gram.y (working copy)
> @@ -28,7 +28,7 @@
> %token <num> INPUTSECTION OUTPUTSECTION ENDSECTION WORDSIZE FRAGSIZE MAXFRAGS
> %token <num> MINFRAGS MAXRATE MINRATE NUMCHANS MIXER DEVICE NUMBER
> %token <num> CDEBUG VERBOSE
> -%token <num> READWRITE FORCERATE AUTOOPEN GAIN
> +%token <num> READWRITE FORCERATE AUTOOPEN GAIN GAINSCALE
> %token <num> RELEASEDEVICE OUTDEVTYPE MIXERINIT
> %token <ptr> STRING
>
> @@ -141,6 +141,8 @@
> { ddaSetConfig(MINRATE, (void *)$2); }
> | GAIN number
> { ddaSetConfig(GAIN, (void *)$2); }
> + | GAINSCALE number
> + { ddaSetConfig(GAINSCALE, (void *)$2); }
> ;
>
> string : STRING { ptr = (char *)malloc(strlen($1)+1);
>
> =---------------------
> paul fox, pgf at foxharp.boston.ma.us (arlington, ma, where it's 68.7 degrees)
>
--
Jon Trulson
mailto:jon at radscan.com http://radscan.com/~jon
#include <std/disclaimer.h>
"No Kill I" -Horta
More information about the Nas
mailing list