acp: make it possible to pass properties to test tool

So you can do:

spa-acp-tool -c 1 -p 'device.profile-set=behringer-umc202.conf'
This commit is contained in:
Wim Taymans 2021-01-11 11:42:46 +01:00
parent 878240e30a
commit ac861a86c0

View file

@ -38,6 +38,7 @@
struct data { struct data {
int verbose; int verbose;
int card_index; int card_index;
char *properties;
struct acp_card *card; struct acp_card *card;
bool quit; bool quit;
}; };
@ -599,7 +600,7 @@ static int handle_input(struct data *data)
static int do_probe(struct data *data) static int do_probe(struct data *data)
{ {
uint32_t n_items = 0; uint32_t n_items = 0;
struct acp_dict_item items[2]; struct acp_dict_item items[64];
struct acp_dict props; struct acp_dict props;
acp_set_log_func(log_func, data); acp_set_log_func(log_func, data);
@ -607,6 +608,35 @@ static int do_probe(struct data *data)
items[n_items++] = ACP_DICT_ITEM_INIT("use-ucm", "true"); items[n_items++] = ACP_DICT_ITEM_INIT("use-ucm", "true");
items[n_items++] = ACP_DICT_ITEM_INIT("verbose", data->verbose ? "true" : "false"); items[n_items++] = ACP_DICT_ITEM_INIT("verbose", data->verbose ? "true" : "false");
if (data->properties != NULL) {
char *p = data->properties, *e, f;
while (*p) {
const char *k, *v;
if ((e = strchr(p, '=')) == NULL)
break;
*e = '\0';
k = p;
p = e+1;
if (*p == '\"') {
p++;
f = '\"';
} else {
f = ' ';
}
if ((e = strchr(p, f)) == NULL &&
(e = strchr(p, '\0')) == NULL)
break;
*e = '\0';
v = p;
p = e+1;
items[n_items++] = ACP_DICT_ITEM_INIT(k, v);
if (n_items == 64)
break;
}
}
props = ACP_DICT_INIT(items, n_items); props = ACP_DICT_INIT(items, n_items);
data->card = acp_card_new(data->card_index, &props); data->card = acp_card_new(data->card_index, &props);
@ -663,12 +693,13 @@ static int do_prompt(struct data *data)
return 0; return 0;
} }
#define OPTIONS "hvc:" #define OPTIONS "hvc:p:"
static const struct option long_options[] = { static const struct option long_options[] = {
{ "help", no_argument, NULL, 'h'}, { "help", no_argument, NULL, 'h'},
{ "verbose", no_argument, NULL, 'v'}, { "verbose", no_argument, NULL, 'v'},
{ "card", required_argument, NULL, 'c' }, { "card", required_argument, NULL, 'c' },
{ "properties", required_argument, NULL, 'p' },
{ NULL, 0, NULL, 0 } { NULL, 0, NULL, 0 }
}; };
@ -684,6 +715,8 @@ static void show_usage(struct data *data, const char *name, bool is_error)
" -h, --help Show this help\n" " -h, --help Show this help\n"
" -v --verbose Be verbose\n" " -v --verbose Be verbose\n"
" -c --card Card number\n" " -c --card Card number\n"
" -p --properties Extra properties:\n"
" 'key=value ... '\n"
"\n"); "\n");
cmd_help(data, NULL, 0, NULL); cmd_help(data, NULL, 0, NULL);
} }
@ -712,6 +745,9 @@ int main(int argc, char *argv[])
} }
data.card_index = ret; data.card_index = ret;
break; break;
case 'p':
data.properties = strdup(optarg);
break;
default: default:
fprintf(stderr, "error: unknown option '%c'\n", c); fprintf(stderr, "error: unknown option '%c'\n", c);
goto error_usage; goto error_usage;
@ -731,6 +767,8 @@ int main(int argc, char *argv[])
if (data.card) if (data.card)
acp_card_destroy(data.card); acp_card_destroy(data.card);
free(data.properties);
return 0; return 0;
error_usage: error_usage: