]> git.alsa-project.org Git - alsa-utils.git/commitdiff
Coding style...
authorJaroslav Kysela <perex@perex.cz>
Fri, 27 Nov 1998 15:13:57 +0000 (15:13 +0000)
committerJaroslav Kysela <perex@perex.cz>
Fri, 27 Nov 1998 15:13:57 +0000 (15:13 +0000)
alsactl/alsactl.c
alsactl/alsactl.h
alsactl/alsactl_parser.y
alsactl/setup.c

index ef91a6011aad5c017e947ff91cb7a2a9aeb709e6..4e7c24bb904e327110b98e4b5243ef1c6f207b94 100644 (file)
 #define HELPID_DEBUG            1002
 #define HELPID_VERSION         1003
 
-extern int yyparse( void );
+extern int yyparse(void);
 extern int linecount;
-extern FILE *yyin; 
+extern FILE *yyin;
 extern int yydebug;
 
 int debugflag = 0;
-char cfgfile[ 512 ] = ALSACTL_FILE;
+char cfgfile[512] = ALSACTL_FILE;
 
-void error( const char *fmt, ... )
+void error(const char *fmt,...)
 {
-  va_list va;
-  
-  va_start( va, fmt );
-  fprintf( stderr, "alsactl: " );
-  vfprintf( stderr, fmt, va );
-  fprintf( stderr, "\n" );
-  va_end( va );
+       va_list va;
+
+       va_start(va, fmt);
+       fprintf(stderr, "alsactl: ");
+       vfprintf(stderr, fmt, va);
+       fprintf(stderr, "\n");
+       va_end(va);
 }
 
-static void help( void )
+static void help(void)
 {
-  printf( "Usage: alsactl <options> command\n" );
-  printf( "\nAvailable options:\n" );
-  printf( "  -h,--help       this help\n" );
-  printf( "  -f,--file #     configuration file (default " ALSACTL_FILE ")\n" );
-  printf( "  -d,--debug      debug mode\n" );
-  printf( "  -v,--version    print version of this program\n" );
-  printf( "\nAvailable commands:\n" );
-  printf( "  store <card #>  store current driver setup for one or each soundcards\n" );
-  printf( "                  to configuration file\n" );
-  printf( "  restore <card #>  restore current driver setup for one or each soundcards\n" );
-  printf( "                    from configuration file\n" );
+       printf("Usage: alsactl <options> command\n");
+       printf("\nAvailable options:\n");
+       printf("  -h,--help       this help\n");
+       printf("  -f,--file #     configuration file (default " ALSACTL_FILE ")\n");
+       printf("  -d,--debug      debug mode\n");
+       printf("  -v,--version    print version of this program\n");
+       printf("\nAvailable commands:\n");
+       printf("  store <card #>  store current driver setup for one or each soundcards\n");
+       printf("                  to configuration file\n");
+       printf("  restore <card #>  restore current driver setup for one or each soundcards\n");
+       printf("                    from configuration file\n");
 }
 
-static int collect_all( void )
+static int collect_all(void)
 {
-  int idx, err;
-  unsigned int card_mask;
-
-  card_mask = snd_cards_mask();
-  if ( !card_mask ) {
-    error( "No soundcards found..." );
-    return 1;
-  }
-  soundcard_setup_init();
-  for ( idx = 0; idx < 32; idx++ ) {
-    if ( card_mask & (1 << idx) ) {    /* find each installed soundcards */
-      if ( (err = soundcard_setup_collect( idx )) ) {
-        soundcard_setup_done();
-        return err;
-      }
-    }
-  }
-  return 0;
+       int idx, err;
+       unsigned int card_mask;
+
+       card_mask = snd_cards_mask();
+       if (!card_mask) {
+               error("No soundcards found...");
+               return 1;
+       }
+       soundcard_setup_init();
+       for (idx = 0; idx < 32; idx++) {
+               if (card_mask & (1 << idx)) {   /* find each installed soundcards */
+                       if ((err = soundcard_setup_collect(idx))) {
+                               soundcard_setup_done();
+                               return err;
+                       }
+               }
+       }
+       return 0;
 }
 
-static int store_setup( const char *cardname )
+static int store_setup(const char *cardname)
 {
-  int err;
-
-  if ( !cardname ) {
-    unsigned int card_mask, idx;
-
-    card_mask = snd_cards_mask();
-    if ( !card_mask ) {
-      error( "No soundcards found..." );
-      return 1;
-    }
-    soundcard_setup_init();
-    for ( idx = 0; idx < 32; idx++ ) {
-      if ( card_mask & (1 << idx) ) {  /* find each installed soundcards */
-        if ( (err = soundcard_setup_collect( idx )) ) {
-          soundcard_setup_done();
-          return err;
-        }
-      }
-    }
-  } else {
-    int cardno;
-  
-    cardno = snd_card_name( cardname );
-    if ( cardno ) {
-      error( "Cannot find soundcard '%s'...", cardname );
-      return 1;
-    }
-    if ( (err = collect_all()) )
-      return err;
-    if ( (err = soundcard_setup_load( cfgfile, 1 )) )
-      return err;
-    if ( (err = soundcard_setup_collect( cardno )) ) {
-      soundcard_setup_done();
-      return err;
-    }
-  }
-  err = soundcard_setup_write( cfgfile );
-  soundcard_setup_done();
-  return err;
+       int err;
+
+       if (!cardname) {
+               unsigned int card_mask, idx;
+
+               card_mask = snd_cards_mask();
+               if (!card_mask) {
+                       error("No soundcards found...");
+                       return 1;
+               }
+               soundcard_setup_init();
+               for (idx = 0; idx < 32; idx++) {
+                       if (card_mask & (1 << idx)) {   /* find each installed soundcards */
+                               if ((err = soundcard_setup_collect(idx))) {
+                                       soundcard_setup_done();
+                                       return err;
+                               }
+                       }
+               }
+       } else {
+               int cardno;
+
+               cardno = snd_card_name(cardname);
+               if (cardno) {
+                       error("Cannot find soundcard '%s'...", cardname);
+                       return 1;
+               }
+               if ((err = collect_all()))
+                       return err;
+               if ((err = soundcard_setup_load(cfgfile, 1)))
+                       return err;
+               if ((err = soundcard_setup_collect(cardno))) {
+                       soundcard_setup_done();
+                       return err;
+               }
+       }
+       err = soundcard_setup_write(cfgfile);
+       soundcard_setup_done();
+       return err;
 }
 
-static int restore_setup( const char *cardname )
+static int restore_setup(const char *cardname)
 {
-  int err, cardno = -1;
-  
-  if ( cardname ) {
-    cardno = snd_card_name( cardname );
-    if ( cardno < 0 ) {
-      error( "Cannot find soundcard '%s'...", cardname );
-      return 1;
-    }
-  }
-  if ( (err = collect_all()) )
-    return err;
-  if ( (err = soundcard_setup_load( cfgfile, 0 )) )
-    return err;
-  err = soundcard_setup_process( cardno );
-  soundcard_setup_done();
-  return err;
+       int err, cardno = -1;
+
+       if (cardname) {
+               cardno = snd_card_name(cardname);
+               if (cardno < 0) {
+                       error("Cannot find soundcard '%s'...", cardname);
+                       return 1;
+               }
+       }
+       if ((err = collect_all()))
+               return err;
+       if ((err = soundcard_setup_load(cfgfile, 0)))
+               return err;
+       err = soundcard_setup_process(cardno);
+       soundcard_setup_done();
+       return err;
 }
 
-int main( int argc, char *argv[] )
+int main(int argc, char *argv[])
 {
-  int morehelp;
-  struct option long_option[] = {
-    { "help", 0, NULL, HELPID_HELP },
-    { "file", 1, NULL, HELPID_FILE },
-    { "debug", 0, NULL, HELPID_DEBUG },
-    { "version", 0, NULL, HELPID_VERSION },
-    { NULL, 0, NULL, 0 },
-  };
-
-  morehelp = 0;
-  while ( 1 ) {
-    int c;
-          
-    if ( ( c = getopt_long( argc, argv, "hf:dv", long_option, NULL ) ) < 0 ) break;
-    switch ( c ) {
-      case 'h':
-      case HELPID_HELP:
-        morehelp++;
-        break;
-      case 'f':
-      case HELPID_FILE:
-        strncpy( cfgfile, optarg, sizeof( cfgfile ) - 1 );
-        cfgfile[ sizeof( cfgfile ) - 1 ] = 0;
-        break;
-      case 'd':
-      case HELPID_DEBUG:
-        debugflag = 1;
-        break;
-      case 'v':
-      case HELPID_VERSION:
-        printf( "alsactl version " SND_UTIL_VERSION "\n" );
-        return 1;
-      default:
-        fprintf( stderr, "\07Invalid switch or option needs an argument.\n" );
-        morehelp++;
-     }
-  }
-  if ( morehelp ) {
-    help();
-    return 1;
-  }            
-
-  if ( argc - optind <= 0 ) {
-    fprintf( stderr, "alsactl: Specify command...\n" );
-    return 0;
-  }
-  if ( !strcmp( argv[ optind ], "store" ) ) {
-    return store_setup( argc - optind > 1 ? argv[ optind + 1 ] : NULL ) ?
-                                                                       0 : 1;
-  } else if ( !strcmp( argv[ optind ], "restore" ) ) {
-    return restore_setup( argc - optind > 1 ? argv[ optind + 1 ] : NULL ) ?
-                                                                       0 : 1;
-  } else {
-    fprintf( stderr, "alsactl: Unknown command '%s'...\n", argv[ optind ] );
-  }
-
-  return 0;
+       int morehelp;
+       struct option long_option[] =
+       {
+               {"help", 0, NULL, HELPID_HELP},
+               {"file", 1, NULL, HELPID_FILE},
+               {"debug", 0, NULL, HELPID_DEBUG},
+               {"version", 0, NULL, HELPID_VERSION},
+               {NULL, 0, NULL, 0},
+       };
+
+       morehelp = 0;
+       while (1) {
+               int c;
+
+               if ((c = getopt_long(argc, argv, "hf:dv", long_option, NULL)) < 0)
+                       break;
+               switch (c) {
+               case 'h':
+               case HELPID_HELP:
+                       morehelp++;
+                       break;
+               case 'f':
+               case HELPID_FILE:
+                       strncpy(cfgfile, optarg, sizeof(cfgfile) - 1);
+                       cfgfile[sizeof(cfgfile) - 1] = 0;
+                       break;
+               case 'd':
+               case HELPID_DEBUG:
+                       debugflag = 1;
+                       break;
+               case 'v':
+               case HELPID_VERSION:
+                       printf("alsactl version " SND_UTIL_VERSION "\n");
+                       return 1;
+               default:
+                       fprintf(stderr, "\07Invalid switch or option needs an argument.\n");
+                       morehelp++;
+               }
+       }
+       if (morehelp) {
+               help();
+               return 1;
+       }
+       if (argc - optind <= 0) {
+               fprintf(stderr, "alsactl: Specify command...\n");
+               return 0;
+       }
+       if (!strcmp(argv[optind], "store")) {
+               return store_setup(argc - optind > 1 ? argv[optind + 1] : NULL) ?
+                   0 : 1;
+       } else if (!strcmp(argv[optind], "restore")) {
+               return restore_setup(argc - optind > 1 ? argv[optind + 1] : NULL) ?
+                   0 : 1;
+       } else {
+               fprintf(stderr, "alsactl: Unknown command '%s'...\n", argv[optind]);
+       }
+
+       return 0;
 }
index 9c1763aa488e99d2f32e418381e0aa0aa629d3af..6ed0b00fa239284484b47ea5995058aa8def795c 100644 (file)
 
 extern int debugflag;
 
-extern void error( const char *fmt, ... );
+extern void error(const char *fmt,...);
 
 struct ctl_switch {
-  int no;
-  int change;
-  snd_ctl_switch_t s;
-  struct ctl_switch *next;
+       int no;
+       int change;
+       snd_ctl_switch_t s;
+       struct ctl_switch *next;
 };
 
 struct ctl {
-  snd_ctl_hw_info_t hwinfo;
-  struct ctl_switch *switches;
+       snd_ctl_hw_info_t hwinfo;
+       struct ctl_switch *switches;
 };
 
 struct mixer_channel {
-  int no;
-  int change;
-  snd_mixer_channel_info_t i;
-  snd_mixer_channel_t c;
-  struct mixer_channel *next;
+       int no;
+       int change;
+       snd_mixer_channel_info_t i;
+       snd_mixer_channel_t c;
+       struct mixer_channel *next;
 };
 
 struct mixer_switch {
-  int no;
-  int change;
-  snd_mixer_switch_t s;
-  struct mixer_switch *next;
+       int no;
+       int change;
+       snd_mixer_switch_t s;
+       struct mixer_switch *next;
 };
 
 struct mixer {
-  int no;
-  snd_mixer_info_t info;
-  struct mixer_channel *channels;
-  struct mixer_switch *switches;
-  struct mixer *next;
+       int no;
+       snd_mixer_info_t info;
+       struct mixer_channel *channels;
+       struct mixer_switch *switches;
+       struct mixer *next;
 };
 
 struct pcm_switch {
-  int no;
-  int change;
-  snd_pcm_switch_t s;
-  struct pcm_switch *next;
+       int no;
+       int change;
+       snd_pcm_switch_t s;
+       struct pcm_switch *next;
 };
 
 struct pcm {
-  int no;
-  snd_pcm_info_t info;
-  struct pcm_switch *pswitches;
-  struct pcm_switch *rswitches;
-  struct pcm *next;
+       int no;
+       snd_pcm_info_t info;
+       struct pcm_switch *pswitches;
+       struct pcm_switch *rswitches;
+       struct pcm *next;
 };
 
 struct rawmidi_switch {
-  int no;
-  int change;
-  snd_rawmidi_switch_t s;
-  struct rawmidi_switch *next;
+       int no;
+       int change;
+       snd_rawmidi_switch_t s;
+       struct rawmidi_switch *next;
 };
 
 struct rawmidi {
-  int no;
-  snd_rawmidi_info_t info;
-  struct rawmidi_switch *iswitches;
-  struct rawmidi_switch *oswitches;
-  struct rawmidi *next;
+       int no;
+       snd_rawmidi_info_t info;
+       struct rawmidi_switch *iswitches;
+       struct rawmidi_switch *oswitches;
+       struct rawmidi *next;
 };
 
 struct soundcard {
-  int no;                      /* card number */
-  struct ctl control;
-  struct mixer *mixers;
-  struct pcm *pcms;
-  struct rawmidi *rawmidis;
-  struct soundcard *next;
+       int no;                 /* card number */
+       struct ctl control;
+       struct mixer *mixers;
+       struct pcm *pcms;
+       struct rawmidi *rawmidis;
+       struct soundcard *next;
 };
 
 extern struct soundcard *soundcards;
 
-void soundcard_setup_init( void );
-void soundcard_setup_done( void );
-int soundcard_setup_load( const char *filename, int skip );
-int soundcard_setup_write( const char *filename );
-int soundcard_setup_collect( int cardno );
-int soundcard_setup_process( int cardno );
+void soundcard_setup_init(void);
+void soundcard_setup_done(void);
+int soundcard_setup_load(const char *filename, int skip);
+int soundcard_setup_write(const char *filename);
+int soundcard_setup_collect(int cardno);
+int soundcard_setup_process(int cardno);
index 8bb3cbe99c15c84b3c6b6d85fe8dd257c3ad714d..f478e8ef3dddf6a3d5b95ad95da2b6af9500b154 100644 (file)
@@ -34,34 +34,34 @@ extern FILE *yyin;
 
        /* local functions */
 
-static void yyerror( char *, ... );
+static void yyerror(char *, ...);
 
-static void select_soundcard( char *name );
-static void select_mixer( char *name );
-static void select_pcm( char *name );
-static void select_rawmidi( char *name );
+static void select_soundcard(char *name);
+static void select_mixer(char *name);
+static void select_pcm(char *name);
+static void select_rawmidi(char *name);
 
-static void select_mixer_channel( char *name );
-static void set_mixer_channel( int left, int right );
-static void set_mixer_channel_flags( unsigned int mask, unsigned int flags );
-static void set_mixer_channel_end( void );
+static void select_mixer_channel(char *name);
+static void set_mixer_channel(int left, int right);
+static void set_mixer_channel_flags(unsigned int mask, unsigned int flags);
+static void set_mixer_channel_end(void);
 
 #define SWITCH_CONTROL         0
 #define SWITCH_MIXER           1
 #define SWITCH_PCM             2
 #define SWITCH_RAWMIDI         3
 
-static void select_control_switch( char *name );
-static void select_mixer_switch( char *name );
-static void select_pcm_playback_switch( char *name );
-static void select_pcm_record_switch( char *name );
-static void select_rawmidi_output_switch( char *name );
-static void select_rawmidi_input_switch( char *name );
+static void select_control_switch(char *name);
+static void select_mixer_switch(char *name);
+static void select_pcm_playback_switch(char *name);
+static void select_pcm_record_switch(char *name);
+static void select_rawmidi_output_switch(char *name);
+static void select_rawmidi_input_switch(char *name);
 
-static void set_switch_boolean( int val );
-static void set_switch_integer( int val );
-static void set_switch_iec958ocs_begin( int end );
-static void set_switch_iec958ocs( int idx, unsigned short val, unsigned short mask );
+static void set_switch_boolean(int val);
+static void set_switch_integer(int val);
+static void set_switch_iec958ocs_begin(int end);
+static void set_switch_iec958ocs(int idx, unsigned short val, unsigned short mask);
 
        /* local variables */
 
@@ -289,131 +289,146 @@ bytearray : L_BYTEARRAY         { $$ = $1; }
 
 %%
 
-static void yyerror( char *string, ... )
+static void yyerror(char *string,...)
 {
-  char errstr[ 1024 ];
+       char errstr[1024];
 
-  va_list vars;
-  va_start( vars, string );
-  vsprintf( errstr, string, vars );
-  va_end( vars );
-  error( "Error in configuration file '%s' (line %i): %s", cfgfile, linecount + 1, errstr );
+       va_list vars;
+       va_start(vars, string);
+       vsprintf(errstr, string, vars);
+       va_end(vars);
+       error("Error in configuration file '%s' (line %i): %s", cfgfile, linecount + 1, errstr);
 
-  exit( 1 );
+       exit(1);
 }
 
-static void select_soundcard( char *name )
+static void select_soundcard(char *name)
 {
-  struct soundcard *soundcard;
-
-  if ( !name ) { Xsoundcard = NULL; return; }
-  for ( soundcard = soundcards; soundcard; soundcard = soundcard -> next )
-    if ( !strcmp( soundcard -> control.hwinfo.id, name ) ) {
-      Xsoundcard = soundcard;
-      free( name );
-      return;
-    }
-  yyerror( "Cannot find soundcard '%s'...", name ); 
-  free( name );
+       struct soundcard *soundcard;
+
+       if (!name) {
+               Xsoundcard = NULL;
+               return;
+       }
+       for (soundcard = soundcards; soundcard; soundcard = soundcard->next)
+               if (!strcmp(soundcard->control.hwinfo.id, name)) {
+                       Xsoundcard = soundcard;
+                       free(name);
+                       return;
+               }
+       yyerror("Cannot find soundcard '%s'...", name);
+       free(name);
 }
 
-static void select_mixer( char *name )
+static void select_mixer(char *name)
 {
-  struct mixer *mixer;
-
-  if ( !name ) { Xmixer = NULL; return; }
-  for ( mixer = Xsoundcard -> mixers; mixer; mixer = mixer -> next )
-    if ( !strcmp( mixer -> info.name, name ) ) {
-      Xmixer = mixer;
-      free( name );
-      return;
-    }
-  yyerror( "Cannot find mixer '%s' for soundcard '%s'...", name, Xsoundcard -> control.hwinfo.id );
-  free( name );
+       struct mixer *mixer;
+
+       if (!name) {
+               Xmixer = NULL;
+               return;
+       }
+       for (mixer = Xsoundcard->mixers; mixer; mixer = mixer->next)
+               if (!strcmp(mixer->info.name, name)) {
+                       Xmixer = mixer;
+                       free(name);
+                       return;
+               }
+       yyerror("Cannot find mixer '%s' for soundcard '%s'...", name, Xsoundcard->control.hwinfo.id);
+       free(name);
 }
 
-static void select_pcm( char *name )
+static void select_pcm(char *name)
 {
-  struct pcm *pcm;
-
-  if ( !name ) { Xpcm = NULL; return; }
-  for ( pcm = Xsoundcard -> pcms; pcm; pcm = pcm -> next )
-    if ( !strcmp( pcm -> info.name, name ) ) {
-      Xpcm = pcm;
-      free( name );
-      return;
-    }
-  yyerror( "Cannot find pcm device '%s' for soundcard '%s'...", name, Xsoundcard -> control.hwinfo.id );
-  free( name );
+       struct pcm *pcm;
+
+       if (!name) {
+               Xpcm = NULL;
+               return;
+       }
+       for (pcm = Xsoundcard->pcms; pcm; pcm = pcm->next)
+               if (!strcmp(pcm->info.name, name)) {
+                       Xpcm = pcm;
+                       free(name);
+                       return;
+               }
+       yyerror("Cannot find pcm device '%s' for soundcard '%s'...", name, Xsoundcard->control.hwinfo.id);
+       free(name);
 }
 
-static void select_rawmidi( char *name )
+static void select_rawmidi(char *name)
 {
-  struct rawmidi *rawmidi;
-
-  if ( !name ) { Xrawmidi = NULL; return; }
-  for ( rawmidi = Xsoundcard -> rawmidis; rawmidi; rawmidi = rawmidi -> next )
-    if ( !strcmp( rawmidi -> info.name, name ) ) {
-      Xrawmidi = rawmidi;
-      free( name );
-      return;
-    }
-  yyerror( "Cannot find rawmidi device '%s' for soundcard '%s'...", name, Xsoundcard -> control.hwinfo.id );
-  free( name );
+       struct rawmidi *rawmidi;
+
+       if (!name) {
+               Xrawmidi = NULL;
+               return;
+       }
+       for (rawmidi = Xsoundcard->rawmidis; rawmidi; rawmidi = rawmidi->next)
+               if (!strcmp(rawmidi->info.name, name)) {
+                       Xrawmidi = rawmidi;
+                       free(name);
+                       return;
+               }
+       yyerror("Cannot find rawmidi device '%s' for soundcard '%s'...", name, Xsoundcard->control.hwinfo.id);
+       free(name);
 }
 
-static void select_mixer_channel( char *name )
+static void select_mixer_channel(char *name)
 {
-  struct mixer_channel *channel;
-
-  if ( !name ) { Xmixerchannel = NULL; return; }
-  for ( channel = Xmixer -> channels; channel; channel = channel -> next )
-    if ( !strcmp( channel -> i.name, name ) ) {
-      Xmixerchannel = channel;
-      Xmixerchannelflags = Xmixerchannel -> c.flags & 
-                               ~(SND_MIXER_FLG_RECORD |
-                                 SND_MIXER_FLG_MUTE |
-                                 SND_MIXER_FLG_SWITCH_OUT |
-                                 SND_MIXER_FLG_SWITCH_IN |
-                                 SND_MIXER_FLG_DECIBEL |
-                                 SND_MIXER_FLG_FORCE);
-      free( name );
-      return;
-    }
-  yyerror( "Cannot find mixer channel '%s'...", name );
-  free( name );
+       struct mixer_channel *channel;
+
+       if (!name) {
+               Xmixerchannel = NULL;
+               return;
+       }
+       for (channel = Xmixer->channels; channel; channel = channel->next)
+               if (!strcmp(channel->i.name, name)) {
+                       Xmixerchannel = channel;
+                       Xmixerchannelflags = Xmixerchannel->c.flags &
+                           ~(SND_MIXER_FLG_RECORD |
+                             SND_MIXER_FLG_MUTE |
+                             SND_MIXER_FLG_SWITCH_OUT |
+                             SND_MIXER_FLG_SWITCH_IN |
+                             SND_MIXER_FLG_DECIBEL |
+                             SND_MIXER_FLG_FORCE);
+                       free(name);
+                       return;
+               }
+       yyerror("Cannot find mixer channel '%s'...", name);
+       free(name);
 }
 
-static void set_mixer_channel( int left, int right )
+static void set_mixer_channel(int left, int right)
 {
-  if ( left >= 0 ) {
-    if ( Xmixerchannel -> i.min > left || Xmixerchannel -> i.max < left )
-      yyerror( "Value out of range (%i-%i)...", Xmixerchannel -> i.min, Xmixerchannel -> i.max );
-    if ( Xmixerchannel -> c.left != left )
-      Xmixerchannel -> change = 1;
-    Xmixerchannel -> c.left = left;
-  }
-  if ( right >= 0 ) {
-    if ( Xmixerchannel -> i.min > right || Xmixerchannel -> i.max < right )
-      yyerror( "Value out of range (%i-%i)...", Xmixerchannel -> i.min, Xmixerchannel -> i.max );
-    if ( Xmixerchannel -> c.right != right )
-      Xmixerchannel -> change = 1;
-    Xmixerchannel -> c.right = right;
-  }
+       if (left >= 0) {
+               if (Xmixerchannel->i.min > left || Xmixerchannel->i.max < left)
+                       yyerror("Value out of range (%i-%i)...", Xmixerchannel->i.min, Xmixerchannel->i.max);
+               if (Xmixerchannel->c.left != left)
+                       Xmixerchannel->change = 1;
+               Xmixerchannel->c.left = left;
+       }
+       if (right >= 0) {
+               if (Xmixerchannel->i.min > right || Xmixerchannel->i.max < right)
+                       yyerror("Value out of range (%i-%i)...", Xmixerchannel->i.min, Xmixerchannel->i.max);
+               if (Xmixerchannel->c.right != right)
+                       Xmixerchannel->change = 1;
+               Xmixerchannel->c.right = right;
+       }
 }
 
-static void set_mixer_channel_flags( unsigned int mask, unsigned int flags )
+static void set_mixer_channel_flags(unsigned int mask, unsigned int flags)
 {
-  Xmixerchannelflags &= ~mask;
-  Xmixerchannelflags |= flags;
+       Xmixerchannelflags &= ~mask;
+       Xmixerchannelflags |= flags;
 }
 
-static void set_mixer_channel_end( void )
+static void set_mixer_channel_end(void)
 {
-  if ( Xmixerchannel -> c.flags != Xmixerchannelflags ) {
-    Xmixerchannel -> change = 1;
-  }
-  Xmixerchannel -> c.flags = Xmixerchannelflags;
+       if (Xmixerchannel->c.flags != Xmixerchannelflags) {
+               Xmixerchannel->change = 1;
+       }
+       Xmixerchannel->c.flags = Xmixerchannelflags;
 }
 
 #define FIND_SWITCH( xtype, first, name, err ) \
@@ -430,114 +445,116 @@ static void set_mixer_channel_end( void )
   yyerror( "Cannot find " err " switch '%s'...", name ); \
   free( name );
 
-static void select_control_switch( char *name )
+static void select_control_switch(char *name)
 {
-  struct ctl_switch *sw;
-  FIND_SWITCH( SWITCH_CONTROL, Xsoundcard -> control.switches, name, "control" );
+       struct ctl_switch *sw;
+       FIND_SWITCH(SWITCH_CONTROL, Xsoundcard->control.switches, name, "control");
 }
 
-static void select_mixer_switch( char *name )
+static void select_mixer_switch(char *name)
 {
-  struct mixer_switch *sw;
-  FIND_SWITCH( SWITCH_MIXER, Xmixer -> switches, name, "mixer" );
+       struct mixer_switch *sw;
+       FIND_SWITCH(SWITCH_MIXER, Xmixer->switches, name, "mixer");
 }
 
-static void select_pcm_playback_switch( char *name )
+static void select_pcm_playback_switch(char *name)
 {
-  struct pcm_switch *sw;
-  FIND_SWITCH( SWITCH_PCM, Xpcm -> pswitches, name, "pcm playback" );
+       struct pcm_switch *sw;
+       FIND_SWITCH(SWITCH_PCM, Xpcm->pswitches, name, "pcm playback");
 }
 
-static void select_pcm_record_switch( char *name )
+static void select_pcm_record_switch(char *name)
 {
-  struct pcm_switch *sw;
-  FIND_SWITCH( SWITCH_PCM, Xpcm -> rswitches, name, "pcm record" );
+       struct pcm_switch *sw;
+       FIND_SWITCH(SWITCH_PCM, Xpcm->rswitches, name, "pcm record");
 }
 
-static void select_rawmidi_output_switch( char *name )
+static void select_rawmidi_output_switch(char *name)
 {
-  struct rawmidi_switch *sw;
-  FIND_SWITCH( SWITCH_RAWMIDI, Xrawmidi -> oswitches, name, "rawmidi output" );
+       struct rawmidi_switch *sw;
+       FIND_SWITCH(SWITCH_RAWMIDI, Xrawmidi->oswitches, name, "rawmidi output");
 }
 
-static void select_rawmidi_input_switch( char *name )
+static void select_rawmidi_input_switch(char *name)
 {
-  struct rawmidi_switch *sw;
-  FIND_SWITCH( SWITCH_RAWMIDI, Xrawmidi -> iswitches, name, "rawmidi input" );
+       struct rawmidi_switch *sw;
+       FIND_SWITCH(SWITCH_RAWMIDI, Xrawmidi->iswitches, name, "rawmidi input");
 }
 
-static void set_switch_boolean( int val )
+static void set_switch_boolean(int val)
 {
-  /* ok.. this is a little bit wrong, but at these times are all switches same */
-  snd_ctl_switch_t *sw = (snd_ctl_switch_t *)Xswitch;
-  unsigned int xx;
-
-  if ( sw -> type != SND_CTL_SW_TYPE_BOOLEAN )
-    yyerror( "Switch '%s' isn't boolean type...", sw -> name );
-  xx = val & 1;
-  if ( memcmp( &sw -> value, &xx, sizeof(xx) ) ) *Xswitchchange = 1;
-  memcpy( &sw -> value, &xx, sizeof(xx) );
+       /* ok.. this is a little bit wrong, but at these times are all switches same */
+       snd_ctl_switch_t *sw = (snd_ctl_switch_t *) Xswitch;
+       unsigned int xx;
+
+       if (sw->type != SND_CTL_SW_TYPE_BOOLEAN)
+               yyerror("Switch '%s' isn't boolean type...", sw->name);
+       xx = val & 1;
+       if (memcmp(&sw->value, &xx, sizeof(xx)))
+               *Xswitchchange = 1;
+       memcpy(&sw->value, &xx, sizeof(xx));
 }
 
-static void set_switch_integer( int val )
+static void set_switch_integer(int val)
 {
-  /* ok.. this is a little bit wrong, but at these times are all switches same */
-  snd_ctl_switch_t *sw = (snd_ctl_switch_t *)Xswitch;
-  unsigned int xx;
-
-  if ( sw -> type != SND_CTL_SW_TYPE_BYTE &&
-       sw -> type != SND_CTL_SW_TYPE_WORD &&
-       sw -> type != SND_CTL_SW_TYPE_DWORD )
-    yyerror( "Switch '%s' isn't integer type...", sw -> name );
-  if ( val < sw -> low || val > sw -> high )
-    yyerror( "Value for switch '%s' out of range (%i-%i)...\n", sw -> name, sw -> low, sw -> high );
-  xx = val;
-  if ( memcmp( &sw -> value, &xx, sizeof(xx) ) ) *Xswitchchange = 1;
-  memcpy( &sw -> value, &xx, sizeof(xx) );
+       /* ok.. this is a little bit wrong, but at these times are all switches same */
+       snd_ctl_switch_t *sw = (snd_ctl_switch_t *) Xswitch;
+       unsigned int xx;
+
+       if (sw->type != SND_CTL_SW_TYPE_BYTE &&
+           sw->type != SND_CTL_SW_TYPE_WORD &&
+           sw->type != SND_CTL_SW_TYPE_DWORD)
+               yyerror("Switch '%s' isn't integer type...", sw->name);
+       if (val < sw->low || val > sw->high)
+               yyerror("Value for switch '%s' out of range (%i-%i)...\n", sw->name, sw->low, sw->high);
+       xx = val;
+       if (memcmp(&sw->value, &xx, sizeof(xx)))
+               *Xswitchchange = 1;
+       memcpy(&sw->value, &xx, sizeof(xx));
 }
 
-static void set_switch_iec958ocs_begin( int end )
+static void set_switch_iec958ocs_begin(int end)
 {
-  /* ok.. this is a little bit wrong, but at these times are all switches same */
-  snd_ctl_switch_t *sw = (snd_ctl_switch_t *)Xswitch;
-
-  if ( end ) {
-    if ( Xswitchiec958ocs != sw -> value.enable ) {
-      sw -> value.enable = Xswitchiec958ocs;
-      *Xswitchchange = 1;
-    }
-    if ( Xswitchiec958ocs1[4] != sw -> value.data16[4] ) {
-      sw -> value.data16[4] = Xswitchiec958ocs1[4];
-      *Xswitchchange = 1;
-    }
-    if ( Xswitchiec958ocs1[5] != sw -> value.data16[5] ) {
-      sw -> value.data16[5] = Xswitchiec958ocs1[5];
-      *Xswitchchange = 1;
-    }
+       /* ok.. this is a little bit wrong, but at these times are all switches same */
+       snd_ctl_switch_t *sw = (snd_ctl_switch_t *) Xswitch;
+
+       if (end) {
+               if (Xswitchiec958ocs != sw->value.enable) {
+                       sw->value.enable = Xswitchiec958ocs;
+                       *Xswitchchange = 1;
+               }
+               if (Xswitchiec958ocs1[4] != sw->value.data16[4]) {
+                       sw->value.data16[4] = Xswitchiec958ocs1[4];
+                       *Xswitchchange = 1;
+               }
+               if (Xswitchiec958ocs1[5] != sw->value.data16[5]) {
+                       sw->value.data16[5] = Xswitchiec958ocs1[5];
+                       *Xswitchchange = 1;
+               }
 #if 0
-    printf( "IEC958: enable = %i, ocs1[4] = 0x%x, ocs1[5] = 0x%x\n",
-                       sw -> value.enable,
-                       sw -> value.data16[4],
-                       sw -> value.data16[5] );
+               printf("IEC958: enable = %i, ocs1[4] = 0x%x, ocs1[5] = 0x%x\n",
+                      sw->value.enable,
+                      sw->value.data16[4],
+                      sw->value.data16[5]);
 #endif
-    return;
-  }
-  if ( Xswitchtype != SWITCH_MIXER || sw -> type != SND_MIXER_SW_TYPE_BOOLEAN ||
-       strcmp( sw -> name, SND_MIXER_SW_IEC958OUT ) )
-    yyerror( "Switch '%s' cannot store IEC958 information for Cirrus Logic chips...", sw -> name );
-  if ( sw -> value.data32[1] != (('C'<<8)|'S') )
-    yyerror( "Switch '%s' doesn't have Cirrus Logic signature!!!", sw -> name );
-  Xswitchiec958ocs = 0;
-  Xswitchiec958ocs1[4] = 0x0000;
-  Xswitchiec958ocs1[5] = 0x0004;       /* copy permitted */
+               return;
+       }
+       if (Xswitchtype != SWITCH_MIXER || sw->type != SND_MIXER_SW_TYPE_BOOLEAN ||
+           strcmp(sw->name, SND_MIXER_SW_IEC958OUT))
+               yyerror("Switch '%s' cannot store IEC958 information for Cirrus Logic chips...", sw->name);
+       if (sw->value.data32[1] != (('C' << 8) | 'S'))
+               yyerror("Switch '%s' doesn't have Cirrus Logic signature!!!", sw->name);
+       Xswitchiec958ocs = 0;
+       Xswitchiec958ocs1[4] = 0x0000;
+       Xswitchiec958ocs1[5] = 0x0004;  /* copy permitted */
 }
 
-static void set_switch_iec958ocs( int idx, unsigned short val, unsigned short mask )
+static void set_switch_iec958ocs(int idx, unsigned short val, unsigned short mask)
 {
-  if ( idx == 0 ) {
-    Xswitchiec958ocs = val ? 1 : 0;
-    return;
-  }
-  Xswitchiec958ocs1[ idx ] &= mask;
-  Xswitchiec958ocs1[ idx ] |= val;
+       if (idx == 0) {
+               Xswitchiec958ocs = val ? 1 : 0;
+               return;
+       }
+       Xswitchiec958ocs1[idx] &= mask;
+       Xswitchiec958ocs1[idx] |= val;
 }
index 3af19a5d267a5a45b7de477c4db2d5024d9ab942..9a901c0cc2247982507634d378d743951279b5a5 100644 (file)
@@ -26,7 +26,7 @@
 #define SND_INTERFACE_PCM      2
 #define SND_INTERFACE_RAWMIDI  3
 
-extern int yyparse( void );
+extern int yyparse(void);
 extern int linecount;
 extern FILE *yyin;
 extern int yydebug;
@@ -36,792 +36,836 @@ struct soundcard *soundcards = NULL;
  *  free functions
  */
 
-static void soundcard_ctl_switch_free( struct ctl_switch *first )
+static void soundcard_ctl_switch_free(struct ctl_switch *first)
 {
-  struct ctl_switch *next;
+       struct ctl_switch *next;
 
-  while ( first ) {
-    next = first -> next;
-    free( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               free(first);
+               first = next;
+       }
 }
 
-static void soundcard_mixer_channel_free( struct mixer_channel *first )
+static void soundcard_mixer_channel_free(struct mixer_channel *first)
 {
-  struct mixer_channel *next;
+       struct mixer_channel *next;
 
-  while ( first ) {
-    next = first -> next;
-    free( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               free(first);
+               first = next;
+       }
 }
 
-static void soundcard_mixer_switch_free( struct mixer_switch *first )
+static void soundcard_mixer_switch_free(struct mixer_switch *first)
 {
-  struct mixer_switch *next;
+       struct mixer_switch *next;
 
-  while ( first ) {
-    next = first -> next;
-    free( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               free(first);
+               first = next;
+       }
 }
 
-static void soundcard_mixer_free1( struct mixer *mixer )
+static void soundcard_mixer_free1(struct mixer *mixer)
 {
-  if ( !mixer ) return;
-  soundcard_mixer_channel_free( mixer -> channels );
-  soundcard_mixer_switch_free( mixer -> switches );
-  free( mixer );
+       if (!mixer)
+               return;
+       soundcard_mixer_channel_free(mixer->channels);
+       soundcard_mixer_switch_free(mixer->switches);
+       free(mixer);
 }
-static void soundcard_mixer_free( struct mixer *first )
+
+static void soundcard_mixer_free(struct mixer *first)
 {
-  struct mixer *next;
+       struct mixer *next;
 
-  while ( first ) {
-    next = first -> next;
-    soundcard_mixer_free1( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               soundcard_mixer_free1(first);
+               first = next;
+       }
 }
 
-static void soundcard_pcm_switch_free( struct pcm_switch *first )
+static void soundcard_pcm_switch_free(struct pcm_switch *first)
 {
-  struct pcm_switch *next;
+       struct pcm_switch *next;
 
-  while ( first ) {
-    next = first -> next;
-    free( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               free(first);
+               first = next;
+       }
 }
 
-static void soundcard_pcm_free1( struct pcm *pcm )
+static void soundcard_pcm_free1(struct pcm *pcm)
 {
-  if ( !pcm ) return;
-  soundcard_pcm_switch_free( pcm -> pswitches );
-  soundcard_pcm_switch_free( pcm -> rswitches );
-  free( pcm );
+       if (!pcm)
+               return;
+       soundcard_pcm_switch_free(pcm->pswitches);
+       soundcard_pcm_switch_free(pcm->rswitches);
+       free(pcm);
 }
-static void soundcard_pcm_free( struct pcm *first )
+
+static void soundcard_pcm_free(struct pcm *first)
 {
-  struct pcm *next;
+       struct pcm *next;
 
-  while ( first ) {
-    next = first -> next;
-    soundcard_pcm_free1( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               soundcard_pcm_free1(first);
+               first = next;
+       }
 }
 
-static void soundcard_rawmidi_switch_free( struct rawmidi_switch *first )
+static void soundcard_rawmidi_switch_free(struct rawmidi_switch *first)
 {
-  struct rawmidi_switch *next;
+       struct rawmidi_switch *next;
 
-  while ( first ) {
-    next = first -> next;
-    free( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               free(first);
+               first = next;
+       }
 }
 
-static void soundcard_rawmidi_free1( struct rawmidi *rawmidi )
+static void soundcard_rawmidi_free1(struct rawmidi *rawmidi)
 {
-  if ( !rawmidi ) return;
-  soundcard_rawmidi_switch_free( rawmidi -> iswitches );
-  soundcard_rawmidi_switch_free( rawmidi -> oswitches );
-  free( rawmidi );
+       if (!rawmidi)
+               return;
+       soundcard_rawmidi_switch_free(rawmidi->iswitches);
+       soundcard_rawmidi_switch_free(rawmidi->oswitches);
+       free(rawmidi);
 }
-static void soundcard_rawmidi_free( struct rawmidi *first )
+
+static void soundcard_rawmidi_free(struct rawmidi *first)
 {
-  struct rawmidi *next;
+       struct rawmidi *next;
 
-  while ( first ) {
-    next = first -> next;
-    soundcard_rawmidi_free1( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               soundcard_rawmidi_free1(first);
+               first = next;
+       }
 }
 
-static void soundcard_free1( struct soundcard *soundcard )
+static void soundcard_free1(struct soundcard *soundcard)
 {
-  if ( !soundcard ) return;
-  soundcard_ctl_switch_free( soundcard -> control.switches );
-  soundcard_mixer_free( soundcard -> mixers );
-  soundcard_pcm_free( soundcard -> pcms );
-  soundcard_rawmidi_free( soundcard -> rawmidis );
-  free( soundcard );
+       if (!soundcard)
+               return;
+       soundcard_ctl_switch_free(soundcard->control.switches);
+       soundcard_mixer_free(soundcard->mixers);
+       soundcard_pcm_free(soundcard->pcms);
+       soundcard_rawmidi_free(soundcard->rawmidis);
+       free(soundcard);
 }
 
-static void soundcard_free( struct soundcard *first )
+static void soundcard_free(struct soundcard *first)
 {
-  struct soundcard *next;
+       struct soundcard *next;
 
-  while ( first ) {
-    next = first -> next;
-    soundcard_free1( first );
-    first = next;
-  }
+       while (first) {
+               next = first->next;
+               soundcard_free1(first);
+               first = next;
+       }
 }
 
-static int soundcard_remove( int cardno )
+static int soundcard_remove(int cardno)
 {
-  struct soundcard *first, *prev = NULL, *next;
-  
-  first = soundcards;
-  while ( first ) {
-    next = first -> next;
-    if ( first -> no == cardno ) {
-      soundcard_free1( first );
-      if ( !prev ) soundcards = next; else prev -> next = next;
-      return 0;
-    }
-    prev = first;
-    first = first -> next;
-  }
-  return -1;
+       struct soundcard *first, *prev = NULL, *next;
+
+       first = soundcards;
+       while (first) {
+               next = first->next;
+               if (first->no == cardno) {
+                       soundcard_free1(first);
+                       if (!prev)
+                               soundcards = next;
+                       else
+                               prev->next = next;
+                       return 0;
+               }
+               prev = first;
+               first = first->next;
+       }
+       return -1;
 }
 
 /*
  *  exported functions
  */
 
-void soundcard_setup_init( void )
+void soundcard_setup_init(void)
 {
-  soundcards = NULL;
+       soundcards = NULL;
 }
 
-void soundcard_setup_done( void )
+void soundcard_setup_done(void)
 {
-  soundcard_free( soundcards ); soundcards = NULL;
+       soundcard_free(soundcards);
+       soundcards = NULL;
 }
 
-int soundcard_setup_collect( int cardno )
+int soundcard_setup_collect(int cardno)
 {
-  void *handle, *mhandle;
-  struct soundcard *card, *first, *prev;
-  int err, idx, count, device;
-  struct ctl_switch *ctl, *ctlprev;
-  struct mixer *mixer, *mixerprev;
-  struct mixer_switch *mixsw, *mixswprev;
-  struct mixer_channel *mixerchannel, *mixerchannelprev;
-  struct pcm *pcm, *pcmprev;
-  struct pcm_switch *pcmsw, *pcmswprev;
-  struct rawmidi *rawmidi, *rawmidiprev;
-  struct rawmidi_switch *rawmidisw, *rawmidiswprev;
-
-  soundcard_remove( cardno );
-  if ( (err = snd_ctl_open( &handle, cardno )) < 0 ) {
-    error( "SND CTL open error: %s", snd_strerror( err ) );
-    return 1;
-  }
-  /* --- */
-  card = (struct soundcard *)malloc( sizeof( struct soundcard ) );
-  if ( !card ) {
-    snd_ctl_close( handle );
-    error( "malloc error" );
-    return 1;
-  }
-  bzero( card, sizeof( struct soundcard ) );
-  card -> no = cardno;
-  for ( first = soundcards, prev = NULL; first; first = first -> next ) {
-    if ( first -> no > cardno ) {
-      if ( !prev ) {
-        soundcards = card;
-      } else {
-        prev -> next = card;
-      }
-      card -> next = first;
-      break;
-    }
-    prev = first;
-  }
-  if ( !first ) {
-    if ( !soundcards ) {
-      soundcards = card;
-    } else {
-      prev -> next = card;
-    }
-  }
-  if ( (err = snd_ctl_hw_info( handle, &card -> control.hwinfo )) < 0 ) {
-    snd_ctl_close( handle );
-    error( "SND CTL HW INFO error: %s", snd_strerror( err ) );
-    return 1;
-  }
-  /* --- */
-  count = snd_ctl_switches( handle );
-  for ( idx = 0, ctlprev = NULL; idx < count; idx++ ) {
-    ctl = (struct ctl_switch *)malloc( sizeof( struct ctl_switch ) );
-    if ( !ctl ) {
-      snd_ctl_close( handle );
-      error( "malloc error" );
-      return 1;
-    }
-    bzero( ctl, sizeof( struct ctl_switch ) );
-    ctl -> no = idx;
-    if ( (err = snd_ctl_switch_read( handle, idx, &ctl -> s )) < 0 ) {
-      free( ctl );
-      error( "CTL switch read error (%s) - skipping", snd_strerror( err ) );
-      break;
-    }
-    if ( !ctlprev ) {
-      card -> control.switches = ctl;
-    } else {
-      ctlprev -> next = ctl;
-    }
-    ctlprev = ctl;
-  }
-  /* --- */
-  for ( device = 0, mixerprev = NULL; device < card -> control.hwinfo.mixerdevs; device++ ) {
-    mixer = (struct mixer *)malloc( sizeof( struct mixer ) );
-    if ( !mixer ) {
-      snd_ctl_close( handle );
-      error( "malloc problem" );
-      return 1;
-    }
-    bzero( mixer, sizeof( struct mixer ) );
-    mixer -> no = device;
-    count = snd_ctl_mixer_switches( handle, device );
-    for ( idx = 0, mixswprev = NULL; idx < count; idx++ ) {
-      mixsw = (struct mixer_switch *)malloc( sizeof( struct mixer_switch ) );
-      if ( !mixsw ) {
-        snd_ctl_close( handle );
-        error( "malloc error" );
-        return 1;
-      }
-      bzero( mixsw, sizeof( struct mixer_switch ) );
-      mixsw -> no = idx;
-      if ( (err = snd_ctl_mixer_switch_read( handle, device, idx, &mixsw -> s )) < 0 ) {
-        free( mixsw );
-        error( "MIXER switch read error (%s) - skipping", snd_strerror( err ) );
-        break;
-      }
-      if ( !mixswprev ) {
-        mixer -> switches = mixsw;
-      } else {
-        mixswprev -> next = mixsw;
-      }
-      mixswprev = mixsw;
-    }
-    if ( !mixerprev ) {
-      card -> mixers = mixer;
-    } else {
-      mixerprev -> next = mixer;
-    }
-    mixerprev = mixer;
-    if ( (err = snd_mixer_open( &mhandle, cardno, device )) < 0 ) {
-      snd_ctl_close( handle );
-      error( "MIXER open error: %s\n", snd_strerror( err ) );
-      return 1;
-    }
-    if ( (err = snd_mixer_exact_mode( mhandle, 1 )) < 0 ) {
-      snd_mixer_close( mhandle );
-      snd_ctl_close( handle );
-      error( "MIXER exact mode error: %s\n", snd_strerror( err ) );
-      return 1;
-    }
-    if ( (err = snd_mixer_info( mhandle, &mixer -> info )) < 0 ) {
-      snd_mixer_close( mhandle );
-      snd_ctl_close( handle );
-      error( "MIXER info error: %s\n", snd_strerror( err ) );
-      return 1;
-    }
-    count = snd_mixer_channels( mhandle );
-    for ( idx = 0, mixerchannelprev = NULL; idx < count; idx++ ) {
-      mixerchannel = (struct mixer_channel *)malloc( sizeof( struct mixer_channel ) );
-      if ( !mixerchannel ) {
-        snd_mixer_close( mhandle );
-        snd_ctl_close( handle );
-        error( "malloc problem" );
-        return 1;
-      }
-      bzero( mixerchannel, sizeof( struct mixer_channel ) );
-      mixerchannel -> no = idx;
-      if ( (err = snd_mixer_channel_info( mhandle, idx, &mixerchannel -> i )) < 0 ) {
-        free( mixerchannel );
-        error( "MIXER channel info error (%s) - skipping", snd_strerror( err ) );
-        break;
-      }
-      if ( (err = snd_mixer_channel_read( mhandle, idx, &mixerchannel -> c )) < 0 ) {
-        free( mixerchannel );
-        error( "MIXER channel read error (%s) - skipping", snd_strerror( err ) );
-        break;
-      }
-      if ( !mixerchannelprev ) {
-        mixer -> channels = mixerchannel;
-      } else {
-        mixerchannelprev -> next = mixerchannel;
-      }
-      mixerchannelprev = mixerchannel;
-    }
-    snd_mixer_close( mhandle );
-  }
-  /* --- */
-  for ( device = 0, pcmprev = NULL; device < card -> control.hwinfo.pcmdevs; device++ ) {
-    pcm = (struct pcm *)malloc( sizeof( struct pcm ) );
-    if ( !pcm ) {
-      snd_ctl_close( handle );
-      error( "malloc problem" );
-      return 1;
-    }
-    bzero( pcm, sizeof( struct pcm ) );
-    pcm -> no = device;
-    if ( (err = snd_ctl_pcm_info( handle, device, &pcm -> info )) < 0 ) {
-      snd_ctl_close( handle );
-      error( "PCM info error: %s\n", snd_strerror( err ) );
-      return 1;
-    }
-    count = snd_ctl_pcm_playback_switches( handle, device );
-    for ( idx = 0, pcmswprev = NULL; idx < count; idx++ ) {
-      pcmsw = (struct pcm_switch *)malloc( sizeof( struct pcm_switch ) );
-      if ( !pcmsw ) {
-        snd_ctl_close( handle );
-        error( "malloc error" );
-        return 1;
-      }
-      bzero( pcmsw, sizeof( struct mixer_switch ) );
-      pcmsw -> no = idx;
-      if ( (err = snd_ctl_pcm_playback_switch_read( handle, device, idx, &pcmsw -> s )) < 0 ) {
-        free( pcmsw );
-        error( "PCM playback switch read error (%s) - skipping", snd_strerror( err ) );
-        break;
-      }
-      if ( !pcmswprev ) {
-        pcm -> pswitches = pcmsw;
-      } else {
-        pcmswprev -> next = pcmsw;
-      }
-      pcmswprev = pcmsw;
-    }
-    count = snd_ctl_pcm_record_switches( handle, device );
-    for ( idx = 0, pcmswprev = NULL; idx < count; idx++ ) {
-      pcmsw = (struct pcm_switch *)malloc( sizeof( struct pcm_switch ) );
-      if ( !pcmsw ) {
-        snd_ctl_close( handle );
-        error( "malloc error" );
-        return 1;
-      }
-      bzero( pcmsw, sizeof( struct mixer_switch ) );
-      pcmsw -> no = idx;
-      if ( (err = snd_ctl_pcm_record_switch_read( handle, device, idx, &pcmsw -> s )) < 0 ) {
-        free( pcmsw );
-        error( "PCM record switch read error (%s) - skipping", snd_strerror( err ) );
-        break;
-      }
-      if ( !pcmswprev ) {
-        pcm -> rswitches = pcmsw;
-      } else {
-        pcmswprev -> next = pcmsw;
-      }
-      pcmswprev = pcmsw;
-    }
-    if ( !pcmprev ) {
-      card -> pcms = pcm;
-    } else {
-      pcmprev -> next = pcm;
-    }
-    pcmprev = pcm;
-  }
-  /* --- */
-  for ( device = 0, rawmidiprev = NULL; device < card -> control.hwinfo.mididevs; device++ ) {
-    rawmidi = (struct rawmidi *)malloc( sizeof( struct rawmidi ) );
-    if ( !rawmidi ) {
-      snd_ctl_close( handle );
-      error( "malloc problem" );
-      return 1;
-    }
-    bzero( rawmidi, sizeof( struct rawmidi ) );
-    rawmidi -> no = device;
-    if ( (err = snd_ctl_rawmidi_info( handle, device, &rawmidi -> info )) < 0 ) {
-      snd_ctl_close( handle );
-      error( "RAWMIDI info error: %s\n", snd_strerror( err ) );
-      return 1;
-    }
-    count = snd_ctl_rawmidi_input_switches( handle, device );
-    for ( idx = 0, rawmidiswprev = NULL; idx < count; idx++ ) {
-      rawmidisw = (struct rawmidi_switch *)malloc( sizeof( struct rawmidi_switch ) );
-      if ( !rawmidisw ) {
-        snd_ctl_close( handle );
-        error( "malloc error" );
-        return 1;
-      }
-      bzero( rawmidisw, sizeof( struct rawmidi_switch ) );
-      rawmidisw -> no = idx;
-      if ( (err = snd_ctl_rawmidi_input_switch_read( handle, device, idx, &rawmidisw -> s )) < 0 ) {
-        free( rawmidisw );
-        error( "RAWMIDI input switch read error (%s) - skipping", snd_strerror( err ) );
-        break;
-      }
-      if ( !rawmidiswprev ) {
-        rawmidi -> iswitches = rawmidisw;
-      } else {
-        rawmidiswprev -> next = rawmidisw;
-      }
-      rawmidiswprev = rawmidisw;
-    }
-    count = snd_ctl_rawmidi_output_switches( handle, device );
-    for ( idx = 0, rawmidiswprev = NULL; idx < count; idx++ ) {
-      rawmidisw = (struct rawmidi_switch *)malloc( sizeof( struct rawmidi_switch ) );
-      if ( !rawmidisw ) {
-        snd_ctl_close( handle );
-        error( "malloc error" );
-        return 1;
-      }
-      bzero( rawmidisw, sizeof( struct rawmidi_switch ) );
-      rawmidisw -> no = idx;
-      if ( (err = snd_ctl_rawmidi_output_switch_read( handle, device, idx, &rawmidisw -> s )) < 0 ) {
-        free( rawmidisw );
-        error( "RAWMIDI output switch read error (%s) - skipping", snd_strerror( err ) );
-        break;
-      }
-      if ( !rawmidiswprev ) {
-        rawmidi -> oswitches = rawmidisw;
-      } else {
-        rawmidiswprev -> next = rawmidisw;
-      }
-      rawmidiswprev = rawmidisw;
-    }
-    if ( !rawmidiprev ) {
-      card -> rawmidis = rawmidi;
-    } else {
-      rawmidiprev -> next = rawmidi;
-    }
-    rawmidiprev = rawmidi;
-  }
-  /* --- */
-  snd_ctl_close( handle );
-  return 0;
+       void *handle, *mhandle;
+       struct soundcard *card, *first, *prev;
+       int err, idx, count, device;
+       struct ctl_switch *ctl, *ctlprev;
+       struct mixer *mixer, *mixerprev;
+       struct mixer_switch *mixsw, *mixswprev;
+       struct mixer_channel *mixerchannel, *mixerchannelprev;
+       struct pcm *pcm, *pcmprev;
+       struct pcm_switch *pcmsw, *pcmswprev;
+       struct rawmidi *rawmidi, *rawmidiprev;
+       struct rawmidi_switch *rawmidisw, *rawmidiswprev;
+
+       soundcard_remove(cardno);
+       if ((err = snd_ctl_open(&handle, cardno)) < 0) {
+               error("SND CTL open error: %s", snd_strerror(err));
+               return 1;
+       }
+       /* --- */
+       card = (struct soundcard *) malloc(sizeof(struct soundcard));
+       if (!card) {
+               snd_ctl_close(handle);
+               error("malloc error");
+               return 1;
+       }
+       bzero(card, sizeof(struct soundcard));
+       card->no = cardno;
+       for (first = soundcards, prev = NULL; first; first = first->next) {
+               if (first->no > cardno) {
+                       if (!prev) {
+                               soundcards = card;
+                       } else {
+                               prev->next = card;
+                       }
+                       card->next = first;
+                       break;
+               }
+               prev = first;
+       }
+       if (!first) {
+               if (!soundcards) {
+                       soundcards = card;
+               } else {
+                       prev->next = card;
+               }
+       }
+       if ((err = snd_ctl_hw_info(handle, &card->control.hwinfo)) < 0) {
+               snd_ctl_close(handle);
+               error("SND CTL HW INFO error: %s", snd_strerror(err));
+               return 1;
+       }
+       /* --- */
+       count = snd_ctl_switches(handle);
+       for (idx = 0, ctlprev = NULL; idx < count; idx++) {
+               ctl = (struct ctl_switch *) malloc(sizeof(struct ctl_switch));
+               if (!ctl) {
+                       snd_ctl_close(handle);
+                       error("malloc error");
+                       return 1;
+               }
+               bzero(ctl, sizeof(struct ctl_switch));
+               ctl->no = idx;
+               if ((err = snd_ctl_switch_read(handle, idx, &ctl->s)) < 0) {
+                       free(ctl);
+                       error("CTL switch read error (%s) - skipping", snd_strerror(err));
+                       break;
+               }
+               if (!ctlprev) {
+                       card->control.switches = ctl;
+               } else {
+                       ctlprev->next = ctl;
+               }
+               ctlprev = ctl;
+       }
+       /* --- */
+       for (device = 0, mixerprev = NULL; device < card->control.hwinfo.mixerdevs; device++) {
+               mixer = (struct mixer *) malloc(sizeof(struct mixer));
+               if (!mixer) {
+                       snd_ctl_close(handle);
+                       error("malloc problem");
+                       return 1;
+               }
+               bzero(mixer, sizeof(struct mixer));
+               mixer->no = device;
+               count = snd_ctl_mixer_switches(handle, device);
+               for (idx = 0, mixswprev = NULL; idx < count; idx++) {
+                       mixsw = (struct mixer_switch *) malloc(sizeof(struct mixer_switch));
+                       if (!mixsw) {
+                               snd_ctl_close(handle);
+                               error("malloc error");
+                               return 1;
+                       }
+                       bzero(mixsw, sizeof(struct mixer_switch));
+                       mixsw->no = idx;
+                       if ((err = snd_ctl_mixer_switch_read(handle, device, idx, &mixsw->s)) < 0) {
+                               free(mixsw);
+                               error("MIXER switch read error (%s) - skipping", snd_strerror(err));
+                               break;
+                       }
+                       if (!mixswprev) {
+                               mixer->switches = mixsw;
+                       } else {
+                               mixswprev->next = mixsw;
+                       }
+                       mixswprev = mixsw;
+               }
+               if (!mixerprev) {
+                       card->mixers = mixer;
+               } else {
+                       mixerprev->next = mixer;
+               }
+               mixerprev = mixer;
+               if ((err = snd_mixer_open(&mhandle, cardno, device)) < 0) {
+                       snd_ctl_close(handle);
+                       error("MIXER open error: %s\n", snd_strerror(err));
+                       return 1;
+               }
+               if ((err = snd_mixer_exact_mode(mhandle, 1)) < 0) {
+                       snd_mixer_close(mhandle);
+                       snd_ctl_close(handle);
+                       error("MIXER exact mode error: %s\n", snd_strerror(err));
+                       return 1;
+               }
+               if ((err = snd_mixer_info(mhandle, &mixer->info)) < 0) {
+                       snd_mixer_close(mhandle);
+                       snd_ctl_close(handle);
+                       error("MIXER info error: %s\n", snd_strerror(err));
+                       return 1;
+               }
+               count = snd_mixer_channels(mhandle);
+               for (idx = 0, mixerchannelprev = NULL; idx < count; idx++) {
+                       mixerchannel = (struct mixer_channel *) malloc(sizeof(struct mixer_channel));
+                       if (!mixerchannel) {
+                               snd_mixer_close(mhandle);
+                               snd_ctl_close(handle);
+                               error("malloc problem");
+                               return 1;
+                       }
+                       bzero(mixerchannel, sizeof(struct mixer_channel));
+                       mixerchannel->no = idx;
+                       if ((err = snd_mixer_channel_info(mhandle, idx, &mixerchannel->i)) < 0) {
+                               free(mixerchannel);
+                               error("MIXER channel info error (%s) - skipping", snd_strerror(err));
+                               break;
+                       }
+                       if ((err = snd_mixer_channel_read(mhandle, idx, &mixerchannel->c)) < 0) {
+                               free(mixerchannel);
+                               error("MIXER channel read error (%s) - skipping", snd_strerror(err));
+                               break;
+                       }
+                       if (!mixerchannelprev) {
+                               mixer->channels = mixerchannel;
+                       } else {
+                               mixerchannelprev->next = mixerchannel;
+                       }
+                       mixerchannelprev = mixerchannel;
+               }
+               snd_mixer_close(mhandle);
+       }
+       /* --- */
+       for (device = 0, pcmprev = NULL; device < card->control.hwinfo.pcmdevs; device++) {
+               pcm = (struct pcm *) malloc(sizeof(struct pcm));
+               if (!pcm) {
+                       snd_ctl_close(handle);
+                       error("malloc problem");
+                       return 1;
+               }
+               bzero(pcm, sizeof(struct pcm));
+               pcm->no = device;
+               if ((err = snd_ctl_pcm_info(handle, device, &pcm->info)) < 0) {
+                       snd_ctl_close(handle);
+                       error("PCM info error: %s\n", snd_strerror(err));
+                       return 1;
+               }
+               count = snd_ctl_pcm_playback_switches(handle, device);
+               for (idx = 0, pcmswprev = NULL; idx < count; idx++) {
+                       pcmsw = (struct pcm_switch *) malloc(sizeof(struct pcm_switch));
+                       if (!pcmsw) {
+                               snd_ctl_close(handle);
+                               error("malloc error");
+                               return 1;
+                       }
+                       bzero(pcmsw, sizeof(struct mixer_switch));
+                       pcmsw->no = idx;
+                       if ((err = snd_ctl_pcm_playback_switch_read(handle, device, idx, &pcmsw->s)) < 0) {
+                               free(pcmsw);
+                               error("PCM playback switch read error (%s) - skipping", snd_strerror(err));
+                               break;
+                       }
+                       if (!pcmswprev) {
+                               pcm->pswitches = pcmsw;
+                       } else {
+                               pcmswprev->next = pcmsw;
+                       }
+                       pcmswprev = pcmsw;
+               }
+               count = snd_ctl_pcm_record_switches(handle, device);
+               for (idx = 0, pcmswprev = NULL; idx < count; idx++) {
+                       pcmsw = (struct pcm_switch *) malloc(sizeof(struct pcm_switch));
+                       if (!pcmsw) {
+                               snd_ctl_close(handle);
+                               error("malloc error");
+                               return 1;
+                       }
+                       bzero(pcmsw, sizeof(struct mixer_switch));
+                       pcmsw->no = idx;
+                       if ((err = snd_ctl_pcm_record_switch_read(handle, device, idx, &pcmsw->s)) < 0) {
+                               free(pcmsw);
+                               error("PCM record switch read error (%s) - skipping", snd_strerror(err));
+                               break;
+                       }
+                       if (!pcmswprev) {
+                               pcm->rswitches = pcmsw;
+                       } else {
+                               pcmswprev->next = pcmsw;
+                       }
+                       pcmswprev = pcmsw;
+               }
+               if (!pcmprev) {
+                       card->pcms = pcm;
+               } else {
+                       pcmprev->next = pcm;
+               }
+               pcmprev = pcm;
+       }
+       /* --- */
+       for (device = 0, rawmidiprev = NULL; device < card->control.hwinfo.mididevs; device++) {
+               rawmidi = (struct rawmidi *) malloc(sizeof(struct rawmidi));
+               if (!rawmidi) {
+                       snd_ctl_close(handle);
+                       error("malloc problem");
+                       return 1;
+               }
+               bzero(rawmidi, sizeof(struct rawmidi));
+               rawmidi->no = device;
+               if ((err = snd_ctl_rawmidi_info(handle, device, &rawmidi->info)) < 0) {
+                       snd_ctl_close(handle);
+                       error("RAWMIDI info error: %s\n", snd_strerror(err));
+                       return 1;
+               }
+               count = snd_ctl_rawmidi_input_switches(handle, device);
+               for (idx = 0, rawmidiswprev = NULL; idx < count; idx++) {
+                       rawmidisw = (struct rawmidi_switch *) malloc(sizeof(struct rawmidi_switch));
+                       if (!rawmidisw) {
+                               snd_ctl_close(handle);
+                               error("malloc error");
+                               return 1;
+                       }
+                       bzero(rawmidisw, sizeof(struct rawmidi_switch));
+                       rawmidisw->no = idx;
+                       if ((err = snd_ctl_rawmidi_input_switch_read(handle, device, idx, &rawmidisw->s)) < 0) {
+                               free(rawmidisw);
+                               error("RAWMIDI input switch read error (%s) - skipping", snd_strerror(err));
+                               break;
+                       }
+                       if (!rawmidiswprev) {
+                               rawmidi->iswitches = rawmidisw;
+                       } else {
+                               rawmidiswprev->next = rawmidisw;
+                       }
+                       rawmidiswprev = rawmidisw;
+               }
+               count = snd_ctl_rawmidi_output_switches(handle, device);
+               for (idx = 0, rawmidiswprev = NULL; idx < count; idx++) {
+                       rawmidisw = (struct rawmidi_switch *) malloc(sizeof(struct rawmidi_switch));
+                       if (!rawmidisw) {
+                               snd_ctl_close(handle);
+                               error("malloc error");
+                               return 1;
+                       }
+                       bzero(rawmidisw, sizeof(struct rawmidi_switch));
+                       rawmidisw->no = idx;
+                       if ((err = snd_ctl_rawmidi_output_switch_read(handle, device, idx, &rawmidisw->s)) < 0) {
+                               free(rawmidisw);
+                               error("RAWMIDI output switch read error (%s) - skipping", snd_strerror(err));
+                               break;
+                       }
+                       if (!rawmidiswprev) {
+                               rawmidi->oswitches = rawmidisw;
+                       } else {
+                               rawmidiswprev->next = rawmidisw;
+                       }
+                       rawmidiswprev = rawmidisw;
+               }
+               if (!rawmidiprev) {
+                       card->rawmidis = rawmidi;
+               } else {
+                       rawmidiprev->next = rawmidi;
+               }
+               rawmidiprev = rawmidi;
+       }
+       /* --- */
+       snd_ctl_close(handle);
+       return 0;
 }
 
 int soundcard_setup_load(const char *cfgfile, int skip)
 {
-  extern int yyparse( void );
-  extern int linecount;
-  extern FILE *yyin;
-  extern int yydebug;
-  int xtry;
+       extern int yyparse(void);
+       extern int linecount;
+       extern FILE *yyin;
+       extern int yydebug;
+       int xtry;
 
 #ifdef YYDEBUG
-  yydebug = 1;  
+       yydebug = 1;
 #endif
-  if ( debugflag )
-    printf( "cfgfile = '%s'\n", cfgfile );
-  if (skip && access(cfgfile, R_OK)) return 0;
-  if ( ( yyin = fopen( cfgfile, "r" ) ) == NULL ) {
-    error( "Cannot open configuration file '%s'...", cfgfile );
-    return 1;
-  }
-  linecount = 0;
-  xtry = yyparse();
-  fclose( yyin );
-  if ( debugflag )
-    printf( "Config ok..\n" );
-  if ( xtry )
-    error( "Ignored error in configuration file '%s'...", cfgfile );
-  return 0;
+       if (debugflag)
+               printf("cfgfile = '%s'\n", cfgfile);
+       if (skip && access(cfgfile, R_OK))
+               return 0;
+       if ((yyin = fopen(cfgfile, "r")) == NULL) {
+               error("Cannot open configuration file '%s'...", cfgfile);
+               return 1;
+       }
+       linecount = 0;
+       xtry = yyparse();
+       fclose(yyin);
+       if (debugflag)
+               printf("Config ok..\n");
+       if (xtry)
+               error("Ignored error in configuration file '%s'...", cfgfile);
+       return 0;
 }
 
-static void soundcard_setup_write_switch( FILE *out, int interface, const unsigned char *name, unsigned int type, unsigned int low, unsigned int high, void *data )
+static void soundcard_setup_write_switch(FILE * out, int interface, const unsigned char *name, unsigned int type, unsigned int low, unsigned int high, void *data)
 {
-  union {
-    unsigned int enable;
-    unsigned char data8[32];
-    unsigned short data16[16];
-    unsigned int data32[8];
-  } *pdata = data;
-  char *s, v[16];
-  int idx, first, switchok = 0;
-  const char *space = "    ";
-  
-  v[0] = '\0';
-  switch ( type ) {
-    case SND_CTL_SW_TYPE_BOOLEAN:      s = "bool"; strcpy( v, pdata -> enable ? "true" : "false" ); break;
-    case SND_CTL_SW_TYPE_BYTE:         s = "byte"; sprintf( v, "%u", (unsigned int)pdata -> data8[0] ); break;
-    case SND_CTL_SW_TYPE_WORD:         s = "word"; sprintf( v, "%u", (unsigned int)pdata -> data16[0] ); break;
-    case SND_CTL_SW_TYPE_DWORD:                s = "dword"; sprintf( v, "%u", pdata -> data32[0] ); break;
-    case SND_CTL_SW_TYPE_USER:         s = "user"; break;
-    default:
-      s = "unknown";
-  }
-  fprintf( out, "%s; Type is '%s'.\n", space, s );
-  if ( low != 0 || high != 0 )
-    fprintf( out, "%s; Accepted switch range is from %u to %u.\n", space, low, high );
-  if ( interface == SND_INTERFACE_CONTROL && type == SND_CTL_SW_TYPE_WORD &&
-       !strcmp( name, SND_CTL_SW_JOYSTICK_ADDRESS ) ) {
-    for ( idx = 1, first = 1; idx < 16; idx++ ) {
-      if ( pdata -> data16[idx] ) {
-        if ( first ) {
-          fprintf( out, "%s; Available addresses - 0x%x", space, pdata -> data16[idx] );
-          first = 0;
-        } else {
-          fprintf( out, ", 0x%x", pdata -> data16[idx] );
-        }
-      }
-    }
-    if ( !first ) fprintf( out, "\n" );
-  }
-  if ( interface == SND_INTERFACE_MIXER && type == SND_MIXER_SW_TYPE_BOOLEAN &&
-       !strcmp( name, SND_MIXER_SW_IEC958OUT ) ) {
-    fprintf( out, "%sswitch( \"%s\", ", space, name );
-    if ( pdata -> data32[1] == (('C'<<8)|'S') ) {      /* Cirrus Crystal */
-      switchok = 0;
-      fprintf( out, "iec958ocs( %s", pdata -> enable ? "enable" : "disable" );
-      if ( pdata -> data16[4] & 0x2000 ) fprintf( out, " 3d" );
-      if ( pdata -> data16[4] & 0x0040 ) fprintf( out, " reset" );
-      if ( pdata -> data16[4] & 0x0020 ) fprintf( out, " user" );
-      if ( pdata -> data16[4] & 0x0010 ) fprintf( out, " valid" );
-      if ( pdata -> data16[5] & 0x0002 ) fprintf( out, " data" );
-      if ( !(pdata -> data16[5] & 0x0004) ) fprintf( out, " protect" );
-      switch ( pdata -> data16[5] & 0x0018 ) {
-        case 0x0008: fprintf( out, " pre2" ); break;
-        default: break;
-      }
-      if ( pdata -> data16[5] & 0x0020 ) fprintf( out, " fsunlock" );
-      fprintf( out, " type( 0x%x )", (pdata -> data16[5] >> 6) & 0x7f );
-      if ( pdata -> data16[5] & 0x2000 ) fprintf( out, " gstatus" );
-      fprintf( out, " )" );
-      goto __end;
-    }
-  }
-  fprintf( out, "%sswitch( \"%s\", ", space, name );
-  if ( !switchok ) {
-    fprintf( out, v );
-    if ( type < 0 || type > SND_CTL_SW_TYPE_DWORD ) {
-      /* TODO: some well known types should be verbose */
-      fprintf( out, " rawdata( " );
-      for ( idx = 0; idx < 31; idx++ ) {
-        fprintf( out, "@%02x:", pdata -> data8[idx] );
-      }
-      fprintf( out, "%02x@ )\n", pdata -> data8[31] );
-    }
-  }
-  __end:
-  fprintf( out, " )\n" );
+       union {
+               unsigned int enable;
+               unsigned char data8[32];
+               unsigned short data16[16];
+               unsigned int data32[8];
+       } *pdata = data;
+       char *s, v[16];
+       int idx, first, switchok = 0;
+       const char *space = "    ";
+
+       v[0] = '\0';
+       switch (type) {
+       case SND_CTL_SW_TYPE_BOOLEAN:
+               s = "bool";
+               strcpy(v, pdata->enable ? "true" : "false");
+               break;
+       case SND_CTL_SW_TYPE_BYTE:
+               s = "byte";
+               sprintf(v, "%u", (unsigned int) pdata->data8[0]);
+               break;
+       case SND_CTL_SW_TYPE_WORD:
+               s = "word";
+               sprintf(v, "%u", (unsigned int) pdata->data16[0]);
+               break;
+       case SND_CTL_SW_TYPE_DWORD:
+               s = "dword";
+               sprintf(v, "%u", pdata->data32[0]);
+               break;
+       case SND_CTL_SW_TYPE_USER:
+               s = "user";
+               break;
+       default:
+               s = "unknown";
+       }
+       fprintf(out, "%s; Type is '%s'.\n", space, s);
+       if (low != 0 || high != 0)
+               fprintf(out, "%s; Accepted switch range is from %u to %u.\n", space, low, high);
+       if (interface == SND_INTERFACE_CONTROL && type == SND_CTL_SW_TYPE_WORD &&
+           !strcmp(name, SND_CTL_SW_JOYSTICK_ADDRESS)) {
+               for (idx = 1, first = 1; idx < 16; idx++) {
+                       if (pdata->data16[idx]) {
+                               if (first) {
+                                       fprintf(out, "%s; Available addresses - 0x%x", space, pdata->data16[idx]);
+                                       first = 0;
+                               } else {
+                                       fprintf(out, ", 0x%x", pdata->data16[idx]);
+                               }
+                       }
+               }
+               if (!first)
+                       fprintf(out, "\n");
+       }
+       if (interface == SND_INTERFACE_MIXER && type == SND_MIXER_SW_TYPE_BOOLEAN &&
+           !strcmp(name, SND_MIXER_SW_IEC958OUT)) {
+               fprintf(out, "%sswitch( \"%s\", ", space, name);
+               if (pdata->data32[1] == (('C' << 8) | 'S')) {   /* Cirrus Crystal */
+                       switchok = 0;
+                       fprintf(out, "iec958ocs( %s", pdata->enable ? "enable" : "disable");
+                       if (pdata->data16[4] & 0x2000)
+                               fprintf(out, " 3d");
+                       if (pdata->data16[4] & 0x0040)
+                               fprintf(out, " reset");
+                       if (pdata->data16[4] & 0x0020)
+                               fprintf(out, " user");
+                       if (pdata->data16[4] & 0x0010)
+                               fprintf(out, " valid");
+                       if (pdata->data16[5] & 0x0002)
+                               fprintf(out, " data");
+                       if (!(pdata->data16[5] & 0x0004))
+                               fprintf(out, " protect");
+                       switch (pdata->data16[5] & 0x0018) {
+                       case 0x0008:
+                               fprintf(out, " pre2");
+                               break;
+                       default:
+                               break;
+                       }
+                       if (pdata->data16[5] & 0x0020)
+                               fprintf(out, " fsunlock");
+                       fprintf(out, " type( 0x%x )", (pdata->data16[5] >> 6) & 0x7f);
+                       if (pdata->data16[5] & 0x2000)
+                               fprintf(out, " gstatus");
+                       fprintf(out, " )");
+                       goto __end;
+               }
+       }
+       fprintf(out, "%sswitch( \"%s\", ", space, name);
+       if (!switchok) {
+               fprintf(out, v);
+               if (type < 0 || type > SND_CTL_SW_TYPE_DWORD) {
+                       /* TODO: some well known types should be verbose */
+                       fprintf(out, " rawdata( ");
+                       for (idx = 0; idx < 31; idx++) {
+                               fprintf(out, "@%02x:", pdata->data8[idx]);
+                       }
+                       fprintf(out, "%02x@ )\n", pdata->data8[31]);
+               }
+       }
+      __end:
+       fprintf(out, " )\n");
 }
 
 
-static void soundcard_setup_write_mixer_channel( FILE *out, snd_mixer_channel_info_t *info, snd_mixer_channel_t *channel )
+static void soundcard_setup_write_mixer_channel(FILE * out, snd_mixer_channel_info_t * info, snd_mixer_channel_t * channel)
 {
-  fprintf( out, "    ; Capabilities:%s%s%s%s%s%s%s%s%s%s%s%s%s.\n",
-       info -> caps & SND_MIXER_CINFO_CAP_RECORD ? " record" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_JOINRECORD ? " join-record" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_STEREO ? " stereo" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_HWMUTE ? " hardware-mute" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_JOINMUTE ? " join-mute" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_DIGITAL ? " digital" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_INPUT ? " external-input" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_LTOR_OUT ? " ltor-out" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_RTOL_OUT ? " rtol-out" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_SWITCH_OUT ? " switch-out" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_LTOR_IN ? " ltor-in" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_RTOL_IN ? " rtol-in" : "",
-       info -> caps & SND_MIXER_CINFO_CAP_RECORDBYMUTE ? " record-by-mute" : "" );
-  fprintf( out, "    ; Accepted channel range is from %i to %i.\n", info -> min, info -> max );
-  fprintf( out, "    channel( \"%s\", ", info -> name );
-  if ( info -> caps & SND_MIXER_CINFO_CAP_STEREO ) {
-    fprintf( out, "stereo( %i%s%s%s%s, %i%s%s%s%s )",
-      channel -> left,
-      channel -> flags & SND_MIXER_FLG_MUTE_LEFT ? " mute" : "",
-      channel -> flags & SND_MIXER_FLG_RECORD_LEFT ? " record" : "",
-      channel -> flags & SND_MIXER_FLG_LTOR_OUT ? " swout" : "",
-      channel -> flags & SND_MIXER_FLG_LTOR_IN ? " swin" : "",
-      channel -> right,
-      channel -> flags & SND_MIXER_FLG_MUTE_RIGHT ? " mute" : "",
-      channel -> flags & SND_MIXER_FLG_RECORD_RIGHT ? " record" : "",
-      channel -> flags & SND_MIXER_FLG_RTOL_OUT ? " swout" : "",
-      channel -> flags & SND_MIXER_FLG_RTOL_IN ? " swin" : ""
-    );
-  } else {
-    fprintf( out, "mono( %i%s%s )", 
-      (channel -> left + channel -> right) / 2,
-      channel -> flags & SND_MIXER_FLG_MUTE ? " mute" : "",
-      channel -> flags & SND_MIXER_FLG_RECORD ? " record" : ""
-    );
-  }
-  fprintf( out, " )\n" );
+       fprintf(out, "    ; Capabilities:%s%s%s%s%s%s%s%s%s%s%s%s%s.\n",
+               info->caps & SND_MIXER_CINFO_CAP_RECORD ?       " record" : "",
+               info->caps & SND_MIXER_CINFO_CAP_JOINRECORD ?   " join-record" : "",
+               info->caps & SND_MIXER_CINFO_CAP_STEREO ?       " stereo" : "",
+               info->caps & SND_MIXER_CINFO_CAP_HWMUTE ?       " hardware-mute" : "",
+               info->caps & SND_MIXER_CINFO_CAP_JOINMUTE ?     " join-mute" : "",
+               info->caps & SND_MIXER_CINFO_CAP_DIGITAL ?      " digital" : "",
+               info->caps & SND_MIXER_CINFO_CAP_INPUT ?        " external-input" : "",
+               info->caps & SND_MIXER_CINFO_CAP_LTOR_OUT ?     " ltor-out" : "",
+               info->caps & SND_MIXER_CINFO_CAP_RTOL_OUT ?     " rtol-out" : "",
+               info->caps & SND_MIXER_CINFO_CAP_SWITCH_OUT ?   " switch-out" : "",
+               info->caps & SND_MIXER_CINFO_CAP_LTOR_IN ?      " ltor-in" : "",
+               info->caps & SND_MIXER_CINFO_CAP_RTOL_IN ?      " rtol-in" : "",
+               info->caps & SND_MIXER_CINFO_CAP_RECORDBYMUTE ? " record-by-mute" : "");
+       fprintf(out, "    ; Accepted channel range is from %i to %i.\n", info->min, info->max);
+       fprintf(out, "    channel( \"%s\", ", info->name);
+       if (info->caps & SND_MIXER_CINFO_CAP_STEREO) {
+               fprintf(out, "stereo( %i%s%s%s%s, %i%s%s%s%s )",
+                       channel->left,
+                channel->flags & SND_MIXER_FLG_MUTE_LEFT ? " mute" : "",
+                       channel->flags & SND_MIXER_FLG_RECORD_LEFT ? " record" : "",
+                channel->flags & SND_MIXER_FLG_LTOR_OUT ? " swout" : "",
+                  channel->flags & SND_MIXER_FLG_LTOR_IN ? " swin" : "",
+                       channel->right,
+               channel->flags & SND_MIXER_FLG_MUTE_RIGHT ? " mute" : "",
+                       channel->flags & SND_MIXER_FLG_RECORD_RIGHT ? " record" : "",
+                channel->flags & SND_MIXER_FLG_RTOL_OUT ? " swout" : "",
+                   channel->flags & SND_MIXER_FLG_RTOL_IN ? " swin" : ""
+                   );
+       } else {
+               fprintf(out, "mono( %i%s%s )",
+                       (channel->left + channel->right) / 2,
+                     channel->flags & SND_MIXER_FLG_MUTE ? " mute" : "",
+                  channel->flags & SND_MIXER_FLG_RECORD ? " record" : ""
+                   );
+       }
+       fprintf(out, " )\n");
 }
 
-int soundcard_setup_write( const char *cfgfile )
+int soundcard_setup_write(const char *cfgfile)
 {
-  FILE *out;
-  struct soundcard *first;
-  struct ctl_switch *ctlsw;
-  struct mixer *mixer;
-  struct mixer_switch *mixersw;
-  struct mixer_channel *mixerchannel;
-  struct pcm *pcm;
-  struct pcm_switch *pcmsw;
-  struct rawmidi *rawmidi;
-  struct rawmidi_switch *rawmidisw;
-  
-  if ( (out = fopen( cfgfile, "w+" )) == NULL ) {
-    error( "Cannot open file '%s' for writing...\n", cfgfile );
-    return 1;
-  }
-  fprintf( out, "# ALSA driver configuration\n" );
-  fprintf( out, "# Generated by alsactl\n" );
-  fprintf( out, "\n" );
-  for ( first = soundcards; first; first = first -> next ) {
-    fprintf( out, "soundcard( \"%s\" ) {\n", first -> control.hwinfo.id );
-    if ( first -> control.switches ) {
-      fprintf( out, "  control {\n" );
-      for ( ctlsw = first -> control.switches; ctlsw; ctlsw = ctlsw -> next )
-        soundcard_setup_write_switch( out, SND_INTERFACE_CONTROL, ctlsw -> s.name, ctlsw -> s.type, ctlsw -> s.low, ctlsw -> s.high, (void *)&ctlsw -> s.value );
-      fprintf( out, "  }\n" );
-    }
-    for ( mixer = first -> mixers; mixer; mixer = mixer -> next ) {
-      fprintf( out, "  mixer( \"%s\" ) {\n", mixer -> info.name );
-      for ( mixerchannel = mixer -> channels; mixerchannel; mixerchannel = mixerchannel -> next )
-        soundcard_setup_write_mixer_channel( out, &mixerchannel -> i, &mixerchannel -> c );
-      for ( mixersw = mixer -> switches; mixersw; mixersw = mixersw -> next )
-        soundcard_setup_write_switch( out, SND_INTERFACE_MIXER, mixersw -> s.name, mixersw -> s.type, mixersw -> s.low, mixersw -> s.high, (void *)(&mixersw -> s.value) );
-      fprintf( out, "  }\n" );
-    }
-    for ( pcm = first -> pcms; pcm; pcm = pcm -> next ) {
-      if ( !pcm -> pswitches && !pcm -> rswitches ) continue; 
-      fprintf( out, "  pcm( \"%s\" ) {\n", pcm -> info.name );
-      if ( pcm -> pswitches ) {
-        fprintf( out, "    playback {" );
-        for ( pcmsw = pcm -> pswitches; pcmsw; pcmsw = pcmsw -> next )
-          soundcard_setup_write_switch( out, SND_INTERFACE_PCM, pcmsw -> s.name, pcmsw -> s.type, pcmsw -> s.low, pcmsw -> s.high, (void *)&pcmsw -> s.value );
-        fprintf( out, "    }\n" );
-      }
-      if ( pcm -> rswitches ) {
-        fprintf( out, "    record {" );
-        for ( pcmsw = pcm -> pswitches; pcmsw; pcmsw = pcmsw -> next )
-          soundcard_setup_write_switch( out, SND_INTERFACE_PCM, pcmsw -> s.name, pcmsw -> s.type, pcmsw -> s.low, pcmsw -> s.high, (void *)&pcmsw -> s.value );
-        fprintf( out, "    }\n" );
-      }
-      fprintf( out, "  }\n" );
-    }
-    for ( rawmidi = first -> rawmidis; rawmidi; rawmidi = rawmidi -> next ) {
-      if ( !rawmidi -> oswitches && !rawmidi -> iswitches ) continue;
-      fprintf( out, "  rawmidi( \"%s\" ) {\n", rawmidi -> info.name );
-      if ( rawmidi -> oswitches ) {
-        fprintf( out, "    output {" );
-        for ( rawmidisw = rawmidi -> oswitches; rawmidisw; rawmidisw = rawmidisw -> next )
-          soundcard_setup_write_switch( out, SND_INTERFACE_RAWMIDI, rawmidisw -> s.name, rawmidisw -> s.type, rawmidisw -> s.low, rawmidisw -> s.high, (void *)&rawmidisw -> s.value );
-        fprintf( out, "    }\n" );
-      }
-      if ( rawmidi -> iswitches ) {
-        fprintf( out, "    input {" );
-        for ( rawmidisw = rawmidi -> iswitches; rawmidisw; rawmidisw = rawmidisw -> next )
-          soundcard_setup_write_switch( out, SND_INTERFACE_RAWMIDI, rawmidisw -> s.name, rawmidisw -> s.type, rawmidisw -> s.low, rawmidisw -> s.high, (void *)&rawmidisw -> s.value );
-        fprintf( out, "    }\n" );
-      }
-      fprintf( out, "  }\n" );
-    }
-    fprintf( out, "}\n%s", first -> next ? "\n" : "" );
-  }
-  fclose( out );
-  return 0;
+       FILE *out;
+       struct soundcard *first;
+       struct ctl_switch *ctlsw;
+       struct mixer *mixer;
+       struct mixer_switch *mixersw;
+       struct mixer_channel *mixerchannel;
+       struct pcm *pcm;
+       struct pcm_switch *pcmsw;
+       struct rawmidi *rawmidi;
+       struct rawmidi_switch *rawmidisw;
+
+       if ((out = fopen(cfgfile, "w+")) == NULL) {
+               error("Cannot open file '%s' for writing...\n", cfgfile);
+               return 1;
+       }
+       fprintf(out, "# ALSA driver configuration\n");
+       fprintf(out, "# Generated by alsactl\n");
+       fprintf(out, "\n");
+       for (first = soundcards; first; first = first->next) {
+               fprintf(out, "soundcard( \"%s\" ) {\n", first->control.hwinfo.id);
+               if (first->control.switches) {
+                       fprintf(out, "  control {\n");
+                       for (ctlsw = first->control.switches; ctlsw; ctlsw = ctlsw->next)
+                               soundcard_setup_write_switch(out, SND_INTERFACE_CONTROL, ctlsw->s.name, ctlsw->s.type, ctlsw->s.low, ctlsw->s.high, (void *) &ctlsw->s.value);
+                       fprintf(out, "  }\n");
+               }
+               for (mixer = first->mixers; mixer; mixer = mixer->next) {
+                       fprintf(out, "  mixer( \"%s\" ) {\n", mixer->info.name);
+                       for (mixerchannel = mixer->channels; mixerchannel; mixerchannel = mixerchannel->next)
+                               soundcard_setup_write_mixer_channel(out, &mixerchannel->i, &mixerchannel->c);
+                       for (mixersw = mixer->switches; mixersw; mixersw = mixersw->next)
+                               soundcard_setup_write_switch(out, SND_INTERFACE_MIXER, mixersw->s.name, mixersw->s.type, mixersw->s.low, mixersw->s.high, (void *) (&mixersw->s.value));
+                       fprintf(out, "  }\n");
+               }
+               for (pcm = first->pcms; pcm; pcm = pcm->next) {
+                       if (!pcm->pswitches && !pcm->rswitches)
+                               continue;
+                       fprintf(out, "  pcm( \"%s\" ) {\n", pcm->info.name);
+                       if (pcm->pswitches) {
+                               fprintf(out, "    playback {");
+                               for (pcmsw = pcm->pswitches; pcmsw; pcmsw = pcmsw->next)
+                                       soundcard_setup_write_switch(out, SND_INTERFACE_PCM, pcmsw->s.name, pcmsw->s.type, pcmsw->s.low, pcmsw->s.high, (void *) &pcmsw->s.value);
+                               fprintf(out, "    }\n");
+                       }
+                       if (pcm->rswitches) {
+                               fprintf(out, "    record {");
+                               for (pcmsw = pcm->pswitches; pcmsw; pcmsw = pcmsw->next)
+                                       soundcard_setup_write_switch(out, SND_INTERFACE_PCM, pcmsw->s.name, pcmsw->s.type, pcmsw->s.low, pcmsw->s.high, (void *) &pcmsw->s.value);
+                               fprintf(out, "    }\n");
+                       }
+                       fprintf(out, "  }\n");
+               }
+               for (rawmidi = first->rawmidis; rawmidi; rawmidi = rawmidi->next) {
+                       if (!rawmidi->oswitches && !rawmidi->iswitches)
+                               continue;
+                       fprintf(out, "  rawmidi( \"%s\" ) {\n", rawmidi->info.name);
+                       if (rawmidi->oswitches) {
+                               fprintf(out, "    output {");
+                               for (rawmidisw = rawmidi->oswitches; rawmidisw; rawmidisw = rawmidisw->next)
+                                       soundcard_setup_write_switch(out, SND_INTERFACE_RAWMIDI, rawmidisw->s.name, rawmidisw->s.type, rawmidisw->s.low, rawmidisw->s.high, (void *) &rawmidisw->s.value);
+                               fprintf(out, "    }\n");
+                       }
+                       if (rawmidi->iswitches) {
+                               fprintf(out, "    input {");
+                               for (rawmidisw = rawmidi->iswitches; rawmidisw; rawmidisw = rawmidisw->next)
+                                       soundcard_setup_write_switch(out, SND_INTERFACE_RAWMIDI, rawmidisw->s.name, rawmidisw->s.type, rawmidisw->s.low, rawmidisw->s.high, (void *) &rawmidisw->s.value);
+                               fprintf(out, "    }\n");
+                       }
+                       fprintf(out, "  }\n");
+               }
+               fprintf(out, "}\n%s", first->next ? "\n" : "");
+       }
+       fclose(out);
+       return 0;
 }
 
-static int soundcard_open_ctl( void **ctlhandle, struct soundcard *soundcard )
+static int soundcard_open_ctl(void **ctlhandle, struct soundcard *soundcard)
 {
-  int err;
-
-  if ( *ctlhandle ) return 0;
-  if ( (err = snd_ctl_open( ctlhandle, soundcard -> no )) < 0 ) {
-    error( "Cannot open control interface for soundcard #%i.", soundcard -> no + 1 );
-    return 1;
-  }
-  return 0;
+       int err;
+
+       if (*ctlhandle)
+               return 0;
+       if ((err = snd_ctl_open(ctlhandle, soundcard->no)) < 0) {
+               error("Cannot open control interface for soundcard #%i.", soundcard->no + 1);
+               return 1;
+       }
+       return 0;
 }
 
-static int soundcard_open_mix( void **mixhandle, struct soundcard *soundcard, struct mixer *mixer )
+static int soundcard_open_mix(void **mixhandle, struct soundcard *soundcard, struct mixer *mixer)
 {
-  int err;
-
-  if ( *mixhandle ) return 0;
-  if ( (err = snd_mixer_open( mixhandle, soundcard -> no, mixer -> no )) < 0 ) {
-    error( "Cannot open mixer interface for soundcard #%i.", soundcard -> no + 1 );
-    return 1;
-  }
-  if ( (err = snd_mixer_exact_mode( *mixhandle, 1 )) < 0 ) {
-    error( "Cannot setup exact mode for mixer #%i/#%i: %s", soundcard -> no + 1, mixer -> no, snd_strerror( err ) );
-    return 1;
-  }
-  return 0;
+       int err;
+
+       if (*mixhandle)
+               return 0;
+       if ((err = snd_mixer_open(mixhandle, soundcard->no, mixer->no)) < 0) {
+               error("Cannot open mixer interface for soundcard #%i.", soundcard->no + 1);
+               return 1;
+       }
+       if ((err = snd_mixer_exact_mode(*mixhandle, 1)) < 0) {
+               error("Cannot setup exact mode for mixer #%i/#%i: %s", soundcard->no + 1, mixer->no, snd_strerror(err));
+               return 1;
+       }
+       return 0;
 }
 
-int soundcard_setup_process( int cardno )
+int soundcard_setup_process(int cardno)
 {
-  int err;
-  void *ctlhandle = NULL;
-  void *mixhandle = NULL;
-  struct soundcard *soundcard;
-  struct ctl_switch *ctlsw;
-  struct mixer *mixer;
-  struct mixer_channel *channel;
-  struct mixer_switch *mixersw;
-  struct pcm *pcm;
-  struct pcm_switch *pcmsw;
-  struct rawmidi *rawmidi;
-  struct rawmidi_switch *rawmidisw;
-  
-  for ( soundcard = soundcards; soundcard; soundcard = soundcard -> next ) {
-    if ( cardno >= 0 && soundcard -> no != cardno ) continue;
-    for ( ctlsw = soundcard -> control.switches; ctlsw; ctlsw = ctlsw -> next ) {
-      if ( ctlsw -> change )
-        if ( !soundcard_open_ctl( &ctlhandle, soundcard ) ) {
-          if ( (err = snd_ctl_switch_write( ctlhandle, ctlsw -> no, &ctlsw -> s )) < 0 )
-            error( "Control switch '%s' write error: %s", ctlsw -> s.name, snd_strerror( err ) );
-        }
-    }
-    for ( mixer = soundcard -> mixers; mixer; mixer = mixer -> next ) {
-      for ( channel = mixer -> channels; channel; channel = channel -> next )
-        if ( channel -> change )
-          if ( !soundcard_open_mix( &mixhandle, soundcard, mixer ) ) {
-            if ( (err = snd_mixer_channel_write( mixhandle, channel -> no, &channel -> c )) < 0 )
-              error( "Mixer channel '%s' write error: %s", channel -> i.name, snd_strerror( err ) );
-          }
-      if ( mixhandle ) { snd_mixer_close( mixhandle ); mixhandle = NULL; }
-      for ( mixersw = mixer -> switches; mixersw; mixersw = mixersw -> next )
-        if ( mixersw -> change )
-          if ( !soundcard_open_ctl( &ctlhandle, soundcard ) ) {
-            if ( (err = snd_ctl_mixer_switch_write( ctlhandle, mixer -> no, mixersw -> no, &mixersw -> s )) < 0 )
-              error( "Mixer switch '%s' write error: %s", mixersw -> s.name, snd_strerror( err ) );
-          }
-    }
-    for ( pcm = soundcard -> pcms; pcm; pcm = pcm -> next ) {
-      for ( pcmsw = pcm -> pswitches; pcmsw; pcmsw = pcmsw -> next ) {
-        if ( pcmsw -> change )
-          if ( !soundcard_open_ctl( &ctlhandle, soundcard ) ) {
-            if ( (err = snd_ctl_pcm_playback_switch_write( ctlhandle, pcm -> no, pcmsw -> no, &pcmsw -> s )) < 0 )
-              error( "PCM playback switch '%s' write error: %s", pcmsw -> s.name, snd_strerror( err ) );
-          }
-      }
-      for ( pcmsw = pcm -> rswitches; pcmsw; pcmsw = pcmsw -> next ) {
-        if ( pcmsw -> change )
-          if ( !soundcard_open_ctl( &ctlhandle, soundcard ) ) {
-            if ( (err = snd_ctl_pcm_playback_switch_write( ctlhandle, pcm -> no, pcmsw -> no, &pcmsw -> s )) < 0 )
-              error( "PCM record switch '%s' write error: %s", pcmsw -> s.name, snd_strerror( err ) );
-          }
-      }
-    }
-    for ( rawmidi = soundcard -> rawmidis; rawmidi; rawmidi = rawmidi -> next ) {
-      for ( rawmidisw = rawmidi -> oswitches; rawmidisw; rawmidisw = rawmidisw -> next ) {
-        if ( rawmidisw -> change )
-          if ( !soundcard_open_ctl( &ctlhandle, soundcard ) ) {
-            if ( (err = snd_ctl_rawmidi_output_switch_write( ctlhandle, rawmidi -> no, rawmidisw -> no, &rawmidisw -> s )) < 0 )
-              error( "RAWMIDI output switch '%s' write error: %s", rawmidisw -> s.name, snd_strerror( err ) );
-          }
-      }
-      for ( rawmidisw = rawmidi -> iswitches; rawmidisw; rawmidisw = rawmidisw -> next ) {
-        if ( rawmidisw -> change )
-          if ( !soundcard_open_ctl( &ctlhandle, soundcard ) ) {
-            if ( (err = snd_ctl_rawmidi_output_switch_write( ctlhandle, rawmidi -> no, rawmidisw -> no, &rawmidisw -> s )) < 0 )
-              error( "RAWMIDI input switch '%s' write error: %s", rawmidisw -> s.name, snd_strerror( err ) );
-          }
-      }
-    }
-  }
-  if ( ctlhandle ) snd_ctl_close( ctlhandle );
-  return 1;
+       int err;
+       void *ctlhandle = NULL;
+       void *mixhandle = NULL;
+       struct soundcard *soundcard;
+       struct ctl_switch *ctlsw;
+       struct mixer *mixer;
+       struct mixer_channel *channel;
+       struct mixer_switch *mixersw;
+       struct pcm *pcm;
+       struct pcm_switch *pcmsw;
+       struct rawmidi *rawmidi;
+       struct rawmidi_switch *rawmidisw;
+
+       for (soundcard = soundcards; soundcard; soundcard = soundcard->next) {
+               if (cardno >= 0 && soundcard->no != cardno)
+                       continue;
+               for (ctlsw = soundcard->control.switches; ctlsw; ctlsw = ctlsw->next) {
+                       if (ctlsw->change)
+                               if (!soundcard_open_ctl(&ctlhandle, soundcard)) {
+                                       if ((err = snd_ctl_switch_write(ctlhandle, ctlsw->no, &ctlsw->s)) < 0)
+                                               error("Control switch '%s' write error: %s", ctlsw->s.name, snd_strerror(err));
+                               }
+               }
+               for (mixer = soundcard->mixers; mixer; mixer = mixer->next) {
+                       for (channel = mixer->channels; channel; channel = channel->next)
+                               if (channel->change)
+                                       if (!soundcard_open_mix(&mixhandle, soundcard, mixer)) {
+                                               if ((err = snd_mixer_channel_write(mixhandle, channel->no, &channel->c)) < 0)
+                                                       error("Mixer channel '%s' write error: %s", channel->i.name, snd_strerror(err));
+                                       }
+                       if (mixhandle) {
+                               snd_mixer_close(mixhandle);
+                               mixhandle = NULL;
+                       }
+                       for (mixersw = mixer->switches; mixersw; mixersw = mixersw->next)
+                               if (mixersw->change)
+                                       if (!soundcard_open_ctl(&ctlhandle, soundcard)) {
+                                               if ((err = snd_ctl_mixer_switch_write(ctlhandle, mixer->no, mixersw->no, &mixersw->s)) < 0)
+                                                       error("Mixer switch '%s' write error: %s", mixersw->s.name, snd_strerror(err));
+                                       }
+               }
+               for (pcm = soundcard->pcms; pcm; pcm = pcm->next) {
+                       for (pcmsw = pcm->pswitches; pcmsw; pcmsw = pcmsw->next) {
+                               if (pcmsw->change)
+                                       if (!soundcard_open_ctl(&ctlhandle, soundcard)) {
+                                               if ((err = snd_ctl_pcm_playback_switch_write(ctlhandle, pcm->no, pcmsw->no, &pcmsw->s)) < 0)
+                                                       error("PCM playback switch '%s' write error: %s", pcmsw->s.name, snd_strerror(err));
+                                       }
+                       }
+                       for (pcmsw = pcm->rswitches; pcmsw; pcmsw = pcmsw->next) {
+                               if (pcmsw->change)
+                                       if (!soundcard_open_ctl(&ctlhandle, soundcard)) {
+                                               if ((err = snd_ctl_pcm_playback_switch_write(ctlhandle, pcm->no, pcmsw->no, &pcmsw->s)) < 0)
+                                                       error("PCM record switch '%s' write error: %s", pcmsw->s.name, snd_strerror(err));
+                                       }
+                       }
+               }
+               for (rawmidi = soundcard->rawmidis; rawmidi; rawmidi = rawmidi->next) {
+                       for (rawmidisw = rawmidi->oswitches; rawmidisw; rawmidisw = rawmidisw->next) {
+                               if (rawmidisw->change)
+                                       if (!soundcard_open_ctl(&ctlhandle, soundcard)) {
+                                               if ((err = snd_ctl_rawmidi_output_switch_write(ctlhandle, rawmidi->no, rawmidisw->no, &rawmidisw->s)) < 0)
+                                                       error("RAWMIDI output switch '%s' write error: %s", rawmidisw->s.name, snd_strerror(err));
+                                       }
+                       }
+                       for (rawmidisw = rawmidi->iswitches; rawmidisw; rawmidisw = rawmidisw->next) {
+                               if (rawmidisw->change)
+                                       if (!soundcard_open_ctl(&ctlhandle, soundcard)) {
+                                               if ((err = snd_ctl_rawmidi_output_switch_write(ctlhandle, rawmidi->no, rawmidisw->no, &rawmidisw->s)) < 0)
+                                                       error("RAWMIDI input switch '%s' write error: %s", rawmidisw->s.name, snd_strerror(err));
+                                       }
+                       }
+               }
+       }
+       if (ctlhandle)
+               snd_ctl_close(ctlhandle);
+       return 1;
 }