main()函数
首先来看函数执行流程
1. 处理传入的参数。其中的getopt_long()函数用于处理传入的参数
while (1) {
int option_index = 0;
int option_char = 0;
option_char = getopt_long(argc, argv, tinymix_short_options,
tinymix_long_options, &option_index);
if (option_char == -1)
break;
switch (option_char) {
case 'D':
card = atoi(optarg);
break;
case 'a':
g_all_values = 1;
break;
case 't':
g_tabs_only = 1;
break;
case 'v':
g_value_only = 1;
break;
case 'h':
usage();
return 0;
default:
usage();
return EINVAL;
}
}
2. 打开对应声卡的混音器
mixer = mixer_open(card);
3. 参数为D a t v h以设置好的方式打印出所有控件类似1;主要是打印控件信息;对相关控件进行赋值
if (argc == optind) {
printf("Mixer name: '%s'\n", mixer_get_name(mixer));
tinymix_list_controls(mixer);
} else if (argc == optind + 1) {
ret = tinymix_detail_control(mixer, argv[optind], !g_value_only, !g_value_only);
} else if (argc >= optind + 2) {
ret = tinymix_set_value(mixer, argv[optind], &argv[optind + 1], argc - optind - 1);
}
4. 关闭设备
mixer_close(mixer);
tinymix_list_controls()函数
先来看看函数原型
static void tinymix_list_controls(struct mixer *mixer)
该函数内主要包含以下函数
/*拿到指定混音器控件数目*/
1. unsigned int mixer_get_num_ctls(struct mixer *mixer);
/*拿到指定混音器的指定控件*/
2. struct mixer_ctl *mixer_get_ctl(struct mixer *mixer, unsigned int id);
/*拿到控件名字*/
3. const char *mixer_ctl_get_name(struct mixer_ctl *ctl);
/*拿到控件类型*/
4. const char *mixer_ctl_get_type_string(struct mixer_ctl *ctl);
/*拿到空间具体数值*/
5. unsigned int mixer_ctl_get_num_values(struct mixer_ctl *ctl);
/*打印信息*/
6. static int tinymix_detail_control(struct mixer *mixer, const char *control,
int prefix, int print_all)
这个函数最主要的部分是
if (g_tabs_only)
printf("ctl\ttype\tnum\tname\tvalue");
else
printf("ctl\ttype\tnum\t%-40s value\n", "name");
if (g_all_values)
printf("\trange/values\n");
else
printf("\n");
for (i = 0; i < num_ctls; i++) {
ctl = mixer_get_ctl(mixer, i);
name = mixer_ctl_get_name(ctl);
type = mixer_ctl_get_type_string(ctl);
num_values = mixer_ctl_get_num_values(ctl);
if (g_tabs_only)
printf("%d\t%s\t%d\t%s\t", i, type, num_values, name);
else
printf("%d\t%s\t%d\t%-40s ", i, type, num_values, name);
tinymix_detail_control(mixer, name, 0, g_all_values);
}
显而易见这个函数主要作用还是打印信息
tinymix_set_value()函数
先来看看函数原型
static int tinymix_set_value(struct mixer *mixer, const char *control,
char **values, unsigned int num_values)
这个函数主要是用来设置参数,涉及到的函数主要是:
int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value);
static void tinymix_set_byte_ctl(struct mixer_ctl *ctl, char **values,
unsigned int num_values);
而tinymix_set_byte_ctl()函数又涉及到了
int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count);
同样也是用于设置参数