summaryrefslogtreecommitdiffstats
path: root/meta-pipewire/recipes-multimedia/pipewire/pipewire/0010-pipewire-cli-add-support-for-printing-endpoint-info-.patch
blob: 0456f84aeca76c3f9cbe52308b3f13c659040e7a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
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