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.

234 lines
6.8KB

  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. #if defined(HAVE_CONFIG_H)
  17. #include "config.h"
  18. #endif
  19. #include <stdint.h>
  20. #include <string.h>
  21. #include <stdio.h>
  22. #include <assert.h>
  23. #include <dbus/dbus.h>
  24. #include "jackdbus.h"
  25. #include "controller_internal.h"
  26. #define controller_ptr ((struct jack_controller *)call->context)
  27. /*
  28. * Check if the supplied method name exists in org.jackaudio.JackControl,
  29. * if it does execute it and return true. Otherwise return false.
  30. */
  31. static
  32. bool
  33. jack_control_run_method(
  34. struct jack_dbus_method_call * call,
  35. const struct jack_dbus_interface_method_descriptor * methods)
  36. {
  37. int ret;
  38. int type;
  39. message_arg_t arg;
  40. /* use empty reply if not overriden in the code that follows */
  41. type = DBUS_TYPE_INVALID;
  42. if (strcmp (call->method_name, "Exit") == 0)
  43. {
  44. g_exit_command = TRUE;
  45. }
  46. else if (strcmp (call->method_name, "IsStarted") == 0)
  47. {
  48. type = DBUS_TYPE_BOOLEAN;
  49. arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE);
  50. }
  51. else if (strcmp (call->method_name, "StartServer") == 0)
  52. {
  53. if (!jack_controller_start_server(controller_ptr, call))
  54. {
  55. jack_error ("Failed to start server");
  56. }
  57. }
  58. else if (strcmp (call->method_name, "StopServer") == 0)
  59. {
  60. if (!jack_controller_stop_server(controller_ptr, call))
  61. {
  62. jack_error ("Failed to stop server");
  63. }
  64. }
  65. else if (strcmp (call->method_name, "GetLoad") == 0)
  66. {
  67. if (!controller_ptr->started)
  68. {
  69. goto not_started;
  70. }
  71. type = DBUS_TYPE_DOUBLE;
  72. arg.doubl = jack_cpu_load(controller_ptr->client);
  73. }
  74. else if (strcmp (call->method_name, "GetXruns") == 0)
  75. {
  76. type = DBUS_TYPE_UINT32;
  77. arg.uint32 = controller_ptr->xruns;
  78. }
  79. else if (strcmp (call->method_name, "GetSampleRate") == 0)
  80. {
  81. if (!controller_ptr->started)
  82. {
  83. goto not_started;
  84. }
  85. type = DBUS_TYPE_UINT32;
  86. arg.uint32 = jack_get_sample_rate(controller_ptr->client);
  87. }
  88. else if (strcmp (call->method_name, "GetLatency") == 0)
  89. {
  90. if (!controller_ptr->started)
  91. {
  92. goto not_started;
  93. }
  94. type = DBUS_TYPE_DOUBLE;
  95. arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
  96. }
  97. else if (strcmp (call->method_name, "GetBufferSize") == 0)
  98. {
  99. if (!controller_ptr->started)
  100. {
  101. goto not_started;
  102. }
  103. type = DBUS_TYPE_UINT32;
  104. arg.uint32 = jack_get_buffer_size(controller_ptr->client);
  105. }
  106. else if (strcmp (call->method_name, "SetBufferSize") == 0)
  107. {
  108. dbus_uint32_t buffer_size;
  109. if (!controller_ptr->started)
  110. {
  111. goto not_started;
  112. }
  113. if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
  114. {
  115. /* jack_dbus_get_method_args() has set reply for us */
  116. goto exit;
  117. }
  118. ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
  119. if (ret != 0)
  120. {
  121. jack_dbus_error(
  122. call,
  123. JACK_DBUS_ERROR_GENERIC,
  124. "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
  125. goto exit;
  126. }
  127. }
  128. else if (strcmp (call->method_name, "IsRealtime") == 0)
  129. {
  130. type = DBUS_TYPE_BOOLEAN;
  131. arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
  132. }
  133. else if (strcmp (call->method_name, "ResetXruns") == 0)
  134. {
  135. controller_ptr->xruns = 0;
  136. }
  137. else
  138. {
  139. return false;
  140. }
  141. jack_dbus_construct_method_return_single(call, type, arg);
  142. return true;
  143. not_started:
  144. jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
  145. "Can't execute method '%s' with stopped JACK server", call->method_name);
  146. exit:
  147. return true;
  148. }
  149. #undef controller_ptr
  150. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
  151. JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
  152. JACK_DBUS_METHOD_ARGUMENTS_END
  153. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
  154. JACK_DBUS_METHOD_ARGUMENTS_END
  155. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
  156. JACK_DBUS_METHOD_ARGUMENTS_END
  157. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
  158. JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
  159. JACK_DBUS_METHOD_ARGUMENTS_END
  160. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
  161. JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
  162. JACK_DBUS_METHOD_ARGUMENTS_END
  163. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
  164. JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
  165. JACK_DBUS_METHOD_ARGUMENTS_END
  166. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
  167. JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
  168. JACK_DBUS_METHOD_ARGUMENTS_END
  169. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
  170. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
  171. JACK_DBUS_METHOD_ARGUMENTS_END
  172. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
  173. JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
  174. JACK_DBUS_METHOD_ARGUMENTS_END
  175. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
  176. JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
  177. JACK_DBUS_METHOD_ARGUMENTS_END
  178. JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
  179. JACK_DBUS_METHOD_ARGUMENTS_END
  180. JACK_DBUS_METHODS_BEGIN
  181. JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
  182. JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
  183. JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
  184. JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
  185. JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
  186. JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
  187. JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
  188. JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
  189. JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
  190. JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
  191. JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
  192. JACK_DBUS_METHODS_END
  193. JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl")
  194. JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
  195. JACK_DBUS_IFACE_EXPOSE_METHODS
  196. JACK_DBUS_IFACE_END