summaryrefslogtreecommitdiffstats
path: root/meta-pipewire/recipes-multimedia/pipewire/pipewire/0004-pipewire-cli-add-command-to-modify-endpoint-control-.patch
blob: 4394d60d54681c934e1f2fd1ae083f4543f16aa9 (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
From 824c8abf88e9ee82567c177145798b619298ab91 Mon Sep 17 00:00:00 2001
From: George Kiagiadakis <george.kiagiadakis@collabora.com>
Date: Wed, 5 Jun 2019 14:57:37 +0300
Subject: [PATCH] pipewire-cli: add command to modify endpoint control values

Upstream-Status: Pending
---
 src/tools/pipewire-cli.c | 86 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c
index 9511db82..b52ab100 100644
--- a/src/tools/pipewire-cli.c
+++ b/src/tools/pipewire-cli.c
@@ -210,6 +210,7 @@ static bool do_export_node(struct data *data, const char *cmd, char *args, char
 static bool do_enum_params(struct data *data, const char *cmd, char *args, char **error);
 static bool do_permissions(struct data *data, const char *cmd, char *args, char **error);
 static bool do_get_permissions(struct data *data, const char *cmd, char *args, char **error);
+static bool do_endpoint_control(struct data *data, const char *cmd, char *args, char **error);
 
 static struct command command_list[] = {
 	{ "help", "Show this help", do_help },
@@ -228,6 +229,7 @@ static struct command command_list[] = {
 	{ "enum-params", "Enumerate params of an object <object-id> [<param-id-name>]", do_enum_params },
 	{ "permissions", "Set permissions for a client <client-id> <permissions>", do_permissions },
 	{ "get-permissions", "Get permissions of a client <client-id>", do_get_permissions },
+	{ "endpoint-control", "Set control value on an endpoint <object-id> <control-id> <type: b|i|l|d> <value>", do_endpoint_control },
 };
 
 static bool do_help(struct data *data, const char *cmd, char *args, char **error)
@@ -1357,6 +1359,90 @@ static bool do_get_permissions(struct data *data, const char *cmd, char *args, c
 	return true;
 }
 
+static bool do_endpoint_control(struct data *data, const char *cmd, char *args, char **error)
+{
+	struct remote_data *rd = data->current;
+	int n;
+	char *a[4];
+	uint32_t id, control_id;
+	struct global *global;
+	char buffer[1024];
+	struct spa_pod_builder b;
+	struct spa_pod_frame f;
+	struct spa_pod *param;
+
+	n = pw_split_ip(args, WHITESPACE, 4, a);
+	if (n < 4) {
+		asprintf(error, "%s <object-id> <control-id> <type: b|i|l|d> <value>", cmd);
+		return false;
+	}
+
+	id = atoi(a[0]);
+	global = pw_map_lookup(&rd->globals, id);
+	if (global == NULL) {
+		asprintf(error, "%s: unknown global %d", cmd, id);
+		return false;
+	}
+	if (global->type != PW_TYPE_INTERFACE_Endpoint) {
+		asprintf(error, "object %d is not an endpoint", atoi(a[0]));
+		return false;
+	}
+	if (global->proxy == NULL) {
+		if (!bind_global(rd, global, error))
+			return false;
+	}
+
+	control_id = atoi(a[1]);
+
+	spa_pod_builder_init(&b, buffer, 1024);
+	spa_pod_builder_push_object (&b, &f,
+		PW_ENDPOINT_OBJECT_ParamControl, PW_ENDPOINT_PARAM_Control);
+	spa_pod_builder_add(&b,
+		PW_ENDPOINT_PARAM_CONTROL_id, SPA_POD_Int(control_id),
+		NULL);
+
+	switch (*a[2]) {
+	case 'b': {
+		bool val = atoi(a[3]);
+		spa_pod_builder_add(&b,
+			PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Bool(val),
+			NULL);
+		break;
+	}
+	case 'i': {
+		int val = atoi(a[3]);
+		spa_pod_builder_add(&b,
+			PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Int(val),
+			NULL);
+		break;
+	}
+	case 'l': {
+		int64_t val = strtoll(a[3], NULL, 10);
+		spa_pod_builder_add(&b,
+			PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Long(val),
+			NULL);
+		break;
+	}
+	case 'd': {
+		double val = strtod(a[3], NULL);
+		spa_pod_builder_add(&b,
+			PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Double(val),
+			NULL);
+		break;
+	}
+	default:
+		asprintf(error, "%s: unknown value type %s", cmd, a[2]);
+		return false;
+	}
+
+	param = spa_pod_builder_pop(&b, &f);
+
+	pw_endpoint_proxy_set_param((struct pw_endpoint_proxy *) global->proxy,
+		PW_ENDPOINT_PARAM_Control, 0, param);
+
+	return true;
+}
+
 static bool parse(struct data *data, char *buf, size_t size, char **error)
 {
 	char *a[2];
-- 
2.20.1