Пример #1
0
static int _get_value(Tcl_Interp *interp, jackctl_parameter_t *parameter, Tcl_Obj *value, union jackctl_parameter_value *result) {
  switch (jackctl_parameter_get_type(parameter)) {
  case JackParamInt: return Tcl_GetIntFromObj(interp, value, &result->i);
  case JackParamUInt: return Tcl_GetIntFromObj(interp, value, &result->ui);
  case JackParamChar: {
    int length;
    result->c = *Tcl_GetStringFromObj(value, &length);
    if (length == 1)
      return TCL_OK;
    return fw_error_str(interp, "character parameter is not one character long");
  }
  case JackParamString: {
    int length;
    strncpy(result->str, Tcl_GetStringFromObj(value, &length), JACK_PARAM_STRING_MAX);
    if (length <= JACK_PARAM_STRING_MAX)
      return TCL_OK;
    return fw_error_str(interp, "string parameter is too long");
  }
  case JackParamBool: {
    int b;
    if (Tcl_GetBooleanFromObj(interp, value, &b) != TCL_OK)
      return TCL_ERROR;
    result->b = b;
    return TCL_OK;
  }  
  }
  return fw_error_obj(interp, Tcl_ObjPrintf("unknown type %d returned by jackctl_parameter_get_type", jackctl_parameter_get_type(parameter)));
}
Пример #2
0
// jackctl_param_type_t jackctl_parameter_get_type(jackctl_parameter_t * parameter);
static int _parameter_get_type(ClientData clientData, Tcl_Interp *interp, int argc, Tcl_Obj* const *objv) {
  if (argc != 3) return fw_error_str(interp, "usage: jack-ctl parameter-get-type parameter");
  jackctl_parameter_t * parameter;
  if (_get_pointer(interp, objv[2], (void**)&parameter) != TCL_OK)
    return TCL_ERROR;
  return _return_string(interp, jack_parameter_types[jackctl_parameter_get_type(parameter)]);

}
Пример #3
0
static Tcl_Obj *_make_value(jackctl_parameter_t *parameter, union jackctl_parameter_value value) {
  switch (jackctl_parameter_get_type(parameter)) {
  case JackParamInt: return Tcl_NewIntObj(value.i);
  case JackParamUInt: return Tcl_NewIntObj(value.ui);
  case JackParamChar: return Tcl_NewStringObj(&value.c, 1);
  case JackParamString: return Tcl_NewStringObj(value.str, -1);
  case JackParamBool: return Tcl_NewBooleanObj(value.b);
  default: return Tcl_ObjPrintf("unknown type %d returned by jackctl_parameter_get_type", jackctl_parameter_get_type(parameter));
  }
}
Пример #4
0
static void print_parameters(const JSList * node_ptr)
{
    while (node_ptr != NULL) {
        jackctl_parameter_t * parameter = (jackctl_parameter_t *)node_ptr->data;
        printf("\nparameter name = %s\n", jackctl_parameter_get_name(parameter));
        printf("parameter id = %c\n", jackctl_parameter_get_id(parameter));
        printf("parameter short decs = %s\n", jackctl_parameter_get_short_description(parameter));
        printf("parameter long decs = %s\n", jackctl_parameter_get_long_description(parameter));
        print_value(jackctl_parameter_get_default_value(parameter), jackctl_parameter_get_type(parameter));
        node_ptr = jack_slist_next(node_ptr);
    }
}
Пример #5
0
EXPORT int
jackctl_parse_driver_params (jackctl_driver *driver_ptr, int argc, char* argv[])
{
    struct option * long_options;
    char * options, * options_ptr;
    unsigned long i;
    int opt;
    JSList * node_ptr;
    jackctl_parameter_t * param = NULL;
    union jackctl_parameter_value value;

    if (argc <= 1)
        return 0;

    const JSList * driver_params = jackctl_driver_get_parameters(driver_ptr);
    if (driver_params == NULL)
        return 1;

    jack_driver_desc_t * desc = jackctl_driver_get_desc(driver_ptr);

    /* check for help */
    if (strcmp (argv[1], "-h") == 0 || strcmp (argv[1], "--help") == 0) {
        if (argc > 2) {
            for (i = 0; i < desc->nparams; i++) {
                if (strcmp (desc->params[i].name, argv[2]) == 0) {
                    jack_print_driver_param_usage (desc, i, stdout);
                    return 1;
                }
            }

            fprintf (stderr, "jackd: unknown option '%s' "
                     "for driver '%s'\n", argv[2],
                     desc->name);
        }

        jack_log("Parameters for driver '%s' (all parameters are optional):", desc->name);
        jack_print_driver_options (desc, stdout);
        return 1;
    }

    /* set up the stuff for getopt */
    options = (char*)calloc (desc->nparams * 3 + 1, sizeof (char));
    long_options = (option*)calloc (desc->nparams + 1, sizeof (struct option));

    options_ptr = options;
    for (i = 0; i < desc->nparams; i++) {
        sprintf (options_ptr, "%c::", desc->params[i].character);
        options_ptr += 3;
        long_options[i].name = desc->params[i].name;
        long_options[i].flag = NULL;
        long_options[i].val = desc->params[i].character;
        long_options[i].has_arg = optional_argument;
    }

    /* create the params */
    optind = 0;
    opterr = 0;
    while ((opt = getopt_long(argc, argv, options, long_options, NULL)) != -1) {

        if (opt == ':' || opt == '?') {
            if (opt == ':') {
                fprintf (stderr, "Missing option to argument '%c'\n", optopt);
            } else {
                fprintf (stderr, "Unknownage with option '%c'\n", optopt);
            }

            fprintf (stderr, "Options for driver '%s':\n", desc->name);
            jack_print_driver_options(desc, stderr);
            return 1;
        }

        node_ptr = (JSList *)driver_params;
        while (node_ptr) {
            param = (jackctl_parameter_t*)node_ptr->data;
            if (opt == jackctl_parameter_get_id(param)) {
                break;
            }
            node_ptr = node_ptr->next;
        }

        if (!optarg && optind < argc &&
                strlen(argv[optind]) &&
                argv[optind][0] != '-') {
            optarg = argv[optind];
        }

        if (optarg) {
            switch (jackctl_parameter_get_type(param)) {
            case JackDriverParamInt:
                value.i = atoi (optarg);
                jackctl_parameter_set_value(param, &value);
                break;
            case JackDriverParamUInt:
                value.ui = strtoul (optarg, NULL, 10);
                jackctl_parameter_set_value(param, &value);
                break;
            case JackDriverParamChar:
                value.c = optarg[0];
                jackctl_parameter_set_value(param, &value);
                break;
            case JackDriverParamString:
                strncpy (value.str, optarg, JACK_DRIVER_PARAM_STRING_MAX);
                jackctl_parameter_set_value(param, &value);
                break;
            case JackDriverParamBool:
                /*
                 if (strcasecmp ("false", optarg) == 0 ||
                     strcasecmp ("off", optarg) == 0 ||
                     strcasecmp ("no", optarg) == 0 ||
                     strcasecmp ("0", optarg) == 0 ||
                     strcasecmp ("(null)", optarg) == 0 ) {
                */
                // steph
                if (strcmp ("false", optarg) == 0 ||
                        strcmp ("off", optarg) == 0 ||
                        strcmp ("no", optarg) == 0 ||
                        strcmp ("0", optarg) == 0 ||
                        strcmp ("(null)", optarg) == 0 ) {
                    value.i = false;
                } else {
                    value.i = true;
                }
                jackctl_parameter_set_value(param, &value);
                break;
            }
        } else {
            if (jackctl_parameter_get_type(param) == JackParamBool) {
                value.i = true;
            } else {
                value = jackctl_parameter_get_default_value(param);
            }
            jackctl_parameter_set_value(param, &value);
        }
    }

    free(options);
    free(long_options);
    return 0;
}