pw-link: add option to print ids

Add an option to print the object ids
Improve monitor output
This commit is contained in:
Wim Taymans 2021-04-08 12:54:53 +02:00
parent a296007ed9
commit 40194833ce

View file

@ -59,6 +59,7 @@ struct data {
#define MODE_MONITOR (1<<3) #define MODE_MONITOR (1<<3)
#define MODE_DISCONNECT (1<<4) #define MODE_DISCONNECT (1<<4)
uint32_t opt_mode; uint32_t opt_mode;
bool opt_id;
bool opt_verbose; bool opt_verbose;
const char *opt_output; const char *opt_output;
const char *opt_input; const char *opt_input;
@ -79,6 +80,7 @@ struct data {
bool monitoring; bool monitoring;
bool list_inputs; bool list_inputs;
bool list_outputs; bool list_outputs;
const char *prefix;
regex_t out_port_regex, *out_regex; regex_t out_port_regex, *out_regex;
regex_t in_port_regex, *in_regex; regex_t in_port_regex, *in_regex;
@ -170,15 +172,21 @@ static char *port_alias(char *buffer, int size, struct object *n, struct object
static void print_port(struct data *data, const char *prefix, struct object *n, static void print_port(struct data *data, const char *prefix, struct object *n,
struct object *p, bool verbose) struct object *p, bool verbose)
{ {
char buffer[1024]; char buffer[1024], id[64] = "", *prefix2 = "";
fprintf(stdout, "%s%s\n", prefix, port_name(buffer, sizeof(buffer), n, p)); if (data->opt_id) {
snprintf(id, sizeof(id), "%4d ", p->id);
prefix2 = " ";
}
fprintf(stdout, "%s%s%s%s\n", data->prefix, prefix,
id, port_name(buffer, sizeof(buffer), n, p));
if (verbose) { if (verbose) {
port_path(buffer, sizeof(buffer), n, p); port_path(buffer, sizeof(buffer), n, p);
if (buffer[0] != '\0') if (buffer[0] != '\0')
fprintf(stdout, " %s%s\n", prefix, buffer); fprintf(stdout, "%s %s%s%s\n", data->prefix, prefix2, prefix, buffer);
port_alias(buffer, sizeof(buffer), n, p); port_alias(buffer, sizeof(buffer), n, p);
if (buffer[0] != '\0') if (buffer[0] != '\0')
fprintf(stdout, " %s%s\n", prefix, buffer); fprintf(stdout, "%s %s%s%s\n", data->prefix, prefix2, prefix, buffer);
} }
} }
@ -202,19 +210,23 @@ static void do_list_port_links(struct data *data, struct object *node, struct ob
spa_list_for_each(o, &data->objects, link) { spa_list_for_each(o, &data->objects, link) {
uint32_t peer; uint32_t peer;
const char *prefix; char prefix[64], id[16] = "";
if (data->opt_id)
snprintf(id, sizeof(id), "%4d ", o->id);
if (o->type != OBJECT_LINK) if (o->type != OBJECT_LINK)
continue; continue;
if (port->extra[0] == PW_DIRECTION_OUTPUT && if (port->extra[0] == PW_DIRECTION_OUTPUT &&
o->extra[0] == port->id) { o->extra[0] == port->id) {
peer = o->extra[1]; peer = o->extra[1];
prefix = " |-> "; snprintf(prefix, sizeof(prefix), "%s |-> ", id);
} }
else if (port->extra[0] == PW_DIRECTION_INPUT && else if (port->extra[0] == PW_DIRECTION_INPUT &&
o->extra[1] == port->id) { o->extra[1] == port->id) {
peer = o->extra[0]; peer = o->extra[0];
prefix = " |<- "; snprintf(prefix, sizeof(prefix), "%s |<- ", id);
} }
else else
continue; continue;
@ -352,7 +364,7 @@ static int do_unlink_ports(struct data *data)
return 0; return 0;
} }
static int do_monitor_port(struct data *data, struct object *port, bool added) static int do_monitor_port(struct data *data, struct object *port)
{ {
regex_t *regex = NULL; regex_t *regex = NULL;
bool do_print = false; bool do_print = false;
@ -375,13 +387,13 @@ static int do_monitor_port(struct data *data, struct object *port, bool added)
if (regex && !port_regex(data, node, port, regex)) if (regex && !port_regex(data, node, port, regex))
return 0; return 0;
print_port(data, added ? "+ " : "- ", node, port, data->opt_verbose); print_port(data, "", node, port, data->opt_verbose);
return 0; return 0;
} }
static int do_monitor_link(struct data *data, struct object *link, bool added) static int do_monitor_link(struct data *data, struct object *link)
{ {
char buffer1[1024], buffer2[1024]; char buffer1[1024], buffer2[1024], id[64] = "";
struct object *n1, *n2, *p1, *p2; struct object *n1, *n2, *p1, *p2;
if (!(data->opt_mode & MODE_LIST_LINKS)) if (!(data->opt_mode & MODE_LIST_LINKS))
@ -401,7 +413,10 @@ static int do_monitor_link(struct data *data, struct object *link, bool added)
if (data->in_regex && !port_regex(data, n2, p2, data->in_regex)) if (data->in_regex && !port_regex(data, n2, p2, data->in_regex))
return 0; return 0;
fprintf(stdout, "%s%s -> %s\n", added ? "+ " : "- ", if (data->opt_id)
snprintf(id, sizeof(id), "%4d ", link->id);
fprintf(stdout, "%s%s%s -> %s\n", data->prefix, id,
port_name(buffer1, sizeof(buffer1), n1, p1), port_name(buffer1, sizeof(buffer1), n1, p1),
port_name(buffer2, sizeof(buffer2), n2, p2)); port_name(buffer2, sizeof(buffer2), n2, p2));
return 0; return 0;
@ -454,12 +469,13 @@ static void registry_event_global(void *data, uint32_t id, uint32_t permissions,
spa_list_append(&d->objects, &obj->link); spa_list_append(&d->objects, &obj->link);
if (d->monitoring) { if (d->monitoring) {
d->prefix = "+ ";
switch (obj->type) { switch (obj->type) {
case OBJECT_PORT: case OBJECT_PORT:
do_monitor_port(d, obj, true); do_monitor_port(d, obj);
break; break;
case OBJECT_LINK: case OBJECT_LINK:
do_monitor_link(d, obj, true); do_monitor_link(d, obj);
break; break;
} }
} }
@ -474,12 +490,13 @@ static void registry_event_global_remove(void *object, uint32_t id)
return; return;
if (d->monitoring) { if (d->monitoring) {
d->prefix = "- ";
switch (obj->type) { switch (obj->type) {
case OBJECT_PORT: case OBJECT_PORT:
do_monitor_port(d, obj, false); do_monitor_port(d, obj);
break; break;
case OBJECT_LINK: case OBJECT_LINK:
do_monitor_link(d, obj, false); do_monitor_link(d, obj);
break; break;
} }
} }
@ -537,6 +554,7 @@ static void show_help(struct data *data, const char *name)
" -i, --input List input ports\n" " -i, --input List input ports\n"
" -l, --links List links\n" " -l, --links List links\n"
" -m, --monitor Monitor links\n" " -m, --monitor Monitor links\n"
" -I, --id List IDs\n"
" -v, --verbose Verbose port properties\n" " -v, --verbose Verbose port properties\n"
"Connect: %1$s [options] output input\n" "Connect: %1$s [options] output input\n"
" -L, --linger Linger (for use with -m)\n" " -L, --linger Linger (for use with -m)\n"
@ -561,6 +579,7 @@ int main(int argc, char *argv[])
{ "input", no_argument, NULL, 'i' }, { "input", no_argument, NULL, 'i' },
{ "links", no_argument, NULL, 'l' }, { "links", no_argument, NULL, 'l' },
{ "monitor", no_argument, NULL, 'm' }, { "monitor", no_argument, NULL, 'm' },
{ "id", no_argument, NULL, 'I' },
{ "verbose", no_argument, NULL, 'v' }, { "verbose", no_argument, NULL, 'v' },
{ "linger", no_argument, NULL, 'L' }, { "linger", no_argument, NULL, 'L' },
{ "passive", no_argument, NULL, 'P' }, { "passive", no_argument, NULL, 'P' },
@ -578,7 +597,7 @@ int main(int argc, char *argv[])
return -1; return -1;
} }
while ((c = getopt_long(argc, argv, "hVr:oilmvLPp:d", long_options, NULL)) != -1) { while ((c = getopt_long(argc, argv, "hVr:oilmIvLPp:d", long_options, NULL)) != -1) {
switch (c) { switch (c) {
case 'h': case 'h':
show_help(&data, argv[0]); show_help(&data, argv[0]);
@ -606,6 +625,9 @@ int main(int argc, char *argv[])
case 'm': case 'm':
data.opt_mode |= MODE_MONITOR; data.opt_mode |= MODE_MONITOR;
break; break;
case 'I':
data.opt_id = true;
break;
case 'v': case 'v':
data.opt_verbose = true; data.opt_verbose = true;
break; break;
@ -671,6 +693,8 @@ int main(int argc, char *argv[])
&data.registry_listener, &data.registry_listener,
&registry_events, &data); &registry_events, &data);
data.prefix = (data.opt_mode & MODE_MONITOR) ? "= " : "";
core_sync(&data); core_sync(&data);
pw_main_loop_run(data.loop); pw_main_loop_run(data.loop);