aboutsummaryrefslogtreecommitdiffstats
path: root/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-pipewire-cli-add-support-for-printing-endpoint-info-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-pipewire-cli-add-support-for-printing-endpoint-info-.patch')
-rw-r--r--meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-pipewire-cli-add-support-for-printing-endpoint-info-.patch167
1 files changed, 167 insertions, 0 deletions
diff --git a/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-pipewire-cli-add-support-for-printing-endpoint-info-.patch b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-pipewire-cli-add-support-for-printing-endpoint-info-.patch
new file mode 100644
index 00000000..0456f84a
--- /dev/null
+++ b/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-pipewire-cli-add-support-for-printing-endpoint-info-.patch
@@ -0,0 +1,167 @@
+From 76865803c2db13b753e1261e01de22760c7b398b Mon Sep 17 00:00:00 2001
+From: George Kiagiadakis <george.kiagiadakis@collabora.com>
+Date: Tue, 28 May 2019 11:46:36 +0300
+Subject: [PATCH] pipewire-cli: add support for printing endpoint info & params
+
+Upstream-Status: Pending
+---
+ src/tools/pipewire-cli.c | 107 ++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 106 insertions(+), 1 deletion(-)
+
+diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c
+index 6110d170..0dbc8368 100644
+--- a/src/tools/pipewire-cli.c
++++ b/src/tools/pipewire-cli.c
+@@ -37,6 +37,8 @@
+ #include <pipewire/type.h>
+ #include <pipewire/permission.h>
+
++#include <extensions/session-manager.h>
++
+ static const char WHITESPACE[] = " \t";
+
+ struct remote_data;
+@@ -174,8 +176,10 @@ static void print_params(struct spa_param_info *params, uint32_t n_params, char
+ return;
+ }
+ for (i = 0; i < n_params; i++) {
++ const struct spa_type_info *type_info = spa_type_param;
++
+ fprintf(stdout, "%c\t %d (%s) %c%c\n", mark, params[i].id,
+- spa_debug_type_find_name(spa_type_param, params[i].id),
++ spa_debug_type_find_name(type_info, params[i].id),
+ params[i].flags & SPA_PARAM_INFO_READ ? 'r' : '-',
+ params[i].flags & SPA_PARAM_INFO_WRITE ? 'w' : '-');
+ }
+@@ -652,6 +656,40 @@ static void info_device(struct proxy_data *pd)
+ info->change_mask = 0;
+ }
+
++static void info_endpoint(struct proxy_data *pd)
++{
++ struct pw_endpoint_info *info = pd->info;
++ const char *direction;
++
++ info_global(pd);
++ fprintf(stdout, "\tname: %s\n", info->name);
++ fprintf(stdout, "\tmedia-class: %s\n", info->media_class);
++ switch(info->direction) {
++ case PW_ENDPOINT_DIRECTION_SINK_INPUT:
++ direction = "sink-input";
++ break;
++ case PW_ENDPOINT_DIRECTION_SOURCE_OUTPUT:
++ direction = "source-output";
++ break;
++ case PW_ENDPOINT_DIRECTION_SOURCE:
++ direction = "source";
++ break;
++ case PW_ENDPOINT_DIRECTION_SINK:
++ direction = "sink";
++ break;
++ default:
++ direction = "invalid";
++ break;
++ }
++ fprintf(stdout, "\tdirection: %s\n", direction);
++ fprintf(stdout, "\tflags: 0x%x\n", info->flags);
++ fprintf(stdout, "%c\tstreams: %u\n", MARK_CHANGE(0), info->n_streams);
++ fprintf(stdout, "%c\tsession: %u\n", MARK_CHANGE(0), info->session_id);
++ print_properties(info->props, MARK_CHANGE(2), true);
++ print_params(info->params, info->n_params, MARK_CHANGE(3), true);
++ info->change_mask = 0;
++}
++
+ static void core_event_info(void *object, const struct pw_core_info *info)
+ {
+ struct proxy_data *pd = object;
+@@ -853,6 +891,63 @@ static const struct pw_device_proxy_events device_events = {
+ .param = event_param
+ };
+
++static void endpoint_info_free(struct pw_endpoint_info *info)
++{
++ free(info->name);
++ free(info->media_class);
++ free(info->params);
++ if (info->props)
++ pw_properties_free ((struct pw_properties *)info->props);
++ free(info);
++}
++
++static void endpoint_event_info(void *object,
++ const struct pw_endpoint_info *update)
++{
++ struct proxy_data *pd = object;
++ struct remote_data *rd = pd->rd;
++ struct pw_endpoint_info *info = pd->info;
++
++ if (!info) {
++ info = pd->info = calloc(1, sizeof(*info));
++ info->id = update->id;
++ info->name = strdup(update->name);
++ info->media_class = strdup(update->media_class);
++ info->direction = update->direction;
++ info->flags = update->flags;
++ }
++ if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_STREAMS)
++ info->n_streams = update->n_streams;
++ if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_SESSION)
++ info->session_id = update->session_id;
++ if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_PARAMS) {
++ info->n_params = update->n_params;
++ free(info->params);
++ info->params = malloc(info->n_params * sizeof(struct spa_param_info));
++ memcpy(info->params, update->params,
++ info->n_params * sizeof(struct spa_param_info));
++ }
++ if (update->change_mask & PW_ENDPOINT_CHANGE_MASK_PROPS) {
++ if (info->props)
++ pw_properties_free ((struct pw_properties *)info->props);
++ info->props =
++ (struct spa_dict *) pw_properties_new_dict (update->props);
++ }
++
++ if (pd->global == NULL)
++ pd->global = pw_map_lookup(&rd->globals, info->id);
++ if (pd->global && pd->global->info_pending) {
++ info_endpoint(pd);
++ pd->global->info_pending = false;
++ }
++}
++
++static const struct pw_endpoint_proxy_events endpoint_events = {
++ PW_VERSION_ENDPOINT_PROXY_EVENTS,
++ .info = endpoint_event_info,
++ .param = event_param
++};
++
+ static void
+ destroy_proxy (void *data)
+ {
+@@ -939,6 +1034,12 @@ static bool bind_global(struct remote_data *rd, struct global *global, char **er
+ destroy = (pw_destroy_t) pw_link_info_free;
+ info_func = info_link;
+ break;
++ case PW_TYPE_INTERFACE_Endpoint:
++ events = &endpoint_events;
++ client_version = PW_VERSION_ENDPOINT_PROXY;
++ destroy = (pw_destroy_t) endpoint_info_free;
++ info_func = info_endpoint;
++ break;
+ default:
+ asprintf(error, "unsupported type %s", spa_debug_type_find_name(pw_type_info(), global->type));
+ return false;
+@@ -1213,6 +1314,10 @@ static bool do_enum_params(struct data *data, const char *cmd, char *args, char
+ pw_device_proxy_enum_params((struct pw_device_proxy*)global->proxy, 0,
+ param_id, 0, 0, NULL);
+ break;
++ case PW_TYPE_INTERFACE_Endpoint:
++ pw_endpoint_proxy_enum_params((struct pw_endpoint_proxy*)global->proxy, 0,
++ param_id, 0, 0, NULL);
++ break;
+ default:
+ asprintf(error, "enum-params not implemented on object %d", atoi(a[0]));
+ return false;
+--
+2.23.0
+