/* -*- 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 #include #include #include #include #include #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; }