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.

230 lines
6.7KB

  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