From fbbaa7239e3eb75685f7ef3ce9db3147594e732a Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Fri, 27 Nov 1998 15:13:57 +0000 Subject: [PATCH] Coding style... --- alsactl/alsactl.c | 315 ++++----- alsactl/alsactl.h | 102 +-- alsactl/alsactl_parser.y | 411 +++++------ alsactl/setup.c | 1452 ++++++++++++++++++++------------------ 4 files changed, 1171 insertions(+), 1109 deletions(-) diff --git a/alsactl/alsactl.c b/alsactl/alsactl.c index ef91a60..4e7c24b 100644 --- a/alsactl/alsactl.c +++ b/alsactl/alsactl.c @@ -29,182 +29,183 @@ #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 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 store current driver setup for one or each soundcards\n" ); - printf( " to configuration file\n" ); - printf( " restore restore current driver setup for one or each soundcards\n" ); - printf( " from configuration file\n" ); + printf("Usage: alsactl 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 store current driver setup for one or each soundcards\n"); + printf(" to configuration file\n"); + printf(" restore 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; } diff --git a/alsactl/alsactl.h b/alsactl/alsactl.h index 9c1763a..6ed0b00 100644 --- a/alsactl/alsactl.h +++ b/alsactl/alsactl.h @@ -28,87 +28,87 @@ 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); diff --git a/alsactl/alsactl_parser.y b/alsactl/alsactl_parser.y index 8bb3cbe..f478e8e 100644 --- a/alsactl/alsactl_parser.y +++ b/alsactl/alsactl_parser.y @@ -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; } diff --git a/alsactl/setup.c b/alsactl/setup.c index 3af19a5..9a901c0 100644 --- a/alsactl/setup.c +++ b/alsactl/setup.c @@ -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; } -- 2.47.1