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.

1422 lines
42KB

  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. unsigned char jack_controller_dbus_types[JACK_PARAM_MAX] =
  27. {
  28. [JackParamInt] = DBUS_TYPE_INT32,
  29. [JackParamUInt] = DBUS_TYPE_UINT32,
  30. [JackParamChar] = DBUS_TYPE_BYTE,
  31. [JackParamString] = DBUS_TYPE_STRING,
  32. [JackParamBool] = DBUS_TYPE_BOOLEAN,
  33. };
  34. const char *jack_controller_dbus_type_signatures[JACK_PARAM_MAX] =
  35. {
  36. [JackParamInt] = DBUS_TYPE_INT32_AS_STRING,
  37. [JackParamUInt] = DBUS_TYPE_UINT32_AS_STRING,
  38. [JackParamChar] = DBUS_TYPE_BYTE_AS_STRING,
  39. [JackParamString] = DBUS_TYPE_STRING_AS_STRING,
  40. [JackParamBool] = DBUS_TYPE_BOOLEAN_AS_STRING,
  41. };
  42. #define PARAM_TYPE_JACK_TO_DBUS(_) jack_controller_dbus_types[_]
  43. #define PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(_) jack_controller_dbus_type_signatures[_]
  44. static
  45. bool
  46. jack_controller_jack_to_dbus_variant(
  47. jackctl_param_type_t type,
  48. const union jackctl_parameter_value *value_ptr,
  49. message_arg_t *dbusv_ptr)
  50. {
  51. switch (type)
  52. {
  53. case JackParamInt:
  54. dbusv_ptr->int32 = (dbus_int32_t)value_ptr->i;
  55. return true;
  56. case JackParamUInt:
  57. dbusv_ptr->uint32 = (dbus_uint32_t)value_ptr->ui;
  58. return true;
  59. case JackParamChar:
  60. dbusv_ptr->byte = value_ptr->c;
  61. return true;
  62. case JackParamString:
  63. dbusv_ptr->string = value_ptr->str;
  64. return true;
  65. case JackParamBool:
  66. dbusv_ptr->boolean = (dbus_bool_t)value_ptr->b;
  67. return true;
  68. }
  69. jack_error("Unknown JACK parameter type %i", (int)type);
  70. assert(0);
  71. return false;
  72. }
  73. static
  74. bool
  75. jack_controller_dbus_to_jack_variant(
  76. int type,
  77. const message_arg_t *dbusv_ptr,
  78. union jackctl_parameter_value *value_ptr)
  79. {
  80. size_t len;
  81. switch (type)
  82. {
  83. case DBUS_TYPE_INT32:
  84. value_ptr->i = dbusv_ptr->int32;
  85. return true;
  86. case DBUS_TYPE_UINT32:
  87. value_ptr->ui = dbusv_ptr->uint32;
  88. return true;
  89. case DBUS_TYPE_BYTE:
  90. value_ptr->c = dbusv_ptr->byte;
  91. return true;
  92. case DBUS_TYPE_STRING:
  93. len = strlen(dbusv_ptr->string);
  94. if (len > JACK_PARAM_STRING_MAX)
  95. {
  96. jack_error("Parameter string value is too long (%u)", (unsigned int)len);
  97. return false;
  98. }
  99. memcpy(value_ptr->str, dbusv_ptr->string, len + 1);
  100. return true;
  101. case DBUS_TYPE_BOOLEAN:
  102. value_ptr->b = dbusv_ptr->boolean;
  103. return true;
  104. }
  105. jack_error("Unknown D-Bus parameter type %i", (int)type);
  106. return false;
  107. }
  108. /*
  109. * Construct a return message for a Get[Driver|Engine]ParameterValue method call.
  110. *
  111. * The operation can only fail due to lack of memory, in which case
  112. * there's no sense in trying to construct an error return. Instead,
  113. * call->reply will be set to NULL and handled in send_method_return().
  114. */
  115. static void
  116. jack_dbus_construct_method_return_parameter(
  117. struct jack_dbus_method_call *call,
  118. dbus_bool_t is_set,
  119. int type,
  120. const char *signature,
  121. message_arg_t default_value,
  122. message_arg_t value)
  123. {
  124. DBusMessageIter iter;
  125. /* Create a new method return message. */
  126. call->reply = dbus_message_new_method_return (call->message);
  127. if (!call->reply)
  128. {
  129. goto fail;
  130. }
  131. dbus_message_iter_init_append (call->reply, &iter);
  132. /* Append the is_set argument. */
  133. if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, (const void *) &is_set))
  134. {
  135. goto fail_unref;
  136. }
  137. /* Append the 'default' and 'value' arguments. */
  138. if (!jack_dbus_message_append_variant(&iter, type, signature, &default_value))
  139. {
  140. goto fail_unref;
  141. }
  142. if (!jack_dbus_message_append_variant(&iter, type, signature, &value))
  143. {
  144. goto fail_unref;
  145. }
  146. return;
  147. fail_unref:
  148. dbus_message_unref (call->reply);
  149. call->reply = NULL;
  150. fail:
  151. jack_error ("Ran out of memory trying to construct method return");
  152. }
  153. #define controller_ptr ((struct jack_controller *)call->context)
  154. static
  155. void
  156. jack_controller_dbus_get_available_drivers(
  157. struct jack_dbus_method_call *call)
  158. {
  159. jack_dbus_construct_method_return_array_of_strings(
  160. call,
  161. controller_ptr->drivers_count,
  162. controller_ptr->driver_names);
  163. }
  164. static
  165. void
  166. jack_controller_dbus_get_selected_driver(
  167. struct jack_dbus_method_call *call)
  168. {
  169. message_arg_t arg;
  170. if (controller_ptr->driver != NULL)
  171. {
  172. arg.string = jackctl_driver_get_name(controller_ptr->driver);
  173. }
  174. else
  175. {
  176. arg.string = NULL;
  177. }
  178. jack_dbus_construct_method_return_single(call, DBUS_TYPE_STRING, arg);
  179. }
  180. static
  181. void
  182. jack_controller_dbus_select_driver(
  183. struct jack_dbus_method_call *call)
  184. {
  185. const char *driver_name;
  186. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
  187. {
  188. /* The method call had invalid arguments meaning that
  189. * jack_dbus_get_method_args() has constructed an error for us.
  190. */
  191. return;
  192. }
  193. if (!jack_controller_select_driver(controller_ptr, driver_name))
  194. {
  195. /* Couldn't find driver with the specified name. */
  196. jack_dbus_error(
  197. call,
  198. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  199. "Unknown driver \"%s\"",
  200. driver_name);
  201. return;
  202. }
  203. jack_controller_settings_save_auto(controller_ptr);
  204. jack_dbus_construct_method_return_empty(call);
  205. }
  206. static
  207. void
  208. jack_controller_get_parameters_info(
  209. struct jack_dbus_method_call *call,
  210. const JSList *parameters_list)
  211. {
  212. DBusMessageIter iter, array_iter, struct_iter;
  213. unsigned char type;
  214. const char *str;
  215. call->reply = dbus_message_new_method_return (call->message);
  216. if (!call->reply)
  217. {
  218. goto fail;
  219. }
  220. dbus_message_iter_init_append (call->reply, &iter);
  221. /* Open the array. */
  222. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ysss)", &array_iter))
  223. {
  224. goto fail_unref;
  225. }
  226. /* Append parameter descriptions to the array. */
  227. while (parameters_list != NULL)
  228. {
  229. /* Open the struct. */
  230. if (!dbus_message_iter_open_container (&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  231. {
  232. goto fail_close_unref;
  233. }
  234. /* Append parameter type. */
  235. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type((jackctl_parameter_t *)parameters_list->data));
  236. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  237. (const void *) &type))
  238. {
  239. goto fail_close2_unref;
  240. }
  241. /* Append parameter name. */
  242. str = jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data);
  243. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  244. (const void *) &str))
  245. {
  246. goto fail_close2_unref;
  247. }
  248. /* Append parameter short description. */
  249. str = jackctl_parameter_get_short_description((jackctl_parameter_t *)parameters_list->data);
  250. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  251. (const void *) &str))
  252. {
  253. goto fail_close2_unref;
  254. }
  255. /* Append parameter long description. */
  256. str = jackctl_parameter_get_long_description((jackctl_parameter_t *)parameters_list->data);
  257. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  258. (const void *) &str))
  259. {
  260. goto fail_close2_unref;
  261. }
  262. /* Close the struct. */
  263. if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
  264. {
  265. goto fail_close_unref;
  266. }
  267. parameters_list = jack_slist_next(parameters_list);
  268. }
  269. /* Close the array. */
  270. if (!dbus_message_iter_close_container (&iter, &array_iter))
  271. {
  272. goto fail_unref;
  273. }
  274. return;
  275. fail_close2_unref:
  276. dbus_message_iter_close_container (&iter, &struct_iter);
  277. fail_close_unref:
  278. dbus_message_iter_close_container (&iter, &array_iter);
  279. fail_unref:
  280. dbus_message_unref (call->reply);
  281. call->reply = NULL;
  282. fail:
  283. jack_error ("Ran out of memory trying to construct method return");
  284. }
  285. static
  286. void
  287. jack_controller_get_parameter_info(
  288. struct jack_dbus_method_call *call,
  289. jackctl_parameter_t *parameter)
  290. {
  291. DBusMessageIter iter, struct_iter;
  292. unsigned char type;
  293. const char *str;
  294. call->reply = dbus_message_new_method_return (call->message);
  295. if (!call->reply)
  296. {
  297. goto fail;
  298. }
  299. dbus_message_iter_init_append (call->reply, &iter);
  300. /* Open the struct. */
  301. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  302. {
  303. goto fail_unref;
  304. }
  305. /* Append parameter type. */
  306. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type(parameter));
  307. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  308. (const void *) &type))
  309. {
  310. goto fail_close_unref;
  311. }
  312. /* Append parameter name. */
  313. str = jackctl_parameter_get_name(parameter);
  314. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  315. (const void *) &str))
  316. {
  317. goto fail_close_unref;
  318. }
  319. /* Append parameter short description. */
  320. str = jackctl_parameter_get_short_description(parameter);
  321. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  322. (const void *) &str))
  323. {
  324. goto fail_close_unref;
  325. }
  326. /* Append parameter long description. */
  327. str = jackctl_parameter_get_long_description(parameter);
  328. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  329. (const void *) &str))
  330. {
  331. goto fail_close_unref;
  332. }
  333. /* Close the struct. */
  334. if (!dbus_message_iter_close_container (&iter, &struct_iter))
  335. {
  336. goto fail_unref;
  337. }
  338. return;
  339. fail_close_unref:
  340. dbus_message_iter_close_container (&iter, &struct_iter);
  341. fail_unref:
  342. dbus_message_unref (call->reply);
  343. call->reply = NULL;
  344. fail:
  345. jack_error ("Ran out of memory trying to construct method return");
  346. }
  347. static
  348. void
  349. jack_controller_get_parameter_constraint(
  350. struct jack_dbus_method_call * call,
  351. jackctl_parameter_t * parameter)
  352. {
  353. uint32_t index;
  354. uint32_t count;
  355. union jackctl_parameter_value min;
  356. union jackctl_parameter_value max;
  357. union jackctl_parameter_value jackctl_value;
  358. DBusMessageIter iter, array_iter, struct_iter;
  359. const char * descr;
  360. jackctl_param_type_t type;
  361. message_arg_t value;
  362. bool is_range;
  363. type = jackctl_parameter_get_type(parameter);
  364. call->reply = dbus_message_new_method_return(call->message);
  365. if (!call->reply)
  366. {
  367. goto fail;
  368. }
  369. dbus_message_iter_init_append(call->reply, &iter);
  370. is_range = jackctl_parameter_has_range_constraint(parameter);
  371. value.boolean = is_range;
  372. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  373. {
  374. goto fail_unref;
  375. }
  376. value.boolean = jackctl_parameter_constraint_is_strict(parameter);
  377. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  378. {
  379. goto fail_unref;
  380. }
  381. value.boolean = jackctl_parameter_constraint_is_fake_value(parameter);
  382. if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value))
  383. {
  384. goto fail_unref;
  385. }
  386. /* Open the array. */
  387. if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(vs)", &array_iter))
  388. {
  389. goto fail_unref;
  390. }
  391. if (is_range)
  392. {
  393. jack_info("parameter with range constraint");
  394. jackctl_parameter_get_range_constraint(parameter, &min, &max);
  395. /* Open the struct. */
  396. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  397. {
  398. goto fail_close_unref;
  399. }
  400. jack_controller_jack_to_dbus_variant(type, &min, &value);
  401. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  402. {
  403. goto fail_close2_unref;
  404. }
  405. descr = "min";
  406. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  407. {
  408. goto fail_close2_unref;
  409. }
  410. /* Close the struct. */
  411. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  412. {
  413. goto fail_close_unref;
  414. }
  415. /* Open the struct. */
  416. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  417. {
  418. goto fail_close_unref;
  419. }
  420. jack_controller_jack_to_dbus_variant(type, &max, &value);
  421. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  422. {
  423. goto fail_close2_unref;
  424. }
  425. descr = "max";
  426. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  427. {
  428. goto fail_close2_unref;
  429. }
  430. /* Close the struct. */
  431. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  432. {
  433. goto fail_close_unref;
  434. }
  435. }
  436. else
  437. {
  438. count = jackctl_parameter_get_enum_constraints_count(parameter);
  439. /* Append enum values to the array. */
  440. for (index = 0 ; index < count ; index++)
  441. {
  442. jackctl_value = jackctl_parameter_get_enum_constraint_value(parameter, index);
  443. descr = jackctl_parameter_get_enum_constraint_description(parameter, index);
  444. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  445. /* Open the struct. */
  446. if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  447. {
  448. goto fail_close_unref;
  449. }
  450. if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value))
  451. {
  452. goto fail_close2_unref;
  453. }
  454. if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &descr))
  455. {
  456. goto fail_close2_unref;
  457. }
  458. /* Close the struct. */
  459. if (!dbus_message_iter_close_container(&array_iter, &struct_iter))
  460. {
  461. goto fail_close_unref;
  462. }
  463. }
  464. }
  465. /* Close the array. */
  466. if (!dbus_message_iter_close_container(&iter, &array_iter))
  467. {
  468. goto fail_unref;
  469. }
  470. return;
  471. fail_close2_unref:
  472. dbus_message_iter_close_container(&array_iter, &struct_iter);
  473. fail_close_unref:
  474. dbus_message_iter_close_container(&iter, &array_iter);
  475. fail_unref:
  476. dbus_message_unref(call->reply);
  477. call->reply = NULL;
  478. fail:
  479. jack_error ("Ran out of memory trying to construct method return");
  480. }
  481. static
  482. void
  483. jack_controller_dbus_get_driver_parameter_constraint(
  484. struct jack_dbus_method_call * call)
  485. {
  486. const char * parameter_name;
  487. jackctl_parameter_t * parameter;
  488. if (controller_ptr->driver == NULL)
  489. {
  490. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER, "No driver selected");
  491. return;
  492. }
  493. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  494. {
  495. /* The method call had invalid arguments meaning that
  496. * jack_dbus_get_method_args() has constructed an error for us.
  497. */
  498. return;
  499. }
  500. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  501. if (parameter == NULL)
  502. {
  503. jack_dbus_error(
  504. call,
  505. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  506. "Unknown parameter \"%s\" for driver \"%s\"",
  507. parameter_name,
  508. jackctl_driver_get_name(controller_ptr->driver));
  509. return;
  510. }
  511. jack_controller_get_parameter_constraint(call, parameter);
  512. }
  513. /*
  514. * Execute GetDriverParametersInfo method call.
  515. */
  516. static
  517. void
  518. jack_controller_dbus_get_driver_parameters_info(
  519. struct jack_dbus_method_call *call)
  520. {
  521. if (controller_ptr->driver == NULL)
  522. {
  523. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  524. "No driver selected");
  525. return;
  526. }
  527. jack_controller_get_parameters_info(
  528. call,
  529. jackctl_driver_get_parameters(controller_ptr->driver));
  530. }
  531. /*
  532. * Execute GetDriverParameterInfo method call.
  533. */
  534. static
  535. void
  536. jack_controller_dbus_get_driver_parameter_info(
  537. struct jack_dbus_method_call *call)
  538. {
  539. const char *parameter_name;
  540. jackctl_parameter_t *parameter;
  541. if (controller_ptr->driver == NULL)
  542. {
  543. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  544. "No driver selected");
  545. return;
  546. }
  547. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  548. {
  549. /* The method call had invalid arguments meaning that
  550. * jack_dbus_get_method_args() has constructed an error for us.
  551. */
  552. return;
  553. }
  554. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  555. if (parameter == NULL)
  556. {
  557. jack_dbus_error(
  558. call,
  559. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  560. "Unknown parameter \"%s\" for driver \"%s\"",
  561. parameter_name,
  562. jackctl_driver_get_name(controller_ptr->driver));
  563. return;
  564. }
  565. jack_controller_get_parameter_info(call, parameter);
  566. }
  567. /*
  568. * Execute GetDriverParameterValue method call.
  569. */
  570. static void
  571. jack_controller_dbus_get_driver_parameter_value(
  572. struct jack_dbus_method_call *call)
  573. {
  574. const char *parameter_name;
  575. jackctl_parameter_t *parameter;
  576. int type;
  577. union jackctl_parameter_value jackctl_value;
  578. union jackctl_parameter_value jackctl_default_value;
  579. message_arg_t value;
  580. message_arg_t default_value;
  581. if (controller_ptr->driver == NULL)
  582. {
  583. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  584. "No driver selected");
  585. return;
  586. }
  587. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  588. {
  589. /* The method call had invalid arguments meaning that
  590. * get_method_args() has constructed an error for us.
  591. */
  592. return;
  593. }
  594. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  595. if (parameter == NULL)
  596. {
  597. jack_dbus_error(
  598. call,
  599. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  600. "Unknown parameter \"%s\" for driver \"%s\"",
  601. parameter,
  602. jackctl_driver_get_name(controller_ptr->driver));
  603. return;
  604. }
  605. type = jackctl_parameter_get_type(parameter);
  606. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  607. jackctl_value = jackctl_parameter_get_value(parameter);
  608. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  609. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  610. /* Construct the reply. */
  611. jack_dbus_construct_method_return_parameter(
  612. call,
  613. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  614. PARAM_TYPE_JACK_TO_DBUS(type),
  615. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  616. default_value,
  617. value);
  618. }
  619. static
  620. void
  621. jack_controller_dbus_set_driver_parameter_value(
  622. struct jack_dbus_method_call *call)
  623. {
  624. const char *parameter_name;
  625. message_arg_t arg;
  626. int arg_type;
  627. jackctl_parameter_t *parameter;
  628. jackctl_param_type_t type;
  629. union jackctl_parameter_value value;
  630. if (controller_ptr->driver == NULL)
  631. {
  632. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  633. "No driver selected");
  634. return;
  635. }
  636. if (!jack_dbus_get_method_args_string_and_variant(call, &parameter_name, &arg, &arg_type))
  637. {
  638. /* The method call had invalid arguments meaning that
  639. * jack_dbus_get_method_args_string_and_variant() has constructed
  640. * an error for us.
  641. */
  642. return;
  643. }
  644. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  645. if (parameter == NULL)
  646. {
  647. jack_dbus_error(
  648. call,
  649. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  650. "Unknown parameter \"%s\" for driver \"%s\"",
  651. parameter,
  652. jackctl_driver_get_name(controller_ptr->driver));
  653. return;
  654. }
  655. type = jackctl_parameter_get_type(parameter);
  656. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  657. {
  658. jack_dbus_error(
  659. call,
  660. JACK_DBUS_ERROR_INVALID_ARGS,
  661. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  662. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  663. (char)arg_type);
  664. return;
  665. }
  666. if (!jack_controller_dbus_to_jack_variant(
  667. arg_type,
  668. &arg,
  669. &value))
  670. {
  671. jack_dbus_error(
  672. call,
  673. JACK_DBUS_ERROR_INVALID_ARGS,
  674. "Cannot convert engine parameter value");
  675. return;
  676. }
  677. jackctl_parameter_set_value(parameter, &value);
  678. jack_controller_settings_save_auto(controller_ptr);
  679. jack_dbus_construct_method_return_empty(call);
  680. }
  681. /*
  682. * Execute GetEngineParametersInfo method call.
  683. */
  684. static
  685. void
  686. jack_controller_dbus_get_engine_parameters_info(
  687. struct jack_dbus_method_call *call)
  688. {
  689. jack_controller_get_parameters_info(
  690. call,
  691. jackctl_server_get_parameters(controller_ptr->server));
  692. }
  693. /*
  694. * Execute GetEngineParameterInfo method call.
  695. */
  696. static
  697. void
  698. jack_controller_dbus_get_engine_parameter_info(
  699. struct jack_dbus_method_call *call)
  700. {
  701. const char *parameter_name;
  702. jackctl_parameter_t *parameter;
  703. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  704. {
  705. /* The method call had invalid arguments meaning that
  706. * jack_dbus_get_method_args() has constructed an error for us.
  707. */
  708. return;
  709. }
  710. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  711. if (parameter == NULL)
  712. {
  713. jack_dbus_error(
  714. call,
  715. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  716. "Unknown engine parameter \"%s\"",
  717. parameter);
  718. return;
  719. }
  720. jack_controller_get_parameter_info(call, parameter);
  721. }
  722. /*
  723. * Execute GetEngineParameterConstraint method call.
  724. */
  725. static
  726. void
  727. jack_controller_dbus_get_engine_parameter_constraint(
  728. struct jack_dbus_method_call *call)
  729. {
  730. const char *parameter_name;
  731. jackctl_parameter_t *parameter;
  732. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  733. {
  734. /* The method call had invalid arguments meaning that
  735. * jack_dbus_get_method_args() has constructed an error for us.
  736. */
  737. return;
  738. }
  739. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  740. if (parameter == NULL)
  741. {
  742. jack_dbus_error(
  743. call,
  744. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  745. "Unknown engine parameter \"%s\"",
  746. parameter);
  747. return;
  748. }
  749. jack_controller_get_parameter_constraint(call, parameter);
  750. }
  751. /*
  752. * Execute GetDriverParameterValue method call.
  753. */
  754. static
  755. void
  756. jack_controller_dbus_get_engine_parameter_value(
  757. struct jack_dbus_method_call *call)
  758. {
  759. const char *parameter_name;
  760. jackctl_parameter_t *parameter;
  761. jackctl_param_type_t type;
  762. union jackctl_parameter_value jackctl_value;
  763. union jackctl_parameter_value jackctl_default_value;
  764. message_arg_t value;
  765. message_arg_t default_value;
  766. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  767. {
  768. /* The method call had invalid arguments meaning that
  769. * jack_dbus_get_method_args() has constructed an error for us.
  770. */
  771. return;
  772. }
  773. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  774. if (parameter == NULL)
  775. {
  776. jack_dbus_error(
  777. call,
  778. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  779. "Unknown engine parameter \"%s\"",
  780. parameter);
  781. return;
  782. }
  783. type = jackctl_parameter_get_type(parameter);
  784. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  785. jackctl_value = jackctl_parameter_get_value(parameter);
  786. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  787. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  788. /* Construct the reply. */
  789. jack_dbus_construct_method_return_parameter(
  790. call,
  791. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  792. PARAM_TYPE_JACK_TO_DBUS(type),
  793. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  794. default_value,
  795. value);
  796. }
  797. static
  798. void
  799. jack_controller_dbus_set_engine_parameter_value(
  800. struct jack_dbus_method_call *call)
  801. {
  802. const char *parameter_name;
  803. message_arg_t arg;
  804. int arg_type;
  805. jackctl_parameter_t *parameter;
  806. jackctl_param_type_t type;
  807. union jackctl_parameter_value value;
  808. if (!jack_dbus_get_method_args_string_and_variant (call, &parameter_name, &arg, &arg_type))
  809. {
  810. /* The method call had invalid arguments meaning that
  811. * jack_dbus_get_method_args_string_and_variant() has constructed
  812. * an error for us.
  813. */
  814. return;
  815. }
  816. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  817. if (parameter == NULL)
  818. {
  819. jack_dbus_error(
  820. call,
  821. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  822. "Unknown engine parameter \"%s\"",
  823. parameter);
  824. return;
  825. }
  826. type = jackctl_parameter_get_type(parameter);
  827. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  828. {
  829. jack_dbus_error(
  830. call,
  831. JACK_DBUS_ERROR_INVALID_ARGS,
  832. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  833. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  834. (char)arg_type);
  835. return;
  836. }
  837. if (!jack_controller_dbus_to_jack_variant(
  838. arg_type,
  839. &arg,
  840. &value))
  841. {
  842. jack_dbus_error(
  843. call,
  844. JACK_DBUS_ERROR_INVALID_ARGS,
  845. "Cannot convert engine parameter value");
  846. return;
  847. }
  848. jackctl_parameter_set_value(parameter, &value);
  849. jack_controller_settings_save_auto(controller_ptr);
  850. jack_dbus_construct_method_return_empty(call);
  851. }
  852. static
  853. void
  854. jack_controller_dbus_get_available_internals(
  855. struct jack_dbus_method_call *call)
  856. {
  857. jack_dbus_construct_method_return_array_of_strings(
  858. call,
  859. controller_ptr->internals_count,
  860. controller_ptr->internal_names);
  861. }
  862. /*
  863. * Execute GetInternalParametersInfo method call.
  864. */
  865. static
  866. void
  867. jack_controller_dbus_get_internal_parameters_info(
  868. struct jack_dbus_method_call *call)
  869. {
  870. const char *internal_name;
  871. jackctl_internal_t * internal;
  872. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_INVALID))
  873. {
  874. /* The method call had invalid arguments meaning that
  875. * get_method_args() has constructed an error for us.
  876. */
  877. return;
  878. }
  879. internal = jack_controller_find_internal(controller_ptr->server, internal_name);
  880. if (internal == NULL)
  881. {
  882. jack_dbus_error(
  883. call,
  884. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  885. "Unknown internal \"%s\"",
  886. internal_name);
  887. return;
  888. }
  889. jack_controller_get_parameters_info(call, jackctl_internal_get_parameters(internal));
  890. }
  891. /*
  892. * Execute GetInternalParameterInfo method call.
  893. */
  894. static
  895. void
  896. jack_controller_dbus_get_internal_parameter_info(
  897. struct jack_dbus_method_call *call)
  898. {
  899. const char *internal_name;
  900. const char *parameter_name;
  901. jackctl_parameter_t *parameter;
  902. jackctl_internal_t * internal;
  903. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  904. {
  905. /* The method call had invalid arguments meaning that
  906. * get_method_args() has constructed an error for us.
  907. */
  908. return;
  909. }
  910. internal = jack_controller_find_internal(controller_ptr->server, internal_name);
  911. if (internal == NULL)
  912. {
  913. jack_dbus_error(
  914. call,
  915. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  916. "Unknown internal \"%s\"",
  917. internal_name);
  918. return;
  919. }
  920. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), parameter_name);
  921. if (parameter == NULL)
  922. {
  923. jack_dbus_error(
  924. call,
  925. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  926. "Unknown parameter \"%s\" for driver \"%s\"",
  927. parameter_name,
  928. jackctl_driver_get_name(controller_ptr->driver));
  929. return;
  930. }
  931. jack_controller_get_parameter_info(call, parameter);
  932. }
  933. /*
  934. * Execute GetInternalParameterConstraint method call.
  935. */
  936. static
  937. void
  938. jack_controller_dbus_get_internal_parameter_constraint(
  939. struct jack_dbus_method_call *call)
  940. {
  941. const char *internal_name;
  942. const char *parameter_name;
  943. jackctl_parameter_t *parameter;
  944. jackctl_internal_t * internal;
  945. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  946. {
  947. /* The method call had invalid arguments meaning that
  948. * get_method_args() has constructed an error for us.
  949. */
  950. return;
  951. }
  952. internal = jack_controller_find_internal(controller_ptr->server, internal_name);
  953. if (internal == NULL)
  954. {
  955. jack_dbus_error(
  956. call,
  957. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  958. "Unknown internal \"%s\"",
  959. internal_name);
  960. return;
  961. }
  962. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), parameter_name);
  963. if (parameter == NULL)
  964. {
  965. jack_dbus_error(
  966. call,
  967. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  968. "Unknown parameter \"%s\" for driver \"%s\"",
  969. parameter_name,
  970. jackctl_driver_get_name(controller_ptr->driver));
  971. return;
  972. }
  973. jack_controller_get_parameter_constraint(call, parameter);
  974. }
  975. /*
  976. * Execute GetInternalParameterValue method call.
  977. */
  978. static void
  979. jack_controller_dbus_get_internal_parameter_value(
  980. struct jack_dbus_method_call *call)
  981. {
  982. const char *internal_name;
  983. const char *parameter_name;
  984. jackctl_parameter_t *parameter;
  985. jackctl_internal_t * internal;
  986. int type;
  987. union jackctl_parameter_value jackctl_value;
  988. union jackctl_parameter_value jackctl_default_value;
  989. message_arg_t value;
  990. message_arg_t default_value;
  991. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  992. {
  993. /* The method call had invalid arguments meaning that
  994. * get_method_args() has constructed an error for us.
  995. */
  996. return;
  997. }
  998. internal = jack_controller_find_internal(controller_ptr->server, internal_name);
  999. if (internal == NULL)
  1000. {
  1001. jack_dbus_error(
  1002. call,
  1003. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1004. "Unknown internal \"%s\"",
  1005. internal_name);
  1006. return;
  1007. }
  1008. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), parameter_name);
  1009. if (parameter == NULL)
  1010. {
  1011. jack_dbus_error(
  1012. call,
  1013. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1014. "Unknown parameter \"%s\" for driver \"%s\"",
  1015. parameter,
  1016. jackctl_driver_get_name(controller_ptr->driver));
  1017. return;
  1018. }
  1019. type = jackctl_parameter_get_type(parameter);
  1020. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  1021. jackctl_value = jackctl_parameter_get_value(parameter);
  1022. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  1023. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  1024. /* Construct the reply. */
  1025. jack_dbus_construct_method_return_parameter(
  1026. call,
  1027. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  1028. PARAM_TYPE_JACK_TO_DBUS(type),
  1029. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1030. default_value,
  1031. value);
  1032. }
  1033. static
  1034. void
  1035. jack_controller_dbus_set_internal_parameter_value(
  1036. struct jack_dbus_method_call *call)
  1037. {
  1038. const char *internal_name;
  1039. const char *parameter_name;
  1040. jackctl_internal_t * internal;
  1041. message_arg_t arg;
  1042. int arg_type;
  1043. jackctl_parameter_t *parameter;
  1044. jackctl_param_type_t type;
  1045. union jackctl_parameter_value value;
  1046. if (!jack_dbus_get_method_args_two_strings_and_variant(call, &internal_name, &parameter_name, &arg, &arg_type))
  1047. {
  1048. /* The method call had invalid arguments meaning that
  1049. * jack_dbus_get_method_args_two_strings_and_variant() has constructed
  1050. * an error for us.
  1051. */
  1052. return;
  1053. }
  1054. internal = jack_controller_find_internal(controller_ptr->server, internal_name);
  1055. if (internal == NULL)
  1056. {
  1057. jack_dbus_error(
  1058. call,
  1059. JACK_DBUS_ERROR_UNKNOWN_INTERNAL,
  1060. "Unknown internal \"%s\"",
  1061. internal_name);
  1062. return;
  1063. }
  1064. parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), parameter_name);
  1065. if (parameter == NULL)
  1066. {
  1067. jack_dbus_error(
  1068. call,
  1069. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1070. "Unknown parameter \"%s\" for driver \"%s\"",
  1071. parameter,
  1072. jackctl_driver_get_name(controller_ptr->driver));
  1073. return;
  1074. }
  1075. type = jackctl_parameter_get_type(parameter);
  1076. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  1077. {
  1078. jack_dbus_error(
  1079. call,
  1080. JACK_DBUS_ERROR_INVALID_ARGS,
  1081. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  1082. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  1083. (char)arg_type);
  1084. return;
  1085. }
  1086. if (!jack_controller_dbus_to_jack_variant(
  1087. arg_type,
  1088. &arg,
  1089. &value))
  1090. {
  1091. jack_dbus_error(
  1092. call,
  1093. JACK_DBUS_ERROR_INVALID_ARGS,
  1094. "Cannot convert engine parameter value");
  1095. return;
  1096. }
  1097. jackctl_parameter_set_value(parameter, &value);
  1098. jack_controller_settings_save_auto(controller_ptr);
  1099. jack_dbus_construct_method_return_empty(call);
  1100. }
  1101. #undef controller_ptr
  1102. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetAvailableDrivers)
  1103. JACK_DBUS_METHOD_ARGUMENT("drivers_list", "as", true)
  1104. JACK_DBUS_METHOD_ARGUMENTS_END
  1105. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSelectedDriver)
  1106. JACK_DBUS_METHOD_ARGUMENT("driver", "s", true)
  1107. JACK_DBUS_METHOD_ARGUMENTS_END
  1108. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SelectDriver)
  1109. JACK_DBUS_METHOD_ARGUMENT("driver", "s", false)
  1110. JACK_DBUS_METHOD_ARGUMENTS_END
  1111. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParametersInfo)
  1112. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  1113. JACK_DBUS_METHOD_ARGUMENTS_END
  1114. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterInfo)
  1115. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1116. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  1117. JACK_DBUS_METHOD_ARGUMENTS_END
  1118. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterConstraint)
  1119. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1120. JACK_DBUS_METHOD_ARGUMENT("is_range", "b", true)
  1121. JACK_DBUS_METHOD_ARGUMENT("is_strict", "b", true)
  1122. JACK_DBUS_METHOD_ARGUMENT("is_fake_value", "b", true)
  1123. JACK_DBUS_METHOD_ARGUMENT("values", "a(vs)", true)
  1124. JACK_DBUS_METHOD_ARGUMENTS_END
  1125. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterValue)
  1126. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1127. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  1128. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  1129. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  1130. JACK_DBUS_METHOD_ARGUMENTS_END
  1131. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetDriverParameterValue)
  1132. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1133. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  1134. JACK_DBUS_METHOD_ARGUMENTS_END
  1135. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParametersInfo)
  1136. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  1137. JACK_DBUS_METHOD_ARGUMENTS_END
  1138. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterInfo)
  1139. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1140. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  1141. JACK_DBUS_METHOD_ARGUMENTS_END
  1142. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterConstraint)
  1143. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1144. JACK_DBUS_METHOD_ARGUMENT("is_range", "b", true)
  1145. JACK_DBUS_METHOD_ARGUMENT("is_strict", "b", true)
  1146. JACK_DBUS_METHOD_ARGUMENT("is_fake_value", "b", true)
  1147. JACK_DBUS_METHOD_ARGUMENT("values", "a(vs)", true)
  1148. JACK_DBUS_METHOD_ARGUMENTS_END
  1149. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterValue)
  1150. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1151. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  1152. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  1153. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  1154. JACK_DBUS_METHOD_ARGUMENTS_END
  1155. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetEngineParameterValue)
  1156. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1157. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  1158. JACK_DBUS_METHOD_ARGUMENTS_END
  1159. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetAvailableInternals)
  1160. JACK_DBUS_METHOD_ARGUMENT("internals_list", "as", true)
  1161. JACK_DBUS_METHOD_ARGUMENTS_END
  1162. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetInternalParametersInfo)
  1163. JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
  1164. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  1165. JACK_DBUS_METHOD_ARGUMENTS_END
  1166. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetInternalParameterInfo)
  1167. JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
  1168. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1169. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  1170. JACK_DBUS_METHOD_ARGUMENTS_END
  1171. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetInternalParameterConstraint)
  1172. JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
  1173. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1174. JACK_DBUS_METHOD_ARGUMENT("is_range", "b", true)
  1175. JACK_DBUS_METHOD_ARGUMENT("is_strict", "b", true)
  1176. JACK_DBUS_METHOD_ARGUMENT("is_fake_value", "b", true)
  1177. JACK_DBUS_METHOD_ARGUMENT("values", "a(vs)", true)
  1178. JACK_DBUS_METHOD_ARGUMENTS_END
  1179. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetInternalParameterValue)
  1180. JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
  1181. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1182. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  1183. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  1184. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  1185. JACK_DBUS_METHOD_ARGUMENTS_END
  1186. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetInternalParameterValue)
  1187. JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
  1188. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1189. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  1190. JACK_DBUS_METHOD_ARGUMENTS_END
  1191. JACK_DBUS_METHODS_BEGIN
  1192. JACK_DBUS_METHOD_DESCRIBE(GetAvailableDrivers, jack_controller_dbus_get_available_drivers)
  1193. JACK_DBUS_METHOD_DESCRIBE(GetSelectedDriver, jack_controller_dbus_get_selected_driver)
  1194. JACK_DBUS_METHOD_DESCRIBE(SelectDriver, jack_controller_dbus_select_driver)
  1195. JACK_DBUS_METHOD_DESCRIBE(GetDriverParametersInfo, jack_controller_dbus_get_driver_parameters_info)
  1196. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterInfo, jack_controller_dbus_get_driver_parameter_info)
  1197. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterConstraint, jack_controller_dbus_get_driver_parameter_constraint)
  1198. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterValue, jack_controller_dbus_get_driver_parameter_value)
  1199. JACK_DBUS_METHOD_DESCRIBE(SetDriverParameterValue, jack_controller_dbus_set_driver_parameter_value)
  1200. JACK_DBUS_METHOD_DESCRIBE(GetEngineParametersInfo, jack_controller_dbus_get_engine_parameters_info)
  1201. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterConstraint, jack_controller_dbus_get_engine_parameter_constraint)
  1202. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterInfo, jack_controller_dbus_get_engine_parameter_info)
  1203. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterValue, jack_controller_dbus_get_engine_parameter_value)
  1204. JACK_DBUS_METHOD_DESCRIBE(SetEngineParameterValue, jack_controller_dbus_set_engine_parameter_value)
  1205. JACK_DBUS_METHOD_DESCRIBE(GetAvailableInternals, jack_controller_dbus_get_available_internals)
  1206. JACK_DBUS_METHOD_DESCRIBE(GetInternalParametersInfo, jack_controller_dbus_get_internal_parameters_info)
  1207. JACK_DBUS_METHOD_DESCRIBE(GetInternalParameterInfo, jack_controller_dbus_get_internal_parameter_info)
  1208. JACK_DBUS_METHOD_DESCRIBE(GetInternalParameterConstraint, jack_controller_dbus_get_internal_parameter_constraint)
  1209. JACK_DBUS_METHOD_DESCRIBE(GetInternalParameterValue, jack_controller_dbus_get_internal_parameter_value)
  1210. JACK_DBUS_METHOD_DESCRIBE(SetInternalParameterValue, jack_controller_dbus_set_internal_parameter_value)
  1211. JACK_DBUS_METHODS_END
  1212. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.JackConfigure")
  1213. JACK_DBUS_IFACE_EXPOSE_METHODS
  1214. JACK_DBUS_IFACE_END