tarina

git clone https://git.tarina.org/tarina
Log | Files | Refs | README | LICENSE

cli.c (3785B)


      1 /*
      2  * alsamixer - curses mixer for the ALSA project
      3  * Copyright (c) 1998,1999 Tim Janik
      4  *                         Jaroslav Kysela <perex@perex.cz>
      5  * Copyright (c) 2009      Clemens Ladisch <clemens@ladisch.de>
      6  *
      7  * This program is free software: you can redistribute it and/or modify
      8  * it under the terms of the GNU General Public License as published by
      9  * the Free Software Foundation, either version 2 of the License, or
     10  * (at your option) any later version.
     11  *
     12  * This program is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  * GNU General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU General Public License
     18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     19  */
     20 
     21 #include "aconfig.h"
     22 #include <stdio.h>
     23 #include <stdlib.h>
     24 #include <locale.h>
     25 #include <getopt.h>
     26 #include <alsa/asoundlib.h>
     27 #include "gettext_curses.h"
     28 #include "mixer_widget.h"
     29 #include "mainloop.h"
     30 
     31 static int use_color = 1;
     32 static struct snd_mixer_selem_regopt selem_regopt = {
     33 	.ver = 1,
     34 	.abstract = SND_MIXER_SABSTRACT_NONE,
     35 	.device = "default",
     36 };
     37 
     38 static void show_help(void)
     39 {
     40 	puts(_("Usage: alsamixer [options]"));
     41 	puts(_("Useful options:\n"
     42 	       "  -h, --help              this help\n"
     43 	       "  -c, --card=NUMBER       sound card number or id\n"
     44 	       "  -D, --device=NAME       mixer device name\n"
     45 	       "  -V, --view=MODE         starting view mode: playback/capture/all"));
     46 	puts(_("Debugging options:\n"
     47 	       "  -g, --no-color          toggle using of colors\n"
     48 	       "  -a, --abstraction=NAME  mixer abstraction level: none/basic"));
     49 }
     50 
     51 static void parse_options(int argc, char *argv[])
     52 {
     53 	static const char short_options[] = "hc:D:V:gsa:";
     54 	static const struct option long_options[] = {
     55 		{ .name = "help", .val = 'h' },
     56 		{ .name = "card", .has_arg = 1, .val = 'c' },
     57 		{ .name = "device", .has_arg = 1, .val = 'D' },
     58 		{ .name = "view", .has_arg = 1, .val = 'V' },
     59 		{ .name = "no-color", .val = 'g' },
     60 		{ .name = "abstraction", .has_arg = 1, .val = 'a' },
     61 		{ }
     62 	};
     63 	int option;
     64 	int card_index;
     65 	static char name_buf[16];
     66 
     67 	while ((option = getopt_long(argc, argv, short_options,
     68 				     long_options, NULL)) != -1) {
     69 		switch (option) {
     70 		case '?':
     71 		case 'h':
     72 			show_help();
     73 			exit(EXIT_SUCCESS);
     74 		case 'c':
     75 			card_index = snd_card_get_index(optarg);
     76 			if (card_index < 0) {
     77 				fprintf(stderr, _("invalid card index: %s\n"), optarg);
     78 				goto fail;
     79 			}
     80 			sprintf(name_buf, "hw:%d", card_index);
     81 			selem_regopt.device = name_buf;
     82 			break;
     83 		case 'D':
     84 			selem_regopt.device = optarg;
     85 			break;
     86 		case 'V':
     87 			if (*optarg == 'p' || *optarg == 'P')
     88 				view_mode = VIEW_MODE_PLAYBACK;
     89 			else if (*optarg == 'c' || *optarg == 'C')
     90 				view_mode = VIEW_MODE_CAPTURE;
     91 			else
     92 				view_mode = VIEW_MODE_ALL;
     93 			break;
     94 		case 'g':
     95 			use_color = !use_color;
     96 			break;
     97 		case 'a':
     98 			if (!strcmp(optarg, "none"))
     99 				selem_regopt.abstract = SND_MIXER_SABSTRACT_NONE;
    100 			else if (!strcmp(optarg, "basic"))
    101 				selem_regopt.abstract = SND_MIXER_SABSTRACT_BASIC;
    102 			else {
    103 				fprintf(stderr, _("unknown abstraction level: %s\n"), optarg);
    104 				goto fail;
    105 			}
    106 			break;
    107 		default:
    108 			fprintf(stderr, _("unknown option: %c\n"), option);
    109 fail:
    110 			fputs(_("try `alsamixer --help' for more information\n"), stderr);
    111 			exit(EXIT_FAILURE);
    112 		}
    113 	}
    114 }
    115 
    116 int main(int argc, char *argv[])
    117 {
    118 	if (!isatty(fileno(stdin)))
    119 		return 0;
    120 
    121 	setlocale(LC_ALL, "");
    122 #ifdef ENABLE_NLS_IN_CURSES
    123 	textdomain(PACKAGE);
    124 #endif
    125 
    126 	parse_options(argc, argv);
    127 
    128 	create_mixer_object(&selem_regopt);
    129 
    130 	initialize_curses(use_color);
    131 
    132 	create_mixer_widget();
    133 
    134 	mainloop();
    135 
    136 	app_shutdown();
    137 	return 0;
    138 }