pipewire: security-manager: add patch to grant dbus privilege to pipewire
[AGL/meta-agl-devel.git] / meta-pipewire / recipes-multimedia / pipewire / pipewire / 0004-pipewire-cli-add-command-to-modify-endpoint-control-.patch
1 From 824c8abf88e9ee82567c177145798b619298ab91 Mon Sep 17 00:00:00 2001
2 From: George Kiagiadakis <george.kiagiadakis@collabora.com>
3 Date: Wed, 5 Jun 2019 14:57:37 +0300
4 Subject: [PATCH] pipewire-cli: add command to modify endpoint control values
5
6 Upstream-Status: Pending
7 ---
8  src/tools/pipewire-cli.c | 86 ++++++++++++++++++++++++++++++++++++++++
9  1 file changed, 86 insertions(+)
10
11 diff --git a/src/tools/pipewire-cli.c b/src/tools/pipewire-cli.c
12 index 9511db82..b52ab100 100644
13 --- a/src/tools/pipewire-cli.c
14 +++ b/src/tools/pipewire-cli.c
15 @@ -210,6 +210,7 @@ static bool do_export_node(struct data *data, const char *cmd, char *args, char
16  static bool do_enum_params(struct data *data, const char *cmd, char *args, char **error);
17  static bool do_permissions(struct data *data, const char *cmd, char *args, char **error);
18  static bool do_get_permissions(struct data *data, const char *cmd, char *args, char **error);
19 +static bool do_endpoint_control(struct data *data, const char *cmd, char *args, char **error);
20  
21  static struct command command_list[] = {
22         { "help", "Show this help", do_help },
23 @@ -228,6 +229,7 @@ static struct command command_list[] = {
24         { "enum-params", "Enumerate params of an object <object-id> [<param-id-name>]", do_enum_params },
25         { "permissions", "Set permissions for a client <client-id> <permissions>", do_permissions },
26         { "get-permissions", "Get permissions of a client <client-id>", do_get_permissions },
27 +       { "endpoint-control", "Set control value on an endpoint <object-id> <control-id> <type: b|i|l|d> <value>", do_endpoint_control },
28  };
29  
30  static bool do_help(struct data *data, const char *cmd, char *args, char **error)
31 @@ -1357,6 +1359,90 @@ static bool do_get_permissions(struct data *data, const char *cmd, char *args, c
32         return true;
33  }
34  
35 +static bool do_endpoint_control(struct data *data, const char *cmd, char *args, char **error)
36 +{
37 +       struct remote_data *rd = data->current;
38 +       int n;
39 +       char *a[4];
40 +       uint32_t id, control_id;
41 +       struct global *global;
42 +       char buffer[1024];
43 +       struct spa_pod_builder b;
44 +       struct spa_pod_frame f;
45 +       struct spa_pod *param;
46 +
47 +       n = pw_split_ip(args, WHITESPACE, 4, a);
48 +       if (n < 4) {
49 +               asprintf(error, "%s <object-id> <control-id> <type: b|i|l|d> <value>", cmd);
50 +               return false;
51 +       }
52 +
53 +       id = atoi(a[0]);
54 +       global = pw_map_lookup(&rd->globals, id);
55 +       if (global == NULL) {
56 +               asprintf(error, "%s: unknown global %d", cmd, id);
57 +               return false;
58 +       }
59 +       if (global->type != PW_TYPE_INTERFACE_Endpoint) {
60 +               asprintf(error, "object %d is not an endpoint", atoi(a[0]));
61 +               return false;
62 +       }
63 +       if (global->proxy == NULL) {
64 +               if (!bind_global(rd, global, error))
65 +                       return false;
66 +       }
67 +
68 +       control_id = atoi(a[1]);
69 +
70 +       spa_pod_builder_init(&b, buffer, 1024);
71 +       spa_pod_builder_push_object (&b, &f,
72 +               PW_ENDPOINT_OBJECT_ParamControl, PW_ENDPOINT_PARAM_Control);
73 +       spa_pod_builder_add(&b,
74 +               PW_ENDPOINT_PARAM_CONTROL_id, SPA_POD_Int(control_id),
75 +               NULL);
76 +
77 +       switch (*a[2]) {
78 +       case 'b': {
79 +               bool val = atoi(a[3]);
80 +               spa_pod_builder_add(&b,
81 +                       PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Bool(val),
82 +                       NULL);
83 +               break;
84 +       }
85 +       case 'i': {
86 +               int val = atoi(a[3]);
87 +               spa_pod_builder_add(&b,
88 +                       PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Int(val),
89 +                       NULL);
90 +               break;
91 +       }
92 +       case 'l': {
93 +               int64_t val = strtoll(a[3], NULL, 10);
94 +               spa_pod_builder_add(&b,
95 +                       PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Long(val),
96 +                       NULL);
97 +               break;
98 +       }
99 +       case 'd': {
100 +               double val = strtod(a[3], NULL);
101 +               spa_pod_builder_add(&b,
102 +                       PW_ENDPOINT_PARAM_CONTROL_value, SPA_POD_Double(val),
103 +                       NULL);
104 +               break;
105 +       }
106 +       default:
107 +               asprintf(error, "%s: unknown value type %s", cmd, a[2]);
108 +               return false;
109 +       }
110 +
111 +       param = spa_pod_builder_pop(&b, &f);
112 +
113 +       pw_endpoint_proxy_set_param((struct pw_endpoint_proxy *) global->proxy,
114 +               PW_ENDPOINT_PARAM_Control, 0, param);
115 +
116 +       return true;
117 +}
118 +
119  static bool parse(struct data *data, char *buf, size_t size, char **error)
120  {
121         char *a[2];
122 -- 
123 2.20.1
124