|
- /* -*- Mode: C ; c-basic-offset: 4 -*- */
- /*
- Copyright (C) 2007,2008 Nedko Arnaudov
- Copyright (C) 2007-2008 Juuso Alasuutari
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- */
-
- #if defined(HAVE_CONFIG_H)
- #include "config.h"
- #endif
-
- #include <stdint.h>
- #include <string.h>
- #include <stdio.h>
- #include <assert.h>
- #include <dbus/dbus.h>
-
- #include "jackdbus.h"
- #include "controller_internal.h"
-
- #define controller_ptr ((struct jack_controller *)call->context)
-
- /*
- * Check if the supplied method name exists in org.jackaudio.JackControl,
- * if it does execute it and return true. Otherwise return false.
- */
- static
- bool
- jack_control_run_method(
- struct jack_dbus_method_call * call,
- const struct jack_dbus_interface_method_descriptor * methods)
- {
- int ret;
- int type;
- message_arg_t arg;
-
- /* use empty reply if not overriden in the code that follows */
- type = DBUS_TYPE_INVALID;
-
- if (strcmp (call->method_name, "Exit") == 0)
- {
- g_exit_command = TRUE;
- }
- else if (strcmp (call->method_name, "IsStarted") == 0)
- {
- type = DBUS_TYPE_BOOLEAN;
- arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE);
- }
- else if (strcmp (call->method_name, "StartServer") == 0)
- {
- if (!jack_controller_start_server(controller_ptr, call))
- {
- jack_error ("Failed to start server");
- }
- }
- else if (strcmp (call->method_name, "StopServer") == 0)
- {
- if (!jack_controller_stop_server(controller_ptr, call))
- {
- jack_error ("Failed to stop server");
- }
- }
- else if (strcmp (call->method_name, "GetLoad") == 0)
- {
- if (!controller_ptr->started)
- {
- goto not_started;
- }
-
- type = DBUS_TYPE_DOUBLE;
- arg.doubl = jack_cpu_load(controller_ptr->client);
- }
- else if (strcmp (call->method_name, "GetXruns") == 0)
- {
- type = DBUS_TYPE_UINT32;
- arg.uint32 = controller_ptr->xruns;
- }
- else if (strcmp (call->method_name, "GetSampleRate") == 0)
- {
- if (!controller_ptr->started)
- {
- goto not_started;
- }
-
- type = DBUS_TYPE_UINT32;
- arg.uint32 = jack_get_sample_rate(controller_ptr->client);
- }
- else if (strcmp (call->method_name, "GetLatency") == 0)
- {
- if (!controller_ptr->started)
- {
- goto not_started;
- }
-
- type = DBUS_TYPE_DOUBLE;
- arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f;
- }
- else if (strcmp (call->method_name, "GetBufferSize") == 0)
- {
- if (!controller_ptr->started)
- {
- goto not_started;
- }
-
- type = DBUS_TYPE_UINT32;
- arg.uint32 = jack_get_buffer_size(controller_ptr->client);
- }
- else if (strcmp (call->method_name, "SetBufferSize") == 0)
- {
- dbus_uint32_t buffer_size;
-
- if (!controller_ptr->started)
- {
- goto not_started;
- }
-
- if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID))
- {
- /* jack_dbus_get_method_args() has set reply for us */
- goto exit;
- }
-
- ret = jack_set_buffer_size(controller_ptr->client, buffer_size);
- if (ret != 0)
- {
- jack_dbus_error(
- call,
- JACK_DBUS_ERROR_GENERIC,
- "jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret);
-
- goto exit;
- }
- }
- else if (strcmp (call->method_name, "IsRealtime") == 0)
- {
- type = DBUS_TYPE_BOOLEAN;
- arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE;
- }
- else if (strcmp (call->method_name, "ResetXruns") == 0)
- {
- controller_ptr->xruns = 0;
- }
- else
- {
- return false;
- }
-
- jack_dbus_construct_method_return_single(call, type, arg);
-
- return true;
-
- not_started:
- jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING,
- "Can't execute method '%s' with stopped JACK server", call->method_name);
-
- exit:
- return true;
- }
-
- #undef controller_ptr
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted)
- JACK_DBUS_METHOD_ARGUMENT("started", "b", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad)
- JACK_DBUS_METHOD_ARGUMENT("load", "d", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns)
- JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate)
- JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency)
- JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize)
- JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize)
- JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime)
- JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHODS_BEGIN
- JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL)
- JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL)
- JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL)
- JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL)
- JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL)
- JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL)
- JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL)
- JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL)
- JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL)
- JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL)
- JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL)
- JACK_DBUS_METHODS_END
-
- JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl")
- JACK_DBUS_IFACE_HANDLER(jack_control_run_method)
- JACK_DBUS_IFACE_EXPOSE_METHODS
- JACK_DBUS_IFACE_END
|