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.

3341 lines
97KB

  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
  714. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  715. /*
  716. Copyright (C) 2007,2008 Nedko Arnaudov
  717. Copyright (C) 2007-2008 Juuso Alasuutari
  718. This program is free software; you can redistribute it and/or modify
  719. it under the terms of the GNU General Public License as published by
  720. the Free Software Foundation; either version 2 of the License.
  721. This program is distributed in the hope that it will be useful,
  722. but WITHOUT ANY WARRANTY; without even the implied warranty of
  723. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  724. GNU General Public License for more details.
  725. You should have received a copy of the GNU General Public License
  726. along with this program; if not, write to the Free Software
  727. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  728. */
  729. #include <stdint.h>
  730. #include <string.h>
  731. #include <assert.h>
  732. #include <dbus/dbus.h>
  733. #include "jackdbus.h"
  734. #include "controller_internal.h"
  735. #include "xml.h"
  736. unsigned char jack_controller_dbus_types[JACK_PARAM_MAX] =
  737. {
  738. [JackParamInt] = DBUS_TYPE_INT32,
  739. [JackParamUInt] = DBUS_TYPE_UINT32,
  740. [JackParamChar] = DBUS_TYPE_BYTE,
  741. [JackParamString] = DBUS_TYPE_STRING,
  742. [JackParamBool] = DBUS_TYPE_BOOLEAN,
  743. };
  744. const char *jack_controller_dbus_type_signatures[JACK_PARAM_MAX] =
  745. {
  746. [JackParamInt] = DBUS_TYPE_INT32_AS_STRING,
  747. [JackParamUInt] = DBUS_TYPE_UINT32_AS_STRING,
  748. [JackParamChar] = DBUS_TYPE_BYTE_AS_STRING,
  749. [JackParamString] = DBUS_TYPE_STRING_AS_STRING,
  750. [JackParamBool] = DBUS_TYPE_BOOLEAN_AS_STRING,
  751. };
  752. #define PARAM_TYPE_JACK_TO_DBUS(_) jack_controller_dbus_types[_]
  753. #define PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(_) jack_controller_dbus_type_signatures[_]
  754. static
  755. bool
  756. jack_controller_jack_to_dbus_variant(
  757. jackctl_param_type_t type,
  758. const union jackctl_parameter_value *value_ptr,
  759. message_arg_t *dbusv_ptr)
  760. {
  761. switch (type)
  762. {
  763. case JackParamInt:
  764. dbusv_ptr->int32 = (dbus_int32_t)value_ptr->i;
  765. return true;
  766. case JackParamUInt:
  767. dbusv_ptr->uint32 = (dbus_uint32_t)value_ptr->ui;
  768. return true;
  769. case JackParamChar:
  770. dbusv_ptr->byte = value_ptr->c;
  771. return true;
  772. case JackParamString:
  773. dbusv_ptr->string = value_ptr->str;
  774. return true;
  775. case JackParamBool:
  776. dbusv_ptr->boolean = (dbus_bool_t)value_ptr->b;
  777. return true;
  778. }
  779. jack_error("Unknown JACK parameter type %i", (int)type);
  780. assert(0);
  781. return false;
  782. }
  783. static
  784. bool
  785. jack_controller_dbus_to_jack_variant(
  786. int type,
  787. const message_arg_t *dbusv_ptr,
  788. union jackctl_parameter_value *value_ptr)
  789. {
  790. size_t len;
  791. switch (type)
  792. {
  793. case DBUS_TYPE_INT32:
  794. value_ptr->i = dbusv_ptr->int32;
  795. return true;
  796. case DBUS_TYPE_UINT32:
  797. value_ptr->ui = dbusv_ptr->uint32;
  798. return true;
  799. case DBUS_TYPE_BYTE:
  800. value_ptr->c = dbusv_ptr->byte;
  801. return true;
  802. case DBUS_TYPE_STRING:
  803. len = strlen(dbusv_ptr->string);
  804. if (len > JACK_PARAM_STRING_MAX)
  805. {
  806. jack_error("Parameter string value is too long (%u)", (unsigned int)len);
  807. return false;
  808. }
  809. memcpy(value_ptr->str, dbusv_ptr->string, len + 1);
  810. return true;
  811. case DBUS_TYPE_BOOLEAN:
  812. value_ptr->b = dbusv_ptr->boolean;
  813. return true;
  814. }
  815. jack_error("Unknown D-Bus parameter type %i", (int)type);
  816. return false;
  817. }
  818. /*
  819. * Construct a return message for a Get[Driver|Engine]ParameterValue method call.
  820. *
  821. * The operation can only fail due to lack of memory, in which case
  822. * there's no sense in trying to construct an error return. Instead,
  823. * call->reply will be set to NULL and handled in send_method_return().
  824. */
  825. static void
  826. jack_dbus_construct_method_return_parameter(
  827. struct jack_dbus_method_call *call,
  828. dbus_bool_t is_set,
  829. int type,
  830. const char *signature,
  831. message_arg_t default_value,
  832. message_arg_t value)
  833. {
  834. DBusMessageIter iter;
  835. /* Create a new method return message. */
  836. call->reply = dbus_message_new_method_return (call->message);
  837. if (!call->reply)
  838. {
  839. goto fail;
  840. }
  841. dbus_message_iter_init_append (call->reply, &iter);
  842. /* Append the is_set argument. */
  843. if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, (const void *) &is_set))
  844. {
  845. goto fail_unref;
  846. }
  847. /* Append the 'default' and 'value' arguments. */
  848. if (!jack_dbus_message_append_variant(&iter, type, signature, &default_value))
  849. {
  850. goto fail_unref;
  851. }
  852. if (!jack_dbus_message_append_variant(&iter, type, signature, &value))
  853. {
  854. goto fail_unref;
  855. }
  856. return;
  857. fail_unref:
  858. dbus_message_unref (call->reply);
  859. call->reply = NULL;
  860. fail:
  861. jack_error ("Ran out of memory trying to construct method return");
  862. }
  863. #define controller_ptr ((struct jack_controller *)call->context)
  864. static
  865. void
  866. jack_controller_dbus_get_available_drivers(
  867. struct jack_dbus_method_call *call)
  868. {
  869. jack_dbus_construct_method_return_array_of_strings(
  870. call,
  871. controller_ptr->drivers_count,
  872. controller_ptr->driver_names);
  873. }
  874. static
  875. void
  876. jack_controller_dbus_get_selected_driver(
  877. struct jack_dbus_method_call *call)
  878. {
  879. message_arg_t arg;
  880. if (controller_ptr->driver != NULL)
  881. {
  882. arg.string = jackctl_driver_get_name(controller_ptr->driver);
  883. }
  884. else
  885. {
  886. arg.string = NULL;
  887. }
  888. jack_dbus_construct_method_return_single(call, DBUS_TYPE_STRING, arg);
  889. }
  890. static
  891. void
  892. jack_controller_dbus_select_driver(
  893. struct jack_dbus_method_call *call)
  894. {
  895. const char *driver_name;
  896. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
  897. {
  898. /* The method call had invalid arguments meaning that
  899. * jack_dbus_get_method_args() has constructed an error for us.
  900. */
  901. return;
  902. }
  903. if (!jack_controller_select_driver(controller_ptr, driver_name))
  904. {
  905. /* Couldn't find driver with the specified name. */
  906. jack_dbus_error(
  907. call,
  908. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  909. "Unknown driver \"%s\"",
  910. driver_name);
  911. return;
  912. }
  913. jack_controller_settings_save_auto(controller_ptr);
  914. jack_dbus_construct_method_return_empty(call);
  915. }
  916. static
  917. void
  918. jack_controller_get_parameters_info(
  919. struct jack_dbus_method_call *call,
  920. const JSList *parameters_list)
  921. {
  922. DBusMessageIter iter, array_iter, struct_iter;
  923. unsigned char type;
  924. const char *str;
  925. call->reply = dbus_message_new_method_return (call->message);
  926. if (!call->reply)
  927. {
  928. goto fail;
  929. }
  930. dbus_message_iter_init_append (call->reply, &iter);
  931. /* Open the array. */
  932. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ysss)", &array_iter))
  933. {
  934. goto fail_unref;
  935. }
  936. /* Append parameter descriptions to the array. */
  937. while (parameters_list != NULL)
  938. {
  939. /* Open the struct. */
  940. if (!dbus_message_iter_open_container (&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  941. {
  942. goto fail_close_unref;
  943. }
  944. /* Append parameter type. */
  945. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type((jackctl_parameter_t *)parameters_list->data));
  946. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  947. (const void *) &type))
  948. {
  949. goto fail_close2_unref;
  950. }
  951. /* Append parameter name. */
  952. str = jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data);
  953. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  954. (const void *) &str))
  955. {
  956. goto fail_close2_unref;
  957. }
  958. /* Append parameter short description. */
  959. str = jackctl_parameter_get_short_description((jackctl_parameter_t *)parameters_list->data);
  960. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  961. (const void *) &str))
  962. {
  963. goto fail_close2_unref;
  964. }
  965. /* Append parameter long description. */
  966. str = jackctl_parameter_get_long_description((jackctl_parameter_t *)parameters_list->data);
  967. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  968. (const void *) &str))
  969. {
  970. goto fail_close2_unref;
  971. }
  972. /* Close the struct. */
  973. if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
  974. {
  975. goto fail_close_unref;
  976. }
  977. parameters_list = jack_slist_next(parameters_list);
  978. }
  979. /* Close the array. */
  980. if (!dbus_message_iter_close_container (&iter, &array_iter))
  981. {
  982. goto fail_unref;
  983. }
  984. return;
  985. fail_close2_unref:
  986. dbus_message_iter_close_container (&iter, &struct_iter);
  987. fail_close_unref:
  988. dbus_message_iter_close_container (&iter, &array_iter);
  989. fail_unref:
  990. dbus_message_unref (call->reply);
  991. call->reply = NULL;
  992. fail:
  993. jack_error ("Ran out of memory trying to construct method return");
  994. }
  995. static
  996. void
  997. jack_controller_get_parameter_info(
  998. struct jack_dbus_method_call *call,
  999. jackctl_parameter_t *parameter)
  1000. {
  1001. DBusMessageIter iter, struct_iter;
  1002. unsigned char type;
  1003. const char *str;
  1004. call->reply = dbus_message_new_method_return (call->message);
  1005. if (!call->reply)
  1006. {
  1007. goto fail;
  1008. }
  1009. dbus_message_iter_init_append (call->reply, &iter);
  1010. /* Open the struct. */
  1011. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  1012. {
  1013. goto fail_unref;
  1014. }
  1015. /* Append parameter type. */
  1016. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type(parameter));
  1017. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  1018. (const void *) &type))
  1019. {
  1020. goto fail_close_unref;
  1021. }
  1022. /* Append parameter name. */
  1023. str = jackctl_parameter_get_name(parameter);
  1024. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1025. (const void *) &str))
  1026. {
  1027. goto fail_close_unref;
  1028. }
  1029. /* Append parameter short description. */
  1030. str = jackctl_parameter_get_short_description(parameter);
  1031. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1032. (const void *) &str))
  1033. {
  1034. goto fail_close_unref;
  1035. }
  1036. /* Append parameter long description. */
  1037. str = jackctl_parameter_get_long_description(parameter);
  1038. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1039. (const void *) &str))
  1040. {
  1041. goto fail_close_unref;
  1042. }
  1043. /* Close the struct. */
  1044. if (!dbus_message_iter_close_container (&iter, &struct_iter))
  1045. {
  1046. goto fail_unref;
  1047. }
  1048. return;
  1049. fail_close_unref:
  1050. dbus_message_iter_close_container (&iter, &struct_iter);
  1051. fail_unref:
  1052. dbus_message_unref (call->reply);
  1053. call->reply = NULL;
  1054. fail:
  1055. jack_error ("Ran out of memory trying to construct method return");
  1056. }
  1057. /*
  1058. * Execute GetDriverParametersInfo method call.
  1059. */
  1060. static
  1061. void
  1062. jack_controller_dbus_get_driver_parameters_info(
  1063. struct jack_dbus_method_call *call)
  1064. {
  1065. if (controller_ptr->driver == NULL)
  1066. {
  1067. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1068. "No driver selected");
  1069. return;
  1070. }
  1071. jack_controller_get_parameters_info(
  1072. call,
  1073. jackctl_driver_get_parameters(controller_ptr->driver));
  1074. }
  1075. /*
  1076. * Execute GetDriverParameterInfo method call.
  1077. */
  1078. static
  1079. void
  1080. jack_controller_dbus_get_driver_parameter_info(
  1081. struct jack_dbus_method_call *call)
  1082. {
  1083. const char *parameter_name;
  1084. jackctl_parameter_t *parameter;
  1085. if (controller_ptr->driver == NULL)
  1086. {
  1087. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1088. "No driver selected");
  1089. return;
  1090. }
  1091. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1092. {
  1093. /* The method call had invalid arguments meaning that
  1094. * jack_dbus_get_method_args() has constructed an error for us.
  1095. */
  1096. return;
  1097. }
  1098. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  1099. if (parameter == NULL)
  1100. {
  1101. jack_dbus_error(
  1102. call,
  1103. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1104. "Unknown parameter \"%s\" for driver \"%s\"",
  1105. parameter_name,
  1106. jackctl_driver_get_name(controller_ptr->driver));
  1107. return;
  1108. }
  1109. jack_controller_get_parameter_info(call, parameter);
  1110. }
  1111. /*
  1112. * Execute GetDriverParameterValue method call.
  1113. */
  1114. static void
  1115. jack_controller_dbus_get_driver_parameter_value(
  1116. struct jack_dbus_method_call *call)
  1117. {
  1118. const char *parameter_name;
  1119. jackctl_parameter_t *parameter;
  1120. int type;
  1121. union jackctl_parameter_value jackctl_value;
  1122. union jackctl_parameter_value jackctl_default_value;
  1123. message_arg_t value;
  1124. message_arg_t default_value;
  1125. if (controller_ptr->driver == NULL)
  1126. {
  1127. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1128. "No driver selected");
  1129. return;
  1130. }
  1131. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1132. {
  1133. /* The method call had invalid arguments meaning that
  1134. * get_method_args() has constructed an error for us.
  1135. */
  1136. return;
  1137. }
  1138. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  1139. if (parameter == NULL)
  1140. {
  1141. jack_dbus_error(
  1142. call,
  1143. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1144. "Unknown parameter \"%s\" for driver \"%s\"",
  1145. parameter,
  1146. jackctl_driver_get_name(controller_ptr->driver));
  1147. return;
  1148. }
  1149. type = jackctl_parameter_get_type(parameter);
  1150. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  1151. jackctl_value = jackctl_parameter_get_value(parameter);
  1152. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  1153. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  1154. /* Construct the reply. */
  1155. jack_dbus_construct_method_return_parameter(
  1156. call,
  1157. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  1158. PARAM_TYPE_JACK_TO_DBUS(type),
  1159. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1160. default_value,
  1161. value);
  1162. }
  1163. static
  1164. void
  1165. jack_controller_dbus_set_driver_parameter_value(
  1166. struct jack_dbus_method_call *call)
  1167. {
  1168. const char *parameter_name;
  1169. message_arg_t arg;
  1170. int arg_type;
  1171. jackctl_parameter_t *parameter;
  1172. jackctl_param_type_t type;
  1173. union jackctl_parameter_value value;
  1174. if (controller_ptr->driver == NULL)
  1175. {
  1176. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1177. "No driver selected");
  1178. return;
  1179. }
  1180. if (!jack_dbus_get_method_args_string_and_variant(call, &parameter_name, &arg, &arg_type))
  1181. {
  1182. /* The method call had invalid arguments meaning that
  1183. * jack_dbus_get_method_args_string_and_variant() has constructed
  1184. * an error for us.
  1185. */
  1186. return;
  1187. }
  1188. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  1189. if (parameter == NULL)
  1190. {
  1191. jack_dbus_error(
  1192. call,
  1193. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1194. "Unknown parameter \"%s\" for driver \"%s\"",
  1195. parameter,
  1196. jackctl_driver_get_name(controller_ptr->driver));
  1197. return;
  1198. }
  1199. type = jackctl_parameter_get_type(parameter);
  1200. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  1201. {
  1202. jack_dbus_error(
  1203. call,
  1204. JACK_DBUS_ERROR_INVALID_ARGS,
  1205. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  1206. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  1207. (char)arg_type);
  1208. return;
  1209. }
  1210. if (!jack_controller_dbus_to_jack_variant(
  1211. arg_type,
  1212. &arg,
  1213. &value))
  1214. {
  1215. jack_dbus_error(
  1216. call,
  1217. JACK_DBUS_ERROR_INVALID_ARGS,
  1218. "Cannot convert engine parameter value");
  1219. return;
  1220. }
  1221. jackctl_parameter_set_value(parameter, &value);
  1222. jack_controller_settings_save_auto(controller_ptr);
  1223. jack_dbus_construct_method_return_empty(call);
  1224. }
  1225. /*
  1226. * Execute GetEngineParametersInfo method call.
  1227. */
  1228. static
  1229. void
  1230. jack_controller_dbus_get_engine_parameters_info(
  1231. struct jack_dbus_method_call *call)
  1232. {
  1233. jack_controller_get_parameters_info(
  1234. call,
  1235. jackctl_server_get_parameters(controller_ptr->server));
  1236. }
  1237. /*
  1238. * Execute GetEngineParameterInfo method call.
  1239. */
  1240. static
  1241. void
  1242. jack_controller_dbus_get_engine_parameter_info(
  1243. struct jack_dbus_method_call *call)
  1244. {
  1245. const char *parameter_name;
  1246. jackctl_parameter_t *parameter;
  1247. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1248. {
  1249. /* The method call had invalid arguments meaning that
  1250. * jack_dbus_get_method_args() has constructed an error for us.
  1251. */
  1252. return;
  1253. }
  1254. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  1255. if (parameter == NULL)
  1256. {
  1257. jack_dbus_error(
  1258. call,
  1259. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  1260. "Unknown engine parameter \"%s\"",
  1261. parameter);
  1262. return;
  1263. }
  1264. jack_controller_get_parameter_info(call, parameter);
  1265. }
  1266. /*
  1267. * Execute GetDriverParameterValue method call.
  1268. */
  1269. static
  1270. void
  1271. jack_controller_dbus_get_engine_parameter_value(
  1272. struct jack_dbus_method_call *call)
  1273. {
  1274. const char *parameter_name;
  1275. jackctl_parameter_t *parameter;
  1276. jackctl_param_type_t type;
  1277. union jackctl_parameter_value jackctl_value;
  1278. union jackctl_parameter_value jackctl_default_value;
  1279. message_arg_t value;
  1280. message_arg_t default_value;
  1281. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1282. {
  1283. /* The method call had invalid arguments meaning that
  1284. * jack_dbus_get_method_args() has constructed an error for us.
  1285. */
  1286. return;
  1287. }
  1288. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  1289. if (parameter == NULL)
  1290. {
  1291. jack_dbus_error(
  1292. call,
  1293. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  1294. "Unknown engine parameter \"%s\"",
  1295. parameter);
  1296. return;
  1297. }
  1298. type = jackctl_parameter_get_type(parameter);
  1299. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  1300. jackctl_value = jackctl_parameter_get_value(parameter);
  1301. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  1302. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  1303. /* Construct the reply. */
  1304. jack_dbus_construct_method_return_parameter(
  1305. call,
  1306. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  1307. PARAM_TYPE_JACK_TO_DBUS(type),
  1308. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1309. default_value,
  1310. value);
  1311. }
  1312. static
  1313. void
  1314. jack_controller_dbus_set_engine_parameter_value(
  1315. struct jack_dbus_method_call *call)
  1316. {
  1317. const char *parameter_name;
  1318. message_arg_t arg;
  1319. int arg_type;
  1320. jackctl_parameter_t *parameter;
  1321. jackctl_param_type_t type;
  1322. union jackctl_parameter_value value;
  1323. if (!jack_dbus_get_method_args_string_and_variant (call, &parameter_name, &arg, &arg_type))
  1324. {
  1325. /* The method call had invalid arguments meaning that
  1326. * jack_dbus_get_method_args_string_and_variant() has constructed
  1327. * an error for us.
  1328. */
  1329. return;
  1330. }
  1331. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  1332. if (parameter == NULL)
  1333. {
  1334. jack_dbus_error(
  1335. call,
  1336. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  1337. "Unknown engine parameter \"%s\"",
  1338. parameter);
  1339. return;
  1340. }
  1341. type = jackctl_parameter_get_type(parameter);
  1342. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  1343. {
  1344. jack_dbus_error(
  1345. call,
  1346. JACK_DBUS_ERROR_INVALID_ARGS,
  1347. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  1348. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  1349. (char)arg_type);
  1350. return;
  1351. }
  1352. if (!jack_controller_dbus_to_jack_variant(
  1353. arg_type,
  1354. &arg,
  1355. &value))
  1356. {
  1357. jack_dbus_error(
  1358. call,
  1359. JACK_DBUS_ERROR_INVALID_ARGS,
  1360. "Cannot convert engine parameter value");
  1361. return;
  1362. }
  1363. jackctl_parameter_set_value(parameter, &value);
  1364. jack_controller_settings_save_auto(controller_ptr);
  1365. jack_dbus_construct_method_return_empty(call);
  1366. }
  1367. #undef controller_ptr
  1368. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetAvailableDrivers)
  1369. JACK_DBUS_METHOD_ARGUMENT("drivers_list", "as", true)
  1370. JACK_DBUS_METHOD_ARGUMENTS_END
  1371. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSelectedDriver)
  1372. JACK_DBUS_METHOD_ARGUMENT("driver", "s", true)
  1373. JACK_DBUS_METHOD_ARGUMENTS_END
  1374. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SelectDriver)
  1375. JACK_DBUS_METHOD_ARGUMENT("driver", "s", false)
  1376. JACK_DBUS_METHOD_ARGUMENTS_END
  1377. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParametersInfo)
  1378. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  1379. JACK_DBUS_METHOD_ARGUMENTS_END
  1380. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterInfo)
  1381. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1382. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  1383. JACK_DBUS_METHOD_ARGUMENTS_END
  1384. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterValue)
  1385. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1386. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  1387. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  1388. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  1389. JACK_DBUS_METHOD_ARGUMENTS_END
  1390. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetDriverParameterValue)
  1391. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1392. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  1393. JACK_DBUS_METHOD_ARGUMENTS_END
  1394. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParametersInfo)
  1395. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  1396. JACK_DBUS_METHOD_ARGUMENTS_END
  1397. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterInfo)
  1398. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1399. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  1400. JACK_DBUS_METHOD_ARGUMENTS_END
  1401. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterValue)
  1402. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1403. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  1404. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  1405. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  1406. JACK_DBUS_METHOD_ARGUMENTS_END
  1407. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetEngineParameterValue)
  1408. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  1409. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  1410. JACK_DBUS_METHOD_ARGUMENTS_END
  1411. JACK_DBUS_METHODS_BEGIN
  1412. JACK_DBUS_METHOD_DESCRIBE(GetAvailableDrivers, jack_controller_dbus_get_available_drivers)
  1413. JACK_DBUS_METHOD_DESCRIBE(GetSelectedDriver, jack_controller_dbus_get_selected_driver)
  1414. JACK_DBUS_METHOD_DESCRIBE(SelectDriver, jack_controller_dbus_select_driver)
  1415. JACK_DBUS_METHOD_DESCRIBE(GetDriverParametersInfo, jack_controller_dbus_get_driver_parameters_info)
  1416. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterInfo, jack_controller_dbus_get_driver_parameter_info)
  1417. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterValue, jack_controller_dbus_get_driver_parameter_value)
  1418. JACK_DBUS_METHOD_DESCRIBE(SetDriverParameterValue, jack_controller_dbus_set_driver_parameter_value)
  1419. JACK_DBUS_METHOD_DESCRIBE(GetEngineParametersInfo, jack_controller_dbus_get_engine_parameters_info)
  1420. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterInfo, jack_controller_dbus_get_engine_parameter_info)
  1421. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterValue, jack_controller_dbus_get_engine_parameter_value)
  1422. JACK_DBUS_METHOD_DESCRIBE(SetEngineParameterValue, jack_controller_dbus_set_engine_parameter_value)
  1423. JACK_DBUS_METHODS_END
  1424. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.JackConfigure")
  1425. JACK_DBUS_IFACE_EXPOSE_METHODS
  1426. JACK_DBUS_IFACE_END
  1427. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  1428. /*
  1429. Copyright (C) 2007,2008 Nedko Arnaudov
  1430. Copyright (C) 2007-2008 Juuso Alasuutari
  1431. This program is free software; you can redistribute it and/or modify
  1432. it under the terms of the GNU General Public License as published by
  1433. the Free Software Foundation; either version 2 of the License.
  1434. This program is distributed in the hope that it will be useful,
  1435. but WITHOUT ANY WARRANTY; without even the implied warranty of
  1436. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  1437. GNU General Public License for more details.
  1438. You should have received a copy of the GNU General Public License
  1439. along with this program; if not, write to the Free Software
  1440. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  1441. */
  1442. #include <stdint.h>
  1443. #include <string.h>
  1444. #include <assert.h>
  1445. #include <dbus/dbus.h>
  1446. #include "jackdbus.h"
  1447. #include "controller_internal.h"
  1448. #include "xml.h"
  1449. unsigned char jack_controller_dbus_types[JACK_PARAM_MAX] =
  1450. {
  1451. [JackParamInt] = DBUS_TYPE_INT32,
  1452. [JackParamUInt] = DBUS_TYPE_UINT32,
  1453. [JackParamChar] = DBUS_TYPE_BYTE,
  1454. [JackParamString] = DBUS_TYPE_STRING,
  1455. [JackParamBool] = DBUS_TYPE_BOOLEAN,
  1456. };
  1457. const char *jack_controller_dbus_type_signatures[JACK_PARAM_MAX] =
  1458. {
  1459. [JackParamInt] = DBUS_TYPE_INT32_AS_STRING,
  1460. [JackParamUInt] = DBUS_TYPE_UINT32_AS_STRING,
  1461. [JackParamChar] = DBUS_TYPE_BYTE_AS_STRING,
  1462. [JackParamString] = DBUS_TYPE_STRING_AS_STRING,
  1463. [JackParamBool] = DBUS_TYPE_BOOLEAN_AS_STRING,
  1464. };
  1465. #define PARAM_TYPE_JACK_TO_DBUS(_) jack_controller_dbus_types[_]
  1466. #define PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(_) jack_controller_dbus_type_signatures[_]
  1467. static
  1468. bool
  1469. jack_controller_jack_to_dbus_variant(
  1470. jackctl_param_type_t type,
  1471. const union jackctl_parameter_value *value_ptr,
  1472. message_arg_t *dbusv_ptr)
  1473. {
  1474. switch (type)
  1475. {
  1476. case JackParamInt:
  1477. dbusv_ptr->int32 = (dbus_int32_t)value_ptr->i;
  1478. return true;
  1479. case JackParamUInt:
  1480. dbusv_ptr->uint32 = (dbus_uint32_t)value_ptr->ui;
  1481. return true;
  1482. case JackParamChar:
  1483. dbusv_ptr->byte = value_ptr->c;
  1484. return true;
  1485. case JackParamString:
  1486. dbusv_ptr->string = value_ptr->str;
  1487. return true;
  1488. case JackParamBool:
  1489. dbusv_ptr->boolean = (dbus_bool_t)value_ptr->b;
  1490. return true;
  1491. }
  1492. jack_error("Unknown JACK parameter type %i", (int)type);
  1493. assert(0);
  1494. return false;
  1495. }
  1496. static
  1497. bool
  1498. jack_controller_dbus_to_jack_variant(
  1499. int type,
  1500. const message_arg_t *dbusv_ptr,
  1501. union jackctl_parameter_value *value_ptr)
  1502. {
  1503. size_t len;
  1504. switch (type)
  1505. {
  1506. case DBUS_TYPE_INT32:
  1507. value_ptr->i = dbusv_ptr->int32;
  1508. return true;
  1509. case DBUS_TYPE_UINT32:
  1510. value_ptr->ui = dbusv_ptr->uint32;
  1511. return true;
  1512. case DBUS_TYPE_BYTE:
  1513. value_ptr->c = dbusv_ptr->byte;
  1514. return true;
  1515. case DBUS_TYPE_STRING:
  1516. len = strlen(dbusv_ptr->string);
  1517. if (len > JACK_PARAM_STRING_MAX)
  1518. {
  1519. jack_error("Parameter string value is too long (%u)", (unsigned int)len);
  1520. return false;
  1521. }
  1522. memcpy(value_ptr->str, dbusv_ptr->string, len + 1);
  1523. return true;
  1524. case DBUS_TYPE_BOOLEAN:
  1525. value_ptr->b = dbusv_ptr->boolean;
  1526. return true;
  1527. }
  1528. jack_error("Unknown D-Bus parameter type %i", (int)type);
  1529. return false;
  1530. }
  1531. /*
  1532. * Construct a return message for a Get[Driver|Engine]ParameterValue method call.
  1533. *
  1534. * The operation can only fail due to lack of memory, in which case
  1535. * there's no sense in trying to construct an error return. Instead,
  1536. * call->reply will be set to NULL and handled in send_method_return().
  1537. */
  1538. static void
  1539. jack_dbus_construct_method_return_parameter(
  1540. struct jack_dbus_method_call *call,
  1541. dbus_bool_t is_set,
  1542. int type,
  1543. const char *signature,
  1544. message_arg_t default_value,
  1545. message_arg_t value)
  1546. {
  1547. DBusMessageIter iter;
  1548. /* Create a new method return message. */
  1549. call->reply = dbus_message_new_method_return (call->message);
  1550. if (!call->reply)
  1551. {
  1552. goto fail;
  1553. }
  1554. dbus_message_iter_init_append (call->reply, &iter);
  1555. /* Append the is_set argument. */
  1556. if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, (const void *) &is_set))
  1557. {
  1558. goto fail_unref;
  1559. }
  1560. /* Append the 'default' and 'value' arguments. */
  1561. if (!jack_dbus_message_append_variant(&iter, type, signature, &default_value))
  1562. {
  1563. goto fail_unref;
  1564. }
  1565. if (!jack_dbus_message_append_variant(&iter, type, signature, &value))
  1566. {
  1567. goto fail_unref;
  1568. }
  1569. return;
  1570. fail_unref:
  1571. dbus_message_unref (call->reply);
  1572. call->reply = NULL;
  1573. fail:
  1574. jack_error ("Ran out of memory trying to construct method return");
  1575. }
  1576. #define controller_ptr ((struct jack_controller *)call->context)
  1577. static
  1578. void
  1579. jack_controller_dbus_get_available_drivers(
  1580. struct jack_dbus_method_call *call)
  1581. {
  1582. jack_dbus_construct_method_return_array_of_strings(
  1583. call,
  1584. controller_ptr->drivers_count,
  1585. controller_ptr->driver_names);
  1586. }
  1587. static
  1588. void
  1589. jack_controller_dbus_get_selected_driver(
  1590. struct jack_dbus_method_call *call)
  1591. {
  1592. message_arg_t arg;
  1593. if (controller_ptr->driver != NULL)
  1594. {
  1595. arg.string = jackctl_driver_get_name(controller_ptr->driver);
  1596. }
  1597. else
  1598. {
  1599. arg.string = NULL;
  1600. }
  1601. jack_dbus_construct_method_return_single(call, DBUS_TYPE_STRING, arg);
  1602. }
  1603. static
  1604. void
  1605. jack_controller_dbus_select_driver(
  1606. struct jack_dbus_method_call *call)
  1607. {
  1608. const char *driver_name;
  1609. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
  1610. {
  1611. /* The method call had invalid arguments meaning that
  1612. * jack_dbus_get_method_args() has constructed an error for us.
  1613. */
  1614. return;
  1615. }
  1616. if (!jack_controller_select_driver(controller_ptr, driver_name))
  1617. {
  1618. /* Couldn't find driver with the specified name. */
  1619. jack_dbus_error(
  1620. call,
  1621. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  1622. "Unknown driver \"%s\"",
  1623. driver_name);
  1624. return;
  1625. }
  1626. jack_controller_settings_save_auto(controller_ptr);
  1627. jack_dbus_construct_method_return_empty(call);
  1628. }
  1629. static
  1630. void
  1631. jack_controller_get_parameters_info(
  1632. struct jack_dbus_method_call *call,
  1633. const JSList *parameters_list)
  1634. {
  1635. DBusMessageIter iter, array_iter, struct_iter;
  1636. unsigned char type;
  1637. const char *str;
  1638. call->reply = dbus_message_new_method_return (call->message);
  1639. if (!call->reply)
  1640. {
  1641. goto fail;
  1642. }
  1643. dbus_message_iter_init_append (call->reply, &iter);
  1644. /* Open the array. */
  1645. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ysss)", &array_iter))
  1646. {
  1647. goto fail_unref;
  1648. }
  1649. /* Append parameter descriptions to the array. */
  1650. while (parameters_list != NULL)
  1651. {
  1652. /* Open the struct. */
  1653. if (!dbus_message_iter_open_container (&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  1654. {
  1655. goto fail_close_unref;
  1656. }
  1657. /* Append parameter type. */
  1658. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type((jackctl_parameter_t *)parameters_list->data));
  1659. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  1660. (const void *) &type))
  1661. {
  1662. goto fail_close2_unref;
  1663. }
  1664. /* Append parameter name. */
  1665. str = jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data);
  1666. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1667. (const void *) &str))
  1668. {
  1669. goto fail_close2_unref;
  1670. }
  1671. /* Append parameter short description. */
  1672. str = jackctl_parameter_get_short_description((jackctl_parameter_t *)parameters_list->data);
  1673. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1674. (const void *) &str))
  1675. {
  1676. goto fail_close2_unref;
  1677. }
  1678. /* Append parameter long description. */
  1679. str = jackctl_parameter_get_long_description((jackctl_parameter_t *)parameters_list->data);
  1680. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1681. (const void *) &str))
  1682. {
  1683. goto fail_close2_unref;
  1684. }
  1685. /* Close the struct. */
  1686. if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
  1687. {
  1688. goto fail_close_unref;
  1689. }
  1690. parameters_list = jack_slist_next(parameters_list);
  1691. }
  1692. /* Close the array. */
  1693. if (!dbus_message_iter_close_container (&iter, &array_iter))
  1694. {
  1695. goto fail_unref;
  1696. }
  1697. return;
  1698. fail_close2_unref:
  1699. dbus_message_iter_close_container (&iter, &struct_iter);
  1700. fail_close_unref:
  1701. dbus_message_iter_close_container (&iter, &array_iter);
  1702. fail_unref:
  1703. dbus_message_unref (call->reply);
  1704. call->reply = NULL;
  1705. fail:
  1706. jack_error ("Ran out of memory trying to construct method return");
  1707. }
  1708. static
  1709. void
  1710. jack_controller_get_parameter_info(
  1711. struct jack_dbus_method_call *call,
  1712. jackctl_parameter_t *parameter)
  1713. {
  1714. DBusMessageIter iter, struct_iter;
  1715. unsigned char type;
  1716. const char *str;
  1717. call->reply = dbus_message_new_method_return (call->message);
  1718. if (!call->reply)
  1719. {
  1720. goto fail;
  1721. }
  1722. dbus_message_iter_init_append (call->reply, &iter);
  1723. /* Open the struct. */
  1724. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  1725. {
  1726. goto fail_unref;
  1727. }
  1728. /* Append parameter type. */
  1729. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type(parameter));
  1730. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  1731. (const void *) &type))
  1732. {
  1733. goto fail_close_unref;
  1734. }
  1735. /* Append parameter name. */
  1736. str = jackctl_parameter_get_name(parameter);
  1737. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1738. (const void *) &str))
  1739. {
  1740. goto fail_close_unref;
  1741. }
  1742. /* Append parameter short description. */
  1743. str = jackctl_parameter_get_short_description(parameter);
  1744. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1745. (const void *) &str))
  1746. {
  1747. goto fail_close_unref;
  1748. }
  1749. /* Append parameter long description. */
  1750. str = jackctl_parameter_get_long_description(parameter);
  1751. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  1752. (const void *) &str))
  1753. {
  1754. goto fail_close_unref;
  1755. }
  1756. /* Close the struct. */
  1757. if (!dbus_message_iter_close_container (&iter, &struct_iter))
  1758. {
  1759. goto fail_unref;
  1760. }
  1761. return;
  1762. fail_close_unref:
  1763. dbus_message_iter_close_container (&iter, &struct_iter);
  1764. fail_unref:
  1765. dbus_message_unref (call->reply);
  1766. call->reply = NULL;
  1767. fail:
  1768. jack_error ("Ran out of memory trying to construct method return");
  1769. }
  1770. /*
  1771. * Execute GetDriverParametersInfo method call.
  1772. */
  1773. static
  1774. void
  1775. jack_controller_dbus_get_driver_parameters_info(
  1776. struct jack_dbus_method_call *call)
  1777. {
  1778. if (controller_ptr->driver == NULL)
  1779. {
  1780. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1781. "No driver selected");
  1782. return;
  1783. }
  1784. jack_controller_get_parameters_info(
  1785. call,
  1786. jackctl_driver_get_parameters(controller_ptr->driver));
  1787. }
  1788. /*
  1789. * Execute GetDriverParameterInfo method call.
  1790. */
  1791. static
  1792. void
  1793. jack_controller_dbus_get_driver_parameter_info(
  1794. struct jack_dbus_method_call *call)
  1795. {
  1796. const char *parameter_name;
  1797. jackctl_parameter_t *parameter;
  1798. if (controller_ptr->driver == NULL)
  1799. {
  1800. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1801. "No driver selected");
  1802. return;
  1803. }
  1804. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1805. {
  1806. /* The method call had invalid arguments meaning that
  1807. * jack_dbus_get_method_args() has constructed an error for us.
  1808. */
  1809. return;
  1810. }
  1811. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  1812. if (parameter == NULL)
  1813. {
  1814. jack_dbus_error(
  1815. call,
  1816. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1817. "Unknown parameter \"%s\" for driver \"%s\"",
  1818. parameter_name,
  1819. jackctl_driver_get_name(controller_ptr->driver));
  1820. return;
  1821. }
  1822. jack_controller_get_parameter_info(call, parameter);
  1823. }
  1824. /*
  1825. * Execute GetDriverParameterValue method call.
  1826. */
  1827. static void
  1828. jack_controller_dbus_get_driver_parameter_value(
  1829. struct jack_dbus_method_call *call)
  1830. {
  1831. const char *parameter_name;
  1832. jackctl_parameter_t *parameter;
  1833. int type;
  1834. union jackctl_parameter_value jackctl_value;
  1835. union jackctl_parameter_value jackctl_default_value;
  1836. message_arg_t value;
  1837. message_arg_t default_value;
  1838. if (controller_ptr->driver == NULL)
  1839. {
  1840. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1841. "No driver selected");
  1842. return;
  1843. }
  1844. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1845. {
  1846. /* The method call had invalid arguments meaning that
  1847. * get_method_args() has constructed an error for us.
  1848. */
  1849. return;
  1850. }
  1851. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  1852. if (parameter == NULL)
  1853. {
  1854. jack_dbus_error(
  1855. call,
  1856. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1857. "Unknown parameter \"%s\" for driver \"%s\"",
  1858. parameter,
  1859. jackctl_driver_get_name(controller_ptr->driver));
  1860. return;
  1861. }
  1862. type = jackctl_parameter_get_type(parameter);
  1863. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  1864. jackctl_value = jackctl_parameter_get_value(parameter);
  1865. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  1866. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  1867. /* Construct the reply. */
  1868. jack_dbus_construct_method_return_parameter(
  1869. call,
  1870. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  1871. PARAM_TYPE_JACK_TO_DBUS(type),
  1872. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  1873. default_value,
  1874. value);
  1875. }
  1876. static
  1877. void
  1878. jack_controller_dbus_set_driver_parameter_value(
  1879. struct jack_dbus_method_call *call)
  1880. {
  1881. const char *parameter_name;
  1882. message_arg_t arg;
  1883. int arg_type;
  1884. jackctl_parameter_t *parameter;
  1885. jackctl_param_type_t type;
  1886. union jackctl_parameter_value value;
  1887. if (controller_ptr->driver == NULL)
  1888. {
  1889. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  1890. "No driver selected");
  1891. return;
  1892. }
  1893. if (!jack_dbus_get_method_args_string_and_variant(call, &parameter_name, &arg, &arg_type))
  1894. {
  1895. /* The method call had invalid arguments meaning that
  1896. * jack_dbus_get_method_args_string_and_variant() has constructed
  1897. * an error for us.
  1898. */
  1899. return;
  1900. }
  1901. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  1902. if (parameter == NULL)
  1903. {
  1904. jack_dbus_error(
  1905. call,
  1906. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  1907. "Unknown parameter \"%s\" for driver \"%s\"",
  1908. parameter,
  1909. jackctl_driver_get_name(controller_ptr->driver));
  1910. return;
  1911. }
  1912. type = jackctl_parameter_get_type(parameter);
  1913. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  1914. {
  1915. jack_dbus_error(
  1916. call,
  1917. JACK_DBUS_ERROR_INVALID_ARGS,
  1918. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  1919. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  1920. (char)arg_type);
  1921. return;
  1922. }
  1923. if (!jack_controller_dbus_to_jack_variant(
  1924. arg_type,
  1925. &arg,
  1926. &value))
  1927. {
  1928. jack_dbus_error(
  1929. call,
  1930. JACK_DBUS_ERROR_INVALID_ARGS,
  1931. "Cannot convert engine parameter value");
  1932. return;
  1933. }
  1934. jackctl_parameter_set_value(parameter, &value);
  1935. jack_controller_settings_save_auto(controller_ptr);
  1936. jack_dbus_construct_method_return_empty(call);
  1937. }
  1938. /*
  1939. * Execute GetEngineParametersInfo method call.
  1940. */
  1941. static
  1942. void
  1943. jack_controller_dbus_get_engine_parameters_info(
  1944. struct jack_dbus_method_call *call)
  1945. {
  1946. jack_controller_get_parameters_info(
  1947. call,
  1948. jackctl_server_get_parameters(controller_ptr->server));
  1949. }
  1950. /*
  1951. * Execute GetEngineParameterInfo method call.
  1952. */
  1953. static
  1954. void
  1955. jack_controller_dbus_get_engine_parameter_info(
  1956. struct jack_dbus_method_call *call)
  1957. {
  1958. const char *parameter_name;
  1959. jackctl_parameter_t *parameter;
  1960. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1961. {
  1962. /* The method call had invalid arguments meaning that
  1963. * jack_dbus_get_method_args() has constructed an error for us.
  1964. */
  1965. return;
  1966. }
  1967. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  1968. if (parameter == NULL)
  1969. {
  1970. jack_dbus_error(
  1971. call,
  1972. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  1973. "Unknown engine parameter \"%s\"",
  1974. parameter);
  1975. return;
  1976. }
  1977. jack_controller_get_parameter_info(call, parameter);
  1978. }
  1979. /*
  1980. * Execute GetDriverParameterValue method call.
  1981. */
  1982. static
  1983. void
  1984. jack_controller_dbus_get_engine_parameter_value(
  1985. struct jack_dbus_method_call *call)
  1986. {
  1987. const char *parameter_name;
  1988. jackctl_parameter_t *parameter;
  1989. jackctl_param_type_t type;
  1990. union jackctl_parameter_value jackctl_value;
  1991. union jackctl_parameter_value jackctl_default_value;
  1992. message_arg_t value;
  1993. message_arg_t default_value;
  1994. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  1995. {
  1996. /* The method call had invalid arguments meaning that
  1997. * jack_dbus_get_method_args() has constructed an error for us.
  1998. */
  1999. return;
  2000. }
  2001. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  2002. if (parameter == NULL)
  2003. {
  2004. jack_dbus_error(
  2005. call,
  2006. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  2007. "Unknown engine parameter \"%s\"",
  2008. parameter);
  2009. return;
  2010. }
  2011. type = jackctl_parameter_get_type(parameter);
  2012. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  2013. jackctl_value = jackctl_parameter_get_value(parameter);
  2014. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  2015. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  2016. /* Construct the reply. */
  2017. jack_dbus_construct_method_return_parameter(
  2018. call,
  2019. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  2020. PARAM_TYPE_JACK_TO_DBUS(type),
  2021. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  2022. default_value,
  2023. value);
  2024. }
  2025. static
  2026. void
  2027. jack_controller_dbus_set_engine_parameter_value(
  2028. struct jack_dbus_method_call *call)
  2029. {
  2030. const char *parameter_name;
  2031. message_arg_t arg;
  2032. int arg_type;
  2033. jackctl_parameter_t *parameter;
  2034. jackctl_param_type_t type;
  2035. union jackctl_parameter_value value;
  2036. if (!jack_dbus_get_method_args_string_and_variant (call, &parameter_name, &arg, &arg_type))
  2037. {
  2038. /* The method call had invalid arguments meaning that
  2039. * jack_dbus_get_method_args_string_and_variant() has constructed
  2040. * an error for us.
  2041. */
  2042. return;
  2043. }
  2044. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  2045. if (parameter == NULL)
  2046. {
  2047. jack_dbus_error(
  2048. call,
  2049. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  2050. "Unknown engine parameter \"%s\"",
  2051. parameter);
  2052. return;
  2053. }
  2054. type = jackctl_parameter_get_type(parameter);
  2055. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  2056. {
  2057. jack_dbus_error(
  2058. call,
  2059. JACK_DBUS_ERROR_INVALID_ARGS,
  2060. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  2061. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  2062. (char)arg_type);
  2063. return;
  2064. }
  2065. if (!jack_controller_dbus_to_jack_variant(
  2066. arg_type,
  2067. &arg,
  2068. &value))
  2069. {
  2070. jack_dbus_error(
  2071. call,
  2072. JACK_DBUS_ERROR_INVALID_ARGS,
  2073. "Cannot convert engine parameter value");
  2074. return;
  2075. }
  2076. jackctl_parameter_set_value(parameter, &value);
  2077. jack_controller_settings_save_auto(controller_ptr);
  2078. jack_dbus_construct_method_return_empty(call);
  2079. }
  2080. #undef controller_ptr
  2081. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetAvailableDrivers)
  2082. JACK_DBUS_METHOD_ARGUMENT("drivers_list", "as", true)
  2083. JACK_DBUS_METHOD_ARGUMENTS_END
  2084. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSelectedDriver)
  2085. JACK_DBUS_METHOD_ARGUMENT("driver", "s", true)
  2086. JACK_DBUS_METHOD_ARGUMENTS_END
  2087. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SelectDriver)
  2088. JACK_DBUS_METHOD_ARGUMENT("driver", "s", false)
  2089. JACK_DBUS_METHOD_ARGUMENTS_END
  2090. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParametersInfo)
  2091. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  2092. JACK_DBUS_METHOD_ARGUMENTS_END
  2093. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterInfo)
  2094. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2095. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  2096. JACK_DBUS_METHOD_ARGUMENTS_END
  2097. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterValue)
  2098. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2099. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  2100. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  2101. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  2102. JACK_DBUS_METHOD_ARGUMENTS_END
  2103. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetDriverParameterValue)
  2104. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2105. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  2106. JACK_DBUS_METHOD_ARGUMENTS_END
  2107. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParametersInfo)
  2108. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  2109. JACK_DBUS_METHOD_ARGUMENTS_END
  2110. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterInfo)
  2111. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2112. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  2113. JACK_DBUS_METHOD_ARGUMENTS_END
  2114. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterValue)
  2115. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2116. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  2117. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  2118. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  2119. JACK_DBUS_METHOD_ARGUMENTS_END
  2120. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetEngineParameterValue)
  2121. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2122. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  2123. JACK_DBUS_METHOD_ARGUMENTS_END
  2124. JACK_DBUS_METHODS_BEGIN
  2125. JACK_DBUS_METHOD_DESCRIBE(GetAvailableDrivers, jack_controller_dbus_get_available_drivers)
  2126. JACK_DBUS_METHOD_DESCRIBE(GetSelectedDriver, jack_controller_dbus_get_selected_driver)
  2127. JACK_DBUS_METHOD_DESCRIBE(SelectDriver, jack_controller_dbus_select_driver)
  2128. JACK_DBUS_METHOD_DESCRIBE(GetDriverParametersInfo, jack_controller_dbus_get_driver_parameters_info)
  2129. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterInfo, jack_controller_dbus_get_driver_parameter_info)
  2130. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterValue, jack_controller_dbus_get_driver_parameter_value)
  2131. JACK_DBUS_METHOD_DESCRIBE(SetDriverParameterValue, jack_controller_dbus_set_driver_parameter_value)
  2132. JACK_DBUS_METHOD_DESCRIBE(GetEngineParametersInfo, jack_controller_dbus_get_engine_parameters_info)
  2133. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterInfo, jack_controller_dbus_get_engine_parameter_info)
  2134. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterValue, jack_controller_dbus_get_engine_parameter_value)
  2135. JACK_DBUS_METHOD_DESCRIBE(SetEngineParameterValue, jack_controller_dbus_set_engine_parameter_value)
  2136. JACK_DBUS_METHODS_END
  2137. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.JackConfigure")
  2138. JACK_DBUS_IFACE_EXPOSE_METHODS
  2139. JACK_DBUS_IFACE_END
  2140. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  2141. /*
  2142. Copyright (C) 2007,2008 Nedko Arnaudov
  2143. Copyright (C) 2007-2008 Juuso Alasuutari
  2144. This program is free software; you can redistribute it and/or modify
  2145. it under the terms of the GNU General Public License as published by
  2146. the Free Software Foundation; either version 2 of the License.
  2147. This program is distributed in the hope that it will be useful,
  2148. but WITHOUT ANY WARRANTY; without even the implied warranty of
  2149. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  2150. GNU General Public License for more details.
  2151. You should have received a copy of the GNU General Public License
  2152. along with this program; if not, write to the Free Software
  2153. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  2154. */
  2155. #include <stdint.h>
  2156. #include <string.h>
  2157. #include <assert.h>
  2158. #include <dbus/dbus.h>
  2159. #include "jackdbus.h"
  2160. #include "controller_internal.h"
  2161. #include "xml.h"
  2162. unsigned char jack_controller_dbus_types[JACK_PARAM_MAX] =
  2163. {
  2164. [JackParamInt] = DBUS_TYPE_INT32,
  2165. [JackParamUInt] = DBUS_TYPE_UINT32,
  2166. [JackParamChar] = DBUS_TYPE_BYTE,
  2167. [JackParamString] = DBUS_TYPE_STRING,
  2168. [JackParamBool] = DBUS_TYPE_BOOLEAN,
  2169. };
  2170. const char *jack_controller_dbus_type_signatures[JACK_PARAM_MAX] =
  2171. {
  2172. [JackParamInt] = DBUS_TYPE_INT32_AS_STRING,
  2173. [JackParamUInt] = DBUS_TYPE_UINT32_AS_STRING,
  2174. [JackParamChar] = DBUS_TYPE_BYTE_AS_STRING,
  2175. [JackParamString] = DBUS_TYPE_STRING_AS_STRING,
  2176. [JackParamBool] = DBUS_TYPE_BOOLEAN_AS_STRING,
  2177. };
  2178. #define PARAM_TYPE_JACK_TO_DBUS(_) jack_controller_dbus_types[_]
  2179. #define PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(_) jack_controller_dbus_type_signatures[_]
  2180. static
  2181. bool
  2182. jack_controller_jack_to_dbus_variant(
  2183. jackctl_param_type_t type,
  2184. const union jackctl_parameter_value *value_ptr,
  2185. message_arg_t *dbusv_ptr)
  2186. {
  2187. switch (type)
  2188. {
  2189. case JackParamInt:
  2190. dbusv_ptr->int32 = (dbus_int32_t)value_ptr->i;
  2191. return true;
  2192. case JackParamUInt:
  2193. dbusv_ptr->uint32 = (dbus_uint32_t)value_ptr->ui;
  2194. return true;
  2195. case JackParamChar:
  2196. dbusv_ptr->byte = value_ptr->c;
  2197. return true;
  2198. case JackParamString:
  2199. dbusv_ptr->string = value_ptr->str;
  2200. return true;
  2201. case JackParamBool:
  2202. dbusv_ptr->boolean = (dbus_bool_t)value_ptr->b;
  2203. return true;
  2204. }
  2205. jack_error("Unknown JACK parameter type %i", (int)type);
  2206. assert(0);
  2207. return false;
  2208. }
  2209. static
  2210. bool
  2211. jack_controller_dbus_to_jack_variant(
  2212. int type,
  2213. const message_arg_t *dbusv_ptr,
  2214. union jackctl_parameter_value *value_ptr)
  2215. {
  2216. size_t len;
  2217. switch (type)
  2218. {
  2219. case DBUS_TYPE_INT32:
  2220. value_ptr->i = dbusv_ptr->int32;
  2221. return true;
  2222. case DBUS_TYPE_UINT32:
  2223. value_ptr->ui = dbusv_ptr->uint32;
  2224. return true;
  2225. case DBUS_TYPE_BYTE:
  2226. value_ptr->c = dbusv_ptr->byte;
  2227. return true;
  2228. case DBUS_TYPE_STRING:
  2229. len = strlen(dbusv_ptr->string);
  2230. if (len > JACK_PARAM_STRING_MAX)
  2231. {
  2232. jack_error("Parameter string value is too long (%u)", (unsigned int)len);
  2233. return false;
  2234. }
  2235. memcpy(value_ptr->str, dbusv_ptr->string, len + 1);
  2236. return true;
  2237. case DBUS_TYPE_BOOLEAN:
  2238. value_ptr->b = dbusv_ptr->boolean;
  2239. return true;
  2240. }
  2241. jack_error("Unknown D-Bus parameter type %i", (int)type);
  2242. return false;
  2243. }
  2244. /*
  2245. * Construct a return message for a Get[Driver|Engine]ParameterValue method call.
  2246. *
  2247. * The operation can only fail due to lack of memory, in which case
  2248. * there's no sense in trying to construct an error return. Instead,
  2249. * call->reply will be set to NULL and handled in send_method_return().
  2250. */
  2251. static void
  2252. jack_dbus_construct_method_return_parameter(
  2253. struct jack_dbus_method_call *call,
  2254. dbus_bool_t is_set,
  2255. int type,
  2256. const char *signature,
  2257. message_arg_t default_value,
  2258. message_arg_t value)
  2259. {
  2260. DBusMessageIter iter;
  2261. /* Create a new method return message. */
  2262. call->reply = dbus_message_new_method_return (call->message);
  2263. if (!call->reply)
  2264. {
  2265. goto fail;
  2266. }
  2267. dbus_message_iter_init_append (call->reply, &iter);
  2268. /* Append the is_set argument. */
  2269. if (!dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, (const void *) &is_set))
  2270. {
  2271. goto fail_unref;
  2272. }
  2273. /* Append the 'default' and 'value' arguments. */
  2274. if (!jack_dbus_message_append_variant(&iter, type, signature, &default_value))
  2275. {
  2276. goto fail_unref;
  2277. }
  2278. if (!jack_dbus_message_append_variant(&iter, type, signature, &value))
  2279. {
  2280. goto fail_unref;
  2281. }
  2282. return;
  2283. fail_unref:
  2284. dbus_message_unref (call->reply);
  2285. call->reply = NULL;
  2286. fail:
  2287. jack_error ("Ran out of memory trying to construct method return");
  2288. }
  2289. #define controller_ptr ((struct jack_controller *)call->context)
  2290. static
  2291. void
  2292. jack_controller_dbus_get_available_drivers(
  2293. struct jack_dbus_method_call *call)
  2294. {
  2295. jack_dbus_construct_method_return_array_of_strings(
  2296. call,
  2297. controller_ptr->drivers_count,
  2298. controller_ptr->driver_names);
  2299. }
  2300. static
  2301. void
  2302. jack_controller_dbus_get_selected_driver(
  2303. struct jack_dbus_method_call *call)
  2304. {
  2305. message_arg_t arg;
  2306. if (controller_ptr->driver != NULL)
  2307. {
  2308. arg.string = jackctl_driver_get_name(controller_ptr->driver);
  2309. }
  2310. else
  2311. {
  2312. arg.string = NULL;
  2313. }
  2314. jack_dbus_construct_method_return_single(call, DBUS_TYPE_STRING, arg);
  2315. }
  2316. static
  2317. void
  2318. jack_controller_dbus_select_driver(
  2319. struct jack_dbus_method_call *call)
  2320. {
  2321. const char *driver_name;
  2322. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
  2323. {
  2324. /* The method call had invalid arguments meaning that
  2325. * jack_dbus_get_method_args() has constructed an error for us.
  2326. */
  2327. return;
  2328. }
  2329. if (!jack_controller_select_driver(controller_ptr, driver_name))
  2330. {
  2331. /* Couldn't find driver with the specified name. */
  2332. jack_dbus_error(
  2333. call,
  2334. JACK_DBUS_ERROR_UNKNOWN_DRIVER,
  2335. "Unknown driver \"%s\"",
  2336. driver_name);
  2337. return;
  2338. }
  2339. jack_controller_settings_save_auto(controller_ptr);
  2340. jack_dbus_construct_method_return_empty(call);
  2341. }
  2342. static
  2343. void
  2344. jack_controller_get_parameters_info(
  2345. struct jack_dbus_method_call *call,
  2346. const JSList *parameters_list)
  2347. {
  2348. DBusMessageIter iter, array_iter, struct_iter;
  2349. unsigned char type;
  2350. const char *str;
  2351. call->reply = dbus_message_new_method_return (call->message);
  2352. if (!call->reply)
  2353. {
  2354. goto fail;
  2355. }
  2356. dbus_message_iter_init_append (call->reply, &iter);
  2357. /* Open the array. */
  2358. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_ARRAY, "(ysss)", &array_iter))
  2359. {
  2360. goto fail_unref;
  2361. }
  2362. /* Append parameter descriptions to the array. */
  2363. while (parameters_list != NULL)
  2364. {
  2365. /* Open the struct. */
  2366. if (!dbus_message_iter_open_container (&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  2367. {
  2368. goto fail_close_unref;
  2369. }
  2370. /* Append parameter type. */
  2371. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type((jackctl_parameter_t *)parameters_list->data));
  2372. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  2373. (const void *) &type))
  2374. {
  2375. goto fail_close2_unref;
  2376. }
  2377. /* Append parameter name. */
  2378. str = jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data);
  2379. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  2380. (const void *) &str))
  2381. {
  2382. goto fail_close2_unref;
  2383. }
  2384. /* Append parameter short description. */
  2385. str = jackctl_parameter_get_short_description((jackctl_parameter_t *)parameters_list->data);
  2386. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  2387. (const void *) &str))
  2388. {
  2389. goto fail_close2_unref;
  2390. }
  2391. /* Append parameter long description. */
  2392. str = jackctl_parameter_get_long_description((jackctl_parameter_t *)parameters_list->data);
  2393. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  2394. (const void *) &str))
  2395. {
  2396. goto fail_close2_unref;
  2397. }
  2398. /* Close the struct. */
  2399. if (!dbus_message_iter_close_container (&array_iter, &struct_iter))
  2400. {
  2401. goto fail_close_unref;
  2402. }
  2403. parameters_list = jack_slist_next(parameters_list);
  2404. }
  2405. /* Close the array. */
  2406. if (!dbus_message_iter_close_container (&iter, &array_iter))
  2407. {
  2408. goto fail_unref;
  2409. }
  2410. return;
  2411. fail_close2_unref:
  2412. dbus_message_iter_close_container (&iter, &struct_iter);
  2413. fail_close_unref:
  2414. dbus_message_iter_close_container (&iter, &array_iter);
  2415. fail_unref:
  2416. dbus_message_unref (call->reply);
  2417. call->reply = NULL;
  2418. fail:
  2419. jack_error ("Ran out of memory trying to construct method return");
  2420. }
  2421. static
  2422. void
  2423. jack_controller_get_parameter_info(
  2424. struct jack_dbus_method_call *call,
  2425. jackctl_parameter_t *parameter)
  2426. {
  2427. DBusMessageIter iter, struct_iter;
  2428. unsigned char type;
  2429. const char *str;
  2430. call->reply = dbus_message_new_method_return (call->message);
  2431. if (!call->reply)
  2432. {
  2433. goto fail;
  2434. }
  2435. dbus_message_iter_init_append (call->reply, &iter);
  2436. /* Open the struct. */
  2437. if (!dbus_message_iter_open_container (&iter, DBUS_TYPE_STRUCT, NULL, &struct_iter))
  2438. {
  2439. goto fail_unref;
  2440. }
  2441. /* Append parameter type. */
  2442. type = PARAM_TYPE_JACK_TO_DBUS(jackctl_parameter_get_type(parameter));
  2443. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_BYTE,
  2444. (const void *) &type))
  2445. {
  2446. goto fail_close_unref;
  2447. }
  2448. /* Append parameter name. */
  2449. str = jackctl_parameter_get_name(parameter);
  2450. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  2451. (const void *) &str))
  2452. {
  2453. goto fail_close_unref;
  2454. }
  2455. /* Append parameter short description. */
  2456. str = jackctl_parameter_get_short_description(parameter);
  2457. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  2458. (const void *) &str))
  2459. {
  2460. goto fail_close_unref;
  2461. }
  2462. /* Append parameter long description. */
  2463. str = jackctl_parameter_get_long_description(parameter);
  2464. if (!dbus_message_iter_append_basic (&struct_iter, DBUS_TYPE_STRING,
  2465. (const void *) &str))
  2466. {
  2467. goto fail_close_unref;
  2468. }
  2469. /* Close the struct. */
  2470. if (!dbus_message_iter_close_container (&iter, &struct_iter))
  2471. {
  2472. goto fail_unref;
  2473. }
  2474. return;
  2475. fail_close_unref:
  2476. dbus_message_iter_close_container (&iter, &struct_iter);
  2477. fail_unref:
  2478. dbus_message_unref (call->reply);
  2479. call->reply = NULL;
  2480. fail:
  2481. jack_error ("Ran out of memory trying to construct method return");
  2482. }
  2483. /*
  2484. * Execute GetDriverParametersInfo method call.
  2485. */
  2486. static
  2487. void
  2488. jack_controller_dbus_get_driver_parameters_info(
  2489. struct jack_dbus_method_call *call)
  2490. {
  2491. if (controller_ptr->driver == NULL)
  2492. {
  2493. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  2494. "No driver selected");
  2495. return;
  2496. }
  2497. jack_controller_get_parameters_info(
  2498. call,
  2499. jackctl_driver_get_parameters(controller_ptr->driver));
  2500. }
  2501. /*
  2502. * Execute GetDriverParameterInfo method call.
  2503. */
  2504. static
  2505. void
  2506. jack_controller_dbus_get_driver_parameter_info(
  2507. struct jack_dbus_method_call *call)
  2508. {
  2509. const char *parameter_name;
  2510. jackctl_parameter_t *parameter;
  2511. if (controller_ptr->driver == NULL)
  2512. {
  2513. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  2514. "No driver selected");
  2515. return;
  2516. }
  2517. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  2518. {
  2519. /* The method call had invalid arguments meaning that
  2520. * jack_dbus_get_method_args() has constructed an error for us.
  2521. */
  2522. return;
  2523. }
  2524. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  2525. if (parameter == NULL)
  2526. {
  2527. jack_dbus_error(
  2528. call,
  2529. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  2530. "Unknown parameter \"%s\" for driver \"%s\"",
  2531. parameter_name,
  2532. jackctl_driver_get_name(controller_ptr->driver));
  2533. return;
  2534. }
  2535. jack_controller_get_parameter_info(call, parameter);
  2536. }
  2537. /*
  2538. * Execute GetDriverParameterValue method call.
  2539. */
  2540. static void
  2541. jack_controller_dbus_get_driver_parameter_value(
  2542. struct jack_dbus_method_call *call)
  2543. {
  2544. const char *parameter_name;
  2545. jackctl_parameter_t *parameter;
  2546. int type;
  2547. union jackctl_parameter_value jackctl_value;
  2548. union jackctl_parameter_value jackctl_default_value;
  2549. message_arg_t value;
  2550. message_arg_t default_value;
  2551. if (controller_ptr->driver == NULL)
  2552. {
  2553. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  2554. "No driver selected");
  2555. return;
  2556. }
  2557. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  2558. {
  2559. /* The method call had invalid arguments meaning that
  2560. * get_method_args() has constructed an error for us.
  2561. */
  2562. return;
  2563. }
  2564. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  2565. if (parameter == NULL)
  2566. {
  2567. jack_dbus_error(
  2568. call,
  2569. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  2570. "Unknown parameter \"%s\" for driver \"%s\"",
  2571. parameter,
  2572. jackctl_driver_get_name(controller_ptr->driver));
  2573. return;
  2574. }
  2575. type = jackctl_parameter_get_type(parameter);
  2576. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  2577. jackctl_value = jackctl_parameter_get_value(parameter);
  2578. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  2579. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  2580. /* Construct the reply. */
  2581. jack_dbus_construct_method_return_parameter(
  2582. call,
  2583. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  2584. PARAM_TYPE_JACK_TO_DBUS(type),
  2585. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  2586. default_value,
  2587. value);
  2588. }
  2589. static
  2590. void
  2591. jack_controller_dbus_set_driver_parameter_value(
  2592. struct jack_dbus_method_call *call)
  2593. {
  2594. const char *parameter_name;
  2595. message_arg_t arg;
  2596. int arg_type;
  2597. jackctl_parameter_t *parameter;
  2598. jackctl_param_type_t type;
  2599. union jackctl_parameter_value value;
  2600. if (controller_ptr->driver == NULL)
  2601. {
  2602. jack_dbus_error (call, JACK_DBUS_ERROR_NEED_DRIVER,
  2603. "No driver selected");
  2604. return;
  2605. }
  2606. if (!jack_dbus_get_method_args_string_and_variant(call, &parameter_name, &arg, &arg_type))
  2607. {
  2608. /* The method call had invalid arguments meaning that
  2609. * jack_dbus_get_method_args_string_and_variant() has constructed
  2610. * an error for us.
  2611. */
  2612. return;
  2613. }
  2614. parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), parameter_name);
  2615. if (parameter == NULL)
  2616. {
  2617. jack_dbus_error(
  2618. call,
  2619. JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER,
  2620. "Unknown parameter \"%s\" for driver \"%s\"",
  2621. parameter,
  2622. jackctl_driver_get_name(controller_ptr->driver));
  2623. return;
  2624. }
  2625. type = jackctl_parameter_get_type(parameter);
  2626. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  2627. {
  2628. jack_dbus_error(
  2629. call,
  2630. JACK_DBUS_ERROR_INVALID_ARGS,
  2631. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  2632. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  2633. (char)arg_type);
  2634. return;
  2635. }
  2636. if (!jack_controller_dbus_to_jack_variant(
  2637. arg_type,
  2638. &arg,
  2639. &value))
  2640. {
  2641. jack_dbus_error(
  2642. call,
  2643. JACK_DBUS_ERROR_INVALID_ARGS,
  2644. "Cannot convert engine parameter value");
  2645. return;
  2646. }
  2647. jackctl_parameter_set_value(parameter, &value);
  2648. jack_controller_settings_save_auto(controller_ptr);
  2649. jack_dbus_construct_method_return_empty(call);
  2650. }
  2651. /*
  2652. * Execute GetEngineParametersInfo method call.
  2653. */
  2654. static
  2655. void
  2656. jack_controller_dbus_get_engine_parameters_info(
  2657. struct jack_dbus_method_call *call)
  2658. {
  2659. jack_controller_get_parameters_info(
  2660. call,
  2661. jackctl_server_get_parameters(controller_ptr->server));
  2662. }
  2663. /*
  2664. * Execute GetEngineParameterInfo method call.
  2665. */
  2666. static
  2667. void
  2668. jack_controller_dbus_get_engine_parameter_info(
  2669. struct jack_dbus_method_call *call)
  2670. {
  2671. const char *parameter_name;
  2672. jackctl_parameter_t *parameter;
  2673. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  2674. {
  2675. /* The method call had invalid arguments meaning that
  2676. * jack_dbus_get_method_args() has constructed an error for us.
  2677. */
  2678. return;
  2679. }
  2680. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  2681. if (parameter == NULL)
  2682. {
  2683. jack_dbus_error(
  2684. call,
  2685. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  2686. "Unknown engine parameter \"%s\"",
  2687. parameter);
  2688. return;
  2689. }
  2690. jack_controller_get_parameter_info(call, parameter);
  2691. }
  2692. /*
  2693. * Execute GetDriverParameterValue method call.
  2694. */
  2695. static
  2696. void
  2697. jack_controller_dbus_get_engine_parameter_value(
  2698. struct jack_dbus_method_call *call)
  2699. {
  2700. const char *parameter_name;
  2701. jackctl_parameter_t *parameter;
  2702. jackctl_param_type_t type;
  2703. union jackctl_parameter_value jackctl_value;
  2704. union jackctl_parameter_value jackctl_default_value;
  2705. message_arg_t value;
  2706. message_arg_t default_value;
  2707. if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &parameter_name, DBUS_TYPE_INVALID))
  2708. {
  2709. /* The method call had invalid arguments meaning that
  2710. * jack_dbus_get_method_args() has constructed an error for us.
  2711. */
  2712. return;
  2713. }
  2714. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  2715. if (parameter == NULL)
  2716. {
  2717. jack_dbus_error(
  2718. call,
  2719. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  2720. "Unknown engine parameter \"%s\"",
  2721. parameter);
  2722. return;
  2723. }
  2724. type = jackctl_parameter_get_type(parameter);
  2725. jackctl_default_value = jackctl_parameter_get_default_value(parameter);
  2726. jackctl_value = jackctl_parameter_get_value(parameter);
  2727. jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value);
  2728. jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value);
  2729. /* Construct the reply. */
  2730. jack_dbus_construct_method_return_parameter(
  2731. call,
  2732. (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE),
  2733. PARAM_TYPE_JACK_TO_DBUS(type),
  2734. PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type),
  2735. default_value,
  2736. value);
  2737. }
  2738. static
  2739. void
  2740. jack_controller_dbus_set_engine_parameter_value(
  2741. struct jack_dbus_method_call *call)
  2742. {
  2743. const char *parameter_name;
  2744. message_arg_t arg;
  2745. int arg_type;
  2746. jackctl_parameter_t *parameter;
  2747. jackctl_param_type_t type;
  2748. union jackctl_parameter_value value;
  2749. if (!jack_dbus_get_method_args_string_and_variant (call, &parameter_name, &arg, &arg_type))
  2750. {
  2751. /* The method call had invalid arguments meaning that
  2752. * jack_dbus_get_method_args_string_and_variant() has constructed
  2753. * an error for us.
  2754. */
  2755. return;
  2756. }
  2757. parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), parameter_name);
  2758. if (parameter == NULL)
  2759. {
  2760. jack_dbus_error(
  2761. call,
  2762. JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER,
  2763. "Unknown engine parameter \"%s\"",
  2764. parameter);
  2765. return;
  2766. }
  2767. type = jackctl_parameter_get_type(parameter);
  2768. if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type)
  2769. {
  2770. jack_dbus_error(
  2771. call,
  2772. JACK_DBUS_ERROR_INVALID_ARGS,
  2773. "Engine parameter value type mismatch: was expecting '%c', got '%c'",
  2774. (char)PARAM_TYPE_JACK_TO_DBUS(type),
  2775. (char)arg_type);
  2776. return;
  2777. }
  2778. if (!jack_controller_dbus_to_jack_variant(
  2779. arg_type,
  2780. &arg,
  2781. &value))
  2782. {
  2783. jack_dbus_error(
  2784. call,
  2785. JACK_DBUS_ERROR_INVALID_ARGS,
  2786. "Cannot convert engine parameter value");
  2787. return;
  2788. }
  2789. jackctl_parameter_set_value(parameter, &value);
  2790. jack_controller_settings_save_auto(controller_ptr);
  2791. jack_dbus_construct_method_return_empty(call);
  2792. }
  2793. #undef controller_ptr
  2794. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetAvailableDrivers)
  2795. JACK_DBUS_METHOD_ARGUMENT("drivers_list", "as", true)
  2796. JACK_DBUS_METHOD_ARGUMENTS_END
  2797. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSelectedDriver)
  2798. JACK_DBUS_METHOD_ARGUMENT("driver", "s", true)
  2799. JACK_DBUS_METHOD_ARGUMENTS_END
  2800. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SelectDriver)
  2801. JACK_DBUS_METHOD_ARGUMENT("driver", "s", false)
  2802. JACK_DBUS_METHOD_ARGUMENTS_END
  2803. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParametersInfo)
  2804. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  2805. JACK_DBUS_METHOD_ARGUMENTS_END
  2806. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterInfo)
  2807. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2808. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  2809. JACK_DBUS_METHOD_ARGUMENTS_END
  2810. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetDriverParameterValue)
  2811. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2812. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  2813. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  2814. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  2815. JACK_DBUS_METHOD_ARGUMENTS_END
  2816. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetDriverParameterValue)
  2817. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2818. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  2819. JACK_DBUS_METHOD_ARGUMENTS_END
  2820. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParametersInfo)
  2821. JACK_DBUS_METHOD_ARGUMENT("parameter_info_array", "a(ysss)", true)
  2822. JACK_DBUS_METHOD_ARGUMENTS_END
  2823. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterInfo)
  2824. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2825. JACK_DBUS_METHOD_ARGUMENT("parameter_info", "(ysss)", true)
  2826. JACK_DBUS_METHOD_ARGUMENTS_END
  2827. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetEngineParameterValue)
  2828. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2829. JACK_DBUS_METHOD_ARGUMENT("is_set", "b", true)
  2830. JACK_DBUS_METHOD_ARGUMENT("default", "v", true)
  2831. JACK_DBUS_METHOD_ARGUMENT("value", "v", true)
  2832. JACK_DBUS_METHOD_ARGUMENTS_END
  2833. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetEngineParameterValue)
  2834. JACK_DBUS_METHOD_ARGUMENT("parameter", "s", false)
  2835. JACK_DBUS_METHOD_ARGUMENT("value", "v", false)
  2836. JACK_DBUS_METHOD_ARGUMENTS_END
  2837. JACK_DBUS_METHODS_BEGIN
  2838. JACK_DBUS_METHOD_DESCRIBE(GetAvailableDrivers, jack_controller_dbus_get_available_drivers)
  2839. JACK_DBUS_METHOD_DESCRIBE(GetSelectedDriver, jack_controller_dbus_get_selected_driver)
  2840. JACK_DBUS_METHOD_DESCRIBE(SelectDriver, jack_controller_dbus_select_driver)
  2841. JACK_DBUS_METHOD_DESCRIBE(GetDriverParametersInfo, jack_controller_dbus_get_driver_parameters_info)
  2842. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterInfo, jack_controller_dbus_get_driver_parameter_info)
  2843. JACK_DBUS_METHOD_DESCRIBE(GetDriverParameterValue, jack_controller_dbus_get_driver_parameter_value)
  2844. JACK_DBUS_METHOD_DESCRIBE(SetDriverParameterValue, jack_controller_dbus_set_driver_parameter_value)
  2845. JACK_DBUS_METHOD_DESCRIBE(GetEngineParametersInfo, jack_controller_dbus_get_engine_parameters_info)
  2846. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterInfo, jack_controller_dbus_get_engine_parameter_info)
  2847. JACK_DBUS_METHOD_DESCRIBE(GetEngineParameterValue, jack_controller_dbus_get_engine_parameter_value)
  2848. JACK_DBUS_METHOD_DESCRIBE(SetEngineParameterValue, jack_controller_dbus_set_engine_parameter_value)
  2849. JACK_DBUS_METHODS_END
  2850. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_configure, "org.jackaudio.JackConfigure")
  2851. JACK_DBUS_IFACE_EXPOSE_METHODS
  2852. JACK_DBUS_IFACE_END