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.

836 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. #include <stdint.h>
  17. #include <string.h>
  18. #include <assert.h>
  19. #include <dbus/dbus.h>
  20. #include "jackdbus.h"
  21. #include "controller_internal.h"
  22. #include "xml.h"
  23. unsigned char jack_controller_dbus_types[JACK_PARAM_MAX] =
  24. {
  25. [JackParamInt] = DBUS_TYPE_INT32,
  26. [JackParamUInt] = DBUS_TYPE_UINT32,
  27. [JackParamChar] = DBUS_TYPE_BYTE,
  28. [JackParamString] = DBUS_TYPE_STRING,
  29. [JackParamBool] = DBUS_TYPE_BOOLEAN,
  30. };
  31. const char *jack_controller_dbus_type_signatures[JACK_PARAM_MAX] =
  32. {
  33. [JackParamInt] = DBUS_TYPE_INT32_AS_STRING,
  34. [JackParamUInt] = DBUS_TYPE_UINT32_AS_STRING,
  35. [JackParamChar] = DBUS_TYPE_BYTE_AS_STRING,
  36. [JackParamString] = DBUS_TYPE_STRING_AS_STRING,
  37. [JackParamBool] = DBUS_TYPE_BOOLEAN_AS_STRING,
  38. };
  39. #define PARAM_TYPE_JACK_TO_DBUS(_) jack_controller_dbus_types[_]
  40. #define PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(_) jack_controller_dbus_type_signatures[_]
  41. static
  42. bool
  43. jack_controller_jack_to_dbus_variant(
  44. jackctl_param_type_t type,
  45. const union jackctl_parameter_value *value_ptr,
  46. message_arg_t *dbusv_ptr)
  47. {
  48. switch (type)
  49. {
  50. case JackParamInt:
  51. dbusv_ptr->int32 = (dbus_int32_t)value_ptr->i;
  52. return true;
  53. case JackParamUInt:
  54. dbusv_ptr->uint32 = (dbus_uint32_t)value_ptr->ui;
  55. return true;
  56. case JackParamChar:
  57. dbusv_ptr->byte = value_ptr->c;
  58. return true;
  59. case JackParamString:
  60. dbusv_ptr->string = value_ptr->str;
  61. return true;
  62. case JackParamBool:
  63. dbusv_ptr->boolean = (dbus_bool_t)value_ptr->b;
  64. return true;
  65. }
  66. jack_error("Unknown JACK parameter type %i", (int)type);
  67. assert(0);
  68. return false;
  69. }
  70. static
  71. bool
  72. jack_controller_dbus_to_jack_variant(
  73. int type,
  74. const message_arg_t *dbusv_ptr,
  75. union jackctl_parameter_value *value_ptr)
  76. {
  77. size_t len;
  78. switch (type)
  79. {
  80. case DBUS_TYPE_INT32:
  81. value_ptr->i = dbusv_ptr->int32;
  82. return true;
  83. case DBUS_TYPE_UINT32:
  84. value_ptr->ui = dbusv_ptr->uint32;
  85. return true;
  86. case DBUS_TYPE_BYTE:
  87. value_ptr->c = dbusv_ptr->byte;
  88. return true;
  89. case DBUS_TYPE_STRING:
  90. len = strlen(dbusv_ptr->string);
  91. if (len > JACK_PARAM_STRING_MAX)
  92. {
  93. jack_error("Parameter string value is too long (%u)", (unsigned int)len);
  94. return false;
  95. }
  96. memcpy(value_ptr->str, dbusv_ptr->string, len + 1);
  97. return true;
  98. case DBUS_TYPE_BOOLEAN:
  99. value_ptr->b = dbusv_ptr->boolean;
  100. return true;
  101. }
  102. jack_error("Unknown D-Bus parameter type %i", (int)type);
  103. return false;
  104. }
  105. /*
  106. * Construct a return message for a Get[Driver|Engine]ParameterValue method call.
  107. *
  108. * The operation can only fail due to lack of memory, in which case
  109. * there's no sense in trying to construct an error return. Instead,
  110. * call->reply will be set to NULL and handled in send_method_return().
  111. */
  112. static void
  113. jack_dbus_construct_method_return_parameter(
  114. struct jack_dbus_method_call *call,
  115. dbus_bool_t is_set,
  116. int type,
  117. const char *signature,
  118. message_arg_t default_value,
  119. message_arg_t value)
  120. {
  121. DBusMessageIter iter;
  122. /* Create a new method return message. */
  123. call->reply = dbus_message_new_method_return (call->message);
  124. if (!call->reply)
  125. {
  126. goto fail;
  127. }
  128. dbus_message_iter_init_append (call->reply, &iter);
  129. /* Append the is_set argument. */
  130. if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, (const void *) &is_set))
  131. {
  132. goto fail_unref;
  133. }
  134. /* Append the 'default' and 'value' arguments. */
  135. if (!jack_dbus_message_append_variant(&iter, type, signature, &default_value))
  136. {
  137. goto fail_unref;
  138. }
  139. if (!jack_dbus_message_append_variant(&iter, type, signature, &value))
  140. {
  141. goto fail_unref;
  142. }
  143. return;
  144. fail_unref:
  145. dbus_message_unref (call->reply);
  146. call->reply = NULL;
  147. fail:
  148. jack_error ("Ran out of memory trying to construct method return");
  149. }
  150. #define controller_ptr ((struct jack_controller *)call->context)
  151. static
  152. void
  153. jack_controller_dbus_get_available_drivers(
  154. struct jack_dbus_method_call *call)
  155. {
  156. jack_dbus_construct_method_return_array_of_strings(
  157. call,
  158. controller_ptr->drivers_count,
  159. controller_ptr->driver_names);
  160. }
  161. static
  162. void
  163. jack_controller_dbus_get_selected_driver(
  164. struct jack_dbus_method_call *call)
  165. {
  166. message_arg_t arg;
  167. if (controller_ptr->driver != NULL)
  168. {
  169. arg.string = jackctl_driver_get_name(controller_ptr->driver);
  170. }
  171. else
  172. {
  173. arg.string = NULL;
  174. }
  175. jack_dbus_construct_method_return_single(call, DBUS_TYPE_STRING, arg);
  176. }
  177. static
  178. void
  179. jack_controller_dbus_select_driver(
  180. struct jack_dbus_method_call *call)
  181. {
  182. const char *driver_name;
  183. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
  184. {
  185. /* The method call had invalid arguments meaning that
  186. * jack_dbus_get_method_args() has constructed an error for us.
  187. */
  188. return;
  189. }
  190. if (!jack_controller_select_driver(controller_ptr, driver_name))
  191. {
  192. /* Couldn't find driver with the specified name. */
  193. jack_dbus_error(
  194. call,
  195. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  196. "Unknown driver \"%s\"",
  197. driver_name);
  198. return;
  199. }
  200. jack_controller_settings_save_auto(controller_ptr);
  201. jack_dbus_construct_method_return_empty(call);
  202. }
  203. static
  204. void
  205. jack_controller_get_parameters_info(
  206. struct jack_dbus_method_call *call,
  207. const JSList *parameters_list)
  208. {
  209. DBusMessageIter iter, array_iter, struct_iter;
  210. unsigned char type;
  211. const char *str;
  212. call->reply = dbus_message_new_method_return (call->message);
  213. if (!call->reply)
  214. {
  215. goto fail;
  216. }
  217. dbus_message_iter_init_append (call->reply, &iter);
  218. /* Open the array. */
  219. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ysss)", &array_iter))
  220. {
  221. goto fail_unref;
  222. }
  223. /* Append parameter descriptions to the array. */
  224. while (parameters_list != NULL)
  225. {
  226. /* Open the struct. */
  227. if (!dbus_message_iter_open_container (&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  228. {
  229. goto fail_close_unref;
  230. }
  231. /* Append parameter type. */
  232. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type((jackctl_parameter_t *)parameters_list->data));
  233. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  234. (const void *) &type))
  235. {
  236. goto fail_close2_unref;
  237. }
  238. /* Append parameter name. */
  239. str = jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data);
  240. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  241. (const void *) &str))
  242. {
  243. goto fail_close2_unref;
  244. }
  245. /* Append parameter short description. */
  246. str = jackctl_parameter_get_short_description((jackctl_parameter_t *)parameters_list->data);
  247. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  248. (const void *) &str))
  249. {
  250. goto fail_close2_unref;
  251. }
  252. /* Append parameter long description. */
  253. str = jackctl_parameter_get_long_description((jackctl_parameter_t *)parameters_list->data);
  254. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  255. (const void *) &str))
  256. {
  257. goto fail_close2_unref;
  258. }
  259. /* Close the struct. */
  260. if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
  261. {
  262. goto fail_close_unref;
  263. }
  264. parameters_list = jack_slist_next(parameters_list);
  265. }
  266. /* Close the array. */
  267. if (!dbus_message_iter_close_container (&iter, &array_iter))
  268. {
  269. goto fail_unref;
  270. }
  271. return;
  272. fail_close2_unref:
  273. dbus_message_iter_close_container (&iter, &struct_iter);
  274. fail_close_unref:
  275. dbus_message_iter_close_container (&iter, &array_iter);
  276. fail_unref:
  277. dbus_message_unref (call->reply);
  278. call->reply = NULL;
  279. fail:
  280. jack_error ("Ran out of memory trying to construct method return");
  281. }
  282. static
  283. void
  284. jack_controller_get_parameter_info(
  285. struct jack_dbus_method_call *call,
  286. jackctl_parameter_t *parameter)
  287. {
  288. DBusMessageIter iter, struct_iter;
  289. unsigned char type;
  290. const char *str;
  291. call->reply = dbus_message_new_method_return (call->message);
  292. if (!call->reply)
  293. {
  294. goto fail;
  295. }
  296. dbus_message_iter_init_append (call->reply, &iter);
  297. /* Open the struct. */
  298. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  299. {
  300. goto fail_unref;
  301. }
  302. /* Append parameter type. */
  303. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type(parameter));
  304. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  305. (const void *) &type))
  306. {
  307. goto fail_close_unref;
  308. }
  309. /* Append parameter name. */
  310. str = jackctl_parameter_get_name(parameter);
  311. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  312. (const void *) &str))
  313. {
  314. goto fail_close_unref;
  315. }
  316. /* Append parameter short description. */
  317. str = jackctl_parameter_get_short_description(parameter);
  318. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  319. (const void *) &str))
  320. {
  321. goto fail_close_unref;
  322. }
  323. /* Append parameter long description. */
  324. str = jackctl_parameter_get_long_description(parameter);
  325. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  326. (const void *) &str))
  327. {
  328. goto fail_close_unref;
  329. }
  330. /* Close the struct. */
  331. if (!dbus_message_iter_close_container (&iter, &struct_iter))
  332. {
  333. goto fail_unref;
  334. }
  335. return;
  336. fail_close_unref:
  337. dbus_message_iter_close_container (&iter, &struct_iter);
  338. fail_unref:
  339. dbus_message_unref (call->reply);
  340. call->reply = NULL;
  341. fail:
  342. jack_error ("Ran out of memory trying to construct method return");
  343. }
  344. /*
  345. * Execute GetDriverParametersInfo method call.
  346. */
  347. static
  348. void
  349. jack_controller_dbus_get_driver_parameters_info(
  350. struct jack_dbus_method_call *call)
  351. {
  352. if (controller_ptr->driver == NULL)
  353. {
  354. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  355. "No driver selected");
  356. return;
  357. }
  358. jack_controller_get_parameters_info(
  359. call,
  360. jackctl_driver_get_parameters(controller_ptr->driver));
  361. }
  362. /*
  363. * Execute GetDriverParameterInfo method call.
  364. */
  365. static
  366. void
  367. jack_controller_dbus_get_driver_parameter_info(
  368. struct jack_dbus_method_call *call)
  369. {
  370. const char *parameter_name;
  371. jackctl_parameter_t *parameter;
  372. if (controller_ptr->driver == NULL)
  373. {
  374. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  375. "No driver selected");
  376. return;
  377. }
  378. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  379. {
  380. /* The method call had invalid arguments meaning that
  381. * jack_dbus_get_method_args() has constructed an error for us.
  382. */
  383. return;
  384. }
  385. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  386. if (parameter == NULL)
  387. {
  388. jack_dbus_error(
  389. call,
  390. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  391. "Unknown parameter \"%s\" for driver \"%s\"",
  392. parameter_name,
  393. jackctl_driver_get_name(controller_ptr->driver));
  394. return;
  395. }
  396. jack_controller_get_parameter_info(call, parameter);
  397. }
  398. /*
  399. * Execute GetDriverParameterValue method call.
  400. */
  401. static void
  402. jack_controller_dbus_get_driver_parameter_value(
  403. struct jack_dbus_method_call *call)
  404. {
  405. const char *parameter_name;
  406. jackctl_parameter_t *parameter;
  407. int type;
  408. union jackctl_parameter_value jackctl_value;
  409. union jackctl_parameter_value jackctl_default_value;
  410. message_arg_t value;
  411. message_arg_t default_value;
  412. if (controller_ptr->driver == NULL)
  413. {
  414. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  415. "No driver selected");
  416. return;
  417. }
  418. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  419. {
  420. /* The method call had invalid arguments meaning that
  421. * get_method_args() has constructed an error for us.
  422. */
  423. return;
  424. }
  425. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  426. if (parameter == NULL)
  427. {
  428. jack_dbus_error(
  429. call,
  430. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  431. "Unknown parameter \"%s\" for driver \"%s\"",
  432. parameter,
  433. jackctl_driver_get_name(controller_ptr->driver));
  434. return;
  435. }
  436. type = jackctl_parameter_get_type(parameter);
  437. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  438. jackctl_value = jackctl_parameter_get_value(parameter);
  439. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  440. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  441. /* Construct the reply. */
  442. jack_dbus_construct_method_return_parameter(
  443. call,
  444. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  445. PARAM_TYPE_JACK_TO_DBUS(type),
  446. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  447. default_value,
  448. value);
  449. }
  450. static
  451. void
  452. jack_controller_dbus_set_driver_parameter_value(
  453. struct jack_dbus_method_call *call)
  454. {
  455. const char *parameter_name;
  456. message_arg_t arg;
  457. int arg_type;
  458. jackctl_parameter_t *parameter;
  459. jackctl_param_type_t type;
  460. union jackctl_parameter_value value;
  461. if (controller_ptr->driver == NULL)
  462. {
  463. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  464. "No driver selected");
  465. return;
  466. }
  467. if (!jack_dbus_get_method_args_string_and_variant(call, &parameter_name, &arg, &arg_type))
  468. {
  469. /* The method call had invalid arguments meaning that
  470. * jack_dbus_get_method_args_string_and_variant() has constructed
  471. * an error for us.
  472. */
  473. return;
  474. }
  475. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  476. if (parameter == NULL)
  477. {
  478. jack_dbus_error(
  479. call,
  480. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  481. "Unknown parameter \"%s\" for driver \"%s\"",
  482. parameter,
  483. jackctl_driver_get_name(controller_ptr->driver));
  484. return;
  485. }
  486. type = jackctl_parameter_get_type(parameter);
  487. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  488. {
  489. jack_dbus_error(
  490. call,
  491. JACK_DBUS_ERROR_INVALID_ARGS,
  492. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  493. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  494. (char)arg_type);
  495. return;
  496. }
  497. if (!jack_controller_dbus_to_jack_variant(
  498. arg_type,
  499. &arg,
  500. &value))
  501. {
  502. jack_dbus_error(
  503. call,
  504. JACK_DBUS_ERROR_INVALID_ARGS,
  505. "Cannot convert engine parameter value");
  506. return;
  507. }
  508. jackctl_parameter_set_value(parameter, &value);
  509. jack_controller_settings_save_auto(controller_ptr);
  510. jack_dbus_construct_method_return_empty(call);
  511. }
  512. /*
  513. * Execute GetEngineParametersInfo method call.
  514. */
  515. static
  516. void
  517. jack_controller_dbus_get_engine_parameters_info(
  518. struct jack_dbus_method_call *call)
  519. {
  520. jack_controller_get_parameters_info(
  521. call,
  522. jackctl_server_get_parameters(controller_ptr->server));
  523. }
  524. /*
  525. * Execute GetEngineParameterInfo method call.
  526. */
  527. static
  528. void
  529. jack_controller_dbus_get_engine_parameter_info(
  530. struct jack_dbus_method_call *call)
  531. {
  532. const char *parameter_name;
  533. jackctl_parameter_t *parameter;
  534. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  535. {
  536. /* The method call had invalid arguments meaning that
  537. * jack_dbus_get_method_args() has constructed an error for us.
  538. */
  539. return;
  540. }
  541. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  542. if (parameter == NULL)
  543. {
  544. jack_dbus_error(
  545. call,
  546. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  547. "Unknown engine parameter \"%s\"",
  548. parameter);
  549. return;
  550. }
  551. jack_controller_get_parameter_info(call, parameter);
  552. }
  553. /*
  554. * Execute GetDriverParameterValue method call.
  555. */
  556. static
  557. void
  558. jack_controller_dbus_get_engine_parameter_value(
  559. struct jack_dbus_method_call *call)
  560. {
  561. const char *parameter_name;
  562. jackctl_parameter_t *parameter;
  563. jackctl_param_type_t type;
  564. union jackctl_parameter_value jackctl_value;
  565. union jackctl_parameter_value jackctl_default_value;
  566. message_arg_t value;
  567. message_arg_t default_value;
  568. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  569. {
  570. /* The method call had invalid arguments meaning that
  571. * jack_dbus_get_method_args() has constructed an error for us.
  572. */
  573. return;
  574. }
  575. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  576. if (parameter == NULL)
  577. {
  578. jack_dbus_error(
  579. call,
  580. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  581. "Unknown engine parameter \"%s\"",
  582. parameter);
  583. return;
  584. }
  585. type = jackctl_parameter_get_type(parameter);
  586. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  587. jackctl_value = jackctl_parameter_get_value(parameter);
  588. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  589. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  590. /* Construct the reply. */
  591. jack_dbus_construct_method_return_parameter(
  592. call,
  593. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  594. PARAM_TYPE_JACK_TO_DBUS(type),
  595. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  596. default_value,
  597. value);
  598. }
  599. static
  600. void
  601. jack_controller_dbus_set_engine_parameter_value(
  602. struct jack_dbus_method_call *call)
  603. {
  604. const char *parameter_name;
  605. message_arg_t arg;
  606. int arg_type;
  607. jackctl_parameter_t *parameter;
  608. jackctl_param_type_t type;
  609. union jackctl_parameter_value value;
  610. if (!jack_dbus_get_method_args_string_and_variant (call, &parameter_name, &arg, &arg_type))
  611. {
  612. /* The method call had invalid arguments meaning that
  613. * jack_dbus_get_method_args_string_and_variant() has constructed
  614. * an error for us.
  615. */
  616. return;
  617. }
  618. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  619. if (parameter == NULL)
  620. {
  621. jack_dbus_error(
  622. call,
  623. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  624. "Unknown engine parameter \"%s\"",
  625. parameter);
  626. return;
  627. }
  628. type = jackctl_parameter_get_type(parameter);
  629. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  630. {
  631. jack_dbus_error(
  632. call,
  633. JACK_DBUS_ERROR_INVALID_ARGS,
  634. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  635. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  636. (char)arg_type);
  637. return;
  638. }
  639. if (!jack_controller_dbus_to_jack_variant(
  640. arg_type,
  641. &arg,
  642. &value))
  643. {
  644. jack_dbus_error(
  645. call,
  646. JACK_DBUS_ERROR_INVALID_ARGS,
  647. "Cannot convert engine parameter value");
  648. return;
  649. }
  650. jackctl_parameter_set_value(parameter, &value);
  651. jack_controller_settings_save_auto(controller_ptr);
  652. jack_dbus_construct_method_return_empty(call);
  653. }
  654. #undef controller_ptr
  655. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetAvailableDrivers)
  656. JACK_DBUS_METHOD_ARGUMENT("drivers_list", "as", true)
  657. JACK_DBUS_METHOD_ARGUMENTS_END
  658. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSelectedDriver)
  659. JACK_DBUS_METHOD_ARGUMENT("driver", "s", true)
  660. JACK_DBUS_METHOD_ARGUMENTS_END
  661. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SelectDriver)
  662. JACK_DBUS_METHOD_ARGUMENT("driver", "s", false)
  663. JACK_DBUS_METHOD_ARGUMENTS_END
  664. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParametersInfo)
  665. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  666. JACK_DBUS_METHOD_ARGUMENTS_END
  667. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterInfo)
  668. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  669. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  670. JACK_DBUS_METHOD_ARGUMENTS_END
  671. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterValue)
  672. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  673. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  674. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  675. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  676. JACK_DBUS_METHOD_ARGUMENTS_END
  677. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetDriverParameterValue)
  678. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  679. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  680. JACK_DBUS_METHOD_ARGUMENTS_END
  681. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParametersInfo)
  682. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  683. JACK_DBUS_METHOD_ARGUMENTS_END
  684. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterInfo)
  685. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  686. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  687. JACK_DBUS_METHOD_ARGUMENTS_END
  688. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterValue)
  689. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  690. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  691. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  692. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  693. JACK_DBUS_METHOD_ARGUMENTS_END
  694. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetEngineParameterValue)
  695. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  696. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  697. JACK_DBUS_METHOD_ARGUMENTS_END
  698. JACK_DBUS_METHODS_BEGIN
  699. JACK_DBUS_METHOD_DESCRIBE(GetAvailableDrivers, jack_controller_dbus_get_available_drivers)
  700. JACK_DBUS_METHOD_DESCRIBE(GetSelectedDriver, jack_controller_dbus_get_selected_driver)
  701. JACK_DBUS_METHOD_DESCRIBE(SelectDriver, jack_controller_dbus_select_driver)
  702. JACK_DBUS_METHOD_DESCRIBE(GetDriverParametersInfo, jack_controller_dbus_get_driver_parameters_info)
  703. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterInfo, jack_controller_dbus_get_driver_parameter_info)
  704. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterValue, jack_controller_dbus_get_driver_parameter_value)
  705. JACK_DBUS_METHOD_DESCRIBE(SetDriverParameterValue, jack_controller_dbus_set_driver_parameter_value)
  706. JACK_DBUS_METHOD_DESCRIBE(GetEngineParametersInfo, jack_controller_dbus_get_engine_parameters_info)
  707. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterInfo, jack_controller_dbus_get_engine_parameter_info)
  708. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterValue, jack_controller_dbus_get_engine_parameter_value)
  709. JACK_DBUS_METHOD_DESCRIBE(SetEngineParameterValue, jack_controller_dbus_set_engine_parameter_value)
  710. JACK_DBUS_METHODS_END
  711. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.JackConfigure")
  712. JACK_DBUS_IFACE_EXPOSE_METHODS
  713. JACK_DBUS_IFACE_END