jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2188 lines
62KB

  1. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  2. /*
  3. Copyright (C) 2007,2008 Nedko Arnaudov
  4. Copyright (C) 2007-2008 Juuso Alasuutari
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #if defined(HAVE_CONFIG_H)
  17. #include "config.h"
  18. #endif
  19. #include <stdint.h>
  20. #include <string.h>
  21. #include <assert.h>
  22. #include <dbus/dbus.h>
  23. #include "jackdbus.h"
  24. #include "controller_internal.h"
  25. #include "xml.h"
  26. #define PTNODE_ENGINE "engine"
  27. #define PTNODE_DRIVER "driver"
  28. #define PTNODE_DRIVERS "drivers"
  29. #define PTNODE_INTERNALS "internals"
  30. #define ENGINE_DRIVER_PARAMETER_NAME "driver"
  31. #define ENGINE_DRIVER_PARAMETER_TYPE JackParamString
  32. #define ENGINE_DRIVER_PARAMETER_SHORT_DESCR "Driver to use"
  33. #define ENGINE_DRIVER_PARAMETER_LONG_DESCR ""
  34. struct parameter_info
  35. {
  36. unsigned char type;
  37. const char * name;
  38. const char * short_decr;
  39. const char * long_descr;
  40. };
  41. unsigned char jack_controller_dbus_types[JACK_PARAM_MAX] =
  42. {
  43. [JackParamInt] = DBUS_TYPE_INT32,
  44. [JackParamUInt] = DBUS_TYPE_UINT32,
  45. [JackParamChar] = DBUS_TYPE_BYTE,
  46. [JackParamString] = DBUS_TYPE_STRING,
  47. [JackParamBool] = DBUS_TYPE_BOOLEAN,
  48. };
  49. const char *jack_controller_dbus_type_signatures[JACK_PARAM_MAX] =
  50. {
  51. [JackParamInt] = DBUS_TYPE_INT32_AS_STRING,
  52. [JackParamUInt] = DBUS_TYPE_UINT32_AS_STRING,
  53. [JackParamChar] = DBUS_TYPE_BYTE_AS_STRING,
  54. [JackParamString] = DBUS_TYPE_STRING_AS_STRING,
  55. [JackParamBool] = DBUS_TYPE_BOOLEAN_AS_STRING,
  56. };
  57. #define PARAM_TYPE_JACK_TO_DBUS(_) jack_controller_dbus_types[_]
  58. #define PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(_) jack_controller_dbus_type_signatures[_]
  59. static
  60. bool
  61. jack_controller_jack_to_dbus_variant(
  62. jackctl_param_type_t type,
  63. const union jackctl_parameter_value *value_ptr,
  64. message_arg_t *dbusv_ptr)
  65. {
  66. switch (type)
  67. {
  68. case JackParamInt:
  69. dbusv_ptr->int32 = (dbus_int32_t)value_ptr->i;
  70. return true;
  71. case JackParamUInt:
  72. dbusv_ptr->uint32 = (dbus_uint32_t)value_ptr->ui;
  73. return true;
  74. case JackParamChar:
  75. dbusv_ptr->byte = value_ptr->c;
  76. return true;
  77. case JackParamString:
  78. dbusv_ptr->string = value_ptr->str;
  79. return true;
  80. case JackParamBool:
  81. dbusv_ptr->boolean = (dbus_bool_t)value_ptr->b;
  82. return true;
  83. }
  84. jack_error("Unknown JACK parameter type %i", (int)type);
  85. assert(0);
  86. return false;
  87. }
  88. static
  89. bool
  90. jack_controller_dbus_to_jack_variant(
  91. int type,
  92. const message_arg_t *dbusv_ptr,
  93. union jackctl_parameter_value *value_ptr)
  94. {
  95. size_t len;
  96. switch (type)
  97. {
  98. case DBUS_TYPE_INT32:
  99. value_ptr->i = dbusv_ptr->int32;
  100. return true;
  101. case DBUS_TYPE_UINT32:
  102. value_ptr->ui = dbusv_ptr->uint32;
  103. return true;
  104. case DBUS_TYPE_BYTE:
  105. value_ptr->c = dbusv_ptr->byte;
  106. return true;
  107. case DBUS_TYPE_STRING:
  108. len = strlen(dbusv_ptr->string);
  109. if (len > JACK_PARAM_STRING_MAX)
  110. {
  111. jack_error("Parameter string value is too long (%u)", (unsigned int)len);
  112. return false;
  113. }
  114. memcpy(value_ptr->str, dbusv_ptr->string, len + 1);
  115. return true;
  116. case DBUS_TYPE_BOOLEAN:
  117. value_ptr->b = dbusv_ptr->boolean;
  118. return true;
  119. }
  120. jack_error("Unknown D-Bus parameter type %i", (int)type);
  121. return false;
  122. }
  123. /*
  124. * Construct a return message for a Get[Driver|Engine]ParameterValue method call.
  125. *
  126. * The operation can only fail due to lack of memory, in which case
  127. * there's no sense in trying to construct an error return. Instead,
  128. * call->reply will be set to NULL and handled in send_method_return().
  129. */
  130. static void
  131. jack_dbus_construct_method_return_parameter(
  132. struct jack_dbus_method_call * call,
  133. dbus_bool_t is_set,
  134. int type,
  135. const char *signature,
  136. message_arg_t default_value,
  137. message_arg_t value)
  138. {
  139. DBusMessageIter iter;
  140. /* Create a new method return message. */
  141. call->reply = dbus_message_new_method_return (call->message);
  142. if (!call->reply)
  143. {
  144. goto fail;
  145. }
  146. dbus_message_iter_init_append (call->reply, &iter);
  147. /* Append the is_set argument. */
  148. if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, (const void *) &is_set))
  149. {
  150. goto fail_unref;
  151. }
  152. /* Append the 'default' and 'value' arguments. */
  153. if (!jack_dbus_message_append_variant(&iter, type, signature, &default_value))
  154. {
  155. goto fail_unref;
  156. }
  157. if (!jack_dbus_message_append_variant(&iter, type, signature, &value))
  158. {
  159. goto fail_unref;
  160. }
  161. return;
  162. fail_unref:
  163. dbus_message_unref (call->reply);
  164. call->reply = NULL;
  165. fail:
  166. jack_error ("Ran out of memory trying to construct method return");
  167. }
  168. static
  169. bool
  170. jack_controller_dbus_get_parameter_address_ex(
  171. struct jack_dbus_method_call * call,
  172. DBusMessageIter * iter_ptr,
  173. const char ** address_array)
  174. {
  175. const char * signature;
  176. DBusMessageIter array_iter;
  177. int type;
  178. int index;
  179. if (!dbus_message_iter_init(call->message, iter_ptr))
  180. {
  181. jack_dbus_error(
  182. call,
  183. JACK_DBUS_ERROR_INVALID_ARGS,
  184. "Invalid arguments to method '%s'. No input arguments found.",
  185. call->method_name);
  186. return false;
  187. }
  188. signature = dbus_message_iter_get_signature(iter_ptr);
  189. if (signature == NULL)
  190. {
  191. jack_error("dbus_message_iter_get_signature() failed");
  192. return false;
  193. }
  194. if (strcmp(signature, "as") != 0)
  195. {
  196. jack_dbus_error(
  197. call,
  198. JACK_DBUS_ERROR_INVALID_ARGS,
  199. "Invalid arguments to method '%s'. Input arguments signature '%s', must begin with 'as'.",
  200. call->method_name,
  201. signature);
  202. return false;
  203. }
  204. dbus_message_iter_recurse(iter_ptr, &array_iter);
  205. index = 0;
  206. while ((type = dbus_message_iter_get_arg_type(&array_iter)) != DBUS_TYPE_INVALID)
  207. {
  208. if (index == 3)
  209. {
  210. jack_dbus_error(
  211. call,
  212. JACK_DBUS_ERROR_INVALID_ARGS,
  213. "Invalid arguments to method '%s'. Parameter address array must contain not more than three elements.",
  214. call->method_name);
  215. return false;
  216. }
  217. ;
  218. if (type != DBUS_TYPE_STRING)
  219. {
  220. jack_dbus_error(
  221. call,
  222. JACK_DBUS_ERROR_FATAL,
  223. "Internal error when parsing parameter address of method '%s'. Address array element type '%c' is not string type.",
  224. call->method_name,
  225. type);
  226. return false;
  227. }
  228. dbus_message_iter_get_basic(&array_iter, address_array + index);
  229. //jack_info("address component: '%s'", address_array[index]);
  230. dbus_message_iter_next(&array_iter);
  231. index++;
  232. }
  233. while (index < 3)
  234. {
  235. address_array[index] = NULL;
  236. index++;
  237. }
  238. return true;
  239. }
  240. static
  241. bool
  242. jack_controller_dbus_get_parameter_address(
  243. struct jack_dbus_method_call * call,
  244. const char ** address_array)
  245. {
  246. DBusMessageIter iter;
  247. bool ret;
  248. ret = jack_controller_dbus_get_parameter_address_ex(call, &iter, address_array);
  249. if (ret && dbus_message_iter_has_next(&iter))
  250. {
  251. jack_dbus_error(
  252. call,
  253. JACK_DBUS_ERROR_INVALID_ARGS,
  254. "Invalid arguments to method '%s'. Input arguments signature must be 'as'.",
  255. call->method_name);
  256. return false;
  257. }
  258. return ret;
  259. }
  260. #define controller_ptr ((struct jack_controller *)call->context)
  261. static
  262. bool
  263. jack_controller_fill_parameter_names(
  264. struct jack_dbus_method_call * call,
  265. DBusMessageIter * iter_ptr,
  266. const char * special_first,
  267. const JSList * parameters_list)
  268. {
  269. DBusMessageIter array_iter;
  270. const char * param_name;
  271. if (!dbus_message_iter_open_container(iter_ptr, DBUS_TYPE_ARRAY, "s", &array_iter))
  272. {
  273. return false;
  274. }
  275. if (special_first != NULL)
  276. {
  277. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &special_first))
  278. {
  279. dbus_message_iter_close_container(iter_ptr, &array_iter);
  280. return false;
  281. }
  282. }
  283. /* Append parameter descriptions to the array. */
  284. while (parameters_list != NULL)
  285. {
  286. param_name = jackctl_parameter_get_name(parameters_list->data);
  287. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &param_name))
  288. {
  289. dbus_message_iter_close_container(iter_ptr, &array_iter);
  290. return false;
  291. }
  292. parameters_list = jack_slist_next(parameters_list);
  293. }
  294. return dbus_message_iter_close_container(iter_ptr, &array_iter);
  295. }
  296. static
  297. void
  298. jack_controller_dbus_read_container(
  299. struct jack_dbus_method_call * call)
  300. {
  301. const char * address[3];
  302. dbus_bool_t leaf;
  303. DBusMessageIter iter;
  304. DBusMessageIter array_iter;
  305. const char * child_name;
  306. unsigned int index;
  307. jackctl_internal_t * internal;
  308. jackctl_driver_t * driver;
  309. //jack_info("jack_controller_dbus_read_container() called");
  310. if (!jack_controller_dbus_get_parameter_address(call, address))
  311. {
  312. /* The method call had invalid arguments meaning that
  313. * jack_controller_dbus_get_parameter_address() has
  314. * constructed an error for us. */
  315. return;
  316. }
  317. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  318. /* Create a new method return message. */
  319. call->reply = dbus_message_new_method_return(call->message);
  320. if (!call->reply)
  321. {
  322. goto oom;
  323. }
  324. dbus_message_iter_init_append(call->reply, &iter);
  325. if (address[0] == NULL) /* root node */
  326. {
  327. //jack_info("reading root container");
  328. leaf = false;
  329. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf))
  330. {
  331. goto oom_unref;
  332. }
  333. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &array_iter))
  334. {
  335. goto oom_unref;
  336. }
  337. child_name = PTNODE_ENGINE;
  338. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name))
  339. {
  340. goto oom_close_unref;
  341. }
  342. child_name = PTNODE_DRIVER;
  343. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name))
  344. {
  345. goto oom_close_unref;
  346. }
  347. child_name = PTNODE_DRIVERS;
  348. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name))
  349. {
  350. goto oom_close_unref;
  351. }
  352. child_name = PTNODE_INTERNALS;
  353. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name))
  354. {
  355. goto oom_close_unref;
  356. }
  357. dbus_message_iter_close_container(&iter, &array_iter);
  358. return;
  359. }
  360. if (address[0] != NULL &&
  361. address[1] == NULL &&
  362. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  363. {
  364. //jack_info("reading engine params container");
  365. leaf = true;
  366. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf))
  367. {
  368. goto oom_unref;
  369. }
  370. if (!jack_controller_fill_parameter_names(
  371. call,
  372. &iter,
  373. ENGINE_DRIVER_PARAMETER_NAME,
  374. jackctl_server_get_parameters(controller_ptr->server)))
  375. {
  376. goto oom_unref;
  377. }
  378. return;
  379. }
  380. if (address[0] != NULL &&
  381. address[1] == NULL &&
  382. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  383. {
  384. //jack_info("reading current driver params container");
  385. leaf = true;
  386. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf))
  387. {
  388. goto oom_unref;
  389. }
  390. if (!jack_controller_fill_parameter_names(
  391. call,
  392. &iter,
  393. NULL,
  394. jackctl_driver_get_parameters(controller_ptr->driver)))
  395. {
  396. goto oom_unref;
  397. }
  398. return;
  399. }
  400. if (address[0] != NULL &&
  401. strcmp(address[0], PTNODE_DRIVERS) == 0)
  402. {
  403. leaf = address[1] != NULL;
  404. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf))
  405. {
  406. goto oom_unref;
  407. }
  408. if (!leaf) /* available drivers requested */
  409. {
  410. //jack_info("reading drivers container");
  411. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &array_iter))
  412. {
  413. goto oom_unref;
  414. }
  415. for (index = 0; index < controller_ptr->drivers_count; index++)
  416. {
  417. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, controller_ptr->driver_names + index))
  418. {
  419. goto oom_close_unref;
  420. }
  421. }
  422. dbus_message_iter_close_container(&iter, &array_iter);
  423. }
  424. else /* specified driver parameters requested */
  425. {
  426. //jack_info("reading driver '%s' params container", address[1]);
  427. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  428. if (driver == NULL)
  429. {
  430. jack_dbus_error(
  431. call,
  432. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  433. "Unknown driver '%s'",
  434. address[1]);
  435. return;
  436. }
  437. if (!jack_controller_fill_parameter_names(
  438. call,
  439. &iter,
  440. NULL,
  441. jackctl_driver_get_parameters(driver)))
  442. {
  443. goto oom_unref;
  444. }
  445. }
  446. return;
  447. }
  448. if (address[0] != NULL &&
  449. strcmp(address[0], PTNODE_INTERNALS) == 0)
  450. {
  451. leaf = address[1] != NULL;
  452. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf))
  453. {
  454. goto oom_unref;
  455. }
  456. if (!leaf) /* available internals requested */
  457. {
  458. //jack_info("reading internals container");
  459. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &array_iter))
  460. {
  461. goto oom_unref;
  462. }
  463. for (index = 0; index < controller_ptr->internals_count; index++)
  464. {
  465. if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, controller_ptr->internal_names + index))
  466. {
  467. goto oom_close_unref;
  468. }
  469. }
  470. dbus_message_iter_close_container(&iter, &array_iter);
  471. }
  472. else /* specified driver parameters requested */
  473. {
  474. //jack_info("reading internal '%s' params container", address[1]);
  475. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  476. if (internal == NULL)
  477. {
  478. jack_dbus_error(
  479. call,
  480. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  481. "Unknown internal '%s'",
  482. address[1]);
  483. return;
  484. }
  485. if (!jack_controller_fill_parameter_names(
  486. call,
  487. &iter,
  488. NULL,
  489. jackctl_internal_get_parameters(internal)))
  490. {
  491. goto oom_unref;
  492. }
  493. }
  494. return;
  495. }
  496. jack_dbus_error(
  497. call,
  498. JACK_DBUS_ERROR_INVALID_ARGS,
  499. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  500. address[0],
  501. address[1],
  502. address[2],
  503. call->method_name);
  504. return;
  505. oom_close_unref:
  506. dbus_message_iter_close_container(&iter, &array_iter);
  507. oom_unref:
  508. dbus_message_unref(call->reply);
  509. call->reply = NULL;
  510. oom:
  511. jack_error ("Ran out of memory trying to construct method return");
  512. }
  513. static
  514. void
  515. jack_controller_fill_parameter_info(
  516. jackctl_parameter_t * parameter,
  517. struct parameter_info * info_ptr)
  518. {
  519. info_ptr->type = jackctl_parameter_get_type(parameter);
  520. info_ptr->name = jackctl_parameter_get_name(parameter);
  521. info_ptr->short_decr = jackctl_parameter_get_short_description(parameter);
  522. info_ptr->long_descr = jackctl_parameter_get_long_description(parameter);
  523. }
  524. static
  525. bool
  526. jack_controller_append_parameter_info_struct(
  527. DBusMessageIter * iter_ptr,
  528. struct parameter_info * info_ptr)
  529. {
  530. DBusMessageIter struct_iter;
  531. unsigned char type;
  532. /* Open the struct. */
  533. if (!dbus_message_iter_open_container(iter_ptr, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  534. {
  535. goto fail;
  536. }
  537. /* Append parameter type. */
  538. type = PARAM_TYPE_JACK_TO_DBUS(info_ptr->type);
  539. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_BYTE, &type))
  540. {
  541. goto fail_close;
  542. }
  543. /* Append parameter name. */
  544. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->name))
  545. {
  546. goto fail_close;
  547. }
  548. /* Append parameter short description. */
  549. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->short_decr))
  550. {
  551. goto fail_close;
  552. }
  553. /* Append parameter long description. */
  554. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->long_descr))
  555. {
  556. goto fail_close;
  557. }
  558. /* Close the struct. */
  559. if (!dbus_message_iter_close_container(iter_ptr, &struct_iter))
  560. {
  561. goto fail;
  562. }
  563. return true;
  564. fail_close:
  565. dbus_message_iter_close_container(iter_ptr, &struct_iter);
  566. fail:
  567. return false;
  568. }
  569. static
  570. void
  571. jack_controller_get_parameters_info(
  572. struct jack_dbus_method_call * call,
  573. struct parameter_info * special_parameter_info_ptr,
  574. const JSList * parameters_list)
  575. {
  576. DBusMessageIter iter, array_iter;
  577. struct parameter_info info;
  578. call->reply = dbus_message_new_method_return (call->message);
  579. if (!call->reply)
  580. {
  581. goto fail;
  582. }
  583. dbus_message_iter_init_append (call->reply, &iter);
  584. /* Open the array. */
  585. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ysss)", &array_iter))
  586. {
  587. goto fail_unref;
  588. }
  589. if (special_parameter_info_ptr != NULL)
  590. {
  591. if (!jack_controller_append_parameter_info_struct(&array_iter, special_parameter_info_ptr))
  592. {
  593. goto fail_close_unref;
  594. }
  595. }
  596. /* Append parameter descriptions to the array. */
  597. while (parameters_list != NULL)
  598. {
  599. jack_controller_fill_parameter_info(parameters_list->data, &info);
  600. if (!jack_controller_append_parameter_info_struct(&array_iter, &info))
  601. {
  602. goto fail_close_unref;
  603. }
  604. parameters_list = jack_slist_next(parameters_list);
  605. }
  606. /* Close the array. */
  607. if (!dbus_message_iter_close_container (&iter, &array_iter))
  608. {
  609. goto fail_unref;
  610. }
  611. return;
  612. fail_close_unref:
  613. dbus_message_iter_close_container (&iter, &array_iter);
  614. fail_unref:
  615. dbus_message_unref (call->reply);
  616. call->reply = NULL;
  617. fail:
  618. jack_error ("Ran out of memory trying to construct method return");
  619. }
  620. static
  621. void
  622. jack_controller_dbus_get_parameters_info(
  623. struct jack_dbus_method_call * call)
  624. {
  625. const char * address[3];
  626. jackctl_internal_t * internal;
  627. jackctl_driver_t * driver;
  628. struct parameter_info driver_parameter_info;
  629. //jack_info("jack_controller_dbus_get_parameters_info() called");
  630. if (!jack_controller_dbus_get_parameter_address(call, address))
  631. {
  632. /* The method call had invalid arguments meaning that
  633. * jack_controller_dbus_get_parameter_address() has
  634. * constructed an error for us. */
  635. return;
  636. }
  637. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  638. if (address[0] != NULL &&
  639. address[1] == NULL &&
  640. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  641. {
  642. driver_parameter_info.type = ENGINE_DRIVER_PARAMETER_TYPE;
  643. driver_parameter_info.name = ENGINE_DRIVER_PARAMETER_NAME;
  644. driver_parameter_info.short_decr = ENGINE_DRIVER_PARAMETER_SHORT_DESCR;
  645. driver_parameter_info.long_descr = ENGINE_DRIVER_PARAMETER_LONG_DESCR;
  646. jack_controller_get_parameters_info(
  647. call,
  648. &driver_parameter_info,
  649. jackctl_server_get_parameters(controller_ptr->server));
  650. return;
  651. }
  652. if (address[0] != NULL &&
  653. address[1] == NULL &&
  654. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  655. {
  656. jack_controller_get_parameters_info(
  657. call,
  658. NULL,
  659. jackctl_driver_get_parameters(controller_ptr->driver));
  660. return;
  661. }
  662. if (address[0] != NULL &&
  663. address[1] != NULL &&
  664. address[2] == NULL &&
  665. strcmp(address[0], PTNODE_DRIVERS) == 0)
  666. {
  667. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  668. if (driver == NULL)
  669. {
  670. jack_dbus_error(
  671. call,
  672. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  673. "Unknown driver '%s'",
  674. address[1]);
  675. return;
  676. }
  677. jack_controller_get_parameters_info(
  678. call,
  679. NULL,
  680. jackctl_driver_get_parameters(driver));
  681. return;
  682. }
  683. if (address[0] != NULL &&
  684. address[1] != NULL &&
  685. address[2] == NULL &&
  686. strcmp(address[0], PTNODE_INTERNALS) == 0)
  687. {
  688. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  689. if (internal == NULL)
  690. {
  691. jack_dbus_error(
  692. call,
  693. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  694. "Unknown internal '%s'",
  695. address[1]);
  696. return;
  697. }
  698. jack_controller_get_parameters_info(
  699. call,
  700. NULL,
  701. jackctl_internal_get_parameters(internal));
  702. return;
  703. }
  704. jack_dbus_error(
  705. call,
  706. JACK_DBUS_ERROR_INVALID_ARGS,
  707. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  708. address[0],
  709. address[1],
  710. address[2],
  711. call->method_name);
  712. }
  713. static
  714. void
  715. jack_controller_get_parameter_info_ex(
  716. struct jack_dbus_method_call * call,
  717. struct parameter_info * info_ptr)
  718. {
  719. DBusMessageIter iter;
  720. call->reply = dbus_message_new_method_return(call->message);
  721. if (!call->reply)
  722. {
  723. goto fail;
  724. }
  725. dbus_message_iter_init_append(call->reply, &iter);
  726. if (!jack_controller_append_parameter_info_struct(&iter, info_ptr))
  727. {
  728. goto fail_unref;
  729. }
  730. return;
  731. fail_unref:
  732. dbus_message_unref(call->reply);
  733. call->reply = NULL;
  734. fail:
  735. jack_error("Ran out of memory trying to construct method return");
  736. }
  737. static
  738. void
  739. jack_controller_get_parameter_info(
  740. struct jack_dbus_method_call * call,
  741. jackctl_parameter_t * parameter)
  742. {
  743. struct parameter_info info;
  744. jack_controller_fill_parameter_info(parameter, &info);
  745. jack_controller_get_parameter_info_ex(call, &info);
  746. }
  747. static
  748. void
  749. jack_controller_dbus_get_parameter_info(
  750. struct jack_dbus_method_call * call)
  751. {
  752. const char * address[3];
  753. jackctl_internal_t * internal;
  754. jackctl_driver_t * driver;
  755. jackctl_parameter_t * parameter;
  756. struct parameter_info driver_parameter_info;
  757. //jack_info("jack_controller_dbus_get_parameter_info() called");
  758. if (!jack_controller_dbus_get_parameter_address(call, address))
  759. {
  760. /* The method call had invalid arguments meaning that
  761. * jack_controller_dbus_get_parameter_address() has
  762. * constructed an error for us. */
  763. return;
  764. }
  765. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  766. if (address[0] != NULL &&
  767. address[1] != NULL &&
  768. address[2] == NULL &&
  769. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  770. {
  771. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  772. {
  773. driver_parameter_info.type = ENGINE_DRIVER_PARAMETER_TYPE;
  774. driver_parameter_info.name = ENGINE_DRIVER_PARAMETER_NAME;
  775. driver_parameter_info.short_decr = ENGINE_DRIVER_PARAMETER_SHORT_DESCR;
  776. driver_parameter_info.long_descr = ENGINE_DRIVER_PARAMETER_LONG_DESCR;
  777. jack_controller_get_parameter_info_ex(call, &driver_parameter_info);
  778. return;
  779. }
  780. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  781. if (parameter == NULL)
  782. {
  783. jack_dbus_error(
  784. call,
  785. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  786. "Unknown engine parameter '%s'",
  787. address[1]);
  788. return;
  789. }
  790. jack_controller_get_parameter_info(call, parameter);
  791. return;
  792. }
  793. if (address[0] != NULL &&
  794. address[1] != NULL &&
  795. address[2] == NULL &&
  796. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  797. {
  798. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  799. if (parameter == NULL)
  800. {
  801. jack_dbus_error(
  802. call,
  803. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  804. "Unknown parameter '%s' for driver '%s'",
  805. address[1],
  806. jackctl_driver_get_name(controller_ptr->driver));
  807. return;
  808. }
  809. jack_controller_get_parameter_info(call, parameter);
  810. return;
  811. }
  812. if (address[0] != NULL &&
  813. address[1] != NULL &&
  814. address[2] != NULL &&
  815. strcmp(address[0], PTNODE_DRIVERS) == 0)
  816. {
  817. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  818. if (driver == NULL)
  819. {
  820. jack_dbus_error(
  821. call,
  822. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  823. "Unknown driver '%s'",
  824. address[1]);
  825. return;
  826. }
  827. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  828. if (parameter == NULL)
  829. {
  830. jack_dbus_error(
  831. call,
  832. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  833. "Unknown parameter '%s' for driver '%s'",
  834. address[2],
  835. address[1]);
  836. return;
  837. }
  838. jack_controller_get_parameter_info(call, parameter);
  839. return;
  840. }
  841. if (address[0] != NULL &&
  842. address[1] != NULL &&
  843. address[2] != NULL &&
  844. strcmp(address[0], PTNODE_INTERNALS) == 0)
  845. {
  846. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  847. if (internal == NULL)
  848. {
  849. jack_dbus_error(
  850. call,
  851. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  852. "Unknown internal '%s'",
  853. address[1]);
  854. return;
  855. }
  856. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  857. if (parameter == NULL)
  858. {
  859. jack_dbus_error(
  860. call,
  861. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  862. "Unknown parameter '%s' for internal '%s'",
  863. address[2],
  864. address[1]);
  865. return;
  866. }
  867. jack_controller_get_parameter_info(call, parameter);
  868. return;
  869. }
  870. jack_dbus_error(
  871. call,
  872. JACK_DBUS_ERROR_INVALID_ARGS,
  873. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  874. address[0],
  875. address[1],
  876. address[2],
  877. call->method_name);
  878. }
  879. static
  880. void
  881. jack_controller_get_parameter_constraint(
  882. struct jack_dbus_method_call * call,
  883. jackctl_parameter_t * parameter)
  884. {
  885. uint32_t index;
  886. uint32_t count;
  887. union jackctl_parameter_value min;
  888. union jackctl_parameter_value max;
  889. union jackctl_parameter_value jackctl_value;
  890. DBusMessageIter iter, array_iter, struct_iter;
  891. const char * descr;
  892. jackctl_param_type_t type;
  893. message_arg_t value;
  894. bool is_range;
  895. type = jackctl_parameter_get_type(parameter);
  896. call->reply = dbus_message_new_method_return(call->message);
  897. if (!call->reply)
  898. {
  899. goto fail;
  900. }
  901. dbus_message_iter_init_append(call->reply, &iter);
  902. is_range = jackctl_parameter_has_range_constraint(parameter);
  903. value.boolean = is_range;
  904. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  905. {
  906. goto fail_unref;
  907. }
  908. value.boolean = jackctl_parameter_constraint_is_strict(parameter);
  909. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  910. {
  911. goto fail_unref;
  912. }
  913. value.boolean = jackctl_parameter_constraint_is_fake_value(parameter);
  914. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  915. {
  916. goto fail_unref;
  917. }
  918. /* Open the array. */
  919. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(vs)", &array_iter))
  920. {
  921. goto fail_unref;
  922. }
  923. if (is_range)
  924. {
  925. jackctl_parameter_get_range_constraint(parameter, &min, &max);
  926. /* Open the struct. */
  927. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  928. {
  929. goto fail_close_unref;
  930. }
  931. jack_controller_jack_to_dbus_variant(type, &min, &value);
  932. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  933. {
  934. goto fail_close2_unref;
  935. }
  936. descr = "min";
  937. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  938. {
  939. goto fail_close2_unref;
  940. }
  941. /* Close the struct. */
  942. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  943. {
  944. goto fail_close_unref;
  945. }
  946. /* Open the struct. */
  947. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  948. {
  949. goto fail_close_unref;
  950. }
  951. jack_controller_jack_to_dbus_variant(type, &max, &value);
  952. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  953. {
  954. goto fail_close2_unref;
  955. }
  956. descr = "max";
  957. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  958. {
  959. goto fail_close2_unref;
  960. }
  961. /* Close the struct. */
  962. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  963. {
  964. goto fail_close_unref;
  965. }
  966. }
  967. else
  968. {
  969. count = jackctl_parameter_get_enum_constraints_count(parameter);
  970. /* Append enum values to the array. */
  971. for (index = 0 ; index < count ; index++)
  972. {
  973. jackctl_value = jackctl_parameter_get_enum_constraint_value(parameter, index);
  974. descr = jackctl_parameter_get_enum_constraint_description(parameter, index);
  975. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  976. /* Open the struct. */
  977. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  978. {
  979. goto fail_close_unref;
  980. }
  981. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  982. {
  983. goto fail_close2_unref;
  984. }
  985. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  986. {
  987. goto fail_close2_unref;
  988. }
  989. /* Close the struct. */
  990. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  991. {
  992. goto fail_close_unref;
  993. }
  994. }
  995. }
  996. /* Close the array. */
  997. if (!dbus_message_iter_close_container(&iter, &array_iter))
  998. {
  999. goto fail_unref;
  1000. }
  1001. return;
  1002. fail_close2_unref:
  1003. dbus_message_iter_close_container(&array_iter, &struct_iter);
  1004. fail_close_unref:
  1005. dbus_message_iter_close_container(&iter, &array_iter);
  1006. fail_unref:
  1007. dbus_message_unref(call->reply);
  1008. call->reply = NULL;
  1009. fail:
  1010. jack_error ("Ran out of memory trying to construct method return");
  1011. }
  1012. static
  1013. void
  1014. jack_controller_get_parameter_constraint_engine_driver(
  1015. struct jack_dbus_method_call * call)
  1016. {
  1017. unsigned int index;
  1018. DBusMessageIter iter, array_iter, struct_iter;
  1019. jackctl_param_type_t type;
  1020. dbus_bool_t bval;
  1021. message_arg_t value;
  1022. type = ENGINE_DRIVER_PARAMETER_TYPE;
  1023. call->reply = dbus_message_new_method_return(call->message);
  1024. if (!call->reply)
  1025. {
  1026. goto fail;
  1027. }
  1028. dbus_message_iter_init_append(call->reply, &iter);
  1029. /* is_range */
  1030. bval = false;
  1031. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval))
  1032. {
  1033. goto fail_unref;
  1034. }
  1035. /* is_strict */
  1036. bval = true;
  1037. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval))
  1038. {
  1039. goto fail_unref;
  1040. }
  1041. /* is_fake_value */
  1042. bval = true;
  1043. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval))
  1044. {
  1045. goto fail_unref;
  1046. }
  1047. /* Open the array. */
  1048. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(vs)", &array_iter))
  1049. {
  1050. goto fail_unref;
  1051. }
  1052. /* Append enum values to the array. */
  1053. for (index = 0 ; index < controller_ptr->drivers_count ; index++)
  1054. {
  1055. /* Open the struct. */
  1056. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  1057. {
  1058. goto fail_close_unref;
  1059. }
  1060. value.string = controller_ptr->driver_names[index];
  1061. if (!jack_dbus_message_append_variant(
  1062. &struct_iter,
  1063. PARAM_TYPE_JACK_TO_DBUS(type),
  1064. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1065. &value))
  1066. {
  1067. goto fail_close2_unref;
  1068. }
  1069. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &value))
  1070. {
  1071. goto fail_close2_unref;
  1072. }
  1073. /* Close the struct. */
  1074. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  1075. {
  1076. goto fail_close_unref;
  1077. }
  1078. }
  1079. /* Close the array. */
  1080. if (!dbus_message_iter_close_container(&iter, &array_iter))
  1081. {
  1082. goto fail_unref;
  1083. }
  1084. return;
  1085. fail_close2_unref:
  1086. dbus_message_iter_close_container(&array_iter, &struct_iter);
  1087. fail_close_unref:
  1088. dbus_message_iter_close_container(&iter, &array_iter);
  1089. fail_unref:
  1090. dbus_message_unref(call->reply);
  1091. call->reply = NULL;
  1092. fail:
  1093. jack_error ("Ran out of memory trying to construct method return");
  1094. }
  1095. static
  1096. void
  1097. jack_controller_dbus_get_parameter_constraint(
  1098. struct jack_dbus_method_call * call)
  1099. {
  1100. const char * address[3];
  1101. jackctl_internal_t * internal;
  1102. jackctl_driver_t * driver;
  1103. jackctl_parameter_t * parameter;
  1104. //jack_info("jack_controller_dbus_get_parameter_constraint() called");
  1105. if (!jack_controller_dbus_get_parameter_address(call, address))
  1106. {
  1107. /* The method call had invalid arguments meaning that
  1108. * jack_controller_dbus_get_parameter_address() has
  1109. * constructed an error for us. */
  1110. return;
  1111. }
  1112. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1113. if (address[0] != NULL &&
  1114. address[1] != NULL &&
  1115. address[2] == NULL &&
  1116. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1117. {
  1118. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1119. {
  1120. jack_controller_get_parameter_constraint_engine_driver(call);
  1121. return;
  1122. }
  1123. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1124. if (parameter == NULL)
  1125. {
  1126. jack_dbus_error(
  1127. call,
  1128. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1129. "Unknown engine parameter '%s'",
  1130. address[1]);
  1131. return;
  1132. }
  1133. jack_controller_get_parameter_constraint(call, parameter);
  1134. return;
  1135. }
  1136. if (address[0] != NULL &&
  1137. address[1] != NULL &&
  1138. address[2] == NULL &&
  1139. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1140. {
  1141. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1142. if (parameter == NULL)
  1143. {
  1144. jack_dbus_error(
  1145. call,
  1146. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1147. "Unknown parameter '%s' for driver '%s'",
  1148. address[1],
  1149. jackctl_driver_get_name(controller_ptr->driver));
  1150. return;
  1151. }
  1152. jack_controller_get_parameter_constraint(call, parameter);
  1153. return;
  1154. }
  1155. if (address[0] != NULL &&
  1156. address[1] != NULL &&
  1157. address[2] != NULL &&
  1158. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1159. {
  1160. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1161. if (driver == NULL)
  1162. {
  1163. jack_dbus_error(
  1164. call,
  1165. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1166. "Unknown driver '%s'",
  1167. address[1]);
  1168. return;
  1169. }
  1170. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1171. if (parameter == NULL)
  1172. {
  1173. jack_dbus_error(
  1174. call,
  1175. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1176. "Unknown parameter '%s' for driver '%s'",
  1177. address[2],
  1178. address[1]);
  1179. return;
  1180. }
  1181. jack_controller_get_parameter_constraint(call, parameter);
  1182. return;
  1183. }
  1184. if (address[0] != NULL &&
  1185. address[1] != NULL &&
  1186. address[2] != NULL &&
  1187. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1188. {
  1189. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1190. if (internal == NULL)
  1191. {
  1192. jack_dbus_error(
  1193. call,
  1194. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1195. "Unknown internal '%s'",
  1196. address[1]);
  1197. return;
  1198. }
  1199. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1200. if (parameter == NULL)
  1201. {
  1202. jack_dbus_error(
  1203. call,
  1204. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1205. "Unknown parameter '%s' for internal '%s'",
  1206. address[2],
  1207. address[1]);
  1208. return;
  1209. }
  1210. jack_controller_get_parameter_constraint(call, parameter);
  1211. return;
  1212. }
  1213. jack_dbus_error(
  1214. call,
  1215. JACK_DBUS_ERROR_INVALID_ARGS,
  1216. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1217. address[0],
  1218. address[1],
  1219. address[2],
  1220. call->method_name);
  1221. }
  1222. static
  1223. void
  1224. jack_controller_get_parameter_value(
  1225. struct jack_dbus_method_call * call,
  1226. jackctl_parameter_t * parameter)
  1227. {
  1228. int type;
  1229. union jackctl_parameter_value jackctl_value;
  1230. union jackctl_parameter_value jackctl_default_value;
  1231. message_arg_t value;
  1232. message_arg_t default_value;
  1233. type = jackctl_parameter_get_type(parameter);
  1234. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  1235. jackctl_value = jackctl_parameter_get_value(parameter);
  1236. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  1237. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  1238. /* Construct the reply. */
  1239. jack_dbus_construct_method_return_parameter(
  1240. call,
  1241. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  1242. PARAM_TYPE_JACK_TO_DBUS(type),
  1243. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1244. default_value,
  1245. value);
  1246. }
  1247. static
  1248. void
  1249. jack_controller_get_parameter_value_engine_driver(
  1250. struct jack_dbus_method_call * call)
  1251. {
  1252. message_arg_t value;
  1253. message_arg_t default_value;
  1254. default_value.string = DEFAULT_DRIVER;
  1255. value.string = jackctl_driver_get_name(controller_ptr->driver);
  1256. /* Construct the reply. */
  1257. jack_dbus_construct_method_return_parameter(
  1258. call,
  1259. controller_ptr->driver_set,
  1260. DBUS_TYPE_STRING,
  1261. DBUS_TYPE_STRING_AS_STRING,
  1262. default_value,
  1263. value);
  1264. }
  1265. static void
  1266. jack_controller_dbus_get_parameter_value(
  1267. struct jack_dbus_method_call * call)
  1268. {
  1269. const char * address[3];
  1270. jackctl_internal_t * internal;
  1271. jackctl_driver_t * driver;
  1272. jackctl_parameter_t * parameter;
  1273. //jack_info("jack_controller_dbus_get_parameter_value() called");
  1274. if (!jack_controller_dbus_get_parameter_address(call, address))
  1275. {
  1276. /* The method call had invalid arguments meaning that
  1277. * jack_controller_dbus_get_parameter_address() has
  1278. * constructed an error for us. */
  1279. return;
  1280. }
  1281. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1282. if (address[0] != NULL &&
  1283. address[1] != NULL &&
  1284. address[2] == NULL &&
  1285. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1286. {
  1287. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1288. {
  1289. jack_controller_get_parameter_value_engine_driver(call);
  1290. return;
  1291. }
  1292. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1293. if (parameter == NULL)
  1294. {
  1295. jack_dbus_error(
  1296. call,
  1297. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1298. "Unknown engine parameter '%s'",
  1299. address[1]);
  1300. return;
  1301. }
  1302. jack_controller_get_parameter_value(call, parameter);
  1303. return;
  1304. }
  1305. if (address[0] != NULL &&
  1306. address[1] != NULL &&
  1307. address[2] == NULL &&
  1308. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1309. {
  1310. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1311. if (parameter == NULL)
  1312. {
  1313. jack_dbus_error(
  1314. call,
  1315. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1316. "Unknown parameter '%s' for driver '%s'",
  1317. address[1],
  1318. jackctl_driver_get_name(controller_ptr->driver));
  1319. return;
  1320. }
  1321. jack_controller_get_parameter_value(call, parameter);
  1322. return;
  1323. }
  1324. if (address[0] != NULL &&
  1325. address[1] != NULL &&
  1326. address[2] != NULL &&
  1327. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1328. {
  1329. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1330. if (driver == NULL)
  1331. {
  1332. jack_dbus_error(
  1333. call,
  1334. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1335. "Unknown driver '%s'",
  1336. address[1]);
  1337. return;
  1338. }
  1339. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1340. if (parameter == NULL)
  1341. {
  1342. jack_dbus_error(
  1343. call,
  1344. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1345. "Unknown parameter '%s' for driver '%s'",
  1346. address[2],
  1347. address[1]);
  1348. return;
  1349. }
  1350. jack_controller_get_parameter_value(call, parameter);
  1351. return;
  1352. }
  1353. if (address[0] != NULL &&
  1354. address[1] != NULL &&
  1355. address[2] != NULL &&
  1356. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1357. {
  1358. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1359. if (internal == NULL)
  1360. {
  1361. jack_dbus_error(
  1362. call,
  1363. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1364. "Unknown internal '%s'",
  1365. address[1]);
  1366. return;
  1367. }
  1368. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1369. if (parameter == NULL)
  1370. {
  1371. jack_dbus_error(
  1372. call,
  1373. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1374. "Unknown parameter '%s' for internal '%s'",
  1375. address[2],
  1376. address[1]);
  1377. return;
  1378. }
  1379. jack_controller_get_parameter_value(call, parameter);
  1380. return;
  1381. }
  1382. jack_dbus_error(
  1383. call,
  1384. JACK_DBUS_ERROR_INVALID_ARGS,
  1385. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1386. address[0],
  1387. address[1],
  1388. address[2],
  1389. call->method_name);
  1390. }
  1391. static
  1392. void
  1393. jack_controller_set_parameter_value(
  1394. struct jack_dbus_method_call * call,
  1395. jackctl_parameter_t * parameter,
  1396. message_arg_t * arg_ptr,
  1397. int arg_type)
  1398. {
  1399. jackctl_param_type_t type;
  1400. union jackctl_parameter_value value;
  1401. type = jackctl_parameter_get_type(parameter);
  1402. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  1403. {
  1404. jack_dbus_error(
  1405. call,
  1406. JACK_DBUS_ERROR_INVALID_ARGS,
  1407. "Parameter value type mismatch: was expecting '%c', got '%c'",
  1408. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  1409. (char)arg_type);
  1410. return;
  1411. }
  1412. if (!jack_controller_dbus_to_jack_variant(
  1413. arg_type,
  1414. arg_ptr,
  1415. &value))
  1416. {
  1417. jack_dbus_error(
  1418. call,
  1419. JACK_DBUS_ERROR_INVALID_ARGS,
  1420. "Cannot convert parameter value");
  1421. return;
  1422. }
  1423. jackctl_parameter_set_value(parameter, &value);
  1424. jack_controller_settings_save_auto(controller_ptr);
  1425. jack_dbus_construct_method_return_empty(call);
  1426. }
  1427. static
  1428. void
  1429. jack_controller_set_parameter_value_engine_driver(
  1430. struct jack_dbus_method_call * call,
  1431. message_arg_t * arg_ptr,
  1432. int arg_type)
  1433. {
  1434. union jackctl_parameter_value value;
  1435. if (arg_type != DBUS_TYPE_STRING)
  1436. {
  1437. jack_dbus_error(
  1438. call,
  1439. JACK_DBUS_ERROR_INVALID_ARGS,
  1440. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  1441. (char)DBUS_TYPE_STRING,
  1442. (char)arg_type);
  1443. return;
  1444. }
  1445. if (!jack_controller_dbus_to_jack_variant(
  1446. arg_type,
  1447. arg_ptr,
  1448. &value))
  1449. {
  1450. jack_dbus_error(
  1451. call,
  1452. JACK_DBUS_ERROR_INVALID_ARGS,
  1453. "Cannot convert engine parameter value");
  1454. return;
  1455. }
  1456. if (!jack_controller_select_driver(controller_ptr, value.str))
  1457. {
  1458. /* Couldn't find driver with the specified name. */
  1459. jack_dbus_error(
  1460. call,
  1461. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  1462. "Unknown driver '%s'",
  1463. value.str);
  1464. return;
  1465. }
  1466. jack_controller_settings_save_auto(controller_ptr);
  1467. jack_dbus_construct_method_return_empty(call);
  1468. }
  1469. static
  1470. void
  1471. jack_controller_dbus_set_parameter_value(
  1472. struct jack_dbus_method_call * call)
  1473. {
  1474. const char * address[3];
  1475. DBusMessageIter iter;
  1476. DBusMessageIter variant_iter;
  1477. message_arg_t arg;
  1478. int arg_type;
  1479. jackctl_internal_t * internal;
  1480. jackctl_driver_t * driver;
  1481. jackctl_parameter_t * parameter;
  1482. //jack_info("jack_controller_dbus_set_parameter_value() called");
  1483. if (!jack_controller_dbus_get_parameter_address_ex(call, &iter, address))
  1484. {
  1485. /* The method call had invalid arguments meaning that
  1486. * jack_controller_dbus_get_parameter_address() has
  1487. * constructed an error for us. */
  1488. return;
  1489. }
  1490. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1491. dbus_message_iter_next(&iter);
  1492. if (dbus_message_iter_has_next(&iter))
  1493. {
  1494. jack_dbus_error(
  1495. call,
  1496. JACK_DBUS_ERROR_INVALID_ARGS,
  1497. "Invalid arguments to method '%s'. Too many arguments.",
  1498. call->method_name);
  1499. return;
  1500. }
  1501. if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
  1502. {
  1503. jack_dbus_error(
  1504. call,
  1505. JACK_DBUS_ERROR_INVALID_ARGS,
  1506. "Invalid arguments to method '%s'. Value to set must be variant.",
  1507. call->method_name);
  1508. return;
  1509. }
  1510. dbus_message_iter_recurse (&iter, &variant_iter);
  1511. dbus_message_iter_get_basic(&variant_iter, &arg);
  1512. arg_type = dbus_message_iter_get_arg_type(&variant_iter);
  1513. //jack_info("argument of type '%c'", arg_type);
  1514. if (address[0] != NULL &&
  1515. address[1] != NULL &&
  1516. address[2] == NULL &&
  1517. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1518. {
  1519. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1520. {
  1521. jack_controller_set_parameter_value_engine_driver(call, &arg, arg_type);
  1522. return;
  1523. }
  1524. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1525. if (parameter == NULL)
  1526. {
  1527. jack_dbus_error(
  1528. call,
  1529. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1530. "Unknown engine parameter '%s'",
  1531. address[1]);
  1532. return;
  1533. }
  1534. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1535. return;
  1536. }
  1537. if (address[0] != NULL &&
  1538. address[1] != NULL &&
  1539. address[2] == NULL &&
  1540. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1541. {
  1542. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1543. if (parameter == NULL)
  1544. {
  1545. jack_dbus_error(
  1546. call,
  1547. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1548. "Unknown parameter '%s' for driver '%s'",
  1549. address[1],
  1550. jackctl_driver_get_name(controller_ptr->driver));
  1551. return;
  1552. }
  1553. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1554. return;
  1555. }
  1556. if (address[0] != NULL &&
  1557. address[1] != NULL &&
  1558. address[2] != NULL &&
  1559. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1560. {
  1561. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1562. if (driver == NULL)
  1563. {
  1564. jack_dbus_error(
  1565. call,
  1566. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1567. "Unknown driver '%s'",
  1568. address[1]);
  1569. return;
  1570. }
  1571. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1572. if (parameter == NULL)
  1573. {
  1574. jack_dbus_error(
  1575. call,
  1576. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1577. "Unknown parameter '%s' for driver '%s'",
  1578. address[2],
  1579. address[1]);
  1580. return;
  1581. }
  1582. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1583. return;
  1584. }
  1585. if (address[0] != NULL &&
  1586. address[1] != NULL &&
  1587. address[2] != NULL &&
  1588. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1589. {
  1590. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1591. if (internal == NULL)
  1592. {
  1593. jack_dbus_error(
  1594. call,
  1595. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1596. "Unknown internal '%s'",
  1597. address[1]);
  1598. return;
  1599. }
  1600. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1601. if (parameter == NULL)
  1602. {
  1603. jack_dbus_error(
  1604. call,
  1605. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1606. "Unknown parameter '%s' for internal '%s'",
  1607. address[2],
  1608. address[1]);
  1609. return;
  1610. }
  1611. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1612. return;
  1613. }
  1614. jack_dbus_error(
  1615. call,
  1616. JACK_DBUS_ERROR_INVALID_ARGS,
  1617. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1618. address[0],
  1619. address[1],
  1620. address[2],
  1621. call->method_name);
  1622. }
  1623. static
  1624. void
  1625. jack_controller_reset_parameter_value(
  1626. struct jack_dbus_method_call * call,
  1627. jackctl_parameter_t * parameter)
  1628. {
  1629. jackctl_parameter_reset(parameter);
  1630. jack_controller_settings_save_auto(controller_ptr);
  1631. jack_dbus_construct_method_return_empty(call);
  1632. }
  1633. static
  1634. void
  1635. jack_controller_reset_parameter_value_engine_driver(
  1636. struct jack_dbus_method_call * call)
  1637. {
  1638. if (!jack_controller_select_driver(controller_ptr, DEFAULT_DRIVER))
  1639. {
  1640. /* Couldn't find driver with the specified name. */
  1641. jack_dbus_error(
  1642. call,
  1643. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  1644. "Default driver '%s' is unknown",
  1645. DEFAULT_DRIVER);
  1646. return;
  1647. }
  1648. controller_ptr->driver_set = false;
  1649. jack_controller_settings_save_auto(controller_ptr);
  1650. jack_dbus_construct_method_return_empty(call);
  1651. }
  1652. static
  1653. void
  1654. jack_controller_dbus_reset_parameter_value(
  1655. struct jack_dbus_method_call * call)
  1656. {
  1657. const char * address[3];
  1658. jackctl_internal_t * internal;
  1659. jackctl_driver_t * driver;
  1660. jackctl_parameter_t * parameter;
  1661. //jack_info("jack_controller_dbus_reset_parameter_value() called");
  1662. if (!jack_controller_dbus_get_parameter_address(call, address))
  1663. {
  1664. /* The method call had invalid arguments meaning that
  1665. * jack_controller_dbus_get_parameter_address() has
  1666. * constructed an error for us. */
  1667. return;
  1668. }
  1669. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1670. if (address[0] != NULL &&
  1671. address[1] != NULL &&
  1672. address[2] == NULL &&
  1673. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1674. {
  1675. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1676. {
  1677. jack_controller_reset_parameter_value_engine_driver(call);
  1678. return;
  1679. }
  1680. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1681. if (parameter == NULL)
  1682. {
  1683. jack_dbus_error(
  1684. call,
  1685. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1686. "Unknown engine parameter '%s'",
  1687. address[1]);
  1688. return;
  1689. }
  1690. jack_controller_reset_parameter_value(call, parameter);
  1691. return;
  1692. }
  1693. if (address[0] != NULL &&
  1694. address[1] != NULL &&
  1695. address[2] == NULL &&
  1696. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1697. {
  1698. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1699. if (parameter == NULL)
  1700. {
  1701. jack_dbus_error(
  1702. call,
  1703. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1704. "Unknown parameter '%s' for driver '%s'",
  1705. address[1],
  1706. jackctl_driver_get_name(controller_ptr->driver));
  1707. return;
  1708. }
  1709. jack_controller_reset_parameter_value(call, parameter);
  1710. return;
  1711. }
  1712. if (address[0] != NULL &&
  1713. address[1] != NULL &&
  1714. address[2] != NULL &&
  1715. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1716. {
  1717. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1718. if (driver == NULL)
  1719. {
  1720. jack_dbus_error(
  1721. call,
  1722. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1723. "Unknown driver '%s'",
  1724. address[1]);
  1725. return;
  1726. }
  1727. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1728. if (parameter == NULL)
  1729. {
  1730. jack_dbus_error(
  1731. call,
  1732. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1733. "Unknown parameter '%s' for driver '%s'",
  1734. address[2],
  1735. address[1]);
  1736. return;
  1737. }
  1738. jack_controller_reset_parameter_value(call, parameter);
  1739. return;
  1740. }
  1741. if (address[0] != NULL &&
  1742. address[1] != NULL &&
  1743. address[2] != NULL &&
  1744. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1745. {
  1746. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1747. if (internal == NULL)
  1748. {
  1749. jack_dbus_error(
  1750. call,
  1751. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1752. "Unknown internal '%s'",
  1753. address[1]);
  1754. return;
  1755. }
  1756. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1757. if (parameter == NULL)
  1758. {
  1759. jack_dbus_error(
  1760. call,
  1761. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1762. "Unknown parameter '%s' for internal '%s'",
  1763. address[2],
  1764. address[1]);
  1765. return;
  1766. }
  1767. jack_controller_reset_parameter_value(call, parameter);
  1768. return;
  1769. }
  1770. jack_dbus_error(
  1771. call,
  1772. JACK_DBUS_ERROR_INVALID_ARGS,
  1773. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1774. address[0],
  1775. address[1],
  1776. address[2],
  1777. call->method_name);
  1778. }
  1779. #undef controller_ptr
  1780. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(ReadContainer, "Get names of child parameters or containers")
  1781. JACK_DBUS_METHOD_ARGUMENT_IN("parent", "as", "Address of parent container")
  1782. JACK_DBUS_METHOD_ARGUMENT_OUT("leaf", "b", "Whether children are parameters (true) or containers (false)")
  1783. JACK_DBUS_METHOD_ARGUMENT_OUT("children", "as", "Array of child names")
  1784. JACK_DBUS_METHOD_ARGUMENTS_END
  1785. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParametersInfo, "Retrieve info about parameters")
  1786. JACK_DBUS_METHOD_ARGUMENT_IN("parent", "as", "Address of parameters parent")
  1787. JACK_DBUS_METHOD_ARGUMENT_OUT("parameter_info_array", "a(ysss)", "Array of parameter info structs. Each info struct contains: type char, name, short and long description")
  1788. JACK_DBUS_METHOD_ARGUMENTS_END
  1789. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParameterInfo, "Retrieve info about parameter")
  1790. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1791. JACK_DBUS_METHOD_ARGUMENT_OUT("parameter_info", "(ysss)", "Parameter info struct that contains: type char, name, short and long description")
  1792. JACK_DBUS_METHOD_ARGUMENTS_END
  1793. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParameterConstraint, "Get constraint of parameter")
  1794. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1795. JACK_DBUS_METHOD_ARGUMENT_OUT("is_range", "b", "Whether constrinat is a range. If so, values parameter will contain two values, min and max")
  1796. JACK_DBUS_METHOD_ARGUMENT_OUT("is_strict", "b", "Whether enum constraint is strict. I.e. value not listed in values array will not work")
  1797. JACK_DBUS_METHOD_ARGUMENT_OUT("is_fake_value", "b", "Whether enum values are fake. I.e. have no user meaningful meaning")
  1798. JACK_DBUS_METHOD_ARGUMENT_OUT("values", "a(vs)", "Values. If there is no constraint, this array will be empty. For range constraint there will be two values, min and max. For enum constraint there will be 2 or more values.")
  1799. JACK_DBUS_METHOD_ARGUMENTS_END
  1800. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParameterValue, "Get value of parameter")
  1801. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1802. JACK_DBUS_METHOD_ARGUMENT_OUT("is_set", "b", "Whether parameter is set or its default value is used")
  1803. JACK_DBUS_METHOD_ARGUMENT_OUT("default", "v", "Default value of parameter")
  1804. JACK_DBUS_METHOD_ARGUMENT_OUT("value", "v", "Actual value of parameter")
  1805. JACK_DBUS_METHOD_ARGUMENTS_END
  1806. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(SetParameterValue, "Set value of parameter")
  1807. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1808. JACK_DBUS_METHOD_ARGUMENT_IN("value", "v", "New value for parameter")
  1809. JACK_DBUS_METHOD_ARGUMENTS_END
  1810. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(ResetParameterValue, "Reset parameter to default value")
  1811. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1812. JACK_DBUS_METHOD_ARGUMENTS_END
  1813. JACK_DBUS_METHODS_BEGIN
  1814. JACK_DBUS_METHOD_DESCRIBE(ReadContainer, jack_controller_dbus_read_container)
  1815. JACK_DBUS_METHOD_DESCRIBE(GetParametersInfo, jack_controller_dbus_get_parameters_info)
  1816. JACK_DBUS_METHOD_DESCRIBE(GetParameterInfo, jack_controller_dbus_get_parameter_info)
  1817. JACK_DBUS_METHOD_DESCRIBE(GetParameterConstraint, jack_controller_dbus_get_parameter_constraint)
  1818. JACK_DBUS_METHOD_DESCRIBE(GetParameterValue, jack_controller_dbus_get_parameter_value)
  1819. JACK_DBUS_METHOD_DESCRIBE(SetParameterValue, jack_controller_dbus_set_parameter_value)
  1820. JACK_DBUS_METHOD_DESCRIBE(ResetParameterValue, jack_controller_dbus_reset_parameter_value)
  1821. JACK_DBUS_METHODS_END
  1822. /*
  1823. * Parameter addresses:
  1824. *
  1825. * "engine"
  1826. * "engine", "driver"
  1827. * "engine", "realtime"
  1828. * "engine", ...more engine parameters
  1829. *
  1830. * "driver", "device"
  1831. * "driver", ...more driver parameters
  1832. *
  1833. * "drivers", "alsa", "device"
  1834. * "drivers", "alsa", ...more alsa driver parameters
  1835. *
  1836. * "drivers", ...more drivers
  1837. *
  1838. * "internals", "netmanager", "multicast_ip"
  1839. * "internals", "netmanager", ...more netmanager parameters
  1840. *
  1841. * "internals", ...more internals
  1842. *
  1843. */
  1844. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.Configure")
  1845. JACK_DBUS_IFACE_EXPOSE_METHODS
  1846. JACK_DBUS_IFACE_END