make tinymix command oriented, based on amixer

This commit is contained in:
Taylor Holberton
2016-11-19 19:46:50 -05:00
parent 474ab24467
commit 888bc69f97
2 changed files with 120 additions and 70 deletions
+38 -11
View File
@@ -4,42 +4,69 @@
tinymix \- view and edit mixer controls for a specified mixer.
.SH SYNOPSIS
.B tinymix\fR [ \fIoptions\fR ] [ \fIcontrol-id\fR ] [ \fIcontrol-value\fR ]
.B tinymix\fR [ \fIoptions\fR ] \fIcommand\fR
.SH Description
\fBtinymix\fR can be used to view and/or edit a list of mixer controls for a specified mixer.
Running \fBtinymix\fR with no arguments will print a list of mixer controls for the default mixer.
With one argument, the argument is interpreted as a control ID and detailed information for that control is printed.
With two arguments, the arguments are interpreted as a control ID and value pair, setting the control to the value specified.
.SH OPTIONS
.TP
\fB\-D\fR \fIcard\fR
\fB\-D, --card\fR \fIcard\fR
Card number of the mixer.
The default is 0.
.TP
\fB\-h, --help\fR
Print help contents and exit.
.TP
\fB\-v, --version\fR
Print the current version of tinymix and exit.
.SH COMMANDS
.TP
\fBget <control-id|control-name>\fR
Prints the value of a specified control
.TP
\fBset <control-id|control-name> <control-value>\fR
Sets the value of a specified control
.TP
\fBcontents\fR
Prints the contents of all mixer controls.
.TP
\fBcontrols\fR
Prints the names and IDs of all mixer controls.
.SH EXAMPLES
.TP
\fBtinymix\fR
\fBtinymix controls\fR
Prints a list of control IDs for the mixer of card 0.
.TP
\fBtinymix -D 1\fR
\fBtinymix -D 1 controls\fR
Prints a list of control IDs for the mixer of card 1.
.TP
\fBtinymix 0\fR
Prints default information about control 0.
\fBtinymix get 0\fR
Prints information about control 0.
.TP
\fBtinymix 0 4\fR
\fBtinymix get "Headphone Playback Volume"\fR
Prints information about a control called "Headphone Playback Volume"\fR
.TP
\fBtinymix set 0 4\fR
Sets control 0 to the value of 4.
.TP
\fBtinymix -D 1 2 32
\fBtinymix --card 1 set 2 32
Sets control 2 of card 1 to the value of 32.
.SH BUGS
+82 -59
View File
@@ -35,61 +35,67 @@
#include <string.h>
#include <limits.h>
static void tinymix_list_controls(struct mixer *mixer, int print_all);
/* Flag set by --verbose. */
int verbose_flag = 0;
static void tinymix_detail_control(struct mixer *mixer, const char *control);
static void tinymix_list_controls(struct mixer *mixer);
static void tinymix_detail_control(struct mixer *mixer, const char *control,
int print_all);
static void tinymix_set_value(struct mixer *mixer, const char *control,
char **values, unsigned int num_values);
static void tinymix_print_enum(struct mixer_ctl *ctl, int print_all);
static void tinymix_print_enum(struct mixer_ctl *ctl);
void usage(void)
{
printf("Usage: tinymix [--verbose] [--help] [-D card] [-c control id] [value to set]\n");
printf("usage: tinymix [options] <command>\n");
printf("options:\n");
printf("\t-h, --help : prints this help message and exists\n");
printf("\t-v, --version : prints this version of tinymix and exists\n");
printf("\t-D, --card NUMBER : specifies the card number of the mixer\n");
printf("commands:\n");
printf("\tget NAME|ID : prints the values of a control\n");
printf("\tset NAME|ID VALUE : sets the value of a control\n");
printf("\tcontrols : lists controls of the mixer\n");
printf("\tcontents : lists controls of the mixer and their contents\n");
}
void version(void)
{
printf("tinymix version 2.0 (tinyalsa version %s)\n", TINYALSA_VERSION_STRING);
}
int main(int argc, char **argv)
{
struct mixer *mixer;
int card = 0;
char control_id[32];
char *cmd;
while (1) {
static struct option long_options[] = {
/* These options set a flag. */
// FIXME - need to figure out how to pull in version?
// {"version", no_argument, &verbose_flag, 1},
{"verbose", no_argument, &verbose_flag, 1},
{"help", no_argument, NULL, 'h'},
{0, 0, 0, 0}
{ "version", no_argument, NULL, 'v' },
{ "help", no_argument, NULL, 'h' },
{ 0, 0, 0, 0 }
};
/* getopt_long stores the option index here. */
int option_index = 0;
int c = 0;
c = getopt_long (argc, argv, "c:D:h", long_options, &option_index);
c = getopt_long (argc, argv, "c:D:hv", long_options, &option_index);
/* Detect the end of the options. */
if (c == -1)
break;
switch (c) {
case 'c':
strncpy(control_id, optarg, sizeof(control_id));
break;
case 'D':
card = atoi(optarg);
break;
case 'h':
usage();
exit(0);
break;
return EXIT_SUCCESS;
case 'v':
version();
return EXIT_SUCCESS;
}
}
@@ -99,22 +105,41 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
printf("Mixer name: '%s'\n", mixer_get_name(mixer));
if (argc == 2) {
tinymix_detail_control(mixer, control_id, verbose_flag);
} else if (argc >= 3) {
tinymix_set_value(mixer, argv[1], &argv[2], argc - 2);
cmd = argv[optind];
if (cmd == NULL) {
fprintf(stderr, "no command specified (see --help)\n");
mixer_close(mixer);
return EXIT_FAILURE;
} else if (strcmp(cmd, "get") == 0) {
if ((optind + 1) >= argc) {
fprintf(stderr, "no control specified\n");
mixer_close(mixer);
return EXIT_FAILURE;
}
tinymix_detail_control(mixer, argv[optind + 1]);
printf("\n");
} else if (strcmp(cmd, "set") == 0) {
if ((optind + 1) >= argc) {
fprintf(stderr, "no control specified\n");
mixer_close(mixer);
return EXIT_FAILURE;
}
tinymix_set_value(mixer, argv[optind + 1], &argv[optind + 2], argc - 2);
} else if (strcmp(cmd, "controls") == 0) {
tinymix_list_controls(mixer, 0);
} else if (strcmp(cmd, "contents") == 0) {
tinymix_list_controls(mixer, 1);
} else {
fprintf(stderr, "unknown command '%s' (see --help)\n", cmd);
mixer_close(mixer);
return EXIT_FAILURE;
}
if (verbose_flag)
tinymix_list_controls(mixer);
mixer_close(mixer);
return 0;
return EXIT_SUCCESS;
}
static void tinymix_list_controls(struct mixer *mixer)
static void tinymix_list_controls(struct mixer *mixer, int print_all)
{
struct mixer_ctl *ctl;
const char *name, *type;
@@ -125,7 +150,11 @@ static void tinymix_list_controls(struct mixer *mixer)
printf("Number of controls: %u\n", num_ctls);
printf("ctl\ttype\tnum\t%-40s value\n", "name");
if (print_all)
printf("ctl\ttype\tnum\t%-40svalue\n", "name");
else
printf("ctl\ttype\tnum\t%-40s\n", "name");
for (i = 0; i < num_ctls; i++) {
ctl = mixer_get_ctl(mixer, i);
@@ -133,11 +162,13 @@ static void tinymix_list_controls(struct mixer *mixer)
type = mixer_ctl_get_type_string(ctl);
num_values = mixer_ctl_get_num_values(ctl);
printf("%u\t%s\t%u\t%-40s", i, type, num_values, name);
tinymix_detail_control(mixer, name, 0);
if (print_all)
tinymix_detail_control(mixer, name);
printf("\n");
}
}
static void tinymix_print_enum(struct mixer_ctl *ctl, int print_all)
static void tinymix_print_enum(struct mixer_ctl *ctl)
{
unsigned int num_enums;
unsigned int i;
@@ -147,16 +178,12 @@ static void tinymix_print_enum(struct mixer_ctl *ctl, int print_all)
for (i = 0; i < num_enums; i++) {
string = mixer_ctl_get_enum_string(ctl, i);
if (print_all)
printf("\t%s%s", mixer_ctl_get_value(ctl, 0) == (int)i ? ">" : "",
string);
else if (mixer_ctl_get_value(ctl, 0) == (int)i)
printf(" %-s", string);
printf("%s%s", mixer_ctl_get_value(ctl, 0) == (int)i ? ", " : "",
string);
}
}
static void tinymix_detail_control(struct mixer *mixer, const char *control,
int print_all)
static void tinymix_detail_control(struct mixer *mixer, const char *control)
{
struct mixer_ctl *ctl;
enum mixer_ctl_type type;
@@ -194,41 +221,37 @@ static void tinymix_detail_control(struct mixer *mixer, const char *control,
}
}
if (print_all)
printf("%s:", mixer_ctl_get_name(ctl));
for (i = 0; i < num_values; i++) {
switch (type)
{
case MIXER_CTL_TYPE_INT:
printf(" %d", mixer_ctl_get_value(ctl, i));
printf("%d", mixer_ctl_get_value(ctl, i));
break;
case MIXER_CTL_TYPE_BOOL:
printf(" %s", mixer_ctl_get_value(ctl, i) ? "On" : "Off");
printf("%s", mixer_ctl_get_value(ctl, i) ? "On" : "Off");
break;
case MIXER_CTL_TYPE_ENUM:
tinymix_print_enum(ctl, print_all);
tinymix_print_enum(ctl);
break;
case MIXER_CTL_TYPE_BYTE:
printf("%02x", buf[i]);
break;
default:
printf(" unknown");
printf("unknown");
break;
};
}
if (print_all) {
if (type == MIXER_CTL_TYPE_INT) {
min = mixer_ctl_get_range_min(ctl);
max = mixer_ctl_get_range_max(ctl);
printf(" (range %d->%d)", min, max);
if ((i + 1) < num_values) {
printf(", ");
}
}
free(buf);
if (type == MIXER_CTL_TYPE_INT) {
min = mixer_ctl_get_range_min(ctl);
max = mixer_ctl_get_range_max(ctl);
printf(" (range %d->%d)", min, max);
}
printf("\n");
free(buf);
}
static void tinymix_set_byte_ctl(struct mixer_ctl *ctl,