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.

643 lines
17KB

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