141 lines
3.8 KiB
C
141 lines
3.8 KiB
C
/* -*- Mode: C ; c-basic-offset: 4 -*- */
|
|
/*
|
|
Copyright (C) 2007,2008,2011 Nedko Arnaudov
|
|
|
|
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 <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include <dbus/dbus.h>
|
|
|
|
#include "controller_internal.h"
|
|
|
|
void
|
|
jack_controller_deserialize_parameter_value(
|
|
struct jack_controller *controller_ptr,
|
|
const char * const * address,
|
|
const char * option_value)
|
|
{
|
|
const struct jack_parameter * param_ptr;
|
|
union jackctl_parameter_value value;
|
|
size_t size;
|
|
|
|
param_ptr = jack_params_get_parameter(controller_ptr->params, address);
|
|
if (param_ptr == NULL)
|
|
{
|
|
jack_error("Unknown parameter");
|
|
goto ignore;
|
|
}
|
|
|
|
jack_info("setting parameter '%s':'%s':'%s' to value \"%s\"", address[0], address[1], address[2], option_value);
|
|
|
|
switch (param_ptr->type)
|
|
{
|
|
case JackParamInt:
|
|
value.i = atoi(option_value);
|
|
break;
|
|
case JackParamUInt:
|
|
value.ui = strtoul(option_value, NULL, 10);
|
|
break;
|
|
case JackParamChar:
|
|
if (option_value[0] == 0 || option_value[1] != 0)
|
|
{
|
|
jack_error("invalid char option value \"%s\"", option_value);
|
|
goto ignore;
|
|
}
|
|
value.c = *option_value;
|
|
break;
|
|
case JackParamString:
|
|
size = strlen(option_value);
|
|
if (size >= sizeof(value.str))
|
|
{
|
|
jack_error("string option value \"%s\" is too long, max is %zu chars (including terminating zero)", option_value, sizeof(value.str));
|
|
goto ignore;
|
|
}
|
|
|
|
strcpy(value.str, option_value);
|
|
break;
|
|
case JackParamBool:
|
|
if (strcmp(option_value, "true") == 0)
|
|
{
|
|
value.b = true;
|
|
}
|
|
else if (strcmp(option_value, "false") == 0)
|
|
{
|
|
value.b = false;
|
|
}
|
|
else
|
|
{
|
|
jack_error("ignoring unknown bool value \"%s\"", option_value);
|
|
goto ignore;
|
|
}
|
|
break;
|
|
default:
|
|
jack_error("Unknown type %d", (int)param_ptr->type);
|
|
goto ignore;
|
|
}
|
|
|
|
if (param_ptr->vtable.set_value(param_ptr->obj, &value))
|
|
{
|
|
return;
|
|
}
|
|
|
|
jack_error("Parameter set failed");
|
|
|
|
ignore:
|
|
jack_error("Ignoring restore attempt of parameter '%s':'%s':'%s'", address[0], address[1], address[2]);
|
|
}
|
|
|
|
void
|
|
jack_controller_serialize_parameter_value(
|
|
const struct jack_parameter * param_ptr,
|
|
char * value_buffer)
|
|
{
|
|
union jackctl_parameter_value value;
|
|
|
|
value = param_ptr->vtable.get_value(param_ptr->obj);
|
|
|
|
switch (param_ptr->type)
|
|
{
|
|
case JackParamInt:
|
|
sprintf(value_buffer, "%d", (int)value.i);
|
|
return;
|
|
case JackParamUInt:
|
|
sprintf(value_buffer, "%u", (unsigned int)value.ui);
|
|
return;
|
|
case JackParamChar:
|
|
sprintf(value_buffer, "%c", (char)value.c);
|
|
return;
|
|
case JackParamString:
|
|
strcpy(value_buffer, value.str);
|
|
return;
|
|
case JackParamBool:
|
|
strcpy(value_buffer, value.b ? "true" : "false");
|
|
return;
|
|
}
|
|
|
|
jack_error("parameter of unknown type %d", (int)param_ptr->type);
|
|
assert(false);
|
|
*value_buffer = 0;
|
|
}
|