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