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.

628 lines
16KB

  1. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  2. /*
  3. JACK control API
  4. Copyright (C) 2008 Nedko Arnaudov
  5. Copyright (C) 2008 GRAME
  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; 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. /**
  18. * @file jack/control.h
  19. * @ingroup publicheader
  20. * @brief JACK control API
  21. *
  22. */
  23. #ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED
  24. #define JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED
  25. #include <jack/jslist.h>
  26. #include <jack/systemdeps.h>
  27. #if !defined(sun) && !defined(__sun__)
  28. #include <stdbool.h>
  29. #endif
  30. /** Parameter types, intentionally similar to jack_driver_param_type_t */
  31. typedef enum
  32. {
  33. JackParamInt = 1, /**< @brief value type is a signed integer */
  34. JackParamUInt, /**< @brief value type is an unsigned integer */
  35. JackParamChar, /**< @brief value type is a char */
  36. JackParamString, /**< @brief value type is a string with max size of ::JACK_PARAM_STRING_MAX+1 chars */
  37. JackParamBool, /**< @brief value type is a boolean */
  38. } jackctl_param_type_t;
  39. /** Driver types */
  40. typedef enum
  41. {
  42. JackMaster = 1, /**< @brief master driver */
  43. JackSlave /**< @brief slave driver */
  44. } jackctl_driver_type_t;
  45. /** @brief Max value that jackctl_param_type_t type can have */
  46. #define JACK_PARAM_MAX (JackParamBool + 1)
  47. /** @brief Max length of string parameter value, excluding terminating null char */
  48. #define JACK_PARAM_STRING_MAX 127
  49. /** @brief Type for parameter value */
  50. /* intentionally similar to jack_driver_param_value_t */
  51. union jackctl_parameter_value
  52. {
  53. uint32_t ui; /**< @brief member used for ::JackParamUInt */
  54. int32_t i; /**< @brief member used for ::JackParamInt */
  55. char c; /**< @brief member used for ::JackParamChar */
  56. char str[JACK_PARAM_STRING_MAX + 1]; /**< @brief member used for ::JackParamString */
  57. bool b; /**< @brief member used for ::JackParamBool */
  58. };
  59. /** opaque type for server object */
  60. typedef struct jackctl_server jackctl_server_t;
  61. /** opaque type for driver object */
  62. typedef struct jackctl_driver jackctl_driver_t;
  63. /** opaque type for internal client object */
  64. typedef struct jackctl_internal jackctl_internal_t;
  65. /** opaque type for parameter object */
  66. typedef struct jackctl_parameter jackctl_parameter_t;
  67. #ifdef __cplusplus
  68. extern "C" {
  69. #endif
  70. #if 0
  71. } /* Adjust editor indent */
  72. #endif
  73. /**
  74. * @defgroup ControlAPI The API for starting and controlling a JACK server
  75. * @{
  76. */
  77. /**
  78. * Call this function to setup process signal handling. As a general
  79. * rule, it is required for proper operation for the server object.
  80. *
  81. * @param flags signals setup flags, use 0 for none. Currently no
  82. * flags are defined
  83. *
  84. * @return the configurated signal set.
  85. */
  86. sigset_t
  87. jackctl_setup_signals(
  88. unsigned int flags);
  89. /**
  90. * Call this function to wait on a signal set.
  91. *
  92. * @param signals signals set to wait on
  93. */
  94. void
  95. jackctl_wait_signals(
  96. sigset_t signals);
  97. /**
  98. * Call this function to create server object.
  99. *
  100. * @param on_device_acquire - Optional callback to be called before device is acquired. If false is returned, device usage will fail
  101. * @param on_device_release - Optional callback to be called after device is released.
  102. *
  103. * @return server object handle, NULL if creation of server object
  104. * failed. Successfully created server object must be destroyed with
  105. * paired call to ::jackctl_server_destroy
  106. */
  107. jackctl_server_t *
  108. jackctl_server_create(
  109. bool (* on_device_acquire)(const char * device_name),
  110. void (* on_device_release)(const char * device_name));
  111. /**
  112. * Call this function to destroy server object.
  113. *
  114. * @param server server object handle to destroy
  115. */
  116. void
  117. jackctl_server_destroy(
  118. jackctl_server_t * server);
  119. /**
  120. * Call this function to open JACK server
  121. *
  122. * @param server server object handle
  123. * @param driver driver to use
  124. *
  125. * @return success status: true - success, false - fail
  126. */
  127. bool
  128. jackctl_server_open(
  129. jackctl_server_t * server,
  130. jackctl_driver_t * driver);
  131. /**
  132. * Call this function to start JACK server
  133. *
  134. * @param server server object handle
  135. *
  136. * @return success status: true - success, false - fail
  137. */
  138. bool
  139. jackctl_server_start(
  140. jackctl_server_t * server);
  141. /**
  142. * Call this function to stop JACK server
  143. *
  144. * @param server server object handle
  145. *
  146. * @return success status: true - success, false - fail
  147. */
  148. bool
  149. jackctl_server_stop(
  150. jackctl_server_t * server);
  151. /**
  152. * Call this function to close JACK server
  153. *
  154. * @param server server object handle
  155. *
  156. * @return success status: true - success, false - fail
  157. */
  158. bool
  159. jackctl_server_close(
  160. jackctl_server_t * server);
  161. /**
  162. * Call this function to get list of available drivers. List node data
  163. * pointers is a driver object handle (::jackctl_driver_t).
  164. *
  165. * @param server server object handle to get drivers for
  166. *
  167. * @return Single linked list of driver object handles. Must not be
  168. * modified. Always same for same server object.
  169. */
  170. const JSList *
  171. jackctl_server_get_drivers_list(
  172. jackctl_server_t * server);
  173. /**
  174. * Call this function to get list of server parameters. List node data
  175. * pointers is a parameter object handle (::jackctl_parameter_t).
  176. *
  177. * @param server server object handle to get parameters for
  178. *
  179. * @return Single linked list of parameter object handles. Must not be
  180. * modified. Always same for same server object.
  181. */
  182. const JSList *
  183. jackctl_server_get_parameters(
  184. jackctl_server_t * server);
  185. /**
  186. * Call this function to get list of available internal clients. List node data
  187. * pointers is a internal client object handle (::jackctl_internal_t).
  188. *
  189. * @param server server object handle to get internal clients for
  190. *
  191. * @return Single linked list of internal client object handles. Must not be
  192. * modified. Always same for same server object.
  193. */
  194. const JSList *
  195. jackctl_server_get_internals_list(
  196. jackctl_server_t * server);
  197. /**
  198. * Call this function to load one internal client.
  199. * (can be used when the server is running)
  200. *
  201. * @param server server object handle
  202. * @param internal internal to use
  203. *
  204. * @return success status: true - success, false - fail
  205. */
  206. bool
  207. jackctl_server_load_internal(
  208. jackctl_server_t * server,
  209. jackctl_internal_t * internal);
  210. /**
  211. * Call this function to unload one internal client.
  212. * (can be used when the server is running)
  213. *
  214. * @param server server object handle
  215. * @param internal internal to unload
  216. *
  217. * @return success status: true - success, false - fail
  218. */
  219. bool
  220. jackctl_server_unload_internal(
  221. jackctl_server_t * server,
  222. jackctl_internal_t * internal);
  223. /**
  224. * Call this function to add a slave in the driver slave list.
  225. * (cannot be used when the server is running that is between
  226. * jackctl_server_start and jackctl_server_stop)
  227. *
  228. * @param server server object handle
  229. * @param driver driver to add in the driver slave list.
  230. *
  231. * @return success status: true - success, false - fail
  232. */
  233. bool
  234. jackctl_server_add_slave(jackctl_server_t * server,
  235. jackctl_driver_t * driver);
  236. /**
  237. * Call this function to remove a slave from the driver slave list.
  238. * (cannot be used when the server is running that is between
  239. * jackctl_server_start and jackctl_server_stop)
  240. *
  241. * @param server server object handle
  242. * @param driver driver to remove from the driver slave list.
  243. *
  244. * @return success status: true - success, false - fail
  245. */
  246. bool
  247. jackctl_server_remove_slave(jackctl_server_t * server,
  248. jackctl_driver_t * driver);
  249. /**
  250. * Call this function to switch master driver.
  251. *
  252. * @param server server object handle
  253. * @param driver driver to switch to
  254. *
  255. * @return success status: true - success, false - fail
  256. */
  257. bool
  258. jackctl_server_switch_master(jackctl_server_t * server,
  259. jackctl_driver_t * driver);
  260. /**
  261. * Call this function to get name of driver.
  262. *
  263. * @param driver driver object handle to get name of
  264. *
  265. * @return driver name. Must not be modified. Always same for same
  266. * driver object.
  267. */
  268. const char *
  269. jackctl_driver_get_name(
  270. jackctl_driver_t * driver);
  271. /**
  272. * Call this function to get type of driver.
  273. *
  274. * @param driver driver object handle to get name of
  275. *
  276. * @return driver type. Must not be modified. Always same for same
  277. * driver object.
  278. */
  279. jackctl_driver_type_t
  280. jackctl_driver_get_type(
  281. jackctl_driver_t * driver);
  282. /**
  283. * Call this function to get list of driver parameters. List node data
  284. * pointers is a parameter object handle (::jackctl_parameter_t).
  285. *
  286. * @param driver driver object handle to get parameters for
  287. *
  288. * @return Single linked list of parameter object handles. Must not be
  289. * modified. Always same for same driver object.
  290. */
  291. const JSList *
  292. jackctl_driver_get_parameters(
  293. jackctl_driver_t * driver);
  294. /**
  295. * Call this function to parse parameters for a driver.
  296. *
  297. * @param driver driver object handle
  298. * @param argc parameter list len
  299. * @param argv parameter list, as an array of char*
  300. *
  301. * @return success status: true - success, false - fail
  302. */
  303. int
  304. jackctl_driver_params_parse(
  305. jackctl_driver * driver,
  306. int argc,
  307. char* argv[]);
  308. /**
  309. * Call this function to get name of internal client.
  310. *
  311. * @param internal internal object handle to get name of
  312. *
  313. * @return internal name. Must not be modified. Always same for same
  314. * internal object.
  315. */
  316. const char *
  317. jackctl_internal_get_name(
  318. jackctl_internal_t * internal);
  319. /**
  320. * Call this function to get list of internal parameters. List node data
  321. * pointers is a parameter object handle (::jackctl_parameter_t).
  322. *
  323. * @param internal internal object handle to get parameters for
  324. *
  325. * @return Single linked list of parameter object handles. Must not be
  326. * modified. Always same for same internal object.
  327. */
  328. const JSList *
  329. jackctl_internal_get_parameters(
  330. jackctl_internal_t * internal);
  331. /**
  332. * Call this function to get parameter name.
  333. *
  334. * @param parameter parameter object handle to get name of
  335. *
  336. * @return parameter name. Must not be modified. Always same for same
  337. * parameter object.
  338. */
  339. const char *
  340. jackctl_parameter_get_name(
  341. jackctl_parameter_t * parameter);
  342. /**
  343. * Call this function to get parameter short description.
  344. *
  345. * @param parameter parameter object handle to get short description of
  346. *
  347. * @return parameter short description. Must not be modified. Always
  348. * same for same parameter object.
  349. */
  350. const char *
  351. jackctl_parameter_get_short_description(
  352. jackctl_parameter_t * parameter);
  353. /**
  354. * Call this function to get parameter long description.
  355. *
  356. * @param parameter parameter object handle to get long description of
  357. *
  358. * @return parameter long description. Must not be modified. Always
  359. * same for same parameter object.
  360. */
  361. const char *
  362. jackctl_parameter_get_long_description(
  363. jackctl_parameter_t * parameter);
  364. /**
  365. * Call this function to get parameter type.
  366. *
  367. * @param parameter parameter object handle to get type of
  368. *
  369. * @return parameter type. Always same for same parameter object.
  370. */
  371. jackctl_param_type_t
  372. jackctl_parameter_get_type(
  373. jackctl_parameter_t * parameter);
  374. /**
  375. * Call this function to get parameter character.
  376. *
  377. * @param parameter parameter object handle to get character of
  378. *
  379. * @return character.
  380. */
  381. char
  382. jackctl_parameter_get_id(
  383. jackctl_parameter_t * parameter);
  384. /**
  385. * Call this function to check whether parameter has been set, or its
  386. * default value is being used.
  387. *
  388. * @param parameter parameter object handle to check
  389. *
  390. * @return true - parameter is set, false - parameter is using default
  391. * value.
  392. */
  393. bool
  394. jackctl_parameter_is_set(
  395. jackctl_parameter_t * parameter);
  396. /**
  397. * Call this function to reset parameter to its default value.
  398. *
  399. * @param parameter parameter object handle to reset value of
  400. *
  401. * @return success status: true - success, false - fail
  402. */
  403. bool
  404. jackctl_parameter_reset(
  405. jackctl_parameter_t * parameter);
  406. /**
  407. * Call this function to get parameter value.
  408. *
  409. * @param parameter parameter object handle to get value of
  410. *
  411. * @return parameter value.
  412. */
  413. union jackctl_parameter_value
  414. jackctl_parameter_get_value(
  415. jackctl_parameter_t * parameter);
  416. /**
  417. * Call this function to set parameter value.
  418. *
  419. * @param parameter parameter object handle to get value of
  420. * @param value_ptr pointer to variable containing parameter value
  421. *
  422. * @return success status: true - success, false - fail
  423. */
  424. bool
  425. jackctl_parameter_set_value(
  426. jackctl_parameter_t * parameter,
  427. const union jackctl_parameter_value * value_ptr);
  428. /**
  429. * Call this function to get parameter default value.
  430. *
  431. * @param parameter parameter object handle to get default value of
  432. *
  433. * @return parameter default value.
  434. */
  435. union jackctl_parameter_value
  436. jackctl_parameter_get_default_value(
  437. jackctl_parameter_t * parameter);
  438. /**
  439. * Call this function check whether parameter has range constraint.
  440. *
  441. * @param parameter object handle of parameter to check
  442. *
  443. * @return whether parameter has range constraint.
  444. */
  445. bool
  446. jackctl_parameter_has_range_constraint(
  447. jackctl_parameter_t * parameter);
  448. /**
  449. * Call this function check whether parameter has enumeration constraint.
  450. *
  451. * @param parameter object handle of parameter to check
  452. *
  453. * @return whether parameter has enumeration constraint.
  454. */
  455. bool
  456. jackctl_parameter_has_enum_constraint(
  457. jackctl_parameter_t * parameter);
  458. /**
  459. * Call this function get how many enumeration values parameter has.
  460. *
  461. * @param parameter object handle of parameter
  462. *
  463. * @return number of enumeration values
  464. */
  465. uint32_t
  466. jackctl_parameter_get_enum_constraints_count(
  467. jackctl_parameter_t * parameter);
  468. /**
  469. * Call this function to get parameter enumeration value.
  470. *
  471. * @param parameter object handle of parameter
  472. * @param index index of parameter enumeration value
  473. *
  474. * @return enumeration value.
  475. */
  476. union jackctl_parameter_value
  477. jackctl_parameter_get_enum_constraint_value(
  478. jackctl_parameter_t * parameter,
  479. uint32_t index);
  480. /**
  481. * Call this function to get parameter enumeration value description.
  482. *
  483. * @param parameter object handle of parameter
  484. * @param index index of parameter enumeration value
  485. *
  486. * @return enumeration value description.
  487. */
  488. const char *
  489. jackctl_parameter_get_enum_constraint_description(
  490. jackctl_parameter_t * parameter,
  491. uint32_t index);
  492. /**
  493. * Call this function to get parameter range.
  494. *
  495. * @param parameter object handle of parameter
  496. * @param min_ptr pointer to variable receiving parameter minimum value
  497. * @param max_ptr pointer to variable receiving parameter maximum value
  498. */
  499. void
  500. jackctl_parameter_get_range_constraint(
  501. jackctl_parameter_t * parameter,
  502. union jackctl_parameter_value * min_ptr,
  503. union jackctl_parameter_value * max_ptr);
  504. /**
  505. * Call this function to check whether parameter constraint is strict,
  506. * i.e. whether supplying non-matching value will not work for sure.
  507. *
  508. * @param parameter parameter object handle to check
  509. *
  510. * @return whether parameter constraint is strict.
  511. */
  512. bool
  513. jackctl_parameter_constraint_is_strict(
  514. jackctl_parameter_t * parameter);
  515. /**
  516. * Call this function to check whether parameter has fake values,
  517. * i.e. values have no user meaningful meaning and only value
  518. * description is meaningful to user.
  519. *
  520. * @param parameter parameter object handle to check
  521. *
  522. * @return whether parameter constraint is strict.
  523. */
  524. bool
  525. jackctl_parameter_constraint_is_fake_value(
  526. jackctl_parameter_t * parameter);
  527. /**
  528. * Call this function to log an error message.
  529. *
  530. * @param format string
  531. */
  532. void
  533. jack_error(
  534. const char *format,
  535. ...);
  536. /**
  537. * Call this function to log an information message.
  538. *
  539. * @param format string
  540. */
  541. void
  542. jack_info(
  543. const char *format,
  544. ...);
  545. /**
  546. * Call this function to log an information message but only when
  547. * verbose mode is enabled.
  548. *
  549. * @param format string
  550. */
  551. void
  552. jack_log(
  553. const char *format,
  554. ...);
  555. /* @} */
  556. #if 0
  557. { /* Adjust editor indent */
  558. #endif
  559. #ifdef __cplusplus
  560. } /* extern "C" */
  561. #endif
  562. #endif /* #ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED */