[EMAIL PROTECTED] wrote, On 01/06/03 18:53:
Last week I modified the mixer to support volume stepping. Having a

Sample usage:

Increasing:
        [daren@wee mixer]$mixer -i 5:5
        Increasing the mixer vol from 40:40 to 45:45.
        [daren@wee mixer]$

Decreasing:
        [daren@wee mixer]$mixer -d vol 10
        Decreasing the mixer vol from 45:45 to 35:35.
        [daren@wee mixer]$
	Mixer can change volume for more than one device within one invocation.
So, what about more generic way to implement stepping ?

You may want to increase volume on one input simultaneously decreasing
the volume on another input. Your can't do it in one step.

Let's implement stepping according to followint example:
[dan@~]$mixer vol 40:40 line1 +15:+15 line2 -10

Set volume for 'vol' to absolute value 40:40, increase line1's volume by
15 and decreasing line2's volume by 10 (both channel).

	It seems to be more generic way to me ...

	The change is backward compatible with current command line format.

	The patch for manual page should be reviewed by someone with better
knowledge of english.


	The patch can be applied to stable also.


					Dan


--
Dan Lukes     tel: +420 2 21914205, fax: +420 2 21914206
root of  FIONet, KolejNET,  webmaster  of www.freebsd.cz
AKA: [EMAIL PROTECTED], [EMAIL PROTECTED],[EMAIL PROTECTED]

*** mixer.c.ORIG        Tue Aug  7 20:15:10 2001
--- mixer.c     Tue Jan  7 10:48:06 2003
***************
*** 23,41 ****
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/soundcard.h>
  
  const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
  
  void usage(int devmask, int recmask);
  int res_name(const char *name, int mask);
  void print_recsrc(int recsrc);
  
  void
  usage(int devmask, int recmask)
  {
        int i, n;
  
!       printf("usage: mixer [-f device] [-s] [[dev [voll[:volr]] | recsrc | 
{^|+|-|=}rec recdev] ... ]\n");
        printf(" devices: ");
        for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
                if ((1 << i) & devmask)  {
--- 23,43 ----
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/soundcard.h>
+ #include <ctype.h>
  
  const char *names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
  
  void usage(int devmask, int recmask);
  int res_name(const char *name, int mask);
  void print_recsrc(int recsrc);
+ int get_vol(char *string, int *l, int *r, int *dl, int *dr);
  
  void
  usage(int devmask, int recmask)
  {
        int i, n;
  
!       printf("usage: mixer [-f device] [-s] [[dev [[+|-]voll[:[+|-]volr]] | recsrc | 
{^|+|-|=}rec recdev] ... ]\n");
        printf(" devices: ");
        for (i = 0, n = 0; i < SOUND_MIXER_NRDEVICES; i++)
                if ((1 << i) & devmask)  {
***************
*** 84,96 ****
        fprintf(stderr, "\n");
  }
  
  int
  main(int argc, char *argv[])
  {
        int foo, bar, baz, dev;
        int devmask = 0, recmask = 0, recsrc = 0, orecsrc;
        int dusage = 0, drecsrc = 0, shortflag = 0;
!       int l = 0, r = 0, t = 0;
        char ch;
  
        char *name;
--- 86,158 ----
        fprintf(stderr, "\n");
  }
  
+ #define PLUSSIGN  '+'
+ #define MINUSSIGN '-'
+ #define DELIMITER ':'
+ int
+ get_vol(char *string, int *l, int *r, int *dl, int *dr)
+ {
+       char *sptr = string;
+       char *endptr;
+       long int value;
+       
+       while(isspace(*sptr))
+               sptr++;
+ 
+       /* if dl==NULL revert to old (non [+|-]) syntax */
+       if (dl != NULL) {
+               if (*sptr == PLUSSIGN) {
+                       *dl = 1;
+                       sptr++;
+               } else if  (*sptr == MINUSSIGN) {
+                       *dl = -1;
+                       sptr++;
+               } else
+                       *dl = 0;
+       }
+       /* catch strings like '+-10' '++3' or '+ 2'*/
+       if (!isdigit(*sptr))
+               return(0);
+       value=strtol(sptr, &endptr, 10);
+       if (*endptr != '\0' && *endptr != DELIMITER && !isspace(*endptr))
+               return(0);
+ 
+       *l=(int)value;
+       sptr=endptr;
+ 
+       if (*sptr!=DELIMITER)
+               return(1);
+ 
+       sptr++;
+       if (dr != NULL) {
+               if (*sptr == PLUSSIGN) {
+                       *dr = 1;
+                       sptr++;
+               } else if  (*sptr == MINUSSIGN) {
+                       *dr = -1;
+                       sptr++;
+               } else
+                       *dr = 0;
+       }
+       /* catch strings like '+-10' '++3' or '+ 2'*/
+       if (!isdigit(*sptr))
+               return(1);
+       value=strtol(sptr, &endptr, 10);
+       if (*endptr != '\0' && !isspace(*endptr))
+               return(1);
+ 
+       *r=(int)value;
+ 
+       return(2);
+ }
+ 
  int
  main(int argc, char *argv[])
  {
        int foo, bar, baz, dev;
        int devmask = 0, recmask = 0, recsrc = 0, orecsrc;
        int dusage = 0, drecsrc = 0, shortflag = 0;
!       int l = 0, r = 0, t = 0, dl = 0, dr = 0;
        char ch;
  
        char *name;
***************
*** 181,187 ****
                        continue;
                }
  
!               if ((t = sscanf(*argv, "%d:%d", &l, &r)) > 0) {
                        dev = 0;
                }
                else if((dev = res_name(*argv, devmask)) == -1) {
--- 243,249 ----
                        continue;
                }
  
!               if ((t = get_vol(*argv, &l, &r, &dl, &dr)) > 0) {
                        dev = 0;
                }
                else if((dev = res_name(*argv, devmask)) == -1) {
***************
*** 190,196 ****
                        break;
                }
  
!               switch(argc > 1 ? sscanf(argv[1], "%d:%d", &l, &r) : t) {
                case 0:
                        if (ioctl(baz, MIXER_READ(dev),&bar)== -1) {
                                warn("MIXER_READ");
--- 252,258 ----
                        break;
                }
  
!               switch(argc > 1 ? get_vol(argv[1], &l, &r, &dl, &dr) : t) {
                case 0:
                        if (ioctl(baz, MIXER_READ(dev),&bar)== -1) {
                                warn("MIXER_READ");
***************
*** 207,213 ****
--- 269,290 ----
                        break;
                case 1:
                        r = l;
+                       dr = dl;
                case 2:
+                       if ( dl != 0 || dr != 0 )
+                               if (ioctl(baz, MIXER_READ(dev),&bar)== -1) {
+                                       warn("MIXER_READ");
+                                       argc--; argv++;
+                                       continue;
+                               }
+                       if ( dl == 1 )
+                               l = (bar & 0x7f) + l;
+                       else if ( dl == -1 )
+                               l = (bar & 0x7f) - l;
+                       if ( dr == 1 )
+                               r = ((bar >> 8) & 0x7f) + r;
+                       else if ( dr == -1 )
+                               r = ((bar >> 8) & 0x7f) - r;
                        if (l < 0)
                                l = 0;
                        else if (l > 100)
*** mixer.8.ORIG        Tue Aug  7 20:15:10 2001
--- mixer.8     Tue Jan  7 11:20:57 2003
***************
*** 39,45 ****
  .Op Fl s
  .Oo
  .Oo Ar dev
! .Op Ar lvol Ns Op : Ns Ar rvol
  .Cm | recsrc |
  .Sm off
  .Eo \&{
--- 39,54 ----
  .Op Fl s
  .Oo
  .Oo Ar dev
! .Oo
! .Sm off
! .Op Cm + | - 
! .Ar lvol Ns 
! .Oo : Ns 
! .Op Cm + | - 
! .Ar rvol
! .Sm on
! .Oc
! .Oc
  .Cm | recsrc |
  .Sm off
  .Eo \&{
***************
*** 78,89 ****
  To modify the mixer value
  .Ar dev ,
  the optional left and right channel settings of
! .Ar lvol Ns Op : Ns Ar rvol
  may be specified.  The
  .Ar lvol
  and
  .Ar rvol
! arguments may be from 0 - 100.  Omitting
  .Ar dev
  and including only the channel settings will change the main volume level.
  .Pp
--- 87,106 ----
  To modify the mixer value
  .Ar dev ,
  the optional left and right channel settings of
! .Sm off
! .Op Cm + | - 
! .Ar lvol Ns 
! .Oo : Ns 
! .Op Cm + | - 
! .Ar rvol
! .Oc
! .Sm on
  may be specified.  The
  .Ar lvol
  and
  .Ar rvol
! arguments may be from 0 - 100.  Without a sign it set volume to absolute
! value otherwise it increment or decrement current volume. Omitting
  .Ar dev
  and including only the channel settings will change the main volume level.
  .Pp

Reply via email to