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.

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