Merge branch 'master' into port_register_notification_defer
[jack2.git] / dbus / controller_iface_control.c
blobca3ab038196d748739e3c6dcc12ac0ed4f60b12b
1 /* -*- Mode: C ; c-basic-offset: 4 -*- */
2 /*
3 Copyright (C) 2007,2008 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 (!jack_controller_start_server(controller_ptr, call))
90 jack_error ("Failed to start server");
92 else
94 jack_controller_control_send_signal_server_started();
97 else if (strcmp (call->method_name, "StopServer") == 0)
99 if (!jack_controller_stop_server(controller_ptr, call))
101 jack_error ("Failed to stop server");
103 else
105 jack_controller_control_send_signal_server_stopped();
108 else if (strcmp (call->method_name, "SwitchMaster") == 0)
110 if (!jack_controller_switch_master(controller_ptr, call))
112 jack_error ("Failed to switch master");
114 else
116 jack_controller_control_send_signal_server_stopped();
119 else if (strcmp (call->method_name, "GetLoad") == 0)
121 if (!controller_ptr->started)
123 goto not_started;
126 type = DBUS_TYPE_DOUBLE;
127 arg.doubl = jack_cpu_load(controller_ptr->client);
129 else if (strcmp (call->method_name, "GetXruns") == 0)
131 type = DBUS_TYPE_UINT32;
132 arg.uint32 = controller_ptr->xruns;
134 else if (strcmp (call->method_name, "GetSampleRate") == 0)
136 if (!controller_ptr->started)
138 goto not_started;
141 type = DBUS_TYPE_UINT32;
142 arg.uint32 = jack_get_sample_rate(controller_ptr->client);
144 else if (strcmp (call->method_name, "GetLatency") == 0)
146 if (!controller_ptr->started)
148 goto not_started;
151 type = DBUS_TYPE_DOUBLE;
152 arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
154 else if (strcmp (call->method_name, "GetBufferSize") == 0)
156 if (!controller_ptr->started)
158 goto not_started;
161 type = DBUS_TYPE_UINT32;
162 arg.uint32 = jack_get_buffer_size(controller_ptr->client);
164 else if (strcmp (call->method_name, "SetBufferSize") == 0)
166 dbus_uint32_t buffer_size;
168 if (!controller_ptr->started)
170 goto not_started;
173 if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
175 /* jack_dbus_get_method_args() has set reply for us */
176 goto exit;
179 ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
180 if (ret != 0)
182 jack_dbus_error(
183 call,
184 JACK_DBUS_ERROR_GENERIC,
185 "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
187 goto exit;
190 else if (strcmp (call->method_name, "IsRealtime") == 0)
192 type = DBUS_TYPE_BOOLEAN;
193 arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
195 else if (strcmp (call->method_name, "ResetXruns") == 0)
197 controller_ptr->xruns = 0;
199 else if (strcmp (call->method_name, "LoadInternal") == 0)
201 const char *internal_name;
203 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_INVALID))
205 /* The method call had invalid arguments meaning that
206 * get_method_args() has constructed an error for us.
208 goto exit;
211 if (!jack_controller_load_internal(controller_ptr, internal_name)) {
212 jack_dbus_error(
213 call,
214 JACK_DBUS_ERROR_GENERIC,
215 "jack_controller_load_internal failed for internal (%s)", internal_name);
218 else if (strcmp (call->method_name, "AddSlave") == 0)
220 const char *driver_name;
222 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
224 /* The method call had invalid arguments meaning that
225 * get_method_args() has constructed an error for us.
227 goto exit;
230 if (!jack_controller_add_slave(controller_ptr, driver_name)) {
231 jack_dbus_error(
232 call,
233 JACK_DBUS_ERROR_GENERIC,
234 "jack_controller_add_slave failed for driver (%s)", driver_name);
237 else if (strcmp (call->method_name, "RemoveSlave") == 0)
239 const char *driver_name;
241 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &driver_name, DBUS_TYPE_INVALID))
243 /* The method call had invalid arguments meaning that
244 * get_method_args() has constructed an error for us.
246 goto exit;
249 if (!jack_controller_remove_slave(controller_ptr, driver_name)) {
250 jack_dbus_error(
251 call,
252 JACK_DBUS_ERROR_GENERIC,
253 "jack_controller_remove_slave failed for driver (%s)", driver_name);
256 else if (strcmp (call->method_name, "UnloadInternal") == 0)
258 const char *internal_name;
260 if (!jack_dbus_get_method_args(call, DBUS_TYPE_STRING, &internal_name, DBUS_TYPE_INVALID))
262 /* The method call had invalid arguments meaning that
263 * get_method_args() has constructed an error for us.
265 goto exit;
268 if (!jack_controller_unload_internal(controller_ptr, internal_name)) {
269 jack_dbus_error(
270 call,
271 JACK_DBUS_ERROR_GENERIC,
272 "jack_controller_unload_internal failed for internal (%s)", internal_name);
276 else
278 return false;
281 jack_dbus_construct_method_return_single(call, type, arg);
283 return true;
285 not_started:
286 jack_dbus_only_error(
287 call,
288 JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
289 "Can't execute method '%s' with stopped JACK server",
290 call->method_name);
292 exit:
293 return true;
296 #undef controller_ptr
298 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
299 JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
300 JACK_DBUS_METHOD_ARGUMENTS_END
302 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
303 JACK_DBUS_METHOD_ARGUMENTS_END
305 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
306 JACK_DBUS_METHOD_ARGUMENTS_END
308 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SwitchMaster)
309 JACK_DBUS_METHOD_ARGUMENTS_END
311 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
312 JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
313 JACK_DBUS_METHOD_ARGUMENTS_END
315 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
316 JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
317 JACK_DBUS_METHOD_ARGUMENTS_END
319 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
320 JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
321 JACK_DBUS_METHOD_ARGUMENTS_END
323 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
324 JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
325 JACK_DBUS_METHOD_ARGUMENTS_END
327 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
328 JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
329 JACK_DBUS_METHOD_ARGUMENTS_END
331 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
332 JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
333 JACK_DBUS_METHOD_ARGUMENTS_END
335 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
336 JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
337 JACK_DBUS_METHOD_ARGUMENTS_END
339 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
340 JACK_DBUS_METHOD_ARGUMENTS_END
342 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(LoadInternal)
343 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
344 JACK_DBUS_METHOD_ARGUMENTS_END
346 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(UnloadInternal)
347 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
348 JACK_DBUS_METHOD_ARGUMENTS_END
350 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(AddSlave)
351 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
352 JACK_DBUS_METHOD_ARGUMENTS_END
354 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(RemoveSlave)
355 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
356 JACK_DBUS_METHOD_ARGUMENTS_END
358 JACK_DBUS_METHODS_BEGIN
359 JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
360 JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
361 JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
362 JACK_DBUS_METHOD_DESCRIBE(SwitchMaster, NULL)
363 JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
364 JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
365 JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
366 JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
367 JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
368 JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
369 JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
370 JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
371 JACK_DBUS_METHOD_DESCRIBE(LoadInternal, NULL)
372 JACK_DBUS_METHOD_DESCRIBE(UnloadInternal, NULL)
373 JACK_DBUS_METHOD_DESCRIBE(AddSlave, NULL)
374 JACK_DBUS_METHOD_DESCRIBE(RemoveSlave, NULL)
375 JACK_DBUS_METHODS_END
377 JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStarted)
378 JACK_DBUS_SIGNAL_ARGUMENTS_END
380 JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStopped)
381 JACK_DBUS_SIGNAL_ARGUMENTS_END
383 JACK_DBUS_SIGNALS_BEGIN
384 JACK_DBUS_SIGNAL_DESCRIBE(ServerStarted)
385 JACK_DBUS_SIGNAL_DESCRIBE(ServerStopped)
386 JACK_DBUS_SIGNALS_END
388 JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, JACK_DBUS_IFACE_NAME)
389 JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
390 JACK_DBUS_IFACE_EXPOSE_METHODS
391 JACK_DBUS_IFACE_EXPOSE_SIGNALS
392 JACK_DBUS_IFACE_END