1 /* -*- Mode: C ; c-basic-offset: 4 -*- */
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)
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 (!jack_controller_start_server(controller_ptr
, call
))
90 jack_error ("Failed to start server");
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");
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");
116 jack_controller_control_send_signal_server_stopped();
119 else if (strcmp (call
->method_name
, "GetLoad") == 0)
121 if (!controller_ptr
->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
)
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
)
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
)
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
)
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 */
179 ret
= jack_set_buffer_size(controller_ptr
->client
, buffer_size
);
184 JACK_DBUS_ERROR_GENERIC
,
185 "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size
, ret
);
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.
211 if (!jack_controller_load_internal(controller_ptr
, internal_name
)) {
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.
230 if (!jack_controller_add_slave(controller_ptr
, driver_name
)) {
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.
249 if (!jack_controller_remove_slave(controller_ptr
, driver_name
)) {
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.
268 if (!jack_controller_unload_internal(controller_ptr
, internal_name
)) {
271 JACK_DBUS_ERROR_GENERIC
,
272 "jack_controller_unload_internal failed for internal (%s)", internal_name
);
281 jack_dbus_construct_method_return_single(call
, type
, arg
);
286 jack_dbus_error (call
, JACK_DBUS_ERROR_SERVER_NOT_RUNNING
,
287 "Can't execute method '%s' with stopped JACK server", call
->method_name
);
293 #undef controller_ptr
295 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted
)
296 JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
297 JACK_DBUS_METHOD_ARGUMENTS_END
299 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer
)
300 JACK_DBUS_METHOD_ARGUMENTS_END
302 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer
)
303 JACK_DBUS_METHOD_ARGUMENTS_END
305 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SwitchMaster
)
306 JACK_DBUS_METHOD_ARGUMENTS_END
308 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad
)
309 JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
310 JACK_DBUS_METHOD_ARGUMENTS_END
312 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns
)
313 JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
314 JACK_DBUS_METHOD_ARGUMENTS_END
316 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate
)
317 JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
318 JACK_DBUS_METHOD_ARGUMENTS_END
320 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency
)
321 JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
322 JACK_DBUS_METHOD_ARGUMENTS_END
324 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize
)
325 JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
326 JACK_DBUS_METHOD_ARGUMENTS_END
328 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize
)
329 JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
330 JACK_DBUS_METHOD_ARGUMENTS_END
332 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime
)
333 JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
334 JACK_DBUS_METHOD_ARGUMENTS_END
336 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns
)
337 JACK_DBUS_METHOD_ARGUMENTS_END
339 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(LoadInternal
)
340 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
341 JACK_DBUS_METHOD_ARGUMENTS_END
343 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(UnloadInternal
)
344 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
345 JACK_DBUS_METHOD_ARGUMENTS_END
347 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(AddSlave
)
348 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
349 JACK_DBUS_METHOD_ARGUMENTS_END
351 JACK_DBUS_METHOD_ARGUMENTS_BEGIN(RemoveSlave
)
352 JACK_DBUS_METHOD_ARGUMENT("internal", "s", false)
353 JACK_DBUS_METHOD_ARGUMENTS_END
355 JACK_DBUS_METHODS_BEGIN
356 JACK_DBUS_METHOD_DESCRIBE(IsStarted
, NULL
)
357 JACK_DBUS_METHOD_DESCRIBE(StartServer
, NULL
)
358 JACK_DBUS_METHOD_DESCRIBE(StopServer
, NULL
)
359 JACK_DBUS_METHOD_DESCRIBE(SwitchMaster
, NULL
)
360 JACK_DBUS_METHOD_DESCRIBE(GetLoad
, NULL
)
361 JACK_DBUS_METHOD_DESCRIBE(GetXruns
, NULL
)
362 JACK_DBUS_METHOD_DESCRIBE(GetSampleRate
, NULL
)
363 JACK_DBUS_METHOD_DESCRIBE(GetLatency
, NULL
)
364 JACK_DBUS_METHOD_DESCRIBE(GetBufferSize
, NULL
)
365 JACK_DBUS_METHOD_DESCRIBE(SetBufferSize
, NULL
)
366 JACK_DBUS_METHOD_DESCRIBE(IsRealtime
, NULL
)
367 JACK_DBUS_METHOD_DESCRIBE(ResetXruns
, NULL
)
368 JACK_DBUS_METHOD_DESCRIBE(LoadInternal
, NULL
)
369 JACK_DBUS_METHOD_DESCRIBE(UnloadInternal
, NULL
)
370 JACK_DBUS_METHOD_DESCRIBE(AddSlave
, NULL
)
371 JACK_DBUS_METHOD_DESCRIBE(RemoveSlave
, NULL
)
372 JACK_DBUS_METHODS_END
374 JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStarted
)
375 JACK_DBUS_SIGNAL_ARGUMENTS_END
377 JACK_DBUS_SIGNAL_ARGUMENTS_BEGIN(ServerStopped
)
378 JACK_DBUS_SIGNAL_ARGUMENTS_END
380 JACK_DBUS_SIGNALS_BEGIN
381 JACK_DBUS_SIGNAL_DESCRIBE(ServerStarted
)
382 JACK_DBUS_SIGNAL_DESCRIBE(ServerStopped
)
383 JACK_DBUS_SIGNALS_END
385 JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control
, JACK_DBUS_IFACE_NAME
)
386 JACK_DBUS_IFACE_HANDLER(jack_control_run_method
)
387 JACK_DBUS_IFACE_EXPOSE_METHODS
388 JACK_DBUS_IFACE_EXPOSE_SIGNALS