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.

2231 lines
63KB

  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_get_parameters_info(
  516. struct jack_dbus_method_call * call,
  517. struct parameter_info * special_parameter_info_ptr,
  518. const JSList * parameters_list)
  519. {
  520. DBusMessageIter iter, array_iter, struct_iter;
  521. unsigned char type;
  522. const char *str;
  523. call->reply = dbus_message_new_method_return (call->message);
  524. if (!call->reply)
  525. {
  526. goto fail;
  527. }
  528. dbus_message_iter_init_append (call->reply, &iter);
  529. /* Open the array. */
  530. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ysss)", &array_iter))
  531. {
  532. goto fail_unref;
  533. }
  534. if (special_parameter_info_ptr != NULL)
  535. {
  536. /* Open the struct. */
  537. if (!dbus_message_iter_open_container (&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  538. {
  539. goto fail_close_unref;
  540. }
  541. /* Append parameter type. */
  542. type = PARAM_TYPE_JACK_TO_DBUS(special_parameter_info_ptr->type);
  543. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE, &type))
  544. {
  545. goto fail_close2_unref;
  546. }
  547. /* Append parameter name. */
  548. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING, &special_parameter_info_ptr->name))
  549. {
  550. goto fail_close2_unref;
  551. }
  552. /* Append parameter short description. */
  553. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING, &special_parameter_info_ptr->short_decr))
  554. {
  555. goto fail_close2_unref;
  556. }
  557. /* Append parameter long description. */
  558. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING, &special_parameter_info_ptr->long_descr))
  559. {
  560. goto fail_close2_unref;
  561. }
  562. /* Close the struct. */
  563. if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
  564. {
  565. goto fail_close_unref;
  566. }
  567. }
  568. /* Append parameter descriptions to the array. */
  569. while (parameters_list != NULL)
  570. {
  571. /* Open the struct. */
  572. if (!dbus_message_iter_open_container (&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  573. {
  574. goto fail_close_unref;
  575. }
  576. /* Append parameter type. */
  577. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type(parameters_list->data));
  578. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE, &type))
  579. {
  580. goto fail_close2_unref;
  581. }
  582. /* Append parameter name. */
  583. str = jackctl_parameter_get_name(parameters_list->data);
  584. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING, &str))
  585. {
  586. goto fail_close2_unref;
  587. }
  588. /* Append parameter short description. */
  589. str = jackctl_parameter_get_short_description(parameters_list->data);
  590. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING, &str))
  591. {
  592. goto fail_close2_unref;
  593. }
  594. /* Append parameter long description. */
  595. str = jackctl_parameter_get_long_description(parameters_list->data);
  596. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING, &str))
  597. {
  598. goto fail_close2_unref;
  599. }
  600. /* Close the struct. */
  601. if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
  602. {
  603. goto fail_close_unref;
  604. }
  605. parameters_list = jack_slist_next(parameters_list);
  606. }
  607. /* Close the array. */
  608. if (!dbus_message_iter_close_container (&iter, &array_iter))
  609. {
  610. goto fail_unref;
  611. }
  612. return;
  613. fail_close2_unref:
  614. dbus_message_iter_close_container (&iter, &struct_iter);
  615. fail_close_unref:
  616. dbus_message_iter_close_container (&iter, &array_iter);
  617. fail_unref:
  618. dbus_message_unref (call->reply);
  619. call->reply = NULL;
  620. fail:
  621. jack_error ("Ran out of memory trying to construct method return");
  622. }
  623. static
  624. void
  625. jack_controller_dbus_get_parameters_info(
  626. struct jack_dbus_method_call * call)
  627. {
  628. const char * address[3];
  629. jackctl_internal_t * internal;
  630. jackctl_driver_t * driver;
  631. struct parameter_info driver_parameter_info;
  632. //jack_info("jack_controller_dbus_get_parameters_info() called");
  633. if (!jack_controller_dbus_get_parameter_address(call, address))
  634. {
  635. /* The method call had invalid arguments meaning that
  636. * jack_controller_dbus_get_parameter_address() has
  637. * constructed an error for us. */
  638. return;
  639. }
  640. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  641. if (address[0] != NULL &&
  642. address[1] == NULL &&
  643. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  644. {
  645. driver_parameter_info.type = ENGINE_DRIVER_PARAMETER_TYPE;
  646. driver_parameter_info.name = ENGINE_DRIVER_PARAMETER_NAME;
  647. driver_parameter_info.short_decr = ENGINE_DRIVER_PARAMETER_SHORT_DESCR;
  648. driver_parameter_info.long_descr = ENGINE_DRIVER_PARAMETER_LONG_DESCR;
  649. jack_controller_get_parameters_info(
  650. call,
  651. &driver_parameter_info,
  652. jackctl_server_get_parameters(controller_ptr->server));
  653. return;
  654. }
  655. if (address[0] != NULL &&
  656. address[1] == NULL &&
  657. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  658. {
  659. jack_controller_get_parameters_info(
  660. call,
  661. NULL,
  662. jackctl_driver_get_parameters(controller_ptr->driver));
  663. return;
  664. }
  665. if (address[0] != NULL &&
  666. address[1] != NULL &&
  667. address[2] == NULL &&
  668. strcmp(address[0], PTNODE_DRIVERS) == 0)
  669. {
  670. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  671. if (driver == NULL)
  672. {
  673. jack_dbus_error(
  674. call,
  675. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  676. "Unknown driver '%s'",
  677. address[1]);
  678. return;
  679. }
  680. jack_controller_get_parameters_info(
  681. call,
  682. NULL,
  683. jackctl_driver_get_parameters(driver));
  684. return;
  685. }
  686. if (address[0] != NULL &&
  687. address[1] != NULL &&
  688. address[2] == NULL &&
  689. strcmp(address[0], PTNODE_INTERNALS) == 0)
  690. {
  691. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  692. if (internal == NULL)
  693. {
  694. jack_dbus_error(
  695. call,
  696. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  697. "Unknown internal '%s'",
  698. address[1]);
  699. return;
  700. }
  701. jack_controller_get_parameters_info(
  702. call,
  703. NULL,
  704. jackctl_internal_get_parameters(internal));
  705. return;
  706. }
  707. jack_dbus_error(
  708. call,
  709. JACK_DBUS_ERROR_INVALID_ARGS,
  710. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  711. address[0],
  712. address[1],
  713. address[2],
  714. call->method_name);
  715. }
  716. static
  717. void
  718. jack_controller_get_parameter_info_ex(
  719. struct jack_dbus_method_call * call,
  720. struct parameter_info * info_ptr)
  721. {
  722. DBusMessageIter iter, struct_iter;
  723. unsigned char type;
  724. call->reply = dbus_message_new_method_return(call->message);
  725. if (!call->reply)
  726. {
  727. goto fail;
  728. }
  729. dbus_message_iter_init_append(call->reply, &iter);
  730. /* Open the struct. */
  731. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  732. {
  733. goto fail_unref;
  734. }
  735. /* Append parameter type. */
  736. type = PARAM_TYPE_JACK_TO_DBUS(info_ptr->type);
  737. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_BYTE, &type))
  738. {
  739. goto fail_close_unref;
  740. }
  741. /* Append parameter name. */
  742. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->name))
  743. {
  744. goto fail_close_unref;
  745. }
  746. /* Append parameter short description. */
  747. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->short_decr))
  748. {
  749. goto fail_close_unref;
  750. }
  751. /* Append parameter long description. */
  752. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->long_descr))
  753. {
  754. goto fail_close_unref;
  755. }
  756. /* Close the struct. */
  757. if (!dbus_message_iter_close_container(&iter, &struct_iter))
  758. {
  759. goto fail_unref;
  760. }
  761. return;
  762. fail_close_unref:
  763. dbus_message_iter_close_container(&iter, &struct_iter);
  764. fail_unref:
  765. dbus_message_unref(call->reply);
  766. call->reply = NULL;
  767. fail:
  768. jack_error("Ran out of memory trying to construct method return");
  769. }
  770. static
  771. void
  772. jack_controller_get_parameter_info(
  773. struct jack_dbus_method_call * call,
  774. jackctl_parameter_t * parameter)
  775. {
  776. struct parameter_info info;
  777. info.type = jackctl_parameter_get_type(parameter);
  778. info.name = jackctl_parameter_get_name(parameter);
  779. info.short_decr = jackctl_parameter_get_short_description(parameter);
  780. info.long_descr = jackctl_parameter_get_long_description(parameter);
  781. jack_controller_get_parameter_info_ex(call, &info);
  782. }
  783. static
  784. void
  785. jack_controller_dbus_get_parameter_info(
  786. struct jack_dbus_method_call * call)
  787. {
  788. const char * address[3];
  789. jackctl_internal_t * internal;
  790. jackctl_driver_t * driver;
  791. jackctl_parameter_t * parameter;
  792. struct parameter_info driver_parameter_info;
  793. //jack_info("jack_controller_dbus_get_parameter_info() called");
  794. if (!jack_controller_dbus_get_parameter_address(call, address))
  795. {
  796. /* The method call had invalid arguments meaning that
  797. * jack_controller_dbus_get_parameter_address() has
  798. * constructed an error for us. */
  799. return;
  800. }
  801. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  802. if (address[0] != NULL &&
  803. address[1] != NULL &&
  804. address[2] == NULL &&
  805. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  806. {
  807. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  808. {
  809. driver_parameter_info.type = ENGINE_DRIVER_PARAMETER_TYPE;
  810. driver_parameter_info.name = ENGINE_DRIVER_PARAMETER_NAME;
  811. driver_parameter_info.short_decr = ENGINE_DRIVER_PARAMETER_SHORT_DESCR;
  812. driver_parameter_info.long_descr = ENGINE_DRIVER_PARAMETER_LONG_DESCR;
  813. jack_controller_get_parameter_info_ex(call, &driver_parameter_info);
  814. return;
  815. }
  816. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  817. if (parameter == NULL)
  818. {
  819. jack_dbus_error(
  820. call,
  821. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  822. "Unknown engine parameter '%s'",
  823. address[1]);
  824. return;
  825. }
  826. jack_controller_get_parameter_info(call, parameter);
  827. return;
  828. }
  829. if (address[0] != NULL &&
  830. address[1] != NULL &&
  831. address[2] == NULL &&
  832. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  833. {
  834. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  835. if (parameter == NULL)
  836. {
  837. jack_dbus_error(
  838. call,
  839. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  840. "Unknown parameter '%s' for driver '%s'",
  841. address[1],
  842. jackctl_driver_get_name(controller_ptr->driver));
  843. return;
  844. }
  845. jack_controller_get_parameter_info(call, parameter);
  846. return;
  847. }
  848. if (address[0] != NULL &&
  849. address[1] != NULL &&
  850. address[2] != NULL &&
  851. strcmp(address[0], PTNODE_DRIVERS) == 0)
  852. {
  853. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  854. if (driver == NULL)
  855. {
  856. jack_dbus_error(
  857. call,
  858. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  859. "Unknown driver '%s'",
  860. address[1]);
  861. return;
  862. }
  863. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  864. if (parameter == NULL)
  865. {
  866. jack_dbus_error(
  867. call,
  868. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  869. "Unknown parameter '%s' for driver '%s'",
  870. address[2],
  871. address[1]);
  872. return;
  873. }
  874. jack_controller_get_parameter_info(call, parameter);
  875. return;
  876. }
  877. if (address[0] != NULL &&
  878. address[1] != NULL &&
  879. address[2] != NULL &&
  880. strcmp(address[0], PTNODE_INTERNALS) == 0)
  881. {
  882. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  883. if (internal == NULL)
  884. {
  885. jack_dbus_error(
  886. call,
  887. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  888. "Unknown internal '%s'",
  889. address[1]);
  890. return;
  891. }
  892. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  893. if (parameter == NULL)
  894. {
  895. jack_dbus_error(
  896. call,
  897. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  898. "Unknown parameter '%s' for internal '%s'",
  899. address[2],
  900. address[1]);
  901. return;
  902. }
  903. jack_controller_get_parameter_info(call, parameter);
  904. return;
  905. }
  906. jack_dbus_error(
  907. call,
  908. JACK_DBUS_ERROR_INVALID_ARGS,
  909. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  910. address[0],
  911. address[1],
  912. address[2],
  913. call->method_name);
  914. }
  915. static
  916. void
  917. jack_controller_get_parameter_constraint(
  918. struct jack_dbus_method_call * call,
  919. jackctl_parameter_t * parameter)
  920. {
  921. uint32_t index;
  922. uint32_t count;
  923. union jackctl_parameter_value min;
  924. union jackctl_parameter_value max;
  925. union jackctl_parameter_value jackctl_value;
  926. DBusMessageIter iter, array_iter, struct_iter;
  927. const char * descr;
  928. jackctl_param_type_t type;
  929. message_arg_t value;
  930. bool is_range;
  931. type = jackctl_parameter_get_type(parameter);
  932. call->reply = dbus_message_new_method_return(call->message);
  933. if (!call->reply)
  934. {
  935. goto fail;
  936. }
  937. dbus_message_iter_init_append(call->reply, &iter);
  938. is_range = jackctl_parameter_has_range_constraint(parameter);
  939. value.boolean = is_range;
  940. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  941. {
  942. goto fail_unref;
  943. }
  944. value.boolean = jackctl_parameter_constraint_is_strict(parameter);
  945. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  946. {
  947. goto fail_unref;
  948. }
  949. value.boolean = jackctl_parameter_constraint_is_fake_value(parameter);
  950. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  951. {
  952. goto fail_unref;
  953. }
  954. /* Open the array. */
  955. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(vs)", &array_iter))
  956. {
  957. goto fail_unref;
  958. }
  959. if (is_range)
  960. {
  961. jackctl_parameter_get_range_constraint(parameter, &min, &max);
  962. /* Open the struct. */
  963. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  964. {
  965. goto fail_close_unref;
  966. }
  967. jack_controller_jack_to_dbus_variant(type, &min, &value);
  968. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  969. {
  970. goto fail_close2_unref;
  971. }
  972. descr = "min";
  973. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  974. {
  975. goto fail_close2_unref;
  976. }
  977. /* Close the struct. */
  978. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  979. {
  980. goto fail_close_unref;
  981. }
  982. /* Open the struct. */
  983. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  984. {
  985. goto fail_close_unref;
  986. }
  987. jack_controller_jack_to_dbus_variant(type, &max, &value);
  988. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  989. {
  990. goto fail_close2_unref;
  991. }
  992. descr = "max";
  993. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  994. {
  995. goto fail_close2_unref;
  996. }
  997. /* Close the struct. */
  998. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  999. {
  1000. goto fail_close_unref;
  1001. }
  1002. }
  1003. else
  1004. {
  1005. count = jackctl_parameter_get_enum_constraints_count(parameter);
  1006. /* Append enum values to the array. */
  1007. for (index = 0 ; index < count ; index++)
  1008. {
  1009. jackctl_value = jackctl_parameter_get_enum_constraint_value(parameter, index);
  1010. descr = jackctl_parameter_get_enum_constraint_description(parameter, index);
  1011. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  1012. /* Open the struct. */
  1013. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  1014. {
  1015. goto fail_close_unref;
  1016. }
  1017. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  1018. {
  1019. goto fail_close2_unref;
  1020. }
  1021. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  1022. {
  1023. goto fail_close2_unref;
  1024. }
  1025. /* Close the struct. */
  1026. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  1027. {
  1028. goto fail_close_unref;
  1029. }
  1030. }
  1031. }
  1032. /* Close the array. */
  1033. if (!dbus_message_iter_close_container(&iter, &array_iter))
  1034. {
  1035. goto fail_unref;
  1036. }
  1037. return;
  1038. fail_close2_unref:
  1039. dbus_message_iter_close_container(&array_iter, &struct_iter);
  1040. fail_close_unref:
  1041. dbus_message_iter_close_container(&iter, &array_iter);
  1042. fail_unref:
  1043. dbus_message_unref(call->reply);
  1044. call->reply = NULL;
  1045. fail:
  1046. jack_error ("Ran out of memory trying to construct method return");
  1047. }
  1048. static
  1049. void
  1050. jack_controller_get_parameter_constraint_engine_driver(
  1051. struct jack_dbus_method_call * call)
  1052. {
  1053. unsigned int index;
  1054. DBusMessageIter iter, array_iter, struct_iter;
  1055. jackctl_param_type_t type;
  1056. dbus_bool_t bval;
  1057. message_arg_t value;
  1058. type = ENGINE_DRIVER_PARAMETER_TYPE;
  1059. call->reply = dbus_message_new_method_return(call->message);
  1060. if (!call->reply)
  1061. {
  1062. goto fail;
  1063. }
  1064. dbus_message_iter_init_append(call->reply, &iter);
  1065. /* is_range */
  1066. bval = false;
  1067. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval))
  1068. {
  1069. goto fail_unref;
  1070. }
  1071. /* is_strict */
  1072. bval = true;
  1073. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval))
  1074. {
  1075. goto fail_unref;
  1076. }
  1077. /* is_fake_value */
  1078. bval = true;
  1079. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval))
  1080. {
  1081. goto fail_unref;
  1082. }
  1083. /* Open the array. */
  1084. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(vs)", &array_iter))
  1085. {
  1086. goto fail_unref;
  1087. }
  1088. /* Append enum values to the array. */
  1089. for (index = 0 ; index < controller_ptr->drivers_count ; index++)
  1090. {
  1091. /* Open the struct. */
  1092. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  1093. {
  1094. goto fail_close_unref;
  1095. }
  1096. value.string = controller_ptr->driver_names[index];
  1097. if (!jack_dbus_message_append_variant(
  1098. &struct_iter,
  1099. PARAM_TYPE_JACK_TO_DBUS(type),
  1100. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1101. &value))
  1102. {
  1103. goto fail_close2_unref;
  1104. }
  1105. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &value))
  1106. {
  1107. goto fail_close2_unref;
  1108. }
  1109. /* Close the struct. */
  1110. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  1111. {
  1112. goto fail_close_unref;
  1113. }
  1114. }
  1115. /* Close the array. */
  1116. if (!dbus_message_iter_close_container(&iter, &array_iter))
  1117. {
  1118. goto fail_unref;
  1119. }
  1120. return;
  1121. fail_close2_unref:
  1122. dbus_message_iter_close_container(&array_iter, &struct_iter);
  1123. fail_close_unref:
  1124. dbus_message_iter_close_container(&iter, &array_iter);
  1125. fail_unref:
  1126. dbus_message_unref(call->reply);
  1127. call->reply = NULL;
  1128. fail:
  1129. jack_error ("Ran out of memory trying to construct method return");
  1130. }
  1131. static
  1132. void
  1133. jack_controller_dbus_get_parameter_constraint(
  1134. struct jack_dbus_method_call * call)
  1135. {
  1136. const char * address[3];
  1137. jackctl_internal_t * internal;
  1138. jackctl_driver_t * driver;
  1139. jackctl_parameter_t * parameter;
  1140. //jack_info("jack_controller_dbus_get_parameter_constraint() called");
  1141. if (!jack_controller_dbus_get_parameter_address(call, address))
  1142. {
  1143. /* The method call had invalid arguments meaning that
  1144. * jack_controller_dbus_get_parameter_address() has
  1145. * constructed an error for us. */
  1146. return;
  1147. }
  1148. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1149. if (address[0] != NULL &&
  1150. address[1] != NULL &&
  1151. address[2] == NULL &&
  1152. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1153. {
  1154. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1155. {
  1156. jack_controller_get_parameter_constraint_engine_driver(call);
  1157. return;
  1158. }
  1159. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1160. if (parameter == NULL)
  1161. {
  1162. jack_dbus_error(
  1163. call,
  1164. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1165. "Unknown engine parameter '%s'",
  1166. address[1]);
  1167. return;
  1168. }
  1169. jack_controller_get_parameter_constraint(call, parameter);
  1170. return;
  1171. }
  1172. if (address[0] != NULL &&
  1173. address[1] != NULL &&
  1174. address[2] == NULL &&
  1175. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1176. {
  1177. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1178. if (parameter == NULL)
  1179. {
  1180. jack_dbus_error(
  1181. call,
  1182. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1183. "Unknown parameter '%s' for driver '%s'",
  1184. address[1],
  1185. jackctl_driver_get_name(controller_ptr->driver));
  1186. return;
  1187. }
  1188. jack_controller_get_parameter_constraint(call, parameter);
  1189. return;
  1190. }
  1191. if (address[0] != NULL &&
  1192. address[1] != NULL &&
  1193. address[2] != NULL &&
  1194. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1195. {
  1196. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1197. if (driver == NULL)
  1198. {
  1199. jack_dbus_error(
  1200. call,
  1201. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1202. "Unknown driver '%s'",
  1203. address[1]);
  1204. return;
  1205. }
  1206. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1207. if (parameter == NULL)
  1208. {
  1209. jack_dbus_error(
  1210. call,
  1211. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1212. "Unknown parameter '%s' for driver '%s'",
  1213. address[2],
  1214. address[1]);
  1215. return;
  1216. }
  1217. jack_controller_get_parameter_constraint(call, parameter);
  1218. return;
  1219. }
  1220. if (address[0] != NULL &&
  1221. address[1] != NULL &&
  1222. address[2] != NULL &&
  1223. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1224. {
  1225. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1226. if (internal == NULL)
  1227. {
  1228. jack_dbus_error(
  1229. call,
  1230. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1231. "Unknown internal '%s'",
  1232. address[1]);
  1233. return;
  1234. }
  1235. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1236. if (parameter == NULL)
  1237. {
  1238. jack_dbus_error(
  1239. call,
  1240. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1241. "Unknown parameter '%s' for internal '%s'",
  1242. address[2],
  1243. address[1]);
  1244. return;
  1245. }
  1246. jack_controller_get_parameter_constraint(call, parameter);
  1247. return;
  1248. }
  1249. jack_dbus_error(
  1250. call,
  1251. JACK_DBUS_ERROR_INVALID_ARGS,
  1252. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1253. address[0],
  1254. address[1],
  1255. address[2],
  1256. call->method_name);
  1257. }
  1258. static
  1259. void
  1260. jack_controller_get_parameter_value(
  1261. struct jack_dbus_method_call * call,
  1262. jackctl_parameter_t * parameter)
  1263. {
  1264. int type;
  1265. union jackctl_parameter_value jackctl_value;
  1266. union jackctl_parameter_value jackctl_default_value;
  1267. message_arg_t value;
  1268. message_arg_t default_value;
  1269. type = jackctl_parameter_get_type(parameter);
  1270. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  1271. jackctl_value = jackctl_parameter_get_value(parameter);
  1272. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  1273. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  1274. /* Construct the reply. */
  1275. jack_dbus_construct_method_return_parameter(
  1276. call,
  1277. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  1278. PARAM_TYPE_JACK_TO_DBUS(type),
  1279. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1280. default_value,
  1281. value);
  1282. }
  1283. static
  1284. void
  1285. jack_controller_get_parameter_value_engine_driver(
  1286. struct jack_dbus_method_call * call)
  1287. {
  1288. message_arg_t value;
  1289. message_arg_t default_value;
  1290. default_value.string = DEFAULT_DRIVER;
  1291. value.string = jackctl_driver_get_name(controller_ptr->driver);
  1292. /* Construct the reply. */
  1293. jack_dbus_construct_method_return_parameter(
  1294. call,
  1295. controller_ptr->driver_set,
  1296. DBUS_TYPE_STRING,
  1297. DBUS_TYPE_STRING_AS_STRING,
  1298. default_value,
  1299. value);
  1300. }
  1301. static void
  1302. jack_controller_dbus_get_parameter_value(
  1303. struct jack_dbus_method_call * call)
  1304. {
  1305. const char * address[3];
  1306. jackctl_internal_t * internal;
  1307. jackctl_driver_t * driver;
  1308. jackctl_parameter_t * parameter;
  1309. //jack_info("jack_controller_dbus_get_parameter_value() called");
  1310. if (!jack_controller_dbus_get_parameter_address(call, address))
  1311. {
  1312. /* The method call had invalid arguments meaning that
  1313. * jack_controller_dbus_get_parameter_address() has
  1314. * constructed an error for us. */
  1315. return;
  1316. }
  1317. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1318. if (address[0] != NULL &&
  1319. address[1] != NULL &&
  1320. address[2] == NULL &&
  1321. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1322. {
  1323. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1324. {
  1325. jack_controller_get_parameter_value_engine_driver(call);
  1326. return;
  1327. }
  1328. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1329. if (parameter == NULL)
  1330. {
  1331. jack_dbus_error(
  1332. call,
  1333. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1334. "Unknown engine parameter '%s'",
  1335. address[1]);
  1336. return;
  1337. }
  1338. jack_controller_get_parameter_value(call, parameter);
  1339. return;
  1340. }
  1341. if (address[0] != NULL &&
  1342. address[1] != NULL &&
  1343. address[2] == NULL &&
  1344. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1345. {
  1346. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1347. if (parameter == NULL)
  1348. {
  1349. jack_dbus_error(
  1350. call,
  1351. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1352. "Unknown parameter '%s' for driver '%s'",
  1353. address[1],
  1354. jackctl_driver_get_name(controller_ptr->driver));
  1355. return;
  1356. }
  1357. jack_controller_get_parameter_value(call, parameter);
  1358. return;
  1359. }
  1360. if (address[0] != NULL &&
  1361. address[1] != NULL &&
  1362. address[2] != NULL &&
  1363. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1364. {
  1365. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1366. if (driver == NULL)
  1367. {
  1368. jack_dbus_error(
  1369. call,
  1370. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1371. "Unknown driver '%s'",
  1372. address[1]);
  1373. return;
  1374. }
  1375. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1376. if (parameter == NULL)
  1377. {
  1378. jack_dbus_error(
  1379. call,
  1380. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1381. "Unknown parameter '%s' for driver '%s'",
  1382. address[2],
  1383. address[1]);
  1384. return;
  1385. }
  1386. jack_controller_get_parameter_value(call, parameter);
  1387. return;
  1388. }
  1389. if (address[0] != NULL &&
  1390. address[1] != NULL &&
  1391. address[2] != NULL &&
  1392. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1393. {
  1394. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1395. if (internal == NULL)
  1396. {
  1397. jack_dbus_error(
  1398. call,
  1399. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1400. "Unknown internal '%s'",
  1401. address[1]);
  1402. return;
  1403. }
  1404. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1405. if (parameter == NULL)
  1406. {
  1407. jack_dbus_error(
  1408. call,
  1409. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1410. "Unknown parameter '%s' for internal '%s'",
  1411. address[2],
  1412. address[1]);
  1413. return;
  1414. }
  1415. jack_controller_get_parameter_value(call, parameter);
  1416. return;
  1417. }
  1418. jack_dbus_error(
  1419. call,
  1420. JACK_DBUS_ERROR_INVALID_ARGS,
  1421. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1422. address[0],
  1423. address[1],
  1424. address[2],
  1425. call->method_name);
  1426. }
  1427. static
  1428. void
  1429. jack_controller_set_parameter_value(
  1430. struct jack_dbus_method_call * call,
  1431. jackctl_parameter_t * parameter,
  1432. message_arg_t * arg_ptr,
  1433. int arg_type)
  1434. {
  1435. jackctl_param_type_t type;
  1436. union jackctl_parameter_value value;
  1437. type = jackctl_parameter_get_type(parameter);
  1438. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  1439. {
  1440. jack_dbus_error(
  1441. call,
  1442. JACK_DBUS_ERROR_INVALID_ARGS,
  1443. "Parameter value type mismatch: was expecting '%c', got '%c'",
  1444. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  1445. (char)arg_type);
  1446. return;
  1447. }
  1448. if (!jack_controller_dbus_to_jack_variant(
  1449. arg_type,
  1450. arg_ptr,
  1451. &value))
  1452. {
  1453. jack_dbus_error(
  1454. call,
  1455. JACK_DBUS_ERROR_INVALID_ARGS,
  1456. "Cannot convert parameter value");
  1457. return;
  1458. }
  1459. jackctl_parameter_set_value(parameter, &value);
  1460. jack_controller_settings_save_auto(controller_ptr);
  1461. jack_dbus_construct_method_return_empty(call);
  1462. }
  1463. static
  1464. void
  1465. jack_controller_set_parameter_value_engine_driver(
  1466. struct jack_dbus_method_call * call,
  1467. message_arg_t * arg_ptr,
  1468. int arg_type)
  1469. {
  1470. union jackctl_parameter_value value;
  1471. if (arg_type != DBUS_TYPE_STRING)
  1472. {
  1473. jack_dbus_error(
  1474. call,
  1475. JACK_DBUS_ERROR_INVALID_ARGS,
  1476. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  1477. (char)DBUS_TYPE_STRING,
  1478. (char)arg_type);
  1479. return;
  1480. }
  1481. if (!jack_controller_dbus_to_jack_variant(
  1482. arg_type,
  1483. arg_ptr,
  1484. &value))
  1485. {
  1486. jack_dbus_error(
  1487. call,
  1488. JACK_DBUS_ERROR_INVALID_ARGS,
  1489. "Cannot convert engine parameter value");
  1490. return;
  1491. }
  1492. if (!jack_controller_select_driver(controller_ptr, value.str))
  1493. {
  1494. /* Couldn't find driver with the specified name. */
  1495. jack_dbus_error(
  1496. call,
  1497. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  1498. "Unknown driver '%s'",
  1499. value.str);
  1500. return;
  1501. }
  1502. jack_controller_settings_save_auto(controller_ptr);
  1503. jack_dbus_construct_method_return_empty(call);
  1504. }
  1505. static
  1506. void
  1507. jack_controller_dbus_set_parameter_value(
  1508. struct jack_dbus_method_call * call)
  1509. {
  1510. const char * address[3];
  1511. DBusMessageIter iter;
  1512. DBusMessageIter variant_iter;
  1513. message_arg_t arg;
  1514. int arg_type;
  1515. jackctl_internal_t * internal;
  1516. jackctl_driver_t * driver;
  1517. jackctl_parameter_t * parameter;
  1518. //jack_info("jack_controller_dbus_set_parameter_value() called");
  1519. if (!jack_controller_dbus_get_parameter_address_ex(call, &iter, address))
  1520. {
  1521. /* The method call had invalid arguments meaning that
  1522. * jack_controller_dbus_get_parameter_address() has
  1523. * constructed an error for us. */
  1524. return;
  1525. }
  1526. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1527. dbus_message_iter_next(&iter);
  1528. if (dbus_message_iter_has_next(&iter))
  1529. {
  1530. jack_dbus_error(
  1531. call,
  1532. JACK_DBUS_ERROR_INVALID_ARGS,
  1533. "Invalid arguments to method '%s'. Too many arguments.",
  1534. call->method_name);
  1535. return;
  1536. }
  1537. if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
  1538. {
  1539. jack_dbus_error(
  1540. call,
  1541. JACK_DBUS_ERROR_INVALID_ARGS,
  1542. "Invalid arguments to method '%s'. Value to set must be variant.",
  1543. call->method_name);
  1544. return;
  1545. }
  1546. dbus_message_iter_recurse (&iter, &variant_iter);
  1547. dbus_message_iter_get_basic(&variant_iter, &arg);
  1548. arg_type = dbus_message_iter_get_arg_type(&variant_iter);
  1549. //jack_info("argument of type '%c'", arg_type);
  1550. if (address[0] != NULL &&
  1551. address[1] != NULL &&
  1552. address[2] == NULL &&
  1553. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1554. {
  1555. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1556. {
  1557. jack_controller_set_parameter_value_engine_driver(call, &arg, arg_type);
  1558. return;
  1559. }
  1560. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1561. if (parameter == NULL)
  1562. {
  1563. jack_dbus_error(
  1564. call,
  1565. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1566. "Unknown engine parameter '%s'",
  1567. address[1]);
  1568. return;
  1569. }
  1570. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1571. return;
  1572. }
  1573. if (address[0] != NULL &&
  1574. address[1] != NULL &&
  1575. address[2] == NULL &&
  1576. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1577. {
  1578. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1579. if (parameter == NULL)
  1580. {
  1581. jack_dbus_error(
  1582. call,
  1583. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1584. "Unknown parameter '%s' for driver '%s'",
  1585. address[1],
  1586. jackctl_driver_get_name(controller_ptr->driver));
  1587. return;
  1588. }
  1589. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1590. return;
  1591. }
  1592. if (address[0] != NULL &&
  1593. address[1] != NULL &&
  1594. address[2] != NULL &&
  1595. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1596. {
  1597. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1598. if (driver == NULL)
  1599. {
  1600. jack_dbus_error(
  1601. call,
  1602. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1603. "Unknown driver '%s'",
  1604. address[1]);
  1605. return;
  1606. }
  1607. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1608. if (parameter == NULL)
  1609. {
  1610. jack_dbus_error(
  1611. call,
  1612. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1613. "Unknown parameter '%s' for driver '%s'",
  1614. address[2],
  1615. address[1]);
  1616. return;
  1617. }
  1618. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1619. return;
  1620. }
  1621. if (address[0] != NULL &&
  1622. address[1] != NULL &&
  1623. address[2] != NULL &&
  1624. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1625. {
  1626. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1627. if (internal == NULL)
  1628. {
  1629. jack_dbus_error(
  1630. call,
  1631. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1632. "Unknown internal '%s'",
  1633. address[1]);
  1634. return;
  1635. }
  1636. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1637. if (parameter == NULL)
  1638. {
  1639. jack_dbus_error(
  1640. call,
  1641. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1642. "Unknown parameter '%s' for internal '%s'",
  1643. address[2],
  1644. address[1]);
  1645. return;
  1646. }
  1647. jack_controller_set_parameter_value(call, parameter, &arg, arg_type);
  1648. return;
  1649. }
  1650. jack_dbus_error(
  1651. call,
  1652. JACK_DBUS_ERROR_INVALID_ARGS,
  1653. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1654. address[0],
  1655. address[1],
  1656. address[2],
  1657. call->method_name);
  1658. }
  1659. static
  1660. void
  1661. jack_controller_reset_parameter_value(
  1662. struct jack_dbus_method_call * call,
  1663. jackctl_parameter_t * parameter)
  1664. {
  1665. jackctl_parameter_reset(parameter);
  1666. jack_controller_settings_save_auto(controller_ptr);
  1667. jack_dbus_construct_method_return_empty(call);
  1668. }
  1669. static
  1670. void
  1671. jack_controller_reset_parameter_value_engine_driver(
  1672. struct jack_dbus_method_call * call)
  1673. {
  1674. if (!jack_controller_select_driver(controller_ptr, DEFAULT_DRIVER))
  1675. {
  1676. /* Couldn't find driver with the specified name. */
  1677. jack_dbus_error(
  1678. call,
  1679. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  1680. "Default driver '%s' is unknown",
  1681. DEFAULT_DRIVER);
  1682. return;
  1683. }
  1684. controller_ptr->driver_set = false;
  1685. jack_controller_settings_save_auto(controller_ptr);
  1686. jack_dbus_construct_method_return_empty(call);
  1687. }
  1688. static
  1689. void
  1690. jack_controller_dbus_reset_parameter_value(
  1691. struct jack_dbus_method_call * call)
  1692. {
  1693. const char * address[3];
  1694. jackctl_internal_t * internal;
  1695. jackctl_driver_t * driver;
  1696. jackctl_parameter_t * parameter;
  1697. //jack_info("jack_controller_dbus_reset_parameter_value() called");
  1698. if (!jack_controller_dbus_get_parameter_address(call, address))
  1699. {
  1700. /* The method call had invalid arguments meaning that
  1701. * jack_controller_dbus_get_parameter_address() has
  1702. * constructed an error for us. */
  1703. return;
  1704. }
  1705. //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]);
  1706. if (address[0] != NULL &&
  1707. address[1] != NULL &&
  1708. address[2] == NULL &&
  1709. strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */
  1710. {
  1711. if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0)
  1712. {
  1713. jack_controller_reset_parameter_value_engine_driver(call);
  1714. return;
  1715. }
  1716. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]);
  1717. if (parameter == NULL)
  1718. {
  1719. jack_dbus_error(
  1720. call,
  1721. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1722. "Unknown engine parameter '%s'",
  1723. address[1]);
  1724. return;
  1725. }
  1726. jack_controller_reset_parameter_value(call, parameter);
  1727. return;
  1728. }
  1729. if (address[0] != NULL &&
  1730. address[1] != NULL &&
  1731. address[2] == NULL &&
  1732. strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */
  1733. {
  1734. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]);
  1735. if (parameter == NULL)
  1736. {
  1737. jack_dbus_error(
  1738. call,
  1739. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1740. "Unknown parameter '%s' for driver '%s'",
  1741. address[1],
  1742. jackctl_driver_get_name(controller_ptr->driver));
  1743. return;
  1744. }
  1745. jack_controller_reset_parameter_value(call, parameter);
  1746. return;
  1747. }
  1748. if (address[0] != NULL &&
  1749. address[1] != NULL &&
  1750. address[2] != NULL &&
  1751. strcmp(address[0], PTNODE_DRIVERS) == 0)
  1752. {
  1753. driver = jack_controller_find_driver(controller_ptr->server, address[1]);
  1754. if (driver == NULL)
  1755. {
  1756. jack_dbus_error(
  1757. call,
  1758. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1759. "Unknown driver '%s'",
  1760. address[1]);
  1761. return;
  1762. }
  1763. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]);
  1764. if (parameter == NULL)
  1765. {
  1766. jack_dbus_error(
  1767. call,
  1768. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1769. "Unknown parameter '%s' for driver '%s'",
  1770. address[2],
  1771. address[1]);
  1772. return;
  1773. }
  1774. jack_controller_reset_parameter_value(call, parameter);
  1775. return;
  1776. }
  1777. if (address[0] != NULL &&
  1778. address[1] != NULL &&
  1779. address[2] != NULL &&
  1780. strcmp(address[0], PTNODE_INTERNALS) == 0)
  1781. {
  1782. internal = jack_controller_find_internal(controller_ptr->server, address[1]);
  1783. if (internal == NULL)
  1784. {
  1785. jack_dbus_error(
  1786. call,
  1787. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1788. "Unknown internal '%s'",
  1789. address[1]);
  1790. return;
  1791. }
  1792. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]);
  1793. if (parameter == NULL)
  1794. {
  1795. jack_dbus_error(
  1796. call,
  1797. JACK_DBUS_ERROR_UNKNOWN_PARAMETER,
  1798. "Unknown parameter '%s' for internal '%s'",
  1799. address[2],
  1800. address[1]);
  1801. return;
  1802. }
  1803. jack_controller_reset_parameter_value(call, parameter);
  1804. return;
  1805. }
  1806. jack_dbus_error(
  1807. call,
  1808. JACK_DBUS_ERROR_INVALID_ARGS,
  1809. "Invalid container address '%s':'%s':'%s' supplied to method '%s'.",
  1810. address[0],
  1811. address[1],
  1812. address[2],
  1813. call->method_name);
  1814. }
  1815. #undef controller_ptr
  1816. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(ReadContainer, "Get names of child parameters or containers")
  1817. JACK_DBUS_METHOD_ARGUMENT_IN("parent", "as", "Address of parent container")
  1818. JACK_DBUS_METHOD_ARGUMENT_OUT("leaf", "b", "Whether children are parameters (true) or containers (false)")
  1819. JACK_DBUS_METHOD_ARGUMENT_OUT("children", "as", "Array of child names")
  1820. JACK_DBUS_METHOD_ARGUMENTS_END
  1821. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParametersInfo, "Retrieve info about parameters")
  1822. JACK_DBUS_METHOD_ARGUMENT_IN("parent", "as", "Address of parameters parent")
  1823. 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")
  1824. JACK_DBUS_METHOD_ARGUMENTS_END
  1825. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParameterInfo, "Retrieve info about parameter")
  1826. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1827. JACK_DBUS_METHOD_ARGUMENT_OUT("parameter_info", "(ysss)", "Parameter info struct that contains: type char, name, short and long description")
  1828. JACK_DBUS_METHOD_ARGUMENTS_END
  1829. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParameterConstraint, "Get constraint of parameter")
  1830. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1831. JACK_DBUS_METHOD_ARGUMENT_OUT("is_range", "b", "Whether constrinat is a range. If so, values parameter will contain two values, min and max")
  1832. JACK_DBUS_METHOD_ARGUMENT_OUT("is_strict", "b", "Whether enum constraint is strict. I.e. value not listed in values array will not work")
  1833. JACK_DBUS_METHOD_ARGUMENT_OUT("is_fake_value", "b", "Whether enum values are fake. I.e. have no user meaningful meaning")
  1834. 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.")
  1835. JACK_DBUS_METHOD_ARGUMENTS_END
  1836. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(GetParameterValue, "Get value of parameter")
  1837. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1838. JACK_DBUS_METHOD_ARGUMENT_OUT("is_set", "b", "Whether parameter is set or its default value is used")
  1839. JACK_DBUS_METHOD_ARGUMENT_OUT("default", "v", "Default value of parameter")
  1840. JACK_DBUS_METHOD_ARGUMENT_OUT("value", "v", "Actual value of parameter")
  1841. JACK_DBUS_METHOD_ARGUMENTS_END
  1842. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(SetParameterValue, "Set value of parameter")
  1843. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1844. JACK_DBUS_METHOD_ARGUMENT_IN("value", "v", "New value for parameter")
  1845. JACK_DBUS_METHOD_ARGUMENTS_END
  1846. JACK_DBUS_METHOD_ARGUMENTS_BEGIN_EX(ResetParameterValue, "Reset parameter to default value")
  1847. JACK_DBUS_METHOD_ARGUMENT_IN("parameter", "as", "Address of parameter")
  1848. JACK_DBUS_METHOD_ARGUMENTS_END
  1849. JACK_DBUS_METHODS_BEGIN
  1850. JACK_DBUS_METHOD_DESCRIBE(ReadContainer, jack_controller_dbus_read_container)
  1851. JACK_DBUS_METHOD_DESCRIBE(GetParametersInfo, jack_controller_dbus_get_parameters_info)
  1852. JACK_DBUS_METHOD_DESCRIBE(GetParameterInfo, jack_controller_dbus_get_parameter_info)
  1853. JACK_DBUS_METHOD_DESCRIBE(GetParameterConstraint, jack_controller_dbus_get_parameter_constraint)
  1854. JACK_DBUS_METHOD_DESCRIBE(GetParameterValue, jack_controller_dbus_get_parameter_value)
  1855. JACK_DBUS_METHOD_DESCRIBE(SetParameterValue, jack_controller_dbus_set_parameter_value)
  1856. JACK_DBUS_METHOD_DESCRIBE(ResetParameterValue, jack_controller_dbus_reset_parameter_value)
  1857. JACK_DBUS_METHODS_END
  1858. /*
  1859. * Parameter addresses:
  1860. *
  1861. * "engine"
  1862. * "engine", "driver"
  1863. * "engine", "realtime"
  1864. * "engine", ...more engine parameters
  1865. *
  1866. * "driver", "device"
  1867. * "driver", ...more driver parameters
  1868. *
  1869. * "drivers", "alsa", "device"
  1870. * "drivers", "alsa", ...more alsa driver parameters
  1871. *
  1872. * "drivers", ...more drivers
  1873. *
  1874. * "internals", "netmanager", "multicast_ip"
  1875. * "internals", "netmanager", ...more netmanager parameters
  1876. *
  1877. * "internals", ...more internals
  1878. *
  1879. */
  1880. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.Configure")
  1881. JACK_DBUS_IFACE_EXPOSE_METHODS
  1882. JACK_DBUS_IFACE_END