Merge branch 'master' into newer-midi-with-winmme-driver
[jack2.git] / dbus / controller_iface_control.c
blobcd0187da9329c77e691bcd0a8d2f2d67c6246731
1 /* -*- Mode: C ; c-basic-offset: 4 -*- */
2 /*
3 Copyright (C) 2007,2008,2010 Nedko Arnaudov
4 Copyright (C) 2007-2008 Juuso Alasuutari
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #if defined(HAVE_CONFIG_H)
22 #include "config.h"
23 #endif
25 #include <stdint.h>
26 #include <string.h>
27 #include <stdio.h>
28 #include <assert.h>
29 #include <dbus/dbus.h>
31 #include "jackdbus.h"
32 #include "controller_internal.h"
34 #define JACK_DBUS_IFACE_NAME "org.jackaudio.JackControl"
36 void
37 jack_controller_control_send_signal_server_started()
40 jack_dbus_send_signal(
41 JACK_CONTROLLER_OBJECT_PATH,
42 JACK_DBUS_IFACE_NAME,
43 "ServerStarted",
44 DBUS_TYPE_INVALID);
47 void
48 jack_controller_control_send_signal_server_stopped()
51 jack_dbus_send_signal(
52 JACK_CONTROLLER_OBJECT_PATH,
53 JACK_DBUS_IFACE_NAME,
54 "ServerStopped",
55 DBUS_TYPE_INVALID);
58 #define controller_ptr ((struct jack_controller *)call->context)
61 * Check if the supplied method name exists in org.jackaudio.JackControl,
62 * if it does execute it and return true. Otherwise return false.
64 static
65 bool
66 jack_control_run_method(
67 struct jack_dbus_method_call * call,
68 const struct jack_dbus_interface_method_descriptor * methods)
70 int ret;
71 int type;
72 message_arg_t arg;
74 /* use empty reply if not overriden in the code that follows */
75 type = DBUS_TYPE_INVALID;
77 if (strcmp (call->method_name, "Exit") == 0)
79 g_exit_command = TRUE;
81 else if (strcmp (call->method_name, "IsStarted") == 0)
83 type = DBUS_TYPE_BOOLEAN;
84 arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE);
86 else if (strcmp (call->method_name, "StartServer") == 0)
88 if (controller_ptr->started)
90 jack_info("Ignoring JACK server start request because server is already started.");
92 else
94 if (!jack_controller_start_server(controller_ptr, call))
96 /* the reply is set by the failed function */
97 assert(call->reply != NULL);
98 return true;
101 jack_controller_control_send_signal_server_started();
104 else if (strcmp (call->method_name, "StopServer") == 0)
106 if (!controller_ptr->started)
108 jack_info("Ignoring JACK server stop request because server is already stopped.");
110 else
112 if (!jack_controller_stop_server(controller_ptr, call))
114 /* the reply is set by the failed function */
115 assert(call->reply != NULL);
116 return true;
119 jack_controller_control_send_signal_server_stopped();
122 else if (strcmp (call->method_name, "SwitchMaster") == 0)
124 if (!jack_controller_switch_master(controller_ptr, call))
126 /* the reply is set by the failed function */
127 assert(call->reply != NULL);
128 return true;
131 jack_controller_control_send_signal_server_stopped();
133 else if (strcmp (call->method_name, "GetLoad") == 0)
135 if (!controller_ptr->started)
137 goto not_started;
140 type = DBUS_TYPE_DOUBLE;
141 arg.doubl = jack_cpu_load(controller_ptr->client);
143 else if (strcmp (call->method_name, "GetXruns") == 0)
145 type = DBUS_TYPE_UINT32;
146 arg.uint32 = controller_ptr->xruns;
148 else if (strcmp (call->method_name, "GetSampleRate") == 0)
150 if (!controller_ptr->started)
152 goto not_started;
155 type = DBUS_TYPE_UINT32;
156 arg.uint32 = jack_get_sample_rate(controller_ptr->client);
158 else if (strcmp (call->method_name, "GetLatency") == 0)
160 if (!controller_ptr->started)
162 goto not_started;
165 type = DBUS_TYPE_DOUBLE;
166 arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
168 else if (strcmp (call->method_name, "GetBufferSize") == 0)
170 if (!controller_ptr->started)
172 goto not_started;
175 type = DBUS_TYPE_UINT32;
176 arg.uint32 = jack_get_buffer_size(controller_ptr->client);
178 else if (strcmp (call->method_name, "SetBufferSize") == 0)
180 dbus_uint32_t buffer_size;
182 if (!controller_ptr->started)
184 goto not_started;
187 if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
189 /* jack_dbus_get_method_args() has set reply for us */
190 goto exit;
193 ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
194 if (ret != 0)
196 jack_dbus_error(
197 call,
198 JACK_DBUS_ERROR_GENERIC,
199 "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
201 goto exit;
204 else if (strcmp (call->method_name, "IsRealtime") == 0)
206 type = DBUS_TYPE_BOOLEAN;
207 arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
209 else if (strcmp (call->method_name, "ResetXruns") == 0)
211 controller_ptr->xruns = 0;
213 else if (strcmp (call->method_name, "LoadInternal") == 0)
215 const char *internal_name;
217 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_INVALID))
219 /* The method call had invalid arguments meaning that
220 * get_method_args() has constructed an error for us.
222 goto exit;
225 if (!jack_controller_load_internal(controller_ptr, internal_name)) {
226 jack_dbus_error(
227 call,
228 JACK_DBUS_ERROR_GENERIC,
229 "jack_controller_load_internal failed for internal (%s)", internal_name);
232 else if (strcmp (call->method_name, "AddSlave") == 0)
234 const char *driver_name;
236 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
238 /* The method call had invalid arguments meaning that
239 * get_method_args() has constructed an error for us.
241 goto exit;
244 if (!jack_controller_add_slave(controller_ptr, driver_name)) {
245 jack_dbus_error(
246 call,
247 JACK_DBUS_ERROR_GENERIC,
248 "jack_controller_add_slave failed for driver (%s)", driver_name);
251 else if (strcmp (call->method_name, "RemoveSlave") == 0)
253 const char *driver_name;
255 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
257 /* The method call had invalid arguments meaning that
258 * get_method_args() has constructed an error for us.
260 goto exit;
263 if (!jack_controller_remove_slave(controller_ptr, driver_name)) {
264 jack_dbus_error(
265 call,
266 JACK_DBUS_ERROR_GENERIC,
267 "jack_controller_remove_slave failed for driver (%s)", driver_name);
270 else if (strcmp (call->method_name, "UnloadInternal") == 0)
272 const char *internal_name;
274 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_INVALID))
276 /* The method call had invalid arguments meaning that
277 * get_method_args() has constructed an error for us.
279 goto exit;
282 if (!jack_controller_unload_internal(controller_ptr, internal_name)) {
283 jack_dbus_error(
284 call,
285 JACK_DBUS_ERROR_GENERIC,
286 "jack_controller_unload_internal failed for internal (%s)", internal_name);
290 else
292 return false;
295 jack_dbus_construct_method_return_single(call, type, arg);
297 return true;
299 not_started:
300 jack_dbus_only_error(
301 call,
302 JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
303 "Can't execute method '%s' with stopped JACK server",
304 call->method_name);
306 exit:
307 return true;
310 #undef controller_ptr
312 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
313 JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
314 JACK_DBUS_METHOD_ARGUMENTS_END
316 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
317 JACK_DBUS_METHOD_ARGUMENTS_END
319 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
320 JACK_DBUS_METHOD_ARGUMENTS_END
322 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SwitchMaster)
323 JACK_DBUS_METHOD_ARGUMENTS_END
325 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
326 JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
327 JACK_DBUS_METHOD_ARGUMENTS_END
329 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
330 JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
331 JACK_DBUS_METHOD_ARGUMENTS_END
333 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
334 JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
335 JACK_DBUS_METHOD_ARGUMENTS_END
337 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
338 JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
339 JACK_DBUS_METHOD_ARGUMENTS_END
341 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
342 JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
343 JACK_DBUS_METHOD_ARGUMENTS_END
345 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
346 JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
347 JACK_DBUS_METHOD_ARGUMENTS_END
349 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
350 JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
351 JACK_DBUS_METHOD_ARGUMENTS_END
353 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
354 JACK_DBUS_METHOD_ARGUMENTS_END
356 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(LoadInternal)
357 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
358 JACK_DBUS_METHOD_ARGUMENTS_END
360 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(UnloadInternal)
361 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
362 JACK_DBUS_METHOD_ARGUMENTS_END
364 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(AddSlave)
365 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
366 JACK_DBUS_METHOD_ARGUMENTS_END
368 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(RemoveSlave)
369 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
370 JACK_DBUS_METHOD_ARGUMENTS_END
372 JACK_DBUS_METHODS_BEGIN
373 JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
374 JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
375 JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
376 JACK_DBUS_METHOD_DESCRIBE(SwitchMaster, NULL)
377 JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
378 JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
379 JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
380 JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
381 JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
382 JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
383 JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
384 JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
385 JACK_DBUS_METHOD_DESCRIBE(LoadInternal, NULL)
386 JACK_DBUS_METHOD_DESCRIBE(UnloadInternal, NULL)
387 JACK_DBUS_METHOD_DESCRIBE(AddSlave, NULL)
388 JACK_DBUS_METHOD_DESCRIBE(RemoveSlave, NULL)
389 JACK_DBUS_METHODS_END
391 JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStarted)
392 JACK_DBUS_SIGNAL_ARGUMENTS_END
394 JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStopped)
395 JACK_DBUS_SIGNAL_ARGUMENTS_END
397 JACK_DBUS_SIGNALS_BEGIN
398 JACK_DBUS_SIGNAL_DESCRIBE(ServerStarted)
399 JACK_DBUS_SIGNAL_DESCRIBE(ServerStopped)
400 JACK_DBUS_SIGNALS_END
402 JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, JACK_DBUS_IFACE_NAME)
403 JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
404 JACK_DBUS_IFACE_EXPOSE_METHODS
405 JACK_DBUS_IFACE_EXPOSE_SIGNALS
406 JACK_DBUS_IFACE_END