From 10d277ce03fa6b6438a564f9859567e0b65aa9e0 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 23 Nov 2018 19:29:36 +0100 Subject: [PATCH] cli: introspect device --- src/pipewire/introspect.c | 5 +++++ src/tools/pipewire-cli.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/pipewire/introspect.c b/src/pipewire/introspect.c index 44221d0d2..e6f8d90cb 100644 --- a/src/pipewire/introspect.c +++ b/src/pipewire/introspect.c @@ -365,6 +365,9 @@ struct pw_device_info *pw_device_info_update(struct pw_device_info *info, return NULL; } info->id = update->id; + if (info->name) + free((void *) info->name); + info->name = update->name ? strdup(update->name) : NULL; info->change_mask = update->change_mask; if (update->change_mask & PW_CLIENT_CHANGE_MASK_PROPS) { @@ -377,6 +380,8 @@ struct pw_device_info *pw_device_info_update(struct pw_device_info *info, void pw_device_info_free(struct pw_device_info *info) { + if (info->name) + free((void *) info->name); if (info->props) pw_spa_dict_destroy(info->props); free(info); diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c index 28a2b8224..1fd53c574 100644 --- a/src/tools/pipewire-cli.c +++ b/src/tools/pipewire-cli.c @@ -606,6 +606,15 @@ static void info_link(struct proxy_data *pd) info->change_mask = 0; } +static void info_device(struct proxy_data *pd) +{ + struct pw_device_info *info = pd->info; + + info_global(pd); + fprintf(stdout, "\tname: \"%s\"\n", info->name); + print_properties(info->props, MARK_CHANGE(0), true); + info->change_mask = 0; +} static void core_event_info(void *object, struct pw_core_info *info) { @@ -781,6 +790,27 @@ static const struct pw_link_proxy_events link_events = { .info = link_event_info }; + +static void device_event_info(void *object, struct pw_device_info *info) +{ + struct proxy_data *pd = object; + struct remote_data *rd = pd->rd; + if (pd->info) + fprintf(stdout, "remote %d device %d changed\n", rd->id, info->id); + pd->info = pw_device_info_update(pd->info, info); + if (pd->global == NULL) + pd->global = pw_map_lookup(&rd->globals, info->id); + if (pd->global && pd->global->info_pending) { + info_device(pd); + pd->global->info_pending = false; + } +} + +static const struct pw_device_proxy_events device_events = { + PW_VERSION_DEVICE_PROXY_EVENTS, + .info = device_event_info +}; + static void destroy_proxy (void *data) { @@ -831,6 +861,12 @@ static bool bind_global(struct remote_data *rd, struct global *global, char **er destroy = (pw_destroy_t) pw_module_info_free; info_func = info_module; break; + case PW_TYPE_INTERFACE_Device: + events = &device_events; + client_version = PW_VERSION_DEVICE; + destroy = (pw_destroy_t) pw_device_info_free; + info_func = info_device; + break; case PW_TYPE_INTERFACE_Node: events = &node_events; client_version = PW_VERSION_NODE;