1 /* -*- Mode: C ; c-basic-offset: 4 -*- */
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)
29 #include <dbus/dbus.h>
32 #include "controller_internal.h"
34 #define JACK_DBUS_IFACE_NAME "org.jackaudio.JackControl"
37 jack_controller_control_send_signal_server_started()
40 jack_dbus_send_signal(
41 JACK_CONTROLLER_OBJECT_PATH
,
48 jack_controller_control_send_signal_server_stopped()
51 jack_dbus_send_signal(
52 JACK_CONTROLLER_OBJECT_PATH
,
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.
66 jack_control_run_method(
67 struct jack_dbus_method_call
* call
,
68 const struct jack_dbus_interface_method_descriptor
* methods
)
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.");
94 if (!jack_controller_start_server(controller_ptr
, call
))
96 /* the reply is set by the failed function */
97 assert(call
->reply
!= NULL
);
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.");
112 if (!jack_controller_stop_server(controller_ptr
, call
))
114 /* the reply is set by the failed function */
115 assert(call
->reply
!= NULL
);
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
);
131 jack_controller_control_send_signal_server_stopped();
133 else if (strcmp (call
->method_name
, "GetLoad") == 0)
135 if (!controller_ptr
->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
)
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
)
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
)
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
)
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 */
193 ret
= jack_set_buffer_size(controller_ptr
->client
, buffer_size
);
198 JACK_DBUS_ERROR_GENERIC
,
199 "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size
, ret
);
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.
225 if (!jack_controller_load_internal(controller_ptr
, internal_name
)) {
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.
244 if (!jack_controller_add_slave(controller_ptr
, driver_name
)) {
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.
263 if (!jack_controller_remove_slave(controller_ptr
, driver_name
)) {
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.
282 if (!jack_controller_unload_internal(controller_ptr
, internal_name
)) {
285 JACK_DBUS_ERROR_GENERIC
,
286 "jack_controller_unload_internal failed for internal (%s)", internal_name
);
295 jack_dbus_construct_method_return_single(call
, type
, arg
);
300 jack_dbus_only_error(
302 JACK_DBUS_ERROR_SERVER_NOT_RUNNING
,
303 "Can't execute method '%s' with stopped JACK server",
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