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.

917 lines
27KB

  1. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  2. /*
  3. Copyright (C) 2007,2008 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. #include <stdint.h>
  17. #include <string.h>
  18. #include <stdio.h>
  19. #include <assert.h>
  20. #include <dbus/dbus.h>
  21. #include "jackdbus.h"
  22. #include "controller_internal.h"
  23. #define controller_ptr ((struct jack_controller *)call->context)
  24. /*
  25. * Check if the supplied method name exists in org.jackaudio.JackControl,
  26. * if it does execute it and return true. Otherwise return false.
  27. */
  28. static
  29. bool
  30. jack_control_run_method(
  31. struct jack_dbus_method_call * call,
  32. const struct jack_dbus_interface_method_descriptor * methods)
  33. {
  34. int ret;
  35. int type;
  36. message_arg_t arg;
  37. /* use empty reply if not overriden in the code that follows */
  38. type = DBUS_TYPE_INVALID;
  39. if (strcmp (call->method_name, "Exit") == 0)
  40. {
  41. g_exit_command = TRUE;
  42. }
  43. else if (strcmp (call->method_name, "IsStarted") == 0)
  44. {
  45. type = DBUS_TYPE_BOOLEAN;
  46. arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE);
  47. }
  48. else if (strcmp (call->method_name, "StartServer") == 0)
  49. {
  50. if (!jack_controller_start_server(controller_ptr, call))
  51. {
  52. jack_error ("Failed to start server");
  53. }
  54. }
  55. else if (strcmp (call->method_name, "StopServer") == 0)
  56. {
  57. if (!jack_controller_stop_server(controller_ptr, call))
  58. {
  59. jack_error ("Failed to stop server");
  60. }
  61. }
  62. else if (strcmp (call->method_name, "GetLoad") == 0)
  63. {
  64. if (!controller_ptr->started)
  65. {
  66. goto not_started;
  67. }
  68. type = DBUS_TYPE_DOUBLE;
  69. arg.doubl = jack_cpu_load(controller_ptr->client);
  70. }
  71. else if (strcmp (call->method_name, "GetXruns") == 0)
  72. {
  73. type = DBUS_TYPE_UINT32;
  74. arg.uint32 = controller_ptr->xruns;
  75. }
  76. else if (strcmp (call->method_name, "GetSampleRate") == 0)
  77. {
  78. if (!controller_ptr->started)
  79. {
  80. goto not_started;
  81. }
  82. type = DBUS_TYPE_UINT32;
  83. arg.uint32 = jack_get_sample_rate(controller_ptr->client);
  84. }
  85. else if (strcmp (call->method_name, "GetLatency") == 0)
  86. {
  87. if (!controller_ptr->started)
  88. {
  89. goto not_started;
  90. }
  91. type = DBUS_TYPE_DOUBLE;
  92. arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
  93. }
  94. else if (strcmp (call->method_name, "GetBufferSize") == 0)
  95. {
  96. if (!controller_ptr->started)
  97. {
  98. goto not_started;
  99. }
  100. type = DBUS_TYPE_UINT32;
  101. arg.uint32 = jack_get_buffer_size(controller_ptr->client);
  102. }
  103. else if (strcmp (call->method_name, "SetBufferSize") == 0)
  104. {
  105. dbus_uint32_t buffer_size;
  106. if (!controller_ptr->started)
  107. {
  108. goto not_started;
  109. }
  110. if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
  111. {
  112. /* jack_dbus_get_method_args() has set reply for us */
  113. goto exit;
  114. }
  115. ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
  116. if (ret != 0)
  117. {
  118. jack_dbus_error(
  119. call,
  120. JACK_DBUS_ERROR_GENERIC,
  121. "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
  122. goto exit;
  123. }
  124. }
  125. else if (strcmp (call->method_name, "IsRealtime") == 0)
  126. {
  127. type = DBUS_TYPE_BOOLEAN;
  128. arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
  129. }
  130. else if (strcmp (call->method_name, "ResetXruns") == 0)
  131. {
  132. controller_ptr->xruns = 0;
  133. }
  134. else
  135. {
  136. return false;
  137. }
  138. jack_dbus_construct_method_return_single(call, type, arg);
  139. return true;
  140. not_started:
  141. jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
  142. "Can't execute method '%s' with stopped JACK server", call->method_name);
  143. exit:
  144. return true;
  145. }
  146. #undef controller_ptr
  147. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
  148. JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
  149. JACK_DBUS_METHOD_ARGUMENTS_END
  150. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
  151. JACK_DBUS_METHOD_ARGUMENTS_END
  152. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
  153. JACK_DBUS_METHOD_ARGUMENTS_END
  154. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
  155. JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
  156. JACK_DBUS_METHOD_ARGUMENTS_END
  157. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
  158. JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
  159. JACK_DBUS_METHOD_ARGUMENTS_END
  160. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
  161. JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
  162. JACK_DBUS_METHOD_ARGUMENTS_END
  163. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
  164. JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
  165. JACK_DBUS_METHOD_ARGUMENTS_END
  166. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
  167. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
  168. JACK_DBUS_METHOD_ARGUMENTS_END
  169. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
  170. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
  171. JACK_DBUS_METHOD_ARGUMENTS_END
  172. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
  173. JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
  174. JACK_DBUS_METHOD_ARGUMENTS_END
  175. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
  176. JACK_DBUS_METHOD_ARGUMENTS_END
  177. JACK_DBUS_METHODS_BEGIN
  178. JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
  179. JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
  180. JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
  181. JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
  182. JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
  183. JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
  184. JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
  185. JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
  186. JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
  187. JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
  188. JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
  189. JACK_DBUS_METHODS_END
  190. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl")
  191. JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
  192. JACK_DBUS_IFACE_EXPOSE_METHODS
  193. JACK_DBUS_IFACE_END
  194. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  195. /*
  196. Copyright (C) 2007,2008 Nedko Arnaudov
  197. Copyright (C) 2007-2008 Juuso Alasuutari
  198. This program is free software; you can redistribute it and/or modify
  199. it under the terms of the GNU General Public License as published by
  200. the Free Software Foundation; either version 2 of the License.
  201. This program is distributed in the hope that it will be useful,
  202. but WITHOUT ANY WARRANTY; without even the implied warranty of
  203. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  204. GNU General Public License for more details.
  205. You should have received a copy of the GNU General Public License
  206. along with this program; if not, write to the Free Software
  207. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  208. */
  209. #include <stdint.h>
  210. #include <string.h>
  211. #include <stdio.h>
  212. #include <assert.h>
  213. #include <dbus/dbus.h>
  214. #include "jackdbus.h"
  215. #include "controller_internal.h"
  216. #define controller_ptr ((struct jack_controller *)call->context)
  217. /*
  218. * Check if the supplied method name exists in org.jackaudio.JackControl,
  219. * if it does execute it and return true. Otherwise return false.
  220. */
  221. static
  222. bool
  223. jack_control_run_method(
  224. struct jack_dbus_method_call * call,
  225. const struct jack_dbus_interface_method_descriptor * methods)
  226. {
  227. int ret;
  228. int type;
  229. message_arg_t arg;
  230. /* use empty reply if not overriden in the code that follows */
  231. type = DBUS_TYPE_INVALID;
  232. if (strcmp (call->method_name, "Exit") == 0)
  233. {
  234. g_exit_command = TRUE;
  235. }
  236. else if (strcmp (call->method_name, "IsStarted") == 0)
  237. {
  238. type = DBUS_TYPE_BOOLEAN;
  239. arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE);
  240. }
  241. else if (strcmp (call->method_name, "StartServer") == 0)
  242. {
  243. if (!jack_controller_start_server(controller_ptr, call))
  244. {
  245. jack_error ("Failed to start server");
  246. }
  247. }
  248. else if (strcmp (call->method_name, "StopServer") == 0)
  249. {
  250. if (!jack_controller_stop_server(controller_ptr, call))
  251. {
  252. jack_error ("Failed to stop server");
  253. }
  254. }
  255. else if (strcmp (call->method_name, "GetLoad") == 0)
  256. {
  257. if (!controller_ptr->started)
  258. {
  259. goto not_started;
  260. }
  261. type = DBUS_TYPE_DOUBLE;
  262. arg.doubl = jack_cpu_load(controller_ptr->client);
  263. }
  264. else if (strcmp (call->method_name, "GetXruns") == 0)
  265. {
  266. type = DBUS_TYPE_UINT32;
  267. arg.uint32 = controller_ptr->xruns;
  268. }
  269. else if (strcmp (call->method_name, "GetSampleRate") == 0)
  270. {
  271. if (!controller_ptr->started)
  272. {
  273. goto not_started;
  274. }
  275. type = DBUS_TYPE_UINT32;
  276. arg.uint32 = jack_get_sample_rate(controller_ptr->client);
  277. }
  278. else if (strcmp (call->method_name, "GetLatency") == 0)
  279. {
  280. if (!controller_ptr->started)
  281. {
  282. goto not_started;
  283. }
  284. type = DBUS_TYPE_DOUBLE;
  285. arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
  286. }
  287. else if (strcmp (call->method_name, "GetBufferSize") == 0)
  288. {
  289. if (!controller_ptr->started)
  290. {
  291. goto not_started;
  292. }
  293. type = DBUS_TYPE_UINT32;
  294. arg.uint32 = jack_get_buffer_size(controller_ptr->client);
  295. }
  296. else if (strcmp (call->method_name, "SetBufferSize") == 0)
  297. {
  298. dbus_uint32_t buffer_size;
  299. if (!controller_ptr->started)
  300. {
  301. goto not_started;
  302. }
  303. if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
  304. {
  305. /* jack_dbus_get_method_args() has set reply for us */
  306. goto exit;
  307. }
  308. ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
  309. if (ret != 0)
  310. {
  311. jack_dbus_error(
  312. call,
  313. JACK_DBUS_ERROR_GENERIC,
  314. "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
  315. goto exit;
  316. }
  317. }
  318. else if (strcmp (call->method_name, "IsRealtime") == 0)
  319. {
  320. type = DBUS_TYPE_BOOLEAN;
  321. arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
  322. }
  323. else if (strcmp (call->method_name, "ResetXruns") == 0)
  324. {
  325. controller_ptr->xruns = 0;
  326. }
  327. else
  328. {
  329. return false;
  330. }
  331. jack_dbus_construct_method_return_single(call, type, arg);
  332. return true;
  333. not_started:
  334. jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
  335. "Can't execute method '%s' with stopped JACK server", call->method_name);
  336. exit:
  337. return true;
  338. }
  339. #undef controller_ptr
  340. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
  341. JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
  342. JACK_DBUS_METHOD_ARGUMENTS_END
  343. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
  344. JACK_DBUS_METHOD_ARGUMENTS_END
  345. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
  346. JACK_DBUS_METHOD_ARGUMENTS_END
  347. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
  348. JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
  349. JACK_DBUS_METHOD_ARGUMENTS_END
  350. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
  351. JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
  352. JACK_DBUS_METHOD_ARGUMENTS_END
  353. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
  354. JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
  355. JACK_DBUS_METHOD_ARGUMENTS_END
  356. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
  357. JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
  358. JACK_DBUS_METHOD_ARGUMENTS_END
  359. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
  360. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
  361. JACK_DBUS_METHOD_ARGUMENTS_END
  362. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
  363. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
  364. JACK_DBUS_METHOD_ARGUMENTS_END
  365. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
  366. JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
  367. JACK_DBUS_METHOD_ARGUMENTS_END
  368. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
  369. JACK_DBUS_METHOD_ARGUMENTS_END
  370. JACK_DBUS_METHODS_BEGIN
  371. JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
  372. JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
  373. JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
  374. JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
  375. JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
  376. JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
  377. JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
  378. JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
  379. JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
  380. JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
  381. JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
  382. JACK_DBUS_METHODS_END
  383. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl")
  384. JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
  385. JACK_DBUS_IFACE_EXPOSE_METHODS
  386. JACK_DBUS_IFACE_END
  387. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  388. /*
  389. Copyright (C) 2007,2008 Nedko Arnaudov
  390. Copyright (C) 2007-2008 Juuso Alasuutari
  391. This program is free software; you can redistribute it and/or modify
  392. it under the terms of the GNU General Public License as published by
  393. the Free Software Foundation; either version 2 of the License.
  394. This program is distributed in the hope that it will be useful,
  395. but WITHOUT ANY WARRANTY; without even the implied warranty of
  396. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  397. GNU General Public License for more details.
  398. You should have received a copy of the GNU General Public License
  399. along with this program; if not, write to the Free Software
  400. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  401. */
  402. #include <stdint.h>
  403. #include <string.h>
  404. #include <stdio.h>
  405. #include <assert.h>
  406. #include <dbus/dbus.h>
  407. #include "jackdbus.h"
  408. #include "controller_internal.h"
  409. #define controller_ptr ((struct jack_controller *)call->context)
  410. /*
  411. * Check if the supplied method name exists in org.jackaudio.JackControl,
  412. * if it does execute it and return true. Otherwise return false.
  413. */
  414. static
  415. bool
  416. jack_control_run_method(
  417. struct jack_dbus_method_call * call,
  418. const struct jack_dbus_interface_method_descriptor * methods)
  419. {
  420. int ret;
  421. int type;
  422. message_arg_t arg;
  423. /* use empty reply if not overriden in the code that follows */
  424. type = DBUS_TYPE_INVALID;
  425. if (strcmp (call->method_name, "Exit") == 0)
  426. {
  427. g_exit_command = TRUE;
  428. }
  429. else if (strcmp (call->method_name, "IsStarted") == 0)
  430. {
  431. type = DBUS_TYPE_BOOLEAN;
  432. arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE);
  433. }
  434. else if (strcmp (call->method_name, "StartServer") == 0)
  435. {
  436. if (!jack_controller_start_server(controller_ptr, call))
  437. {
  438. jack_error ("Failed to start server");
  439. }
  440. }
  441. else if (strcmp (call->method_name, "StopServer") == 0)
  442. {
  443. if (!jack_controller_stop_server(controller_ptr, call))
  444. {
  445. jack_error ("Failed to stop server");
  446. }
  447. }
  448. else if (strcmp (call->method_name, "GetLoad") == 0)
  449. {
  450. if (!controller_ptr->started)
  451. {
  452. goto not_started;
  453. }
  454. type = DBUS_TYPE_DOUBLE;
  455. arg.doubl = jack_cpu_load(controller_ptr->client);
  456. }
  457. else if (strcmp (call->method_name, "GetXruns") == 0)
  458. {
  459. type = DBUS_TYPE_UINT32;
  460. arg.uint32 = controller_ptr->xruns;
  461. }
  462. else if (strcmp (call->method_name, "GetSampleRate") == 0)
  463. {
  464. if (!controller_ptr->started)
  465. {
  466. goto not_started;
  467. }
  468. type = DBUS_TYPE_UINT32;
  469. arg.uint32 = jack_get_sample_rate(controller_ptr->client);
  470. }
  471. else if (strcmp (call->method_name, "GetLatency") == 0)
  472. {
  473. if (!controller_ptr->started)
  474. {
  475. goto not_started;
  476. }
  477. type = DBUS_TYPE_DOUBLE;
  478. arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
  479. }
  480. else if (strcmp (call->method_name, "GetBufferSize") == 0)
  481. {
  482. if (!controller_ptr->started)
  483. {
  484. goto not_started;
  485. }
  486. type = DBUS_TYPE_UINT32;
  487. arg.uint32 = jack_get_buffer_size(controller_ptr->client);
  488. }
  489. else if (strcmp (call->method_name, "SetBufferSize") == 0)
  490. {
  491. dbus_uint32_t buffer_size;
  492. if (!controller_ptr->started)
  493. {
  494. goto not_started;
  495. }
  496. if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
  497. {
  498. /* jack_dbus_get_method_args() has set reply for us */
  499. goto exit;
  500. }
  501. ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
  502. if (ret != 0)
  503. {
  504. jack_dbus_error(
  505. call,
  506. JACK_DBUS_ERROR_GENERIC,
  507. "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
  508. goto exit;
  509. }
  510. }
  511. else if (strcmp (call->method_name, "IsRealtime") == 0)
  512. {
  513. type = DBUS_TYPE_BOOLEAN;
  514. arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
  515. }
  516. else if (strcmp (call->method_name, "ResetXruns") == 0)
  517. {
  518. controller_ptr->xruns = 0;
  519. }
  520. else
  521. {
  522. return false;
  523. }
  524. jack_dbus_construct_method_return_single(call, type, arg);
  525. return true;
  526. not_started:
  527. jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
  528. "Can't execute method '%s' with stopped JACK server", call->method_name);
  529. exit:
  530. return true;
  531. }
  532. #undef controller_ptr
  533. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
  534. JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
  535. JACK_DBUS_METHOD_ARGUMENTS_END
  536. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
  537. JACK_DBUS_METHOD_ARGUMENTS_END
  538. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
  539. JACK_DBUS_METHOD_ARGUMENTS_END
  540. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
  541. JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
  542. JACK_DBUS_METHOD_ARGUMENTS_END
  543. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
  544. JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
  545. JACK_DBUS_METHOD_ARGUMENTS_END
  546. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
  547. JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
  548. JACK_DBUS_METHOD_ARGUMENTS_END
  549. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
  550. JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
  551. JACK_DBUS_METHOD_ARGUMENTS_END
  552. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
  553. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
  554. JACK_DBUS_METHOD_ARGUMENTS_END
  555. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
  556. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
  557. JACK_DBUS_METHOD_ARGUMENTS_END
  558. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
  559. JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
  560. JACK_DBUS_METHOD_ARGUMENTS_END
  561. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
  562. JACK_DBUS_METHOD_ARGUMENTS_END
  563. JACK_DBUS_METHODS_BEGIN
  564. JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
  565. JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
  566. JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
  567. JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
  568. JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
  569. JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
  570. JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
  571. JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
  572. JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
  573. JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
  574. JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
  575. JACK_DBUS_METHODS_END
  576. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl")
  577. JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
  578. JACK_DBUS_IFACE_EXPOSE_METHODS
  579. JACK_DBUS_IFACE_END
  580. /* -*- Mode: C ; c-basic-offset: 4 -*- */
  581. /*
  582. Copyright (C) 2007,2008 Nedko Arnaudov
  583. Copyright (C) 2007-2008 Juuso Alasuutari
  584. This program is free software; you can redistribute it and/or modify
  585. it under the terms of the GNU General Public License as published by
  586. the Free Software Foundation; either version 2 of the License.
  587. This program is distributed in the hope that it will be useful,
  588. but WITHOUT ANY WARRANTY; without even the implied warranty of
  589. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  590. GNU General Public License for more details.
  591. You should have received a copy of the GNU General Public License
  592. along with this program; if not, write to the Free Software
  593. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  594. */
  595. #include <stdint.h>
  596. #include <string.h>
  597. #include <stdio.h>
  598. #include <assert.h>
  599. #include <dbus/dbus.h>
  600. #include "jackdbus.h"
  601. #include "controller_internal.h"
  602. #define controller_ptr ((struct jack_controller *)call->context)
  603. /*
  604. * Check if the supplied method name exists in org.jackaudio.JackControl,
  605. * if it does execute it and return true. Otherwise return false.
  606. */
  607. static
  608. bool
  609. jack_control_run_method(
  610. struct jack_dbus_method_call * call,
  611. const struct jack_dbus_interface_method_descriptor * methods)
  612. {
  613. int ret;
  614. int type;
  615. message_arg_t arg;
  616. /* use empty reply if not overriden in the code that follows */
  617. type = DBUS_TYPE_INVALID;
  618. if (strcmp (call->method_name, "Exit") == 0)
  619. {
  620. g_exit_command = TRUE;
  621. }
  622. else if (strcmp (call->method_name, "IsStarted") == 0)
  623. {
  624. type = DBUS_TYPE_BOOLEAN;
  625. arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE);
  626. }
  627. else if (strcmp (call->method_name, "StartServer") == 0)
  628. {
  629. if (!jack_controller_start_server(controller_ptr, call))
  630. {
  631. jack_error ("Failed to start server");
  632. }
  633. }
  634. else if (strcmp (call->method_name, "StopServer") == 0)
  635. {
  636. if (!jack_controller_stop_server(controller_ptr, call))
  637. {
  638. jack_error ("Failed to stop server");
  639. }
  640. }
  641. else if (strcmp (call->method_name, "GetLoad") == 0)
  642. {
  643. if (!controller_ptr->started)
  644. {
  645. goto not_started;
  646. }
  647. type = DBUS_TYPE_DOUBLE;
  648. arg.doubl = jack_cpu_load(controller_ptr->client);
  649. }
  650. else if (strcmp (call->method_name, "GetXruns") == 0)
  651. {
  652. type = DBUS_TYPE_UINT32;
  653. arg.uint32 = controller_ptr->xruns;
  654. }
  655. else if (strcmp (call->method_name, "GetSampleRate") == 0)
  656. {
  657. if (!controller_ptr->started)
  658. {
  659. goto not_started;
  660. }
  661. type = DBUS_TYPE_UINT32;
  662. arg.uint32 = jack_get_sample_rate(controller_ptr->client);
  663. }
  664. else if (strcmp (call->method_name, "GetLatency") == 0)
  665. {
  666. if (!controller_ptr->started)
  667. {
  668. goto not_started;
  669. }
  670. type = DBUS_TYPE_DOUBLE;
  671. arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
  672. }
  673. else if (strcmp (call->method_name, "GetBufferSize") == 0)
  674. {
  675. if (!controller_ptr->started)
  676. {
  677. goto not_started;
  678. }
  679. type = DBUS_TYPE_UINT32;
  680. arg.uint32 = jack_get_buffer_size(controller_ptr->client);
  681. }
  682. else if (strcmp (call->method_name, "SetBufferSize") == 0)
  683. {
  684. dbus_uint32_t buffer_size;
  685. if (!controller_ptr->started)
  686. {
  687. goto not_started;
  688. }
  689. if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
  690. {
  691. /* jack_dbus_get_method_args() has set reply for us */
  692. goto exit;
  693. }
  694. ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
  695. if (ret != 0)
  696. {
  697. jack_dbus_error(
  698. call,
  699. JACK_DBUS_ERROR_GENERIC,
  700. "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
  701. goto exit;
  702. }
  703. }
  704. else if (strcmp (call->method_name, "IsRealtime") == 0)
  705. {
  706. type = DBUS_TYPE_BOOLEAN;
  707. arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
  708. }
  709. else if (strcmp (call->method_name, "ResetXruns") == 0)
  710. {
  711. controller_ptr->xruns = 0;
  712. }
  713. else
  714. {
  715. return false;
  716. }
  717. jack_dbus_construct_method_return_single(call, type, arg);
  718. return true;
  719. not_started:
  720. jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
  721. "Can't execute method '%s' with stopped JACK server", call->method_name);
  722. exit:
  723. return true;
  724. }
  725. #undef controller_ptr
  726. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
  727. JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
  728. JACK_DBUS_METHOD_ARGUMENTS_END
  729. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
  730. JACK_DBUS_METHOD_ARGUMENTS_END
  731. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
  732. JACK_DBUS_METHOD_ARGUMENTS_END
  733. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
  734. JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
  735. JACK_DBUS_METHOD_ARGUMENTS_END
  736. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
  737. JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
  738. JACK_DBUS_METHOD_ARGUMENTS_END
  739. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
  740. JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
  741. JACK_DBUS_METHOD_ARGUMENTS_END
  742. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
  743. JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
  744. JACK_DBUS_METHOD_ARGUMENTS_END
  745. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
  746. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
  747. JACK_DBUS_METHOD_ARGUMENTS_END
  748. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
  749. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
  750. JACK_DBUS_METHOD_ARGUMENTS_END
  751. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
  752. JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
  753. JACK_DBUS_METHOD_ARGUMENTS_END
  754. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
  755. JACK_DBUS_METHOD_ARGUMENTS_END
  756. JACK_DBUS_METHODS_BEGIN
  757. JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
  758. JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
  759. JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
  760. JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
  761. JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
  762. JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
  763. JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
  764. JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
  765. JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
  766. JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
  767. JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
  768. JACK_DBUS_METHODS_END
  769. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl")
  770. JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
  771. JACK_DBUS_IFACE_EXPOSE_METHODS
  772. JACK_DBUS_IFACE_END