pw-metadata: make it possible to select metdata by name

This commit is contained in:
Wim Taymans 2020-11-20 17:47:21 +01:00
parent d5680a119f
commit d822a0b1d0

View file

@ -38,6 +38,7 @@ struct data {
struct pw_main_loop *loop; struct pw_main_loop *loop;
const char *opt_remote; const char *opt_remote;
const char *opt_name;
bool opt_monitor; bool opt_monitor;
bool opt_delete; bool opt_delete;
uint32_t opt_id; uint32_t opt_id;
@ -89,16 +90,21 @@ static void registry_event_global(void *data, uint32_t id, uint32_t permissions,
const struct spa_dict *props) const struct spa_dict *props)
{ {
struct data *d = data; struct data *d = data;
const char *str;
if (strcmp(type, PW_TYPE_INTERFACE_Metadata) != 0) if (strcmp(type, PW_TYPE_INTERFACE_Metadata) != 0)
return; return;
if ((str = spa_dict_lookup(props, PW_KEY_METADATA_NAME)) != NULL &&
strcmp(str, d->opt_name) != 0)
return;
if (d->metadata != NULL) { if (d->metadata != NULL) {
pw_log_warn("Multiple metadata: ignoring metadata %d", id); pw_log_warn("Multiple metadata: ignoring metadata %d", id);
return; return;
} }
fprintf(stdout, "Found \"%s\" metadata %d\n", d->opt_name, id);
d->metadata = pw_registry_bind(d->registry, d->metadata = pw_registry_bind(d->registry,
id, type, PW_VERSION_METADATA, 0); id, type, PW_VERSION_METADATA, 0);
@ -162,15 +168,16 @@ static void do_quit(void *userdata, int signal_number)
pw_main_loop_quit(data->loop); pw_main_loop_quit(data->loop);
} }
static void show_help(const char *name) static void show_help(struct data *data, const char *name)
{ {
fprintf(stdout, "%s [options] [ id [ key [ value [ type ] ] ] ]\n" fprintf(stdout, "%s [options] [ id [ key [ value [ type ] ] ] ]\n"
" -h, --help Show this help\n" " -h, --help Show this help\n"
" --version Show version\n" " --version Show version\n"
" -r, --remote Remote daemon name\n" " -r, --remote Remote daemon name\n"
" -m, --monitor Monitor metadata\n" " -m, --monitor Monitor metadata\n"
" -d, --delete Delete metadata\n", " -d, --delete Delete metadata\n"
name); " -n, --name Metadata name (default: \"%s\")\n",
name, data->opt_name);
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@ -183,15 +190,18 @@ int main(int argc, char *argv[])
{ "remote", required_argument, NULL, 'r' }, { "remote", required_argument, NULL, 'r' },
{ "monitor", no_argument, NULL, 'm' }, { "monitor", no_argument, NULL, 'm' },
{ "delete", no_argument, NULL, 'd' }, { "delete", no_argument, NULL, 'd' },
{ "name", required_argument, NULL, 'n' },
{ NULL, 0, NULL, 0} { NULL, 0, NULL, 0}
}; };
pw_init(&argc, &argv); pw_init(&argc, &argv);
while ((c = getopt_long(argc, argv, "hVr:md", long_options, NULL)) != -1) { data.opt_name = "default";
while ((c = getopt_long(argc, argv, "hVr:mdn:", long_options, NULL)) != -1) {
switch (c) { switch (c) {
case 'h': case 'h':
show_help(argv[0]); show_help(&data, argv[0]);
return 0; return 0;
case 'V': case 'V':
fprintf(stdout, "%s\n" fprintf(stdout, "%s\n"
@ -210,8 +220,11 @@ int main(int argc, char *argv[])
case 'd': case 'd':
data.opt_delete = true; data.opt_delete = true;
break; break;
case 'n':
data.opt_name = optarg;
break;
default: default:
show_help(argv[0]); show_help(&data, argv[0]);
return -1; return -1;
} }
} }