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
|