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.

1133 lines
40KB

  1. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  2. /*
  3. Copyright (C) 2007,2008 Nedko Arnaudov
  4. Copyright (C) 2007-2008 Juuso Alasuutari
  5. Copyright (C) 2008 Marc-Olivier Barre
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. */
  17. #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  18. #define DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  19. #include <stdbool.h>
  20. #define JACK_DBUS_DEBUG
  21. //#define DISABLE_SIGNAL_MAGIC
  22. #define DEFAULT_XDG_CONFIG "/.config"
  23. #define DEFAULT_XDG_LOG "/.log"
  24. #define JACKDBUS_DIR "/jack"
  25. #define JACKDBUS_LOG "/jackdbus.log"
  26. #define JACKDBUS_CONF "/conf.xml"
  27. extern char *g_jackdbus_config_dir;
  28. extern size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */
  29. extern int g_exit_command;
  30. bool
  31. jack_controller_settings_init();
  32. void
  33. jack_controller_settings_uninit();
  34. #define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod"
  35. #define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning"
  36. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver"
  37. #define JACK_DBUS_ERROR_NEED_DRIVER "org.jackaudio.Error.NeedDriver"
  38. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER "org.jackaudio.Error.UnknownDriverParameter"
  39. #define JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER "org.jackaudio.Error.UnknownEngineParameter"
  40. #define JACK_DBUS_ERROR_INVALID_ARGS "org.jackaudio.Error.InvalidArgs"
  41. #define JACK_DBUS_ERROR_GENERIC "org.jackaudio.Error.Generic"
  42. #define JACK_DBUS_ERROR_FATAL "org.jackaudio.Error.Fatal"
  43. struct jack_dbus_method_call
  44. {
  45. void *context;
  46. DBusConnection *connection;
  47. const char *method_name;
  48. DBusMessage *message;
  49. DBusMessage *reply;
  50. };
  51. struct jack_dbus_interface_method_argument_descriptor
  52. {
  53. const char * name;
  54. const char * type;
  55. bool direction_out; /* true - out, false - in */
  56. };
  57. struct jack_dbus_interface_method_descriptor
  58. {
  59. const char * name;
  60. const struct jack_dbus_interface_method_argument_descriptor * arguments;
  61. void (* handler)(struct jack_dbus_method_call * call);
  62. };
  63. struct jack_dbus_interface_signal_argument_descriptor
  64. {
  65. const char * name;
  66. const char * type;
  67. };
  68. struct jack_dbus_interface_signal_descriptor
  69. {
  70. const char * name;
  71. const struct jack_dbus_interface_signal_argument_descriptor * arguments;
  72. };
  73. struct jack_dbus_interface_descriptor
  74. {
  75. const char * name;
  76. bool
  77. (* handler)(
  78. struct jack_dbus_method_call * call,
  79. const struct jack_dbus_interface_method_descriptor * methods);
  80. const struct jack_dbus_interface_method_descriptor * methods;
  81. const struct jack_dbus_interface_signal_descriptor * signals;
  82. };
  83. struct jack_dbus_object_descriptor
  84. {
  85. struct jack_dbus_interface_descriptor ** interfaces;
  86. void * context;
  87. };
  88. typedef union
  89. {
  90. unsigned char byte;
  91. dbus_bool_t boolean;
  92. dbus_int16_t int16;
  93. dbus_uint16_t uint16;
  94. dbus_int32_t int32;
  95. dbus_uint32_t uint32;
  96. dbus_int64_t int64;
  97. dbus_uint64_t uint64;
  98. double doubl;
  99. const char *string;
  100. } message_arg_t;
  101. #define JACK_DBUS_METHOD_ARGUMENTS_BEGIN(method_name) \
  102. static const \
  103. struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
  104. {
  105. #define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
  106. { \
  107. .name = argument_name, \
  108. .type = argument_type, \
  109. .direction_out = argument_direction_out \
  110. },
  111. #define JACK_DBUS_METHOD_ARGUMENTS_END \
  112. JACK_DBUS_METHOD_ARGUMENT(NULL, NULL, false) \
  113. };
  114. #define JACK_DBUS_METHODS_BEGIN \
  115. static const \
  116. struct jack_dbus_interface_method_descriptor methods_dtor[] = \
  117. {
  118. #define JACK_DBUS_METHOD_DESCRIBE(method_name, handler_name) \
  119. { \
  120. .name = # method_name, \
  121. .arguments = method_name ## _arguments, \
  122. .handler = handler_name \
  123. },
  124. #define JACK_DBUS_METHODS_END \
  125. { \
  126. .name = NULL, \
  127. .arguments = NULL, \
  128. .handler = NULL \
  129. } \
  130. };
  131. #define JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(signal_name) \
  132. static const \
  133. struct jack_dbus_interface_signal_argument_descriptor signal_name ## _arguments[] = \
  134. {
  135. #define JACK_DBUS_SIGNAL_ARGUMENT(argument_name, argument_type) \
  136. { \
  137. .name = argument_name, \
  138. .type = argument_type \
  139. },
  140. #define JACK_DBUS_SIGNAL_ARGUMENTS_END \
  141. JACK_DBUS_SIGNAL_ARGUMENT(NULL, NULL) \
  142. };
  143. #define JACK_DBUS_SIGNALS_BEGIN \
  144. static const \
  145. struct jack_dbus_interface_signal_descriptor signals_dtor[] = \
  146. {
  147. #define JACK_DBUS_SIGNAL_DESCRIBE(signal_name) \
  148. { \
  149. .name = # signal_name, \
  150. .arguments = signal_name ## _arguments \
  151. },
  152. #define JACK_DBUS_SIGNALS_END \
  153. { \
  154. .name = NULL, \
  155. .arguments = NULL, \
  156. } \
  157. };
  158. #define JACK_DBUS_IFACE_BEGIN(iface_var, iface_name) \
  159. struct jack_dbus_interface_descriptor iface_var = \
  160. { \
  161. .name = iface_name, \
  162. .handler = jack_dbus_run_method,
  163. #define JACK_DBUS_IFACE_HANDLER(handler_func) \
  164. .handler = handler_func,
  165. #define JACK_DBUS_IFACE_EXPOSE_METHODS \
  166. .methods = methods_dtor,
  167. #define JACK_DBUS_IFACE_EXPOSE_SIGNALS \
  168. .signals = signals_dtor,
  169. #define JACK_DBUS_IFACE_END \
  170. };
  171. DBusHandlerResult
  172. jack_dbus_message_handler(
  173. DBusConnection *connection,
  174. DBusMessage *message,
  175. void *data);
  176. void
  177. jack_dbus_message_handler_unregister(
  178. DBusConnection *connection,
  179. void *data);
  180. bool
  181. jack_dbus_run_method(
  182. struct jack_dbus_method_call * call,
  183. const struct jack_dbus_interface_method_descriptor * methods);
  184. void
  185. jack_dbus_error(
  186. void *dbus_call_context_ptr,
  187. const char *error_name,
  188. const char *format,
  189. ...);
  190. bool
  191. jack_dbus_get_method_args(
  192. struct jack_dbus_method_call *call,
  193. int type,
  194. ...);
  195. bool
  196. jack_dbus_get_method_args_string_and_variant(
  197. struct jack_dbus_method_call *call,
  198. const char **arg1,
  199. message_arg_t *arg2,
  200. int *type_ptr);
  201. bool
  202. jack_dbus_message_append_variant(
  203. DBusMessageIter *iter,
  204. int type,
  205. const char *signature,
  206. message_arg_t *arg);
  207. void
  208. jack_dbus_construct_method_return_empty(
  209. struct jack_dbus_method_call * call);
  210. void
  211. jack_dbus_construct_method_return_single(
  212. struct jack_dbus_method_call *call,
  213. int type,
  214. message_arg_t arg);
  215. void
  216. jack_dbus_construct_method_return_array_of_strings(
  217. struct jack_dbus_method_call *call,
  218. unsigned int num_members,
  219. const char **array);
  220. void
  221. jack_dbus_send_signal(
  222. const char *sender_object_path,
  223. const char *iface,
  224. const char *signal_name,
  225. int first_arg_type,
  226. ...);
  227. #define JACK_CONTROLLER_OBJECT_PATH "/org/jackaudio/Controller"
  228. extern struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[];
  229. #endif /* #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED */
  230. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  231. /*
  232. Copyright (C) 2007,2008 Nedko Arnaudov
  233. Copyright (C) 2007-2008 Juuso Alasuutari
  234. Copyright (C) 2008 Marc-Olivier Barre
  235. This program is free software; you can redistribute it and/or modify
  236. it under the terms of the GNU General Public License as published by
  237. the Free Software Foundation; either version 2 of the License.
  238. This program is distributed in the hope that it will be useful,
  239. but WITHOUT ANY WARRANTY; without even the implied warranty of
  240. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  241. GNU General Public License for more details.
  242. You should have received a copy of the GNU General Public License
  243. along with this program; if not, write to the Free Software
  244. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  245. */
  246. #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  247. #define DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  248. #include <stdbool.h>
  249. #define JACK_DBUS_DEBUG
  250. //#define DISABLE_SIGNAL_MAGIC
  251. #define DEFAULT_XDG_CONFIG "/.config"
  252. #define DEFAULT_XDG_LOG "/.log"
  253. #define JACKDBUS_DIR "/jack"
  254. #define JACKDBUS_LOG "/jackdbus.log"
  255. #define JACKDBUS_CONF "/conf.xml"
  256. extern char *g_jackdbus_config_dir;
  257. extern size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */
  258. extern int g_exit_command;
  259. bool
  260. jack_controller_settings_init();
  261. void
  262. jack_controller_settings_uninit();
  263. #define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod"
  264. #define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning"
  265. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver"
  266. #define JACK_DBUS_ERROR_NEED_DRIVER "org.jackaudio.Error.NeedDriver"
  267. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER "org.jackaudio.Error.UnknownDriverParameter"
  268. #define JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER "org.jackaudio.Error.UnknownEngineParameter"
  269. #define JACK_DBUS_ERROR_INVALID_ARGS "org.jackaudio.Error.InvalidArgs"
  270. #define JACK_DBUS_ERROR_GENERIC "org.jackaudio.Error.Generic"
  271. #define JACK_DBUS_ERROR_FATAL "org.jackaudio.Error.Fatal"
  272. struct jack_dbus_method_call
  273. {
  274. void *context;
  275. DBusConnection *connection;
  276. const char *method_name;
  277. DBusMessage *message;
  278. DBusMessage *reply;
  279. };
  280. struct jack_dbus_interface_method_argument_descriptor
  281. {
  282. const char * name;
  283. const char * type;
  284. bool direction_out; /* true - out, false - in */
  285. };
  286. struct jack_dbus_interface_method_descriptor
  287. {
  288. const char * name;
  289. const struct jack_dbus_interface_method_argument_descriptor * arguments;
  290. void (* handler)(struct jack_dbus_method_call * call);
  291. };
  292. struct jack_dbus_interface_signal_argument_descriptor
  293. {
  294. const char * name;
  295. const char * type;
  296. };
  297. struct jack_dbus_interface_signal_descriptor
  298. {
  299. const char * name;
  300. const struct jack_dbus_interface_signal_argument_descriptor * arguments;
  301. };
  302. struct jack_dbus_interface_descriptor
  303. {
  304. const char * name;
  305. bool
  306. (* handler)(
  307. struct jack_dbus_method_call * call,
  308. const struct jack_dbus_interface_method_descriptor * methods);
  309. const struct jack_dbus_interface_method_descriptor * methods;
  310. const struct jack_dbus_interface_signal_descriptor * signals;
  311. };
  312. struct jack_dbus_object_descriptor
  313. {
  314. struct jack_dbus_interface_descriptor ** interfaces;
  315. void * context;
  316. };
  317. typedef union
  318. {
  319. unsigned char byte;
  320. dbus_bool_t boolean;
  321. dbus_int16_t int16;
  322. dbus_uint16_t uint16;
  323. dbus_int32_t int32;
  324. dbus_uint32_t uint32;
  325. dbus_int64_t int64;
  326. dbus_uint64_t uint64;
  327. double doubl;
  328. const char *string;
  329. } message_arg_t;
  330. #define JACK_DBUS_METHOD_ARGUMENTS_BEGIN(method_name) \
  331. static const \
  332. struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
  333. {
  334. #define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
  335. { \
  336. .name = argument_name, \
  337. .type = argument_type, \
  338. .direction_out = argument_direction_out \
  339. },
  340. #define JACK_DBUS_METHOD_ARGUMENTS_END \
  341. JACK_DBUS_METHOD_ARGUMENT(NULL, NULL, false) \
  342. };
  343. #define JACK_DBUS_METHODS_BEGIN \
  344. static const \
  345. struct jack_dbus_interface_method_descriptor methods_dtor[] = \
  346. {
  347. #define JACK_DBUS_METHOD_DESCRIBE(method_name, handler_name) \
  348. { \
  349. .name = # method_name, \
  350. .arguments = method_name ## _arguments, \
  351. .handler = handler_name \
  352. },
  353. #define JACK_DBUS_METHODS_END \
  354. { \
  355. .name = NULL, \
  356. .arguments = NULL, \
  357. .handler = NULL \
  358. } \
  359. };
  360. #define JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(signal_name) \
  361. static const \
  362. struct jack_dbus_interface_signal_argument_descriptor signal_name ## _arguments[] = \
  363. {
  364. #define JACK_DBUS_SIGNAL_ARGUMENT(argument_name, argument_type) \
  365. { \
  366. .name = argument_name, \
  367. .type = argument_type \
  368. },
  369. #define JACK_DBUS_SIGNAL_ARGUMENTS_END \
  370. JACK_DBUS_SIGNAL_ARGUMENT(NULL, NULL) \
  371. };
  372. #define JACK_DBUS_SIGNALS_BEGIN \
  373. static const \
  374. struct jack_dbus_interface_signal_descriptor signals_dtor[] = \
  375. {
  376. #define JACK_DBUS_SIGNAL_DESCRIBE(signal_name) \
  377. { \
  378. .name = # signal_name, \
  379. .arguments = signal_name ## _arguments \
  380. },
  381. #define JACK_DBUS_SIGNALS_END \
  382. { \
  383. .name = NULL, \
  384. .arguments = NULL, \
  385. } \
  386. };
  387. #define JACK_DBUS_IFACE_BEGIN(iface_var, iface_name) \
  388. struct jack_dbus_interface_descriptor iface_var = \
  389. { \
  390. .name = iface_name, \
  391. .handler = jack_dbus_run_method,
  392. #define JACK_DBUS_IFACE_HANDLER(handler_func) \
  393. .handler = handler_func,
  394. #define JACK_DBUS_IFACE_EXPOSE_METHODS \
  395. .methods = methods_dtor,
  396. #define JACK_DBUS_IFACE_EXPOSE_SIGNALS \
  397. .signals = signals_dtor,
  398. #define JACK_DBUS_IFACE_END \
  399. };
  400. DBusHandlerResult
  401. jack_dbus_message_handler(
  402. DBusConnection *connection,
  403. DBusMessage *message,
  404. void *data);
  405. void
  406. jack_dbus_message_handler_unregister(
  407. DBusConnection *connection,
  408. void *data);
  409. bool
  410. jack_dbus_run_method(
  411. struct jack_dbus_method_call * call,
  412. const struct jack_dbus_interface_method_descriptor * methods);
  413. void
  414. jack_dbus_error(
  415. void *dbus_call_context_ptr,
  416. const char *error_name,
  417. const char *format,
  418. ...);
  419. bool
  420. jack_dbus_get_method_args(
  421. struct jack_dbus_method_call *call,
  422. int type,
  423. ...);
  424. bool
  425. jack_dbus_get_method_args_string_and_variant(
  426. struct jack_dbus_method_call *call,
  427. const char **arg1,
  428. message_arg_t *arg2,
  429. int *type_ptr);
  430. bool
  431. jack_dbus_message_append_variant(
  432. DBusMessageIter *iter,
  433. int type,
  434. const char *signature,
  435. message_arg_t *arg);
  436. void
  437. jack_dbus_construct_method_return_empty(
  438. struct jack_dbus_method_call * call);
  439. void
  440. jack_dbus_construct_method_return_single(
  441. struct jack_dbus_method_call *call,
  442. int type,
  443. message_arg_t arg);
  444. void
  445. jack_dbus_construct_method_return_array_of_strings(
  446. struct jack_dbus_method_call *call,
  447. unsigned int num_members,
  448. const char **array);
  449. void
  450. jack_dbus_send_signal(
  451. const char *sender_object_path,
  452. const char *iface,
  453. const char *signal_name,
  454. int first_arg_type,
  455. ...);
  456. #define JACK_CONTROLLER_OBJECT_PATH "/org/jackaudio/Controller"
  457. extern struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[];
  458. #endif /* #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED */
  459. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  460. /*
  461. Copyright (C) 2007,2008 Nedko Arnaudov
  462. Copyright (C) 2007-2008 Juuso Alasuutari
  463. Copyright (C) 2008 Marc-Olivier Barre
  464. This program is free software; you can redistribute it and/or modify
  465. it under the terms of the GNU General Public License as published by
  466. the Free Software Foundation; either version 2 of the License.
  467. This program is distributed in the hope that it will be useful,
  468. but WITHOUT ANY WARRANTY; without even the implied warranty of
  469. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  470. GNU General Public License for more details.
  471. You should have received a copy of the GNU General Public License
  472. along with this program; if not, write to the Free Software
  473. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  474. */
  475. #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  476. #define DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  477. #include <stdbool.h>
  478. #define JACK_DBUS_DEBUG
  479. //#define DISABLE_SIGNAL_MAGIC
  480. #define DEFAULT_XDG_CONFIG "/.config"
  481. #define DEFAULT_XDG_LOG "/.log"
  482. #define JACKDBUS_DIR "/jack"
  483. #define JACKDBUS_LOG "/jackdbus.log"
  484. #define JACKDBUS_CONF "/conf.xml"
  485. extern char *g_jackdbus_config_dir;
  486. extern size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */
  487. extern int g_exit_command;
  488. bool
  489. jack_controller_settings_init();
  490. void
  491. jack_controller_settings_uninit();
  492. #define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod"
  493. #define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning"
  494. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver"
  495. #define JACK_DBUS_ERROR_NEED_DRIVER "org.jackaudio.Error.NeedDriver"
  496. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER "org.jackaudio.Error.UnknownDriverParameter"
  497. #define JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER "org.jackaudio.Error.UnknownEngineParameter"
  498. #define JACK_DBUS_ERROR_INVALID_ARGS "org.jackaudio.Error.InvalidArgs"
  499. #define JACK_DBUS_ERROR_GENERIC "org.jackaudio.Error.Generic"
  500. #define JACK_DBUS_ERROR_FATAL "org.jackaudio.Error.Fatal"
  501. struct jack_dbus_method_call
  502. {
  503. void *context;
  504. DBusConnection *connection;
  505. const char *method_name;
  506. DBusMessage *message;
  507. DBusMessage *reply;
  508. };
  509. struct jack_dbus_interface_method_argument_descriptor
  510. {
  511. const char * name;
  512. const char * type;
  513. bool direction_out; /* true - out, false - in */
  514. };
  515. struct jack_dbus_interface_method_descriptor
  516. {
  517. const char * name;
  518. const struct jack_dbus_interface_method_argument_descriptor * arguments;
  519. void (* handler)(struct jack_dbus_method_call * call);
  520. };
  521. struct jack_dbus_interface_signal_argument_descriptor
  522. {
  523. const char * name;
  524. const char * type;
  525. };
  526. struct jack_dbus_interface_signal_descriptor
  527. {
  528. const char * name;
  529. const struct jack_dbus_interface_signal_argument_descriptor * arguments;
  530. };
  531. struct jack_dbus_interface_descriptor
  532. {
  533. const char * name;
  534. bool
  535. (* handler)(
  536. struct jack_dbus_method_call * call,
  537. const struct jack_dbus_interface_method_descriptor * methods);
  538. const struct jack_dbus_interface_method_descriptor * methods;
  539. const struct jack_dbus_interface_signal_descriptor * signals;
  540. };
  541. struct jack_dbus_object_descriptor
  542. {
  543. struct jack_dbus_interface_descriptor ** interfaces;
  544. void * context;
  545. };
  546. typedef union
  547. {
  548. unsigned char byte;
  549. dbus_bool_t boolean;
  550. dbus_int16_t int16;
  551. dbus_uint16_t uint16;
  552. dbus_int32_t int32;
  553. dbus_uint32_t uint32;
  554. dbus_int64_t int64;
  555. dbus_uint64_t uint64;
  556. double doubl;
  557. const char *string;
  558. } message_arg_t;
  559. #define JACK_DBUS_METHOD_ARGUMENTS_BEGIN(method_name) \
  560. static const \
  561. struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
  562. {
  563. #define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
  564. { \
  565. .name = argument_name, \
  566. .type = argument_type, \
  567. .direction_out = argument_direction_out \
  568. },
  569. #define JACK_DBUS_METHOD_ARGUMENTS_END \
  570. JACK_DBUS_METHOD_ARGUMENT(NULL, NULL, false) \
  571. };
  572. #define JACK_DBUS_METHODS_BEGIN \
  573. static const \
  574. struct jack_dbus_interface_method_descriptor methods_dtor[] = \
  575. {
  576. #define JACK_DBUS_METHOD_DESCRIBE(method_name, handler_name) \
  577. { \
  578. .name = # method_name, \
  579. .arguments = method_name ## _arguments, \
  580. .handler = handler_name \
  581. },
  582. #define JACK_DBUS_METHODS_END \
  583. { \
  584. .name = NULL, \
  585. .arguments = NULL, \
  586. .handler = NULL \
  587. } \
  588. };
  589. #define JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(signal_name) \
  590. static const \
  591. struct jack_dbus_interface_signal_argument_descriptor signal_name ## _arguments[] = \
  592. {
  593. #define JACK_DBUS_SIGNAL_ARGUMENT(argument_name, argument_type) \
  594. { \
  595. .name = argument_name, \
  596. .type = argument_type \
  597. },
  598. #define JACK_DBUS_SIGNAL_ARGUMENTS_END \
  599. JACK_DBUS_SIGNAL_ARGUMENT(NULL, NULL) \
  600. };
  601. #define JACK_DBUS_SIGNALS_BEGIN \
  602. static const \
  603. struct jack_dbus_interface_signal_descriptor signals_dtor[] = \
  604. {
  605. #define JACK_DBUS_SIGNAL_DESCRIBE(signal_name) \
  606. { \
  607. .name = # signal_name, \
  608. .arguments = signal_name ## _arguments \
  609. },
  610. #define JACK_DBUS_SIGNALS_END \
  611. { \
  612. .name = NULL, \
  613. .arguments = NULL, \
  614. } \
  615. };
  616. #define JACK_DBUS_IFACE_BEGIN(iface_var, iface_name) \
  617. struct jack_dbus_interface_descriptor iface_var = \
  618. { \
  619. .name = iface_name, \
  620. .handler = jack_dbus_run_method,
  621. #define JACK_DBUS_IFACE_HANDLER(handler_func) \
  622. .handler = handler_func,
  623. #define JACK_DBUS_IFACE_EXPOSE_METHODS \
  624. .methods = methods_dtor,
  625. #define JACK_DBUS_IFACE_EXPOSE_SIGNALS \
  626. .signals = signals_dtor,
  627. #define JACK_DBUS_IFACE_END \
  628. };
  629. DBusHandlerResult
  630. jack_dbus_message_handler(
  631. DBusConnection *connection,
  632. DBusMessage *message,
  633. void *data);
  634. void
  635. jack_dbus_message_handler_unregister(
  636. DBusConnection *connection,
  637. void *data);
  638. bool
  639. jack_dbus_run_method(
  640. struct jack_dbus_method_call * call,
  641. const struct jack_dbus_interface_method_descriptor * methods);
  642. void
  643. jack_dbus_error(
  644. void *dbus_call_context_ptr,
  645. const char *error_name,
  646. const char *format,
  647. ...);
  648. bool
  649. jack_dbus_get_method_args(
  650. struct jack_dbus_method_call *call,
  651. int type,
  652. ...);
  653. bool
  654. jack_dbus_get_method_args_string_and_variant(
  655. struct jack_dbus_method_call *call,
  656. const char **arg1,
  657. message_arg_t *arg2,
  658. int *type_ptr);
  659. bool
  660. jack_dbus_message_append_variant(
  661. DBusMessageIter *iter,
  662. int type,
  663. const char *signature,
  664. message_arg_t *arg);
  665. void
  666. jack_dbus_construct_method_return_empty(
  667. struct jack_dbus_method_call * call);
  668. void
  669. jack_dbus_construct_method_return_single(
  670. struct jack_dbus_method_call *call,
  671. int type,
  672. message_arg_t arg);
  673. void
  674. jack_dbus_construct_method_return_array_of_strings(
  675. struct jack_dbus_method_call *call,
  676. unsigned int num_members,
  677. const char **array);
  678. void
  679. jack_dbus_send_signal(
  680. const char *sender_object_path,
  681. const char *iface,
  682. const char *signal_name,
  683. int first_arg_type,
  684. ...);
  685. #define JACK_CONTROLLER_OBJECT_PATH "/org/jackaudio/Controller"
  686. extern struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[];
  687. #endif /* #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED */
  688. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  689. /*
  690. Copyright (C) 2007,2008 Nedko Arnaudov
  691. Copyright (C) 2007-2008 Juuso Alasuutari
  692. Copyright (C) 2008 Marc-Olivier Barre
  693. This program is free software; you can redistribute it and/or modify
  694. it under the terms of the GNU General Public License as published by
  695. the Free Software Foundation; either version 2 of the License.
  696. This program is distributed in the hope that it will be useful,
  697. but WITHOUT ANY WARRANTY; without even the implied warranty of
  698. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  699. GNU General Public License for more details.
  700. You should have received a copy of the GNU General Public License
  701. along with this program; if not, write to the Free Software
  702. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  703. */
  704. #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  705. #define DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED
  706. #include <stdbool.h>
  707. #define JACK_DBUS_DEBUG
  708. //#define DISABLE_SIGNAL_MAGIC
  709. #define DEFAULT_XDG_CONFIG "/.config"
  710. #define DEFAULT_XDG_LOG "/.log"
  711. #define JACKDBUS_DIR "/jack"
  712. #define JACKDBUS_LOG "/jackdbus.log"
  713. #define JACKDBUS_CONF "/conf.xml"
  714. extern char *g_jackdbus_config_dir;
  715. extern size_t g_jackdbus_config_dir_len; /* without terminating '\0' char */
  716. extern int g_exit_command;
  717. bool
  718. jack_controller_settings_init();
  719. void
  720. jack_controller_settings_uninit();
  721. #define JACK_DBUS_ERROR_UNKNOWN_METHOD "org.jackaudio.Error.UnknownMethod"
  722. #define JACK_DBUS_ERROR_SERVER_NOT_RUNNING "org.jackaudio.Error.ServerNotRunning"
  723. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER "org.jackaudio.Error.UnknownDriver"
  724. #define JACK_DBUS_ERROR_NEED_DRIVER "org.jackaudio.Error.NeedDriver"
  725. #define JACK_DBUS_ERROR_UNKNOWN_DRIVER_PARAMETER "org.jackaudio.Error.UnknownDriverParameter"
  726. #define JACK_DBUS_ERROR_UNKNOWN_ENGINE_PARAMETER "org.jackaudio.Error.UnknownEngineParameter"
  727. #define JACK_DBUS_ERROR_INVALID_ARGS "org.jackaudio.Error.InvalidArgs"
  728. #define JACK_DBUS_ERROR_GENERIC "org.jackaudio.Error.Generic"
  729. #define JACK_DBUS_ERROR_FATAL "org.jackaudio.Error.Fatal"
  730. struct jack_dbus_method_call
  731. {
  732. void *context;
  733. DBusConnection *connection;
  734. const char *method_name;
  735. DBusMessage *message;
  736. DBusMessage *reply;
  737. };
  738. struct jack_dbus_interface_method_argument_descriptor
  739. {
  740. const char * name;
  741. const char * type;
  742. bool direction_out; /* true - out, false - in */
  743. };
  744. struct jack_dbus_interface_method_descriptor
  745. {
  746. const char * name;
  747. const struct jack_dbus_interface_method_argument_descriptor * arguments;
  748. void (* handler)(struct jack_dbus_method_call * call);
  749. };
  750. struct jack_dbus_interface_signal_argument_descriptor
  751. {
  752. const char * name;
  753. const char * type;
  754. };
  755. struct jack_dbus_interface_signal_descriptor
  756. {
  757. const char * name;
  758. const struct jack_dbus_interface_signal_argument_descriptor * arguments;
  759. };
  760. struct jack_dbus_interface_descriptor
  761. {
  762. const char * name;
  763. bool
  764. (* handler)(
  765. struct jack_dbus_method_call * call,
  766. const struct jack_dbus_interface_method_descriptor * methods);
  767. const struct jack_dbus_interface_method_descriptor * methods;
  768. const struct jack_dbus_interface_signal_descriptor * signals;
  769. };
  770. struct jack_dbus_object_descriptor
  771. {
  772. struct jack_dbus_interface_descriptor ** interfaces;
  773. void * context;
  774. };
  775. typedef union
  776. {
  777. unsigned char byte;
  778. dbus_bool_t boolean;
  779. dbus_int16_t int16;
  780. dbus_uint16_t uint16;
  781. dbus_int32_t int32;
  782. dbus_uint32_t uint32;
  783. dbus_int64_t int64;
  784. dbus_uint64_t uint64;
  785. double doubl;
  786. const char *string;
  787. } message_arg_t;
  788. #define JACK_DBUS_METHOD_ARGUMENTS_BEGIN(method_name) \
  789. static const \
  790. struct jack_dbus_interface_method_argument_descriptor method_name ## _arguments[] = \
  791. {
  792. #define JACK_DBUS_METHOD_ARGUMENT(argument_name, argument_type, argument_direction_out) \
  793. { \
  794. .name = argument_name, \
  795. .type = argument_type, \
  796. .direction_out = argument_direction_out \
  797. },
  798. #define JACK_DBUS_METHOD_ARGUMENTS_END \
  799. JACK_DBUS_METHOD_ARGUMENT(NULL, NULL, false) \
  800. };
  801. #define JACK_DBUS_METHODS_BEGIN \
  802. static const \
  803. struct jack_dbus_interface_method_descriptor methods_dtor[] = \
  804. {
  805. #define JACK_DBUS_METHOD_DESCRIBE(method_name, handler_name) \
  806. { \
  807. .name = # method_name, \
  808. .arguments = method_name ## _arguments, \
  809. .handler = handler_name \
  810. },
  811. #define JACK_DBUS_METHODS_END \
  812. { \
  813. .name = NULL, \
  814. .arguments = NULL, \
  815. .handler = NULL \
  816. } \
  817. };
  818. #define JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(signal_name) \
  819. static const \
  820. struct jack_dbus_interface_signal_argument_descriptor signal_name ## _arguments[] = \
  821. {
  822. #define JACK_DBUS_SIGNAL_ARGUMENT(argument_name, argument_type) \
  823. { \
  824. .name = argument_name, \
  825. .type = argument_type \
  826. },
  827. #define JACK_DBUS_SIGNAL_ARGUMENTS_END \
  828. JACK_DBUS_SIGNAL_ARGUMENT(NULL, NULL) \
  829. };
  830. #define JACK_DBUS_SIGNALS_BEGIN \
  831. static const \
  832. struct jack_dbus_interface_signal_descriptor signals_dtor[] = \
  833. {
  834. #define JACK_DBUS_SIGNAL_DESCRIBE(signal_name) \
  835. { \
  836. .name = # signal_name, \
  837. .arguments = signal_name ## _arguments \
  838. },
  839. #define JACK_DBUS_SIGNALS_END \
  840. { \
  841. .name = NULL, \
  842. .arguments = NULL, \
  843. } \
  844. };
  845. #define JACK_DBUS_IFACE_BEGIN(iface_var, iface_name) \
  846. struct jack_dbus_interface_descriptor iface_var = \
  847. { \
  848. .name = iface_name, \
  849. .handler = jack_dbus_run_method,
  850. #define JACK_DBUS_IFACE_HANDLER(handler_func) \
  851. .handler = handler_func,
  852. #define JACK_DBUS_IFACE_EXPOSE_METHODS \
  853. .methods = methods_dtor,
  854. #define JACK_DBUS_IFACE_EXPOSE_SIGNALS \
  855. .signals = signals_dtor,
  856. #define JACK_DBUS_IFACE_END \
  857. };
  858. DBusHandlerResult
  859. jack_dbus_message_handler(
  860. DBusConnection *connection,
  861. DBusMessage *message,
  862. void *data);
  863. void
  864. jack_dbus_message_handler_unregister(
  865. DBusConnection *connection,
  866. void *data);
  867. bool
  868. jack_dbus_run_method(
  869. struct jack_dbus_method_call * call,
  870. const struct jack_dbus_interface_method_descriptor * methods);
  871. void
  872. jack_dbus_error(
  873. void *dbus_call_context_ptr,
  874. const char *error_name,
  875. const char *format,
  876. ...);
  877. bool
  878. jack_dbus_get_method_args(
  879. struct jack_dbus_method_call *call,
  880. int type,
  881. ...);
  882. bool
  883. jack_dbus_get_method_args_string_and_variant(
  884. struct jack_dbus_method_call *call,
  885. const char **arg1,
  886. message_arg_t *arg2,
  887. int *type_ptr);
  888. bool
  889. jack_dbus_message_append_variant(
  890. DBusMessageIter *iter,
  891. int type,
  892. const char *signature,
  893. message_arg_t *arg);
  894. void
  895. jack_dbus_construct_method_return_empty(
  896. struct jack_dbus_method_call * call);
  897. void
  898. jack_dbus_construct_method_return_single(
  899. struct jack_dbus_method_call *call,
  900. int type,
  901. message_arg_t arg);
  902. void
  903. jack_dbus_construct_method_return_array_of_strings(
  904. struct jack_dbus_method_call *call,
  905. unsigned int num_members,
  906. const char **array);
  907. void
  908. jack_dbus_send_signal(
  909. const char *sender_object_path,
  910. const char *iface,
  911. const char *signal_name,
  912. int first_arg_type,
  913. ...);
  914. #define JACK_CONTROLLER_OBJECT_PATH "/org/jackaudio/Controller"
  915. extern struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[];
  916. #endif /* #ifndef DBUS_H__3DB2458F_44B2_43EA_882A_9F888DF71A88__INCLUDED */