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.

840 lines
24KB

  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. /*
  348. * Execute GetDriverParametersInfo method call.
  349. */
  350. static
  351. void
  352. jack_controller_dbus_get_driver_parameters_info(
  353. struct jack_dbus_method_call *call)
  354. {
  355. if (controller_ptr->driver == NULL)
  356. {
  357. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  358. "No driver selected");
  359. return;
  360. }
  361. jack_controller_get_parameters_info(
  362. call,
  363. jackctl_driver_get_parameters(controller_ptr->driver));
  364. }
  365. /*
  366. * Execute GetDriverParameterInfo method call.
  367. */
  368. static
  369. void
  370. jack_controller_dbus_get_driver_parameter_info(
  371. struct jack_dbus_method_call *call)
  372. {
  373. const char *parameter_name;
  374. jackctl_parameter_t *parameter;
  375. if (controller_ptr->driver == NULL)
  376. {
  377. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  378. "No driver selected");
  379. return;
  380. }
  381. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  382. {
  383. /* The method call had invalid arguments meaning that
  384. * jack_dbus_get_method_args() has constructed an error for us.
  385. */
  386. return;
  387. }
  388. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  389. if (parameter == NULL)
  390. {
  391. jack_dbus_error(
  392. call,
  393. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  394. "Unknown parameter \"%s\" for driver \"%s\"",
  395. parameter_name,
  396. jackctl_driver_get_name(controller_ptr->driver));
  397. return;
  398. }
  399. jack_controller_get_parameter_info(call, parameter);
  400. }
  401. /*
  402. * Execute GetDriverParameterValue method call.
  403. */
  404. static void
  405. jack_controller_dbus_get_driver_parameter_value(
  406. struct jack_dbus_method_call *call)
  407. {
  408. const char *parameter_name;
  409. jackctl_parameter_t *parameter;
  410. int type;
  411. union jackctl_parameter_value jackctl_value;
  412. union jackctl_parameter_value jackctl_default_value;
  413. message_arg_t value;
  414. message_arg_t default_value;
  415. if (controller_ptr->driver == NULL)
  416. {
  417. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  418. "No driver selected");
  419. return;
  420. }
  421. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  422. {
  423. /* The method call had invalid arguments meaning that
  424. * get_method_args() has constructed an error for us.
  425. */
  426. return;
  427. }
  428. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  429. if (parameter == NULL)
  430. {
  431. jack_dbus_error(
  432. call,
  433. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  434. "Unknown parameter \"%s\" for driver \"%s\"",
  435. parameter,
  436. jackctl_driver_get_name(controller_ptr->driver));
  437. return;
  438. }
  439. type = jackctl_parameter_get_type(parameter);
  440. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  441. jackctl_value = jackctl_parameter_get_value(parameter);
  442. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  443. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  444. /* Construct the reply. */
  445. jack_dbus_construct_method_return_parameter(
  446. call,
  447. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  448. PARAM_TYPE_JACK_TO_DBUS(type),
  449. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  450. default_value,
  451. value);
  452. }
  453. static
  454. void
  455. jack_controller_dbus_set_driver_parameter_value(
  456. struct jack_dbus_method_call *call)
  457. {
  458. const char *parameter_name;
  459. message_arg_t arg;
  460. int arg_type;
  461. jackctl_parameter_t *parameter;
  462. jackctl_param_type_t type;
  463. union jackctl_parameter_value value;
  464. if (controller_ptr->driver == NULL)
  465. {
  466. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  467. "No driver selected");
  468. return;
  469. }
  470. if (!jack_dbus_get_method_args_string_and_variant(call, &parameter_name, &arg, &arg_type))
  471. {
  472. /* The method call had invalid arguments meaning that
  473. * jack_dbus_get_method_args_string_and_variant() has constructed
  474. * an error for us.
  475. */
  476. return;
  477. }
  478. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  479. if (parameter == NULL)
  480. {
  481. jack_dbus_error(
  482. call,
  483. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  484. "Unknown parameter \"%s\" for driver \"%s\"",
  485. parameter,
  486. jackctl_driver_get_name(controller_ptr->driver));
  487. return;
  488. }
  489. type = jackctl_parameter_get_type(parameter);
  490. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  491. {
  492. jack_dbus_error(
  493. call,
  494. JACK_DBUS_ERROR_INVALID_ARGS,
  495. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  496. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  497. (char)arg_type);
  498. return;
  499. }
  500. if (!jack_controller_dbus_to_jack_variant(
  501. arg_type,
  502. &arg,
  503. &value))
  504. {
  505. jack_dbus_error(
  506. call,
  507. JACK_DBUS_ERROR_INVALID_ARGS,
  508. "Cannot convert engine parameter value");
  509. return;
  510. }
  511. jackctl_parameter_set_value(parameter, &value);
  512. jack_controller_settings_save_auto(controller_ptr);
  513. jack_dbus_construct_method_return_empty(call);
  514. }
  515. /*
  516. * Execute GetEngineParametersInfo method call.
  517. */
  518. static
  519. void
  520. jack_controller_dbus_get_engine_parameters_info(
  521. struct jack_dbus_method_call *call)
  522. {
  523. jack_controller_get_parameters_info(
  524. call,
  525. jackctl_server_get_parameters(controller_ptr->server));
  526. }
  527. /*
  528. * Execute GetEngineParameterInfo method call.
  529. */
  530. static
  531. void
  532. jack_controller_dbus_get_engine_parameter_info(
  533. struct jack_dbus_method_call *call)
  534. {
  535. const char *parameter_name;
  536. jackctl_parameter_t *parameter;
  537. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  538. {
  539. /* The method call had invalid arguments meaning that
  540. * jack_dbus_get_method_args() has constructed an error for us.
  541. */
  542. return;
  543. }
  544. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  545. if (parameter == NULL)
  546. {
  547. jack_dbus_error(
  548. call,
  549. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  550. "Unknown engine parameter \"%s\"",
  551. parameter);
  552. return;
  553. }
  554. jack_controller_get_parameter_info(call, parameter);
  555. }
  556. /*
  557. * Execute GetDriverParameterValue method call.
  558. */
  559. static
  560. void
  561. jack_controller_dbus_get_engine_parameter_value(
  562. struct jack_dbus_method_call *call)
  563. {
  564. const char *parameter_name;
  565. jackctl_parameter_t *parameter;
  566. jackctl_param_type_t type;
  567. union jackctl_parameter_value jackctl_value;
  568. union jackctl_parameter_value jackctl_default_value;
  569. message_arg_t value;
  570. message_arg_t default_value;
  571. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  572. {
  573. /* The method call had invalid arguments meaning that
  574. * jack_dbus_get_method_args() has constructed an error for us.
  575. */
  576. return;
  577. }
  578. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  579. if (parameter == NULL)
  580. {
  581. jack_dbus_error(
  582. call,
  583. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  584. "Unknown engine parameter \"%s\"",
  585. parameter);
  586. return;
  587. }
  588. type = jackctl_parameter_get_type(parameter);
  589. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  590. jackctl_value = jackctl_parameter_get_value(parameter);
  591. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  592. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  593. /* Construct the reply. */
  594. jack_dbus_construct_method_return_parameter(
  595. call,
  596. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  597. PARAM_TYPE_JACK_TO_DBUS(type),
  598. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  599. default_value,
  600. value);
  601. }
  602. static
  603. void
  604. jack_controller_dbus_set_engine_parameter_value(
  605. struct jack_dbus_method_call *call)
  606. {
  607. const char *parameter_name;
  608. message_arg_t arg;
  609. int arg_type;
  610. jackctl_parameter_t *parameter;
  611. jackctl_param_type_t type;
  612. union jackctl_parameter_value value;
  613. if (!jack_dbus_get_method_args_string_and_variant (call, &parameter_name, &arg, &arg_type))
  614. {
  615. /* The method call had invalid arguments meaning that
  616. * jack_dbus_get_method_args_string_and_variant() has constructed
  617. * an error for us.
  618. */
  619. return;
  620. }
  621. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  622. if (parameter == NULL)
  623. {
  624. jack_dbus_error(
  625. call,
  626. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  627. "Unknown engine parameter \"%s\"",
  628. parameter);
  629. return;
  630. }
  631. type = jackctl_parameter_get_type(parameter);
  632. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  633. {
  634. jack_dbus_error(
  635. call,
  636. JACK_DBUS_ERROR_INVALID_ARGS,
  637. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  638. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  639. (char)arg_type);
  640. return;
  641. }
  642. if (!jack_controller_dbus_to_jack_variant(
  643. arg_type,
  644. &arg,
  645. &value))
  646. {
  647. jack_dbus_error(
  648. call,
  649. JACK_DBUS_ERROR_INVALID_ARGS,
  650. "Cannot convert engine parameter value");
  651. return;
  652. }
  653. jackctl_parameter_set_value(parameter, &value);
  654. jack_controller_settings_save_auto(controller_ptr);
  655. jack_dbus_construct_method_return_empty(call);
  656. }
  657. #undef controller_ptr
  658. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetAvailableDrivers)
  659. JACK_DBUS_METHOD_ARGUMENT("drivers_list", "as", true)
  660. JACK_DBUS_METHOD_ARGUMENTS_END
  661. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSelectedDriver)
  662. JACK_DBUS_METHOD_ARGUMENT("driver", "s", true)
  663. JACK_DBUS_METHOD_ARGUMENTS_END
  664. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SelectDriver)
  665. JACK_DBUS_METHOD_ARGUMENT("driver", "s", false)
  666. JACK_DBUS_METHOD_ARGUMENTS_END
  667. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParametersInfo)
  668. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  669. JACK_DBUS_METHOD_ARGUMENTS_END
  670. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterInfo)
  671. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  672. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  673. JACK_DBUS_METHOD_ARGUMENTS_END
  674. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterValue)
  675. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  676. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  677. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  678. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  679. JACK_DBUS_METHOD_ARGUMENTS_END
  680. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetDriverParameterValue)
  681. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  682. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  683. JACK_DBUS_METHOD_ARGUMENTS_END
  684. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParametersInfo)
  685. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  686. JACK_DBUS_METHOD_ARGUMENTS_END
  687. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterInfo)
  688. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  689. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  690. JACK_DBUS_METHOD_ARGUMENTS_END
  691. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterValue)
  692. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  693. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  694. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  695. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  696. JACK_DBUS_METHOD_ARGUMENTS_END
  697. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetEngineParameterValue)
  698. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  699. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  700. JACK_DBUS_METHOD_ARGUMENTS_END
  701. JACK_DBUS_METHODS_BEGIN
  702. JACK_DBUS_METHOD_DESCRIBE(GetAvailableDrivers, jack_controller_dbus_get_available_drivers)
  703. JACK_DBUS_METHOD_DESCRIBE(GetSelectedDriver, jack_controller_dbus_get_selected_driver)
  704. JACK_DBUS_METHOD_DESCRIBE(SelectDriver, jack_controller_dbus_select_driver)
  705. JACK_DBUS_METHOD_DESCRIBE(GetDriverParametersInfo, jack_controller_dbus_get_driver_parameters_info)
  706. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterInfo, jack_controller_dbus_get_driver_parameter_info)
  707. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterValue, jack_controller_dbus_get_driver_parameter_value)
  708. JACK_DBUS_METHOD_DESCRIBE(SetDriverParameterValue, jack_controller_dbus_set_driver_parameter_value)
  709. JACK_DBUS_METHOD_DESCRIBE(GetEngineParametersInfo, jack_controller_dbus_get_engine_parameters_info)
  710. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterInfo, jack_controller_dbus_get_engine_parameter_info)
  711. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterValue, jack_controller_dbus_get_engine_parameter_value)
  712. JACK_DBUS_METHOD_DESCRIBE(SetEngineParameterValue, jack_controller_dbus_set_engine_parameter_value)
  713. JACK_DBUS_METHODS_END
  714. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.JackConfigure")
  715. JACK_DBUS_IFACE_EXPOSE_METHODS
  716. JACK_DBUS_IFACE_END