14765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/*
24765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
34765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *
44765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * Redistribution and use in source and binary forms, with or without
54765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * modification, are permitted provided that the following conditions are
64765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * met:
74765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *   * Redistributions of source code must retain the above copyright
84765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *     notice, this list of conditions and the following disclaimer.
94765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *   * Redistributions in binary form must reproduce the above
104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *     copyright notice, this list of conditions and the following
114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *     disclaimer in the documentation and/or other materials provided
124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *     with the distribution.
134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *   * Neither the name of Code Aurora Forum, Inc. nor the names of its
144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *     contributors may be used to endorse or promote products derived
154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *     from this software without specific prior written permission.
164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev *
174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev */
294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <sys/ioctl.h>
314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <sys/stat.h>
324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <linux/ioctl.h>
334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <fcntl.h>
344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <string.h>
354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <stdio.h>
364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <errno.h>
374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include <stdlib.h>
384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include "alsa_ucm.h"
404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev#include "msm8960_use_cases.h"
414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* Function prototypes */
434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void print_help_menu(void);
444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void alsaucm_test_cmd_svr(void);
454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int process_cmd(char *cmdStr);
464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* Global data */
484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevsnd_use_case_mgr_t *uc_mgr;
494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev/* Defines */
514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevenum ucm_cmd_id {
524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_OPEN = 0,
534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_SET,
544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_LISTCARDS,
554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_LIST,
564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_GET,
574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_GETI,
584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_RESET,
594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_RELOAD,
604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_HELP,
614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_QUIT,
624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    UCM_UNKNOWN
634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstruct cmd {
664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    enum ucm_cmd_id code;
674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const char *cmd_str;
684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic struct cmd cmds[] = {
714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_OPEN, "open" },
724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_SET,  "set" },
734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_LISTCARDS,  "listcards" },
744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_LIST,  "list" },
754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_GET,  "get" },
764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_GETI,  "geti" },
774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_RESET,  "reset" },
784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_RELOAD,  "reload" },
794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_HELP,  "help" },
804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_QUIT,  "quit" },
814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    { UCM_UNKNOWN, NULL }
824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev};
834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void alsaucm_test_cmd_svr(void)
854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int fd;
874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    ssize_t read_count;
884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char cmdstr[256] = {'\0'};
894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char ch;
904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *exit_str = "quit";
914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (mknod("/data/alsaucm_test", S_IFIFO | 0666, 0) == 0) {
934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        fd = open("/data/alsaucm_test", O_RDONLY);
944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        while (1) {
954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            read_count = read(fd, &ch, 1);
964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (read_count == 0) {
974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                sleep(2);
984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                continue;
994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            } else if (read_count < 0) {
1004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                fprintf(stderr, "alsaucm_test: error reading cmd\n");
1014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                break;
1024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
1034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            if (ch != '\n') {
1054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                strlcat(cmdstr, &ch , (2+strlen(cmdstr)));
1064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                continue;
1074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            } else {
1084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                if (!strncmp(cmdstr, exit_str, strlen(cmdstr))) {
1094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    /* free UCM instace */
1104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    if (uc_mgr) {
1114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        snd_use_case_mgr_close(uc_mgr);
1124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                        uc_mgr = NULL;
1134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    }
1144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    break;
1154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                } else {
1164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    process_cmd(cmdstr);
1174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                    memset(cmdstr, 0, sizeof(cmdstr));
1184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev                }
1194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            }
1204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
1214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        printf("alsaucm_test: exit server mode\n");
1224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        close(fd);
1234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        remove("/data/alsaucm_test");
1244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else {
1254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        fprintf(stderr, "alsaucm_test: Failed to create server\n");
1264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
1274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic void print_help_menu(void)
1314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    printf("\nAvailable commands:\n"
1334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  open NAME                  open card NAME\n"
1344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  reset                      reset sound card to default state\n"
1354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  reload                     reload configuration\n"
1364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  listcards                  list available cards\n"
1374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  list IDENTIFIER            list command\n"
1384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  get IDENTIFIER             get string value\n"
1394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  geti IDENTIFIER            get integer value\n"
1404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  set IDENTIFIER VALUE       set string value\n"
1414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  help                     help\n"
1424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           "  quit                     quit\n");
1434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevint main(int argc, char **argv)
1464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *help_str = "help";
1484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    argc--;
1494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    argv++;
1504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (argc > 0) {
1524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!strncmp(argv[0], help_str, strlen(argv[0])))
1534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            print_help_menu();
1544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    } else
1554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev	    alsaucm_test_cmd_svr();
1564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
1574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
1584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchevstatic int process_cmd(char *cmdStr)
1604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev{
1614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    const char **list = NULL , *str = NULL;
1624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    long lval;
1634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int err, i;
1644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *command = NULL;
1654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    int count = 0;
1664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    char *identifier = NULL, *value = NULL;
1674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    struct cmd *cmd = NULL;
1684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    command = strtok_r(cmdStr, " ", &value);
1704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    identifier = strtok_r(NULL, " ", &value);
1714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (command == NULL) {
1734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        fprintf(stderr, "NULL pointer encountered. Invalid value for command");
1744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -1;
1754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
1764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    for (cmd = cmds; cmd->cmd_str != NULL; cmd++) {
1784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (strncmp(cmd->cmd_str, command, strlen(cmd->cmd_str)) == 0)
1794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            break;
1804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
1814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if (cmd->cmd_str == NULL) {
1834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        fprintf(stderr, "Unknown command '%s'\n", command);
1844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -EINVAL;
1854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
1864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    if ((identifier == NULL) && ((cmd->code != UCM_HELP) &&
1884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        (cmd->code != UCM_LISTCARDS) && (cmd->code != UCM_RESET) &&
1894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        (cmd->code != UCM_RELOAD)))
1904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    {
1914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        fprintf(stderr, "NULL pointer encountered. Invalid value for identifier");
1924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        return -1;
1934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
1944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
1954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    switch (cmd->code) {
1964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_HELP:
1974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        print_help_menu();
1984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
1994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_OPEN:
2014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (uc_mgr) {
2024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            snd_use_case_mgr_close(uc_mgr);
2034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            uc_mgr = NULL;
2044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_mgr_open(&uc_mgr, identifier);
2074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
2084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to open sound card %s: %d\n", cmd->cmd_str, identifier, err);
2094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return err;
2104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        snd_use_case_mgr_wait_for_parsing(uc_mgr);
2124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
2134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_LISTCARDS:
2154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_card_list(&list);
2164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
2174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to get card list: %d\n", cmd->cmd_str, err);
2184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return err;
2194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err == 0) {
2214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            printf("list is empty\n");
2224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return 0;
2234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2254765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        for (i = 0; i < err; i++)
2264765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            printf("  %i: %s\n", i+1, list[i]);
2274765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        snd_use_case_free_list(list, err);
2284765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
2294765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2304765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_RESET:
2314765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!uc_mgr) {
2324765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "No card is opened before. %s command can't be executed\n", cmd->cmd_str);
2334765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return -EINVAL;
2344765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2354765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2364765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_mgr_reset(uc_mgr);
2374765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
2384765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to reset sound card %d\n", cmd->cmd_str, err);
2394765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return err;
2404765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2414765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
2424765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2434765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_RELOAD:
2444765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!uc_mgr) {
2454765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "No card is opened before. %s command can't be executed\n", cmd->cmd_str);
2464765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return -EINVAL;
2474765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2484765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2494765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_mgr_reload(uc_mgr);
2504765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
2514765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to reload manager %d\n", cmd->cmd_str, err);
2524765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return err;
2534765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2544765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
2554765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2564765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_LIST:
2574765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!uc_mgr) {
2584765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "No card is opened before. %s command can't be executed\n", cmd->cmd_str);
2594765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return -EINVAL;
2604765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2614765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2624765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_get_list(uc_mgr, identifier, &list);
2634765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
2644765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to get list %s: %d\n", cmd->cmd_str, identifier, err);
2654765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return err;
2664765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2674765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err == 0) {
2684765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           printf("list is empty\n");
2694765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           return 0;
2704765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2714765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        for (i = 0; i < err; i++) {
2724765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            printf("  %i: %s\n", i+1, list[i]);
2734765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2744765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        snd_use_case_free_list(list, err);
2754765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
2764765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2774765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_SET:
2784765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!uc_mgr) {
2794765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "No card is opened before. %s command can't be executed\n", cmd->cmd_str);
2804765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return -EINVAL;
2814765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2824765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2834765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_set(uc_mgr, identifier, value);
2844765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
2854765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to set %s=%s: %d\n", cmd->cmd_str, identifier, value, err);
2864765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return err;
2874765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2884765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
2894765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2904765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_GET:
2914765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!uc_mgr) {
2924765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "No card is opened before. %s command can't be executed\n", cmd->cmd_str);
2934765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return -EINVAL;
2944765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
2954765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
2964765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_get(uc_mgr, identifier, &str);
2974765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
2984765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to get %s: %d\n", cmd->cmd_str, identifier, err);
2994765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return err;
3004765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
3014765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        printf("  %s=%s\n", identifier, str);
3024765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        free((void *)str);
3034765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
3044765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3054765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    case UCM_GETI:
3064765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (!uc_mgr) {
3074765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           fprintf(stderr, "No card is opened before. %s command can't be executed\n", cmd->cmd_str);
3084765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev           return -EINVAL;
3094765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
3104765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3114765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        err = snd_use_case_geti(uc_mgr, identifier, &lval);
3124765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        if (err < 0) {
3134765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            fprintf(stderr, "%s: error failed to get integer %s: %d\n", cmd->cmd_str, identifier, err);
3144765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev            return lval;
3154765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        }
3164765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        printf("  %s=%li\n", identifier, lval);
3174765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
3184765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
3194765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    default:
3204765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev        break;
3214765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    }
3224765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev    return 0;
3234765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev}
3244765c439491ddda3de658e62cc4a64d10e726b34Iliyan Malchev
325