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.

751 lines
20KB

  1. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  2. /*
  3. Copyright (C) 2007,2008,2010,2011 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. #if defined(HAVE_CONFIG_H)
  17. #include "config.h"
  18. #endif
  19. #include <stdint.h>
  20. #include <string.h>
  21. #include <dbus/dbus.h>
  22. #include <assert.h>
  23. #include "controller.h"
  24. #include "controller_internal.h"
  25. #include "xml.h"
  26. #include "reserve.h"
  27. struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[] =
  28. {
  29. &g_jack_controller_iface_introspectable,
  30. &g_jack_controller_iface_control,
  31. &g_jack_controller_iface_configure,
  32. &g_jack_controller_iface_patchbay,
  33. &g_jack_controller_iface_transport,
  34. NULL
  35. };
  36. static
  37. jackctl_driver_t *
  38. jack_controller_find_driver(
  39. jackctl_server_t *server,
  40. const char *driver_name)
  41. {
  42. const JSList * node_ptr;
  43. node_ptr = jackctl_server_get_drivers_list(server);
  44. while (node_ptr)
  45. {
  46. if (strcmp(jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), driver_name) == 0)
  47. {
  48. return node_ptr->data;
  49. }
  50. node_ptr = jack_slist_next(node_ptr);
  51. }
  52. return NULL;
  53. }
  54. static bool jack_controller_check_slave_driver(struct jack_controller * controller_ptr, const char * name)
  55. {
  56. struct list_head * node_ptr;
  57. struct jack_controller_slave_driver * driver_ptr;
  58. list_for_each(node_ptr, &controller_ptr->slave_drivers)
  59. {
  60. driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings);
  61. if (strcmp(name, driver_ptr->name) == 0)
  62. {
  63. return true;
  64. }
  65. }
  66. return false;
  67. }
  68. static bool jack_controller_load_slave_drivers(struct jack_controller * controller_ptr)
  69. {
  70. struct list_head * node_ptr;
  71. struct jack_controller_slave_driver * driver_ptr;
  72. list_for_each(node_ptr, &controller_ptr->slave_drivers)
  73. {
  74. driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings);
  75. assert(driver_ptr->handle != NULL);
  76. assert(!driver_ptr->loaded);
  77. if (!jackctl_server_add_slave(controller_ptr->server, driver_ptr->handle))
  78. {
  79. jack_error("Driver \"%s\" cannot be loaded", driver_ptr->name);
  80. return false;
  81. }
  82. driver_ptr->loaded = true;
  83. }
  84. return true;
  85. }
  86. static void jack_controller_unload_slave_drivers(struct jack_controller * controller_ptr)
  87. {
  88. struct list_head * node_ptr;
  89. struct jack_controller_slave_driver * driver_ptr;
  90. list_for_each(node_ptr, &controller_ptr->slave_drivers)
  91. {
  92. driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings);
  93. if (driver_ptr->loaded)
  94. {
  95. jackctl_server_remove_slave(controller_ptr->server, driver_ptr->handle);
  96. driver_ptr->loaded = false;
  97. }
  98. }
  99. }
  100. static void jack_controller_remove_slave_drivers(struct jack_controller * controller_ptr)
  101. {
  102. struct jack_controller_slave_driver * driver_ptr;
  103. while (!list_empty(&controller_ptr->slave_drivers))
  104. {
  105. driver_ptr = list_entry(controller_ptr->slave_drivers.next, struct jack_controller_slave_driver, siblings);
  106. assert(!driver_ptr->loaded);
  107. list_del(&driver_ptr->siblings);
  108. free(driver_ptr->name);
  109. free(driver_ptr);
  110. }
  111. controller_ptr->slave_drivers_vparam_value.str[0] = 0;
  112. }
  113. static
  114. jackctl_internal_t *
  115. jack_controller_find_internal(
  116. jackctl_server_t *server,
  117. const char *internal_name)
  118. {
  119. const JSList * node_ptr;
  120. node_ptr = jackctl_server_get_internals_list(server);
  121. while (node_ptr)
  122. {
  123. if (strcmp(jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data), internal_name) == 0)
  124. {
  125. return node_ptr->data;
  126. }
  127. node_ptr = jack_slist_next(node_ptr);
  128. }
  129. return NULL;
  130. }
  131. bool
  132. jack_controller_select_driver(
  133. struct jack_controller * controller_ptr,
  134. const char * driver_name)
  135. {
  136. if (!jack_params_set_driver(controller_ptr->params, driver_name))
  137. {
  138. return false;
  139. }
  140. jack_info("driver \"%s\" selected", driver_name);
  141. return true;
  142. }
  143. static
  144. int
  145. jack_controller_xrun(void * arg)
  146. {
  147. ((struct jack_controller *)arg)->xruns++;
  148. return 0;
  149. }
  150. bool
  151. jack_controller_start_server(
  152. struct jack_controller * controller_ptr,
  153. void *dbus_call_context_ptr)
  154. {
  155. int ret;
  156. jack_info("Starting jack server...");
  157. assert(!controller_ptr->started); /* should be ensured by caller */
  158. controller_ptr->xruns = 0;
  159. if (!jackctl_server_open(
  160. controller_ptr->server,
  161. jack_params_get_driver(controller_ptr->params)))
  162. {
  163. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to open server");
  164. goto fail;
  165. }
  166. jack_controller_load_slave_drivers(controller_ptr);
  167. if (!jackctl_server_start(
  168. controller_ptr->server))
  169. {
  170. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to start server");
  171. goto fail_close_server;
  172. }
  173. controller_ptr->client = jack_client_open(
  174. "dbusapi",
  175. JackNoStartServer,
  176. NULL);
  177. if (controller_ptr->client == NULL)
  178. {
  179. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "failed to create dbusapi jack client");
  180. goto fail_stop_server;
  181. }
  182. ret = jack_set_xrun_callback(controller_ptr->client, jack_controller_xrun, controller_ptr);
  183. if (ret != 0)
  184. {
  185. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "failed to set xrun callback. error is %d", ret);
  186. goto fail_close_client;
  187. }
  188. if (!jack_controller_patchbay_init(controller_ptr))
  189. {
  190. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to initialize patchbay district");
  191. goto fail_close_client;
  192. }
  193. ret = jack_activate(controller_ptr->client);
  194. if (ret != 0)
  195. {
  196. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "failed to activate dbusapi jack client. error is %d", ret);
  197. goto fail_patchbay_uninit;
  198. }
  199. controller_ptr->started = true;
  200. return TRUE;
  201. fail_patchbay_uninit:
  202. jack_controller_patchbay_uninit(controller_ptr);
  203. fail_close_client:
  204. ret = jack_client_close(controller_ptr->client);
  205. if (ret != 0)
  206. {
  207. jack_error("jack_client_close() failed with error %d", ret);
  208. }
  209. controller_ptr->client = NULL;
  210. fail_stop_server:
  211. if (!jackctl_server_stop(controller_ptr->server))
  212. {
  213. jack_error("failed to stop jack server");
  214. }
  215. fail_close_server:
  216. jack_controller_unload_slave_drivers(controller_ptr);
  217. if (!jackctl_server_close(controller_ptr->server))
  218. {
  219. jack_error("failed to close jack server");
  220. }
  221. fail:
  222. return FALSE;
  223. }
  224. bool
  225. jack_controller_stop_server(
  226. struct jack_controller * controller_ptr,
  227. void *dbus_call_context_ptr)
  228. {
  229. int ret;
  230. jack_info("Stopping jack server...");
  231. assert(controller_ptr->started); /* should be ensured by caller */
  232. ret = jack_deactivate(controller_ptr->client);
  233. if (ret != 0)
  234. {
  235. jack_error("failed to deactivate dbusapi jack client. error is %d", ret);
  236. }
  237. jack_controller_patchbay_uninit(controller_ptr);
  238. ret = jack_client_close(controller_ptr->client);
  239. if (ret != 0)
  240. {
  241. jack_error("jack_client_close() failed with error %d", ret);
  242. }
  243. controller_ptr->client = NULL;
  244. if (!jackctl_server_stop(controller_ptr->server))
  245. {
  246. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to stop server");
  247. return FALSE;
  248. }
  249. jack_controller_unload_slave_drivers(controller_ptr);
  250. if (!jackctl_server_close(controller_ptr->server))
  251. {
  252. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to close server");
  253. return FALSE;
  254. }
  255. controller_ptr->started = false;
  256. return TRUE;
  257. }
  258. bool
  259. jack_controller_switch_master(
  260. struct jack_controller * controller_ptr,
  261. void *dbus_call_context_ptr)
  262. {
  263. assert(controller_ptr->started); /* should be ensured by caller */
  264. if (!jackctl_server_switch_master(
  265. controller_ptr->server,
  266. jack_params_get_driver(controller_ptr->params)))
  267. {
  268. jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to switch master");
  269. controller_ptr->started = false;
  270. return FALSE;
  271. }
  272. return TRUE;
  273. }
  274. #define DEVICE_MAX 2
  275. typedef struct reserved_audio_device {
  276. char device_name[64];
  277. rd_device * reserved_device;
  278. } reserved_audio_device;
  279. int g_device_count = 0;
  280. static reserved_audio_device g_reserved_device[DEVICE_MAX];
  281. static
  282. bool
  283. on_device_acquire(const char * device_name)
  284. {
  285. int ret;
  286. DBusError error;
  287. ret = rd_acquire(
  288. &g_reserved_device[g_device_count].reserved_device,
  289. g_connection,
  290. device_name,
  291. "Jack audio server",
  292. INT32_MAX,
  293. NULL,
  294. &error);
  295. if (ret < 0)
  296. {
  297. jack_error("Failed to acquire device name : %s error : %s", device_name, (error.message ? error.message : strerror(-ret)));
  298. return false;
  299. }
  300. strcpy(g_reserved_device[g_device_count].device_name, device_name);
  301. g_device_count++;
  302. jack_info("Acquired audio card %s", device_name);
  303. return true;
  304. }
  305. static
  306. void
  307. on_device_release(const char * device_name)
  308. {
  309. int i;
  310. // Look for corresponding reserved device
  311. for (i = 0; i < DEVICE_MAX; i++) {
  312. if (strcmp(g_reserved_device[i].device_name, device_name) == 0)
  313. break;
  314. }
  315. if (i < DEVICE_MAX) {
  316. jack_info("Released audio card %s", device_name);
  317. rd_release(g_reserved_device[i].reserved_device);
  318. } else {
  319. jack_error("Audio card %s not found!!", device_name);
  320. }
  321. g_device_count--;
  322. }
  323. #define controller_ptr ((struct jack_controller *)obj)
  324. static bool slave_drivers_parameter_is_set(void * obj)
  325. {
  326. return controller_ptr->slave_drivers_set;
  327. }
  328. static bool slave_drivers_parameter_reset(void * obj)
  329. {
  330. if (controller_ptr->started)
  331. {
  332. jack_error("Cannot modify slave-drivers when server is started");
  333. return false;
  334. }
  335. jack_controller_remove_slave_drivers(controller_ptr);
  336. controller_ptr->slave_drivers_set = false;
  337. return true;
  338. }
  339. static union jackctl_parameter_value slave_drivers_parameter_get_value(void * obj)
  340. {
  341. return controller_ptr->slave_drivers_vparam_value;
  342. }
  343. static bool slave_drivers_parameter_set_value(void * obj, const union jackctl_parameter_value * value_ptr)
  344. {
  345. char * buffer;
  346. char * save;
  347. const char * token;
  348. struct list_head old_list;
  349. struct list_head new_list;
  350. union jackctl_parameter_value old_value;
  351. union jackctl_parameter_value new_value;
  352. bool old_set;
  353. if (controller_ptr->started)
  354. {
  355. jack_error("Cannot modify slave-drivers when server is started");
  356. return false;
  357. }
  358. old_set = controller_ptr->slave_drivers_set;
  359. old_value = controller_ptr->slave_drivers_vparam_value;
  360. controller_ptr->slave_drivers_vparam_value.str[0] = 0;
  361. old_list = controller_ptr->slave_drivers;
  362. INIT_LIST_HEAD(&controller_ptr->slave_drivers);
  363. buffer = strdup(value_ptr->str);
  364. if (buffer == NULL)
  365. {
  366. jack_error("strdup() failed.");
  367. return false;
  368. }
  369. token = strtok_r(buffer, ",", &save);
  370. while (token)
  371. {
  372. //jack_info("slave driver '%s'", token);
  373. if (!jack_controller_add_slave_driver(controller_ptr, token))
  374. {
  375. jack_controller_remove_slave_drivers(controller_ptr);
  376. controller_ptr->slave_drivers = old_list;
  377. controller_ptr->slave_drivers_vparam_value = old_value;
  378. controller_ptr->slave_drivers_set = old_set;
  379. free(buffer);
  380. return false;
  381. }
  382. token = strtok_r(NULL, ",", &save);
  383. }
  384. new_value = controller_ptr->slave_drivers_vparam_value;
  385. new_list = controller_ptr->slave_drivers;
  386. controller_ptr->slave_drivers = old_list;
  387. jack_controller_remove_slave_drivers(controller_ptr);
  388. controller_ptr->slave_drivers_vparam_value = new_value;
  389. controller_ptr->slave_drivers = new_list;
  390. controller_ptr->slave_drivers_set = true;
  391. free(buffer);
  392. return true;
  393. }
  394. static union jackctl_parameter_value slave_drivers_parameter_get_default_value(void * obj)
  395. {
  396. union jackctl_parameter_value value;
  397. value.str[0] = 0;
  398. return value;
  399. }
  400. #undef controller_ptr
  401. void *
  402. jack_controller_create(
  403. DBusConnection *connection)
  404. {
  405. struct jack_controller *controller_ptr;
  406. const char * address[PARAM_ADDRESS_SIZE];
  407. DBusObjectPathVTable vtable =
  408. {
  409. jack_dbus_message_handler_unregister,
  410. jack_dbus_message_handler,
  411. NULL
  412. };
  413. controller_ptr = malloc(sizeof(struct jack_controller));
  414. if (!controller_ptr)
  415. {
  416. jack_error("Ran out of memory trying to allocate struct jack_controller");
  417. goto fail;
  418. }
  419. controller_ptr->server = jackctl_server_create(on_device_acquire, on_device_release);
  420. if (controller_ptr->server == NULL)
  421. {
  422. jack_error("Failed to create server object");
  423. goto fail_free;
  424. }
  425. controller_ptr->params = jack_params_create(controller_ptr->server);
  426. if (controller_ptr->params == NULL)
  427. {
  428. jack_error("Failed to initialize parameter tree");
  429. goto fail_destroy_server;
  430. }
  431. controller_ptr->client = NULL;
  432. controller_ptr->started = false;
  433. INIT_LIST_HEAD(&controller_ptr->slave_drivers);
  434. controller_ptr->slave_drivers_set = false;
  435. controller_ptr->slave_drivers_vparam_value.str[0] = 0;
  436. controller_ptr->slave_drivers_vparam.obj = controller_ptr;
  437. controller_ptr->slave_drivers_vparam.vtable.is_set = slave_drivers_parameter_is_set;
  438. controller_ptr->slave_drivers_vparam.vtable.reset = slave_drivers_parameter_reset;
  439. controller_ptr->slave_drivers_vparam.vtable.get_value = slave_drivers_parameter_get_value;
  440. controller_ptr->slave_drivers_vparam.vtable.set_value = slave_drivers_parameter_set_value;
  441. controller_ptr->slave_drivers_vparam.vtable.get_default_value = slave_drivers_parameter_get_default_value;
  442. controller_ptr->slave_drivers_vparam.type = JackParamString;
  443. controller_ptr->slave_drivers_vparam.name = "slave-drivers";
  444. controller_ptr->slave_drivers_vparam.short_decr = "Slave drivers to use";
  445. controller_ptr->slave_drivers_vparam.long_descr = "A comma separated list of slave drivers";
  446. controller_ptr->slave_drivers_vparam.constraint_flags = 0;
  447. address[0] = PTNODE_ENGINE;
  448. address[1] = NULL;
  449. jack_params_add_parameter(controller_ptr->params, address, true, &controller_ptr->slave_drivers_vparam);
  450. controller_ptr->dbus_descriptor.context = controller_ptr;
  451. controller_ptr->dbus_descriptor.interfaces = g_jackcontroller_interfaces;
  452. if (!dbus_connection_register_object_path(
  453. connection,
  454. JACK_CONTROLLER_OBJECT_PATH,
  455. &vtable,
  456. &controller_ptr->dbus_descriptor))
  457. {
  458. jack_error("Ran out of memory trying to register D-Bus object path");
  459. goto fail_destroy_params;
  460. }
  461. jack_controller_settings_load(controller_ptr);
  462. return controller_ptr;
  463. fail_destroy_params:
  464. jack_params_destroy(controller_ptr->params);
  465. fail_destroy_server:
  466. jackctl_server_destroy(controller_ptr->server);
  467. fail_free:
  468. free(controller_ptr);
  469. fail:
  470. return NULL;
  471. }
  472. bool
  473. jack_controller_add_slave_driver(
  474. struct jack_controller * controller_ptr,
  475. const char * driver_name)
  476. {
  477. jackctl_driver_t * driver;
  478. struct jack_controller_slave_driver * driver_ptr;
  479. size_t len_old;
  480. size_t len_new;
  481. len_old = strlen(controller_ptr->slave_drivers_vparam_value.str);
  482. len_new = strlen(driver_name);
  483. if (len_old + len_new + 2 > sizeof(controller_ptr->slave_drivers_vparam_value.str))
  484. {
  485. jack_error("No more space for slave drivers.");
  486. return false;
  487. }
  488. driver = jack_controller_find_driver(controller_ptr->server, driver_name);
  489. if (driver == NULL)
  490. {
  491. jack_error("Unknown driver \"%s\"", driver_name);
  492. return false;
  493. }
  494. if (jack_controller_check_slave_driver(controller_ptr, driver_name))
  495. {
  496. jack_info("Driver \"%s\" is already slave", driver_name);
  497. return true;
  498. }
  499. driver_ptr = malloc(sizeof(struct jack_controller_slave_driver));
  500. if (driver_ptr == NULL)
  501. {
  502. jack_error("malloc() failed to allocate jack_controller_slave_driver struct");
  503. return false;
  504. }
  505. driver_ptr->name = strdup(driver_name);
  506. if (driver_ptr->name == NULL)
  507. {
  508. jack_error("strdup() failed for slave driver name \"%s\"", driver_name);
  509. free(driver_ptr);
  510. return false;
  511. }
  512. driver_ptr->handle = driver;
  513. driver_ptr->loaded = false;
  514. jack_info("driver \"%s\" set as slave", driver_name);
  515. list_add_tail(&driver_ptr->siblings, &controller_ptr->slave_drivers);
  516. if (len_old != 0)
  517. {
  518. controller_ptr->slave_drivers_vparam_value.str[len_old++] = ',';
  519. }
  520. memcpy(controller_ptr->slave_drivers_vparam_value.str + len_old, driver_name, len_new + 1);
  521. controller_ptr->slave_drivers_set = true;
  522. return true;
  523. }
  524. bool
  525. jack_controller_remove_slave_driver(
  526. struct jack_controller * controller_ptr,
  527. const char * driver_name)
  528. {
  529. struct list_head * node_ptr;
  530. struct jack_controller_slave_driver * driver_ptr;
  531. list_for_each(node_ptr, &controller_ptr->slave_drivers)
  532. {
  533. driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings);
  534. if (strcmp(driver_ptr->name, driver_name) == 0)
  535. {
  536. list_del(&driver_ptr->siblings);
  537. free(driver_ptr->name);
  538. free(driver_ptr);
  539. /* update the slave-drivers param value */
  540. controller_ptr->slave_drivers_vparam_value.str[0] = 0;
  541. list_for_each(node_ptr, &controller_ptr->slave_drivers)
  542. {
  543. driver_ptr = list_entry(node_ptr, struct jack_controller_slave_driver, siblings);
  544. if (controller_ptr->slave_drivers_vparam_value.str[0] != 0)
  545. {
  546. strcat(controller_ptr->slave_drivers_vparam_value.str, ",");
  547. }
  548. strcat(controller_ptr->slave_drivers_vparam_value.str, driver_ptr->name);
  549. }
  550. jack_info("driver \"%s\" is not slave anymore", driver_name);
  551. return true;
  552. }
  553. }
  554. return false;
  555. }
  556. bool
  557. jack_controller_load_internal(
  558. struct jack_controller *controller_ptr,
  559. const char * internal_name)
  560. {
  561. jackctl_internal_t *internal;
  562. internal = jack_controller_find_internal(controller_ptr->server, internal_name);
  563. if (internal == NULL)
  564. {
  565. return false;
  566. }
  567. jack_info("internal \"%s\" selected", internal_name);
  568. return jackctl_server_load_internal(controller_ptr->server, internal);
  569. }
  570. bool
  571. jack_controller_unload_internal(
  572. struct jack_controller *controller_ptr,
  573. const char * internal_name)
  574. {
  575. jackctl_internal_t *internal;
  576. internal = jack_controller_find_internal(controller_ptr->server, internal_name);
  577. if (internal == NULL)
  578. {
  579. return false;
  580. }
  581. jack_info("internal \"%s\" selected", internal_name);
  582. return jackctl_server_unload_internal(controller_ptr->server, internal);
  583. }
  584. #define controller_ptr ((struct jack_controller *)context)
  585. void
  586. jack_controller_destroy(
  587. void * context)
  588. {
  589. if (controller_ptr->started)
  590. {
  591. jack_controller_stop_server(controller_ptr, NULL);
  592. }
  593. jack_controller_remove_slave_drivers(controller_ptr);
  594. jack_params_destroy(controller_ptr->params);
  595. jackctl_server_destroy(controller_ptr->server);
  596. free(controller_ptr);
  597. }