1 /* -*- Mode: C ; c-basic-offset: 2 -*- */
2 /*****************************************************************************
10 *****************************************************************************/
15 #include "../proxies/jmcore_proxy.h"
17 void ladish_dump_element_stack(struct ladish_parse_context
* context_ptr
)
22 log_info("depth=%d", context_ptr
->depth
);
24 for (depth
= context_ptr
->depth
; depth
>= 0; depth
--)
26 switch (context_ptr
->element
[depth
])
28 case PARSE_CONTEXT_ROOT
:
31 case PARSE_CONTEXT_STUDIO
:
34 case PARSE_CONTEXT_JACK
:
37 case PARSE_CONTEXT_CONF
:
40 case PARSE_CONTEXT_PARAMETER
:
43 case PARSE_CONTEXT_CLIENTS
:
46 case PARSE_CONTEXT_CLIENT
:
49 case PARSE_CONTEXT_PORTS
:
52 case PARSE_CONTEXT_PORT
:
55 case PARSE_CONTEXT_DICT
:
58 case PARSE_CONTEXT_KEY
:
61 case PARSE_CONTEXT_CONNECTIONS
:
62 descr
= "connections";
64 case PARSE_CONTEXT_CONNECTION
:
67 case PARSE_CONTEXT_APPLICATIONS
:
68 descr
= "applications";
70 case PARSE_CONTEXT_APPLICATION
:
71 descr
= "application";
73 case PARSE_CONTEXT_ROOMS
:
76 case PARSE_CONTEXT_ROOM
:
79 case PARSE_CONTEXT_PROJECT
:
86 log_info("%d - %u (%s)", depth
, context_ptr
->element
[depth
], descr
);
90 static const char * get_string_attribute_internal(const char * const * attr
, const char * key
, bool optional
)
92 while (attr
[0] != NULL
)
94 ASSERT(attr
[1] != NULL
);
95 if (strcmp(attr
[0], key
) == 0)
104 log_error("attribute \"%s\" is missing", key
);
110 const char * ladish_get_string_attribute(const char * const * attr
, const char * key
)
112 return get_string_attribute_internal(attr
, key
, false);
115 const char * ladish_get_uuid_attribute(const char * const * attr
, const char * key
, uuid_t uuid
, bool optional
)
119 value
= get_string_attribute_internal(attr
, key
, optional
);
125 if (uuid_parse(value
, uuid
) != 0)
127 log_error("cannot parse uuid \"%s\"", value
);
134 const char * ladish_get_bool_attribute(const char * const * attr
, const char * key
, bool * bool_value_ptr
)
136 const char * value_str
;
138 value_str
= ladish_get_string_attribute(attr
, key
);
139 if (value_str
== NULL
)
144 if (strcmp(value_str
, "true") == 0)
146 *bool_value_ptr
= true;
150 if (strcmp(value_str
, "false") == 0)
152 *bool_value_ptr
= false;
156 log_error("boolean XML attribute has value of \"%s\" but only \"true\" and \"false\" are valid", value_str
);
160 const char * ladish_get_byte_attribute(const char * const * attr
, const char * key
, uint8_t * byte_value_ptr
)
162 const char * value_str
;
166 value_str
= ladish_get_string_attribute(attr
, key
);
167 if (value_str
== NULL
)
172 errno
= 0; /* To distinguish success/failure after call */
173 li_value
= strtol(value_str
, &end_ptr
, 10);
174 if ((errno
== ERANGE
&& (li_value
== LONG_MAX
|| li_value
== LONG_MIN
)) || (errno
!= 0 && li_value
== 0) || end_ptr
== value_str
)
176 log_error("value '%s' of attribute '%s' is not valid integer.", value_str
, key
);
180 if (li_value
< 0 || li_value
> 255)
182 log_error("value '%s' of attribute '%s' is not valid uint8.", value_str
, key
);
186 *byte_value_ptr
= (uint8_t)li_value
;
191 ladish_get_name_and_uuid_attributes(
192 const char * element_description
,
193 const char * const * attr
,
194 const char ** name_str_ptr
,
195 const char ** uuid_str_ptr
,
198 const char * name_str
;
199 const char * uuid_str
;
201 name_str
= ladish_get_string_attribute(attr
, "name");
202 if (name_str
== NULL
)
204 log_error("%s \"name\" attribute is not available", element_description
);
208 uuid_str
= ladish_get_uuid_attribute(attr
, "uuid", uuid
, false);
209 if (uuid_str
== NULL
)
211 log_error("%s \"uuid\" attribute is not available. name=\"%s\"", element_description
, name_str
);
215 *name_str_ptr
= name_str
;
216 *uuid_str_ptr
= uuid_str
;
221 ladish_parse_port_type_and_direction_attributes(
222 const char * element_description
,
223 const char * const * attr
,
225 uint32_t * flags_ptr
)
227 const char * type_str
;
228 const char * direction_str
;
230 type_str
= ladish_get_string_attribute(attr
, "type");
231 if (type_str
== NULL
)
233 log_error("%s \"type\" attribute is not available", element_description
);
237 direction_str
= ladish_get_string_attribute(attr
, "direction");
238 if (direction_str
== NULL
)
240 log_error("%s \"direction\" attribute is not available", element_description
);
244 if (strcmp(type_str
, "midi") == 0)
246 *type_ptr
= JACKDBUS_PORT_TYPE_MIDI
;
248 else if (strcmp(type_str
, "audio") == 0)
250 *type_ptr
= JACKDBUS_PORT_TYPE_AUDIO
;
254 log_error("%s \"type\" attribute contains unknown value \"%s\"", element_description
, type_str
);
258 if (strcmp(direction_str
, "playback") == 0)
261 JACKDBUS_PORT_SET_INPUT(*flags_ptr
);
263 else if (strcmp(direction_str
, "capture") == 0)
266 JACKDBUS_PORT_SET_OUTPUT(*flags_ptr
);
270 log_error("%s \"direction\" attribute contains unknown value \"%s\"", element_description
, direction_str
);
277 struct interlink_context
279 ladish_graph_handle vgraph
;
280 ladish_app_supervisor_handle app_supervisor
;
283 #define ctx_ptr ((struct interlink_context *)context)
289 ladish_graph_handle graph_handle
,
290 ladish_client_handle jclient
,
292 void ** client_iteration_context_ptr_ptr
)
296 ladish_client_handle vclient
;
298 ladish_app_handle app
;
302 if (strcmp(name
, "system") == 0)
307 interlinked
= ladish_client_get_interlink(jclient
, vclient_uuid
);
309 if (ladish_client_has_app(jclient
))
311 ASSERT(interlinked
); /* jclient has app associated but is not interlinked */
314 else if (interlinked
)
316 ASSERT_NO_PASS
; /* jclient has no app associated but is interlinked */
319 ASSERT(!interlinked
);
321 pid
= ladish_client_get_pid(jclient
);
322 jmcore
= pid
!= 0 && pid
!= jmcore_proxy_get_pid_cached();
328 app
= ladish_app_supervisor_find_app_by_name(ctx_ptr
->app_supervisor
, name
);
331 log_info("JACK client \"%s\" not found in app supervisor", name
);
335 vclient
= ladish_graph_find_client_by_name(ctx_ptr
->vgraph
, name
, true);
338 log_error("JACK client '%s' has no vclient associated", name
);
342 log_info("Interlinking clients of app '%s'", name
);
343 ladish_client_interlink(jclient
, vclient
);
345 ladish_app_get_uuid(app
, app_uuid
);
346 ladish_client_set_app(jclient
, app_uuid
);
347 ladish_client_set_app(vclient
, app_uuid
);
349 ladish_client_set_vgraph(jclient
, ctx_ptr
->vgraph
);
354 void ladish_interlink_clients(ladish_graph_handle vgraph
, ladish_app_supervisor_handle app_supervisor
)
356 struct interlink_context ctx
;
359 ctx
.app_supervisor
= app_supervisor
;
361 ladish_graph_iterate_nodes(ladish_studio_get_jack_graph(), false, &ctx
, interlink_client
, NULL
, NULL
);