0
点赞
收藏
分享

微信扫一扫

tinyalsa-tinymix源码浅析

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);

同样也是用于设置参数

举报

相关推荐

0 条评论